1 /* $OpenBSD: ber.h,v 1.5 2021/10/31 16:42:08 tb 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 /* X.690 section 8.19.5 */ 84 #define BER_MAX_OID_LEN 128 /* RFC 2578 section 7.1.3 */ 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 *ober_get_element(unsigned int); 94 void ober_set_header(struct ber_element *, int, 95 unsigned int); 96 void ober_link_elements(struct ber_element *, 97 struct ber_element *); 98 struct ber_element *ober_unlink_elements(struct ber_element *); 99 void ober_replace_elements(struct ber_element *, 100 struct ber_element *); 101 struct ber_element *ober_add_sequence(struct ber_element *); 102 struct ber_element *ober_add_set(struct ber_element *); 103 struct ber_element *ober_add_integer(struct ber_element *, long long); 104 int ober_get_integer(struct ber_element *, long long *); 105 struct ber_element *ober_add_enumerated(struct ber_element *, long long); 106 int ober_get_enumerated(struct ber_element *, long long *); 107 struct ber_element *ober_add_boolean(struct ber_element *, int); 108 int ober_get_boolean(struct ber_element *, int *); 109 struct ber_element *ober_add_string(struct ber_element *, const char *); 110 struct ber_element *ober_add_nstring(struct ber_element *, const char *, 111 size_t); 112 struct ber_element *ober_add_ostring(struct ber_element *, 113 struct ber_octetstring *); 114 int ober_get_string(struct ber_element *, char **); 115 int ober_get_nstring(struct ber_element *, void **, 116 size_t *); 117 int ober_get_ostring(struct ber_element *, 118 struct ber_octetstring *); 119 struct ber_element *ober_add_bitstring(struct ber_element *, const void *, 120 size_t); 121 int ober_get_bitstring(struct ber_element *, void **, 122 size_t *); 123 struct ber_element *ober_add_null(struct ber_element *); 124 int ober_get_null(struct ber_element *); 125 struct ber_element *ober_add_eoc(struct ber_element *); 126 int ober_get_eoc(struct ber_element *); 127 struct ber_element *ober_add_oid(struct ber_element *, struct ber_oid *); 128 struct ber_element *ober_add_noid(struct ber_element *, struct ber_oid *, int); 129 struct ber_element *ober_add_oidstring(struct ber_element *, const char *); 130 int ober_get_oid(struct ber_element *, struct ber_oid *); 131 size_t ober_oid2ber(struct ber_oid *, u_int8_t *, size_t); 132 int ober_string2oid(const char *, struct ber_oid *); 133 struct ber_element *ober_printf_elements(struct ber_element *, char *, ...); 134 int ober_scanf_elements(struct ber_element *, char *, ...); 135 ssize_t ober_get_writebuf(struct ber *, void **); 136 ssize_t ober_write_elements(struct ber *, struct ber_element *); 137 void ober_set_readbuf(struct ber *, void *, size_t); 138 struct ber_element *ober_read_elements(struct ber *, struct ber_element *); 139 off_t ober_getpos(struct ber_element *); 140 struct ber_element *ober_dup(struct ber_element *); 141 void ober_free_element(struct ber_element *); 142 void ober_free_elements(struct ber_element *); 143 size_t ober_calc_len(struct ber_element *); 144 void ober_set_application(struct ber *, 145 unsigned int (*)(struct ber_element *)); 146 void ober_set_writecallback(struct ber_element *, 147 void (*)(void *, size_t), void *); 148 void ober_free(struct ber *); 149 int ober_oid_cmp(struct ber_oid *, struct ber_oid *); 150 151 __END_DECLS 152 153 #endif /* _BER_H */ 154