#ifndef SYNTA_H
#define SYNTA_H
#include <stdarg.h>
#include <stdbool.h>
#include <stdint.h>
#include <stdlib.h>
typedef enum SyntaErrorCode {
SyntaErrorCode_Success = 0,
SyntaErrorCode_InvalidTag = 1,
SyntaErrorCode_InvalidLength = 2,
SyntaErrorCode_UnexpectedEof = 3,
SyntaErrorCode_InvalidEncoding = 4,
SyntaErrorCode_InvalidInteger = 5,
SyntaErrorCode_InvalidOid = 6,
SyntaErrorCode_InvalidUtf8 = 7,
SyntaErrorCode_InvalidPrintableString = 8,
SyntaErrorCode_InvalidIA5String = 9,
SyntaErrorCode_InvalidBoolean = 10,
SyntaErrorCode_InvalidTime = 11,
SyntaErrorCode_InvalidBitString = 12,
SyntaErrorCode_MaxDepthExceeded = 13,
SyntaErrorCode_MaxSequenceElementsExceeded = 14,
SyntaErrorCode_MaxLengthExceeded = 15,
SyntaErrorCode_BerViolation = 16,
SyntaErrorCode_DerViolation = 17,
SyntaErrorCode_CerViolation = 18,
SyntaErrorCode_NullPointer = 19,
SyntaErrorCode_InvalidArgument = 20,
SyntaErrorCode_OutOfMemory = 21,
SyntaErrorCode_IntegerOverflow = 22,
SyntaErrorCode_IntegerUnderflow = 23,
SyntaErrorCode_Unknown = 999,
} SyntaErrorCode;
typedef enum SyntaEncoding {
SyntaEncoding_Der = 0,
SyntaEncoding_Ber = 1,
SyntaEncoding_Cer = 2,
} SyntaEncoding;
typedef enum SyntaTagClass {
SyntaTagClass_Universal = 0,
SyntaTagClass_Application = 1,
SyntaTagClass_ContextSpecific = 2,
SyntaTagClass_Private = 3,
} SyntaTagClass;
typedef struct SyntaCertificate {
uint8_t _private[0];
} SyntaCertificate;
typedef struct SyntaByteArray {
const uint8_t *data;
uint32_t len;
uint32_t owned;
} SyntaByteArray;
typedef struct SyntaCmsSignedData {
uint8_t _private[0];
} SyntaCmsSignedData;
typedef struct SyntaCmsSignerInfo {
uint8_t _private[0];
} SyntaCmsSignerInfo;
typedef struct SyntaCmsEnvelopedData {
uint8_t _private[0];
} SyntaCmsEnvelopedData;
typedef struct SyntaCmsEncryptedData {
uint8_t _private[0];
} SyntaCmsEncryptedData;
typedef struct SyntaCmsDigestedData {
uint8_t _private[0];
} SyntaCmsDigestedData;
typedef struct SyntaCmsContentInfo {
uint8_t _private[0];
} SyntaCmsContentInfo;
typedef struct SyntaCrl {
uint8_t _private[0];
} SyntaCrl;
typedef struct SyntaCsr {
uint8_t _private[0];
} SyntaCsr;
typedef struct SyntaDecoder {
uint8_t _private[0];
} SyntaDecoder;
typedef struct SyntaDecoderConfig {
uintptr_t max_depth;
uintptr_t max_sequence_elements;
uintptr_t max_length;
} SyntaDecoderConfig;
typedef struct SyntaTag {
enum SyntaTagClass class_;
bool constructed;
unsigned int number;
} SyntaTag;
typedef struct SyntaInteger {
uint8_t _private[0];
} SyntaInteger;
typedef struct SyntaOctetString {
uint8_t _private[0];
} SyntaOctetString;
typedef struct SyntaObjectIdentifier {
uint8_t _private[0];
} SyntaObjectIdentifier;
typedef struct SyntaEncoder {
uint8_t _private[0];
} SyntaEncoder;
typedef struct SyntaOcsp {
uint8_t _private[0];
} SyntaOcsp;
typedef struct SyntaDerList {
uint8_t _private[0];
} SyntaDerList;
#ifdef __cplusplus
extern "C" {
#endif
struct SyntaCertificate *synta_certificate_parse_der(const uint8_t *data, uintptr_t len);
void synta_certificate_free(struct SyntaCertificate *cert);
enum SyntaErrorCode synta_certificate_get_version(const struct SyntaCertificate *cert,
int64_t *out);
enum SyntaErrorCode synta_certificate_get_serial_number(const struct SyntaCertificate *cert,
struct SyntaByteArray *out);
uintptr_t synta_certificate_get_signature_algorithm(const struct SyntaCertificate *cert,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_certificate_get_signature_algorithm_der(const struct SyntaCertificate *cert,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_certificate_get_outer_signature_algorithm_der(const struct SyntaCertificate *cert,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_certificate_get_issuer_der(const struct SyntaCertificate *cert,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_certificate_get_subject_der(const struct SyntaCertificate *cert,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_signed_data_get_version(const struct SyntaCmsSignedData *sd,
int64_t *out);
uintptr_t synta_cms_signed_data_get_encap_content_type(const struct SyntaCmsSignedData *sd,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_signed_data_get_encap_content(const struct SyntaCmsSignedData *sd,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_signed_data_get_certificates_der(const struct SyntaCmsSignedData *sd,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_signed_data_get_crls_der(const struct SyntaCmsSignedData *sd,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_signed_data_get_signer_info_count(const struct SyntaCmsSignedData *sd,
uintptr_t *out);
enum SyntaErrorCode synta_cms_signed_data_get_signer_info_der(const struct SyntaCmsSignedData *sd,
uintptr_t index,
struct SyntaByteArray *out);
struct SyntaCmsSignerInfo *synta_cms_signer_info_parse_der(const uint8_t *data, uintptr_t len);
void synta_cms_signer_info_free(struct SyntaCmsSignerInfo *si);
enum SyntaErrorCode synta_cms_signer_info_get_version(const struct SyntaCmsSignerInfo *si,
int64_t *out);
enum SyntaErrorCode synta_cms_signer_info_get_sid_der(const struct SyntaCmsSignerInfo *si,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_signer_info_get_digest_algorithm_der(const struct SyntaCmsSignerInfo *si,
struct SyntaByteArray *out);
uintptr_t synta_cms_signer_info_get_digest_algorithm_oid(const struct SyntaCmsSignerInfo *si,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_signer_info_get_signed_attrs_der(const struct SyntaCmsSignerInfo *si,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_signer_info_get_signature_algorithm_der(const struct SyntaCmsSignerInfo *si,
struct SyntaByteArray *out);
uintptr_t synta_cms_signer_info_get_signature_algorithm_oid(const struct SyntaCmsSignerInfo *si,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_signer_info_get_signature(const struct SyntaCmsSignerInfo *si,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_signer_info_get_unsigned_attrs_der(const struct SyntaCmsSignerInfo *si,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_enveloped_data_get_version(const struct SyntaCmsEnvelopedData *ed,
int64_t *out);
enum SyntaErrorCode synta_cms_enveloped_data_get_recipient_infos_der(const struct SyntaCmsEnvelopedData *ed,
struct SyntaByteArray *out);
uintptr_t synta_cms_enveloped_data_get_content_type(const struct SyntaCmsEnvelopedData *ed,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_enveloped_data_get_content_encryption_algorithm_der(const struct SyntaCmsEnvelopedData *ed,
struct SyntaByteArray *out);
uintptr_t synta_cms_enveloped_data_get_content_encryption_algorithm_oid(const struct SyntaCmsEnvelopedData *ed,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_enveloped_data_get_encrypted_content(const struct SyntaCmsEnvelopedData *ed,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_encrypted_data_get_version(const struct SyntaCmsEncryptedData *ed,
int64_t *out);
uintptr_t synta_cms_encrypted_data_get_content_type(const struct SyntaCmsEncryptedData *ed,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_encrypted_data_get_content_encryption_algorithm_der(const struct SyntaCmsEncryptedData *ed,
struct SyntaByteArray *out);
uintptr_t synta_cms_encrypted_data_get_content_encryption_algorithm_oid(const struct SyntaCmsEncryptedData *ed,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_encrypted_data_get_encrypted_content(const struct SyntaCmsEncryptedData *ed,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_encrypted_data_decrypt(const struct SyntaCmsEncryptedData *ed,
const uint8_t *key,
uintptr_t key_len,
struct SyntaByteArray *plaintext_out);
enum SyntaErrorCode synta_cms_encrypted_data_create(const uint8_t *plaintext,
uintptr_t plaintext_len,
const uint8_t *key,
uintptr_t key_len,
const uint8_t *content_type_oid_der,
uintptr_t content_type_oid_der_len,
const uint8_t *enc_alg_oid_der,
uintptr_t enc_alg_oid_der_len,
struct SyntaByteArray *der_out);
enum SyntaErrorCode synta_cms_digested_data_get_version(const struct SyntaCmsDigestedData *dd,
int64_t *out);
enum SyntaErrorCode synta_cms_digested_data_get_digest_algorithm_der(const struct SyntaCmsDigestedData *dd,
struct SyntaByteArray *out);
uintptr_t synta_cms_digested_data_get_digest_algorithm_oid(const struct SyntaCmsDigestedData *dd,
char *buffer,
uintptr_t buffer_len);
uintptr_t synta_cms_digested_data_get_encap_content_type(const struct SyntaCmsDigestedData *dd,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_cms_digested_data_get_encap_content(const struct SyntaCmsDigestedData *dd,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_cms_digested_data_get_digest(const struct SyntaCmsDigestedData *dd,
struct SyntaByteArray *out);
struct SyntaCmsContentInfo *synta_cms_content_info_parse_der(const uint8_t *data,
uintptr_t len);
void synta_cms_content_info_free(struct SyntaCmsContentInfo *ci);
uintptr_t synta_cms_content_info_get_content_type(const struct SyntaCmsContentInfo *ci,
char *buffer,
uintptr_t buffer_len);
const struct SyntaCmsSignedData *synta_cms_content_info_get0_signed_data(const struct SyntaCmsContentInfo *ci);
const struct SyntaCmsEnvelopedData *synta_cms_content_info_get0_enveloped_data(const struct SyntaCmsContentInfo *ci);
const struct SyntaCmsEncryptedData *synta_cms_content_info_get0_encrypted_data(const struct SyntaCmsContentInfo *ci);
const struct SyntaCmsDigestedData *synta_cms_content_info_get0_digested_data(const struct SyntaCmsContentInfo *ci);
struct SyntaCrl *synta_crl_parse_der(const uint8_t *data, uintptr_t len);
struct SyntaCrl *synta_crl_parse_pem(const uint8_t *data, uintptr_t len);
void synta_crl_free(struct SyntaCrl *crl);
enum SyntaErrorCode synta_crl_get_issuer_der(const struct SyntaCrl *crl,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_crl_get_signature_algorithm_der(const struct SyntaCrl *crl,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_crl_get_signature_value_der(const struct SyntaCrl *crl,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_crl_get_this_update_der(const struct SyntaCrl *crl,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_crl_get_next_update_der(const struct SyntaCrl *crl,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_crl_get_revoked_count(const struct SyntaCrl *crl, uintptr_t *out);
struct SyntaCsr *synta_csr_parse_der(const uint8_t *data, uintptr_t len);
struct SyntaCsr *synta_csr_parse_pem(const uint8_t *data, uintptr_t len);
void synta_csr_free(struct SyntaCsr *csr);
enum SyntaErrorCode synta_csr_get_version(const struct SyntaCsr *csr, int64_t *out);
enum SyntaErrorCode synta_csr_get_subject_der(const struct SyntaCsr *csr,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_csr_get_signature_algorithm_der(const struct SyntaCsr *csr,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_csr_get_signature_der(const struct SyntaCsr *csr,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_csr_get_public_key_der(const struct SyntaCsr *csr,
struct SyntaByteArray *out);
struct SyntaDecoder *synta_decoder_new(const uint8_t *data,
uintptr_t len,
enum SyntaEncoding encoding);
struct SyntaDecoder *synta_decoder_new_with_config(const uint8_t *data,
uintptr_t len,
enum SyntaEncoding encoding,
const struct SyntaDecoderConfig *config);
void synta_decoder_free(struct SyntaDecoder *decoder);
uintptr_t synta_decoder_remaining(const struct SyntaDecoder *decoder);
bool synta_decoder_at_end(const struct SyntaDecoder *decoder);
enum SyntaErrorCode synta_decoder_peek_tag(const struct SyntaDecoder *decoder,
struct SyntaTag *out);
enum SyntaErrorCode synta_decode_boolean(struct SyntaDecoder *decoder, bool *out);
enum SyntaErrorCode synta_decode_integer(struct SyntaDecoder *decoder, struct SyntaInteger **out);
enum SyntaErrorCode synta_decode_null(struct SyntaDecoder *decoder);
enum SyntaErrorCode synta_decode_real(struct SyntaDecoder *decoder, double *out);
enum SyntaErrorCode synta_decode_octet_string(struct SyntaDecoder *decoder,
struct SyntaOctetString **out);
enum SyntaErrorCode synta_decode_utf8_string_os(struct SyntaDecoder *decoder,
struct SyntaOctetString **out);
enum SyntaErrorCode synta_decode_printable_string_os(struct SyntaDecoder *decoder,
struct SyntaOctetString **out);
enum SyntaErrorCode synta_decode_ia5_string_os(struct SyntaDecoder *decoder,
struct SyntaOctetString **out);
enum SyntaErrorCode synta_decode_utctime_os(struct SyntaDecoder *decoder,
struct SyntaOctetString **out);
enum SyntaErrorCode synta_decode_generalized_time_os(struct SyntaDecoder *decoder,
struct SyntaOctetString **out);
enum SyntaErrorCode synta_decode_bit_string(struct SyntaDecoder *decoder,
struct SyntaByteArray *out,
uint8_t *unused_bits);
enum SyntaErrorCode synta_decode_object_identifier(struct SyntaDecoder *decoder,
struct SyntaObjectIdentifier **out);
enum SyntaErrorCode synta_decode_utf8_string(struct SyntaDecoder *decoder,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_decode_printable_string(struct SyntaDecoder *decoder,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_decode_ia5_string(struct SyntaDecoder *decoder,
struct SyntaByteArray *out);
enum SyntaErrorCode synta_decoder_enter_sequence(struct SyntaDecoder *decoder,
struct SyntaDecoder **out);
enum SyntaErrorCode synta_decoder_enter_set(struct SyntaDecoder *decoder,
struct SyntaDecoder **out);
enum SyntaErrorCode synta_decoder_enter_constructed(struct SyntaDecoder *decoder,
struct SyntaTag tag,
struct SyntaDecoder **out);
struct SyntaEncoder *synta_encoder_new(enum SyntaEncoding encoding);
enum SyntaErrorCode synta_encoder_finish(struct SyntaEncoder *encoder, struct SyntaByteArray *out);
void synta_encoder_free(struct SyntaEncoder *encoder);
enum SyntaErrorCode synta_encode_boolean(struct SyntaEncoder *encoder, bool value);
enum SyntaErrorCode synta_encode_integer(struct SyntaEncoder *encoder,
const struct SyntaInteger *integer);
enum SyntaErrorCode synta_encode_integer_i64(struct SyntaEncoder *encoder, int64_t value);
enum SyntaErrorCode synta_encode_null(struct SyntaEncoder *encoder);
enum SyntaErrorCode synta_encode_real(struct SyntaEncoder *encoder, double value);
enum SyntaErrorCode synta_encode_octet_string(struct SyntaEncoder *encoder,
const uint8_t *data,
uintptr_t len);
enum SyntaErrorCode synta_encode_utf8_string_bytes(struct SyntaEncoder *encoder,
const uint8_t *data,
uintptr_t len);
enum SyntaErrorCode synta_encode_printable_string_bytes(struct SyntaEncoder *encoder,
const uint8_t *data,
uintptr_t len);
enum SyntaErrorCode synta_encode_ia5_string_bytes(struct SyntaEncoder *encoder,
const uint8_t *data,
uintptr_t len);
enum SyntaErrorCode synta_encode_utctime_bytes(struct SyntaEncoder *encoder,
const uint8_t *data,
uintptr_t len);
enum SyntaErrorCode synta_encode_generalized_time_bytes(struct SyntaEncoder *encoder,
const uint8_t *data,
uintptr_t len);
enum SyntaErrorCode synta_encode_bit_string(struct SyntaEncoder *encoder,
const uint8_t *data,
uintptr_t len,
uint8_t unused_bits);
enum SyntaErrorCode synta_encode_object_identifier(struct SyntaEncoder *encoder,
const struct SyntaObjectIdentifier *oid);
enum SyntaErrorCode synta_encode_utf8_string(struct SyntaEncoder *encoder, const char *str);
enum SyntaErrorCode synta_encode_printable_string(struct SyntaEncoder *encoder, const char *str);
enum SyntaErrorCode synta_encode_ia5_string(struct SyntaEncoder *encoder, const char *str);
enum SyntaErrorCode synta_encoder_start_sequence(struct SyntaEncoder *encoder,
struct SyntaEncoder **out);
enum SyntaErrorCode synta_encoder_start_set(struct SyntaEncoder *encoder,
struct SyntaEncoder **out);
enum SyntaErrorCode synta_encoder_start_constructed(struct SyntaEncoder *encoder,
struct SyntaTag tag,
struct SyntaEncoder **out);
enum SyntaErrorCode synta_encoder_end_constructed(struct SyntaEncoder *encoder);
const char *synta_get_last_error_message(void);
void synta_clear_last_error(void);
const char *synta_error_message(enum SyntaErrorCode code);
struct SyntaInteger *synta_integer_new_i64(int64_t value);
struct SyntaInteger *synta_integer_new_u64(uint64_t value);
struct SyntaInteger *synta_integer_new_bytes(const uint8_t *data, uintptr_t len, bool _is_negative);
enum SyntaErrorCode synta_integer_to_i64(const struct SyntaInteger *integer, int64_t *out);
enum SyntaErrorCode synta_integer_to_u64(const struct SyntaInteger *integer,
uint64_t *out);
enum SyntaErrorCode synta_integer_to_bytes(const struct SyntaInteger *integer,
struct SyntaByteArray *out);
bool synta_integer_is_negative(const struct SyntaInteger *integer);
void synta_integer_free(struct SyntaInteger *integer);
struct SyntaOcsp *synta_ocsp_parse_der(const uint8_t *data, uintptr_t len);
void synta_ocsp_free(struct SyntaOcsp *ocsp);
enum SyntaErrorCode synta_ocsp_get_status_code(const struct SyntaOcsp *ocsp, int32_t *out);
uintptr_t synta_ocsp_get_status(const struct SyntaOcsp *ocsp, char *buffer, uintptr_t buffer_len);
uintptr_t synta_ocsp_get_response_type_oid(const struct SyntaOcsp *ocsp,
char *buffer,
uintptr_t buffer_len);
enum SyntaErrorCode synta_ocsp_get_response_bytes_der(const struct SyntaOcsp *ocsp,
struct SyntaByteArray *out);
struct SyntaOctetString *synta_octet_string_new(const uint8_t *data, uintptr_t len);
const uint8_t *synta_octet_string_data(const struct SyntaOctetString *octet_string);
uintptr_t synta_octet_string_len(const struct SyntaOctetString *octet_string);
void synta_octet_string_free(struct SyntaOctetString *octet_string);
struct SyntaObjectIdentifier *synta_oid_new(const uint32_t *components, uintptr_t len);
struct SyntaObjectIdentifier *synta_oid_from_string(const char *str);
uintptr_t synta_oid_to_string(const struct SyntaObjectIdentifier *oid,
char *buf,
uintptr_t buf_len);
enum SyntaErrorCode synta_oid_components(const struct SyntaObjectIdentifier *oid,
const uint32_t **out,
uintptr_t *out_len);
bool synta_oid_equals(const struct SyntaObjectIdentifier *a, const struct SyntaObjectIdentifier *b);
void synta_oid_free(struct SyntaObjectIdentifier *oid);
struct SyntaDerList *synta_pem_to_der(const uint8_t *data, uintptr_t len);
struct SyntaByteArray synta_der_to_pem(const uint8_t *data, uintptr_t len, const char *label);
uintptr_t synta_der_list_count(const struct SyntaDerList *list);
enum SyntaErrorCode synta_der_list_get_der(const struct SyntaDerList *list,
uintptr_t index,
struct SyntaByteArray *out);
void synta_der_list_free(struct SyntaDerList *list);
struct SyntaDerList *synta_pkcs7_certs_from_der(const uint8_t *data, uintptr_t len);
struct SyntaDerList *synta_pkcs7_certs_from_pem(const uint8_t *data, uintptr_t len);
struct SyntaDerList *synta_pkcs12_certs_from_der(const uint8_t *data,
uintptr_t len,
const uint8_t *password,
uintptr_t password_len);
struct SyntaDerList *synta_read_pki_file(const uint8_t *data,
uintptr_t len,
const uint8_t *password,
uintptr_t password_len);
void synta_byte_array_free(struct SyntaByteArray *array);
struct SyntaByteArray synta_byte_array_alloc(uintptr_t len);
struct SyntaByteArray synta_byte_array_clone(const struct SyntaByteArray *array);
#ifdef __cplusplus
} #endif
#endif