1 /* 2 * Copyright (c) 2003-2017 Lev Walkin <vlm@lionet.info>. All rights reserved. 3 * Redistribution and modifications are permitted subject to BSD license. 4 */ 5 #ifndef ASN_CODECS_H 6 #define ASN_CODECS_H 7 8 #ifdef __cplusplus 9 extern "C" { 10 #endif 11 12 struct asn_TYPE_descriptor_s; /* Forward declaration */ 13 14 /* 15 * This structure defines a set of parameters that may be passed 16 * to every ASN.1 encoder or decoder function. 17 * WARNING: if max_stack_size member is set, and you are calling the 18 * function pointers of the asn_TYPE_descriptor_t directly, 19 * this structure must be ALLOCATED ON THE STACK! 20 * If you can't always satisfy this requirement, use ber_decode(), 21 * xer_decode() and uper_decode() functions instead. 22 */ 23 typedef struct asn_codec_ctx_s { 24 /* 25 * Limit the decoder routines to use no (much) more stack than a given 26 * number of bytes. Most of decoders are stack-based, and this 27 * would protect against stack overflows if the number of nested 28 * encodings is high. 29 * The OCTET STRING, BIT STRING and ANY BER decoders are heap-based, 30 * and are safe from this kind of overflow. 31 * A value from getrlimit(RLIMIT_STACK) may be used to initialize 32 * this variable. Be careful in multithreaded environments, as the 33 * stack size is rather limited. 34 */ 35 size_t max_stack_size; /* 0 disables stack bounds checking */ 36 } asn_codec_ctx_t; 37 38 /* 39 * Type of the return value of the encoding functions (der_encode, xer_encode). 40 */ 41 typedef struct asn_enc_rval_s { 42 /* 43 * Number of bytes encoded. 44 * -1 indicates failure to encode the structure. 45 * In this case, the members below this one are meaningful. 46 */ 47 ssize_t encoded; 48 49 /* 50 * Members meaningful when (encoded == -1), for post mortem analysis. 51 */ 52 53 /* Type which cannot be encoded */ 54 const struct asn_TYPE_descriptor_s *failed_type; 55 56 /* Pointer to the structure of that type */ 57 const void *structure_ptr; 58 } asn_enc_rval_t; 59 #define ASN__ENCODE_FAILED do { \ 60 asn_enc_rval_t tmp_error; \ 61 tmp_error.encoded = -1; \ 62 tmp_error.failed_type = td; \ 63 tmp_error.structure_ptr = sptr; \ 64 ASN_DEBUG("Failed to encode element %s", td ? td->name : ""); \ 65 return tmp_error; \ 66 } while(0) 67 #define ASN__ENCODED_OK(rval) do { \ 68 rval.structure_ptr = 0; \ 69 rval.failed_type = 0; \ 70 return rval; \ 71 } while(0) 72 73 /* 74 * Type of the return value of the decoding functions (ber_decode, xer_decode) 75 * 76 * Please note that the number of consumed bytes is ALWAYS meaningful, 77 * even if code==RC_FAIL. This is to indicate the number of successfully 78 * decoded bytes, hence providing a possibility to fail with more diagnostics 79 * (i.e., print the offending remainder of the buffer). 80 */ 81 enum asn_dec_rval_code_e { 82 RC_OK, /* Decoded successfully */ 83 RC_WMORE, /* More data expected, call again */ 84 RC_FAIL /* Failure to decode data */ 85 }; 86 typedef struct asn_dec_rval_s { 87 enum asn_dec_rval_code_e code; /* Result code */ 88 size_t consumed; /* Number of bytes consumed */ 89 } asn_dec_rval_t; 90 #define ASN__DECODE_FAILED do { \ 91 asn_dec_rval_t tmp_error; \ 92 tmp_error.code = RC_FAIL; \ 93 tmp_error.consumed = 0; \ 94 ASN_DEBUG("Failed to decode element %s", td ? td->name : ""); \ 95 return tmp_error; \ 96 } while(0) 97 #define ASN__DECODE_STARVED do { \ 98 asn_dec_rval_t tmp_error; \ 99 tmp_error.code = RC_WMORE; \ 100 tmp_error.consumed = 0; \ 101 return tmp_error; \ 102 } while(0) 103 104 #ifdef __cplusplus 105 } 106 #endif 107 108 #endif /* ASN_CODECS_H */ 109