1*48b76637Stb /* $OpenBSD: ber.h,v 1.5 2021/10/31 16:42:08 tb Exp $ */ 2d4b95dc4Srob 3d4b95dc4Srob /* 4d4b95dc4Srob * Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> 5d4b95dc4Srob * Copyright (c) 2006, 2007 Claudio Jeker <claudio@openbsd.org> 6d4b95dc4Srob * 7d4b95dc4Srob * Permission to use, copy, modify, and distribute this software for any 8d4b95dc4Srob * purpose with or without fee is hereby granted, provided that the above 9d4b95dc4Srob * copyright notice and this permission notice appear in all copies. 10d4b95dc4Srob * 11d4b95dc4Srob * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12d4b95dc4Srob * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13d4b95dc4Srob * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14d4b95dc4Srob * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15d4b95dc4Srob * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16d4b95dc4Srob * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17d4b95dc4Srob * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18d4b95dc4Srob */ 19d4b95dc4Srob 20d4b95dc4Srob #ifndef _BER_H 21d4b95dc4Srob #define _BER_H 22d4b95dc4Srob 23d4b95dc4Srob struct ber_octetstring { 24d4b95dc4Srob size_t ostr_len; 25d4b95dc4Srob const void *ostr_val; 26d4b95dc4Srob }; 27d4b95dc4Srob 28d4b95dc4Srob struct ber_element { 29d4b95dc4Srob struct ber_element *be_next; 30d4b95dc4Srob unsigned int be_type; 31d4b95dc4Srob unsigned int be_encoding; 32d4b95dc4Srob size_t be_len; 33d4b95dc4Srob off_t be_offs; 34d4b95dc4Srob int be_free; 35d4b95dc4Srob u_int8_t be_class; 36d4b95dc4Srob void (*be_cb)(void *, size_t); 37d4b95dc4Srob void *be_cbarg; 38d4b95dc4Srob union { 39d4b95dc4Srob struct ber_element *bv_sub; 40d4b95dc4Srob void *bv_val; 41d4b95dc4Srob long long bv_numeric; 42d4b95dc4Srob } be_union; 43d4b95dc4Srob #define be_sub be_union.bv_sub 44d4b95dc4Srob #define be_val be_union.bv_val 45d4b95dc4Srob #define be_numeric be_union.bv_numeric 46d4b95dc4Srob }; 47d4b95dc4Srob 48d4b95dc4Srob struct ber { 49d4b95dc4Srob off_t br_offs; 50d4b95dc4Srob u_char *br_wbuf; 51d4b95dc4Srob u_char *br_wptr; 52d4b95dc4Srob u_char *br_wend; 53d4b95dc4Srob u_char *br_rbuf; 54d4b95dc4Srob u_char *br_rptr; 55d4b95dc4Srob u_char *br_rend; 56d4b95dc4Srob 57d4b95dc4Srob unsigned int (*br_application)(struct ber_element *); 58d4b95dc4Srob }; 59d4b95dc4Srob 60d4b95dc4Srob /* well-known ber_element types */ 61d4b95dc4Srob #define BER_TYPE_DEFAULT ((unsigned int)-1) 62d4b95dc4Srob #define BER_TYPE_EOC 0 63d4b95dc4Srob #define BER_TYPE_BOOLEAN 1 64d4b95dc4Srob #define BER_TYPE_INTEGER 2 65d4b95dc4Srob #define BER_TYPE_BITSTRING 3 66d4b95dc4Srob #define BER_TYPE_OCTETSTRING 4 67d4b95dc4Srob #define BER_TYPE_NULL 5 68d4b95dc4Srob #define BER_TYPE_OBJECT 6 69d4b95dc4Srob #define BER_TYPE_ENUMERATED 10 70d4b95dc4Srob #define BER_TYPE_SEQUENCE 16 71d4b95dc4Srob #define BER_TYPE_SET 17 72d4b95dc4Srob 73d4b95dc4Srob /* ber classes */ 74d4b95dc4Srob #define BER_CLASS_UNIVERSAL 0x0 75d4b95dc4Srob #define BER_CLASS_UNIV BER_CLASS_UNIVERSAL 76d4b95dc4Srob #define BER_CLASS_APPLICATION 0x1 77d4b95dc4Srob #define BER_CLASS_APP BER_CLASS_APPLICATION 78d4b95dc4Srob #define BER_CLASS_CONTEXT 0x2 79d4b95dc4Srob #define BER_CLASS_PRIVATE 0x3 80d4b95dc4Srob #define BER_CLASS_MASK 0x3 81d4b95dc4Srob 82d4b95dc4Srob /* common definitions */ 83*48b76637Stb #define BER_MIN_OID_LEN 2 /* X.690 section 8.19.5 */ 84*48b76637Stb #define BER_MAX_OID_LEN 128 /* RFC 2578 section 7.1.3 */ 85d4b95dc4Srob #define BER_MAX_SEQ_ELEMENTS USHRT_MAX /* 65535 */ 86d4b95dc4Srob 87d4b95dc4Srob struct ber_oid { 88d4b95dc4Srob u_int32_t bo_id[BER_MAX_OID_LEN + 1]; 89d4b95dc4Srob size_t bo_n; 90d4b95dc4Srob }; 91d4b95dc4Srob 92d4b95dc4Srob __BEGIN_DECLS 93696b5899Stb struct ber_element *ober_get_element(unsigned int); 94696b5899Stb void ober_set_header(struct ber_element *, int, 95d4b95dc4Srob unsigned int); 96696b5899Stb void ober_link_elements(struct ber_element *, 97d4b95dc4Srob struct ber_element *); 98696b5899Stb struct ber_element *ober_unlink_elements(struct ber_element *); 99696b5899Stb void ober_replace_elements(struct ber_element *, 100d4b95dc4Srob struct ber_element *); 101696b5899Stb struct ber_element *ober_add_sequence(struct ber_element *); 102696b5899Stb struct ber_element *ober_add_set(struct ber_element *); 103696b5899Stb struct ber_element *ober_add_integer(struct ber_element *, long long); 104696b5899Stb int ober_get_integer(struct ber_element *, long long *); 105696b5899Stb struct ber_element *ober_add_enumerated(struct ber_element *, long long); 106696b5899Stb int ober_get_enumerated(struct ber_element *, long long *); 107696b5899Stb struct ber_element *ober_add_boolean(struct ber_element *, int); 108696b5899Stb int ober_get_boolean(struct ber_element *, int *); 109696b5899Stb struct ber_element *ober_add_string(struct ber_element *, const char *); 110696b5899Stb struct ber_element *ober_add_nstring(struct ber_element *, const char *, 111d4b95dc4Srob size_t); 112696b5899Stb struct ber_element *ober_add_ostring(struct ber_element *, 113d4b95dc4Srob struct ber_octetstring *); 114696b5899Stb int ober_get_string(struct ber_element *, char **); 115696b5899Stb int ober_get_nstring(struct ber_element *, void **, 116d4b95dc4Srob size_t *); 117696b5899Stb int ober_get_ostring(struct ber_element *, 118d4b95dc4Srob struct ber_octetstring *); 119696b5899Stb struct ber_element *ober_add_bitstring(struct ber_element *, const void *, 120d4b95dc4Srob size_t); 121696b5899Stb int ober_get_bitstring(struct ber_element *, void **, 122d4b95dc4Srob size_t *); 123696b5899Stb struct ber_element *ober_add_null(struct ber_element *); 124696b5899Stb int ober_get_null(struct ber_element *); 125696b5899Stb struct ber_element *ober_add_eoc(struct ber_element *); 126696b5899Stb int ober_get_eoc(struct ber_element *); 127696b5899Stb struct ber_element *ober_add_oid(struct ber_element *, struct ber_oid *); 128696b5899Stb struct ber_element *ober_add_noid(struct ber_element *, struct ber_oid *, int); 129696b5899Stb struct ber_element *ober_add_oidstring(struct ber_element *, const char *); 130696b5899Stb int ober_get_oid(struct ber_element *, struct ber_oid *); 131696b5899Stb size_t ober_oid2ber(struct ber_oid *, u_int8_t *, size_t); 132696b5899Stb int ober_string2oid(const char *, struct ber_oid *); 133696b5899Stb struct ber_element *ober_printf_elements(struct ber_element *, char *, ...); 134696b5899Stb int ober_scanf_elements(struct ber_element *, char *, ...); 135696b5899Stb ssize_t ober_get_writebuf(struct ber *, void **); 136696b5899Stb ssize_t ober_write_elements(struct ber *, struct ber_element *); 137696b5899Stb void ober_set_readbuf(struct ber *, void *, size_t); 138696b5899Stb struct ber_element *ober_read_elements(struct ber *, struct ber_element *); 139696b5899Stb off_t ober_getpos(struct ber_element *); 14063beb567Smartijn struct ber_element *ober_dup(struct ber_element *); 141696b5899Stb void ober_free_element(struct ber_element *); 142696b5899Stb void ober_free_elements(struct ber_element *); 143696b5899Stb size_t ober_calc_len(struct ber_element *); 144696b5899Stb void ober_set_application(struct ber *, 145d4b95dc4Srob unsigned int (*)(struct ber_element *)); 146696b5899Stb void ober_set_writecallback(struct ber_element *, 147d4b95dc4Srob void (*)(void *, size_t), void *); 148696b5899Stb void ober_free(struct ber *); 149696b5899Stb int ober_oid_cmp(struct ber_oid *, struct ber_oid *); 150d4b95dc4Srob 151d4b95dc4Srob __END_DECLS 152d4b95dc4Srob 153d4b95dc4Srob #endif /* _BER_H */ 154