synta 0.2.5

ASN.1 parser, decoder, and encoder library with DER/BER support and C FFI
Documentation
# Quick Start


This page shows the minimal code to decode and encode ASN.1 data using the
Synta C API, plus how to compile and run the examples.

## Decode an INTEGER

```c
#include <synta.h>
#include <stdio.h>

int main(void) {
    const uint8_t data[] = {0x02, 0x01, 0x2A}; /* INTEGER 42 */
    SyntaDecoder *dec = synta_decoder_new(data, sizeof(data), SyntaEncoding_Der);
    if (!dec) {
        fprintf(stderr, "Error: %s\n", synta_get_last_error_message());
        return 1;
    }

    SyntaInteger *integer = NULL;
    if (synta_decode_integer(dec, &integer) == SyntaErrorCode_Success) {
        int64_t value;
        synta_integer_to_i64(integer, &value);
        printf("Value: %lld\n", (long long)value);
        synta_integer_free(integer);
    } else {
        fprintf(stderr, "Error: %s\n", synta_get_last_error_message());
    }

    synta_decoder_free(dec);
    return 0;
}
```

## Encode a SEQUENCE

```c
#include <synta.h>

int main(void) {
    SyntaEncoder *enc = synta_encoder_new(SyntaEncoding_Der);

    SyntaEncoder *seq = NULL;
    synta_encoder_start_sequence(enc, &seq);
    synta_encode_integer_i64(seq, 42);
    synta_encode_boolean(seq, true);
    synta_encoder_end_constructed(seq);

    SyntaByteArray output = {0};
    synta_encoder_finish(enc, &output);
    /* enc is consumed by synta_encoder_finish; do not free enc */

    /* use output.data[0..output.len-1] */

    synta_byte_array_free(&output);
    return 0;
}
```

## Parse an X.509 Certificate

```c
#include <synta.h>
#include <stdio.h>

void print_cert_info(const uint8_t *der, uintptr_t der_len) {
    SyntaCertificate *cert = synta_certificate_parse_der(der, der_len);
    if (!cert) {
        fprintf(stderr, "Parse failed: %s\n", synta_get_last_error_message());
        return;
    }

    /* Subject DN: zero-copy borrowed slice into the original DER buffer */
    SyntaByteArray subject = {0};
    synta_certificate_get_subject_der(cert, &subject);
    /* subject.owned == 0: bytes are borrowed from cert; do not free */
    printf("Subject DER: %u bytes\n", subject.len);

    /* Signature algorithm OID as a dotted-decimal string (size-query pattern) */
    uintptr_t needed = synta_certificate_get_signature_algorithm(cert, NULL, 0);
    char sig_alg[64];
    if (needed <= sizeof(sig_alg)) {
        synta_certificate_get_signature_algorithm(cert, sig_alg, sizeof(sig_alg));
        printf("Sig alg: %s\n", sig_alg);
    }

    synta_certificate_free(cert);
}
```

## Compile and Run

### With pkg-config

```bash
gcc example.c $(pkg-config --cflags --libs csynta) -o example
./example
```

### Without pkg-config

```bash
gcc example.c -I/path/to/synta/include \
              -L/path/to/synta/lib -lcsynta -lpthread -ldl -lm \
              -o example
./example
```

The generated code requires a C99-capable compiler (`-std=c99` or later).

## Configure DoS Protection

By default, `synta_decoder_new` uses built-in limits.  To set custom limits:

```c
#include <synta.h>

SyntaDecoder *make_decoder(const uint8_t *data, uintptr_t len) {
    SyntaDecoderConfig cfg = {
        .max_depth             = 32,
        .max_sequence_elements = 10000,
        .max_length            = 16 * 1024 * 1024,  /* 16 MB */
    };
    return synta_decoder_new_with_config(data, len, SyntaEncoding_Der, &cfg);
}
```

## Next Steps

- [Installation and Linking]installation.md — build options, pkg-config, CMake
- [API Reference: Decoder]../api/decoder.md — all decode functions
- [API Reference: Encoder]../api/encoder.md — all encode functions
- [Memory Management]../memory.md — ownership rules and common pitfalls
- [Code Generation]../codegen/overview.md — generate C structs from ASN.1 schemas