1 /* $OpenBSD: ber.h,v 1.1 2019/05/11 17:46:02 rob Exp $ */ 2 3 /* 4 * Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> 5 * Copyright (c) 2006, 2007 Claudio Jeker <claudio@openbsd.org> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 20 #ifndef _BER_H 21 #define _BER_H 22 23 struct ber_octetstring { 24 size_t ostr_len; 25 const void *ostr_val; 26 }; 27 28 struct ber_element { 29 struct ber_element *be_next; 30 unsigned int be_type; 31 unsigned int be_encoding; 32 size_t be_len; 33 off_t be_offs; 34 int be_free; 35 u_int8_t be_class; 36 void (*be_cb)(void *, size_t); 37 void *be_cbarg; 38 union { 39 struct ber_element *bv_sub; 40 void *bv_val; 41 long long bv_numeric; 42 } be_union; 43 #define be_sub be_union.bv_sub 44 #define be_val be_union.bv_val 45 #define be_numeric be_union.bv_numeric 46 }; 47 48 struct ber { 49 off_t br_offs; 50 u_char *br_wbuf; 51 u_char *br_wptr; 52 u_char *br_wend; 53 u_char *br_rbuf; 54 u_char *br_rptr; 55 u_char *br_rend; 56 57 unsigned int (*br_application)(struct ber_element *); 58 }; 59 60 /* well-known ber_element types */ 61 #define BER_TYPE_DEFAULT ((unsigned int)-1) 62 #define BER_TYPE_EOC 0 63 #define BER_TYPE_BOOLEAN 1 64 #define BER_TYPE_INTEGER 2 65 #define BER_TYPE_BITSTRING 3 66 #define BER_TYPE_OCTETSTRING 4 67 #define BER_TYPE_NULL 5 68 #define BER_TYPE_OBJECT 6 69 #define BER_TYPE_ENUMERATED 10 70 #define BER_TYPE_SEQUENCE 16 71 #define BER_TYPE_SET 17 72 73 /* ber classes */ 74 #define BER_CLASS_UNIVERSAL 0x0 75 #define BER_CLASS_UNIV BER_CLASS_UNIVERSAL 76 #define BER_CLASS_APPLICATION 0x1 77 #define BER_CLASS_APP BER_CLASS_APPLICATION 78 #define BER_CLASS_CONTEXT 0x2 79 #define BER_CLASS_PRIVATE 0x3 80 #define BER_CLASS_MASK 0x3 81 82 /* common definitions */ 83 #define BER_MIN_OID_LEN 2 /* OBJECT */ 84 #define BER_MAX_OID_LEN 32 /* OBJECT */ 85 #define BER_MAX_SEQ_ELEMENTS USHRT_MAX /* 65535 */ 86 87 struct ber_oid { 88 u_int32_t bo_id[BER_MAX_OID_LEN + 1]; 89 size_t bo_n; 90 }; 91 92 __BEGIN_DECLS 93 struct ber_element *ber_get_element(unsigned int); 94 void ber_set_header(struct ber_element *, int, 95 unsigned int); 96 void ber_link_elements(struct ber_element *, 97 struct ber_element *); 98 struct ber_element *ber_unlink_elements(struct ber_element *); 99 void ber_replace_elements(struct ber_element *, 100 struct ber_element *); 101 struct ber_element *ber_add_sequence(struct ber_element *); 102 struct ber_element *ber_add_set(struct ber_element *); 103 struct ber_element *ber_add_integer(struct ber_element *, long long); 104 int ber_get_integer(struct ber_element *, long long *); 105 struct ber_element *ber_add_enumerated(struct ber_element *, long long); 106 int ber_get_enumerated(struct ber_element *, long long *); 107 struct ber_element *ber_add_boolean(struct ber_element *, int); 108 int ber_get_boolean(struct ber_element *, int *); 109 struct ber_element *ber_add_string(struct ber_element *, const char *); 110 struct ber_element *ber_add_nstring(struct ber_element *, const char *, 111 size_t); 112 struct ber_element *ber_add_ostring(struct ber_element *, 113 struct ber_octetstring *); 114 int ber_get_string(struct ber_element *, char **); 115 int ber_get_nstring(struct ber_element *, void **, 116 size_t *); 117 int ber_get_ostring(struct ber_element *, 118 struct ber_octetstring *); 119 struct ber_element *ber_add_bitstring(struct ber_element *, const void *, 120 size_t); 121 int ber_get_bitstring(struct ber_element *, void **, 122 size_t *); 123 struct ber_element *ber_add_null(struct ber_element *); 124 int ber_get_null(struct ber_element *); 125 struct ber_element *ber_add_eoc(struct ber_element *); 126 int ber_get_eoc(struct ber_element *); 127 struct ber_element *ber_add_oid(struct ber_element *, struct ber_oid *); 128 struct ber_element *ber_add_noid(struct ber_element *, struct ber_oid *, int); 129 struct ber_element *ber_add_oidstring(struct ber_element *, const char *); 130 int ber_get_oid(struct ber_element *, struct ber_oid *); 131 size_t ber_oid2ber(struct ber_oid *, u_int8_t *, size_t); 132 int ber_string2oid(const char *, struct ber_oid *); 133 struct ber_element *ber_printf_elements(struct ber_element *, char *, ...); 134 int ber_scanf_elements(struct ber_element *, char *, ...); 135 ssize_t ber_get_writebuf(struct ber *, void **); 136 ssize_t ber_write_elements(struct ber *, struct ber_element *); 137 void ber_set_readbuf(struct ber *, void *, size_t); 138 struct ber_element *ber_read_elements(struct ber *, struct ber_element *); 139 off_t ber_getpos(struct ber_element *); 140 void ber_free_element(struct ber_element *); 141 void ber_free_elements(struct ber_element *); 142 size_t ber_calc_len(struct ber_element *); 143 void ber_set_application(struct ber *, 144 unsigned int (*)(struct ber_element *)); 145 void ber_set_writecallback(struct ber_element *, 146 void (*)(void *, size_t), void *); 147 void ber_free(struct ber *); 148 int ber_oid_cmp(struct ber_oid *, struct ber_oid *); 149 150 __END_DECLS 151 152 #endif /* _BER_H */ 153