Annotation of src/usr.bin/ldap/ber.h, Revision 1.8
1.8 ! martijn 1: /* $OpenBSD: ber.h,v 1.7 2018/08/12 22:04:09 rob Exp $ */
1.1 reyk 2:
3: /*
1.3 rob 4: * Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org>
1.1 reyk 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:
1.4 rob 20: #ifndef _BER_H
21: #define _BER_H
22:
1.8 ! martijn 23: struct ber_octetstring {
! 24: size_t ostr_len;
! 25: const void *ostr_val;
! 26: };
! 27:
1.1 reyk 28: struct ber_element {
29: struct ber_element *be_next;
1.5 claudio 30: unsigned int be_type;
31: unsigned int be_encoding;
1.1 reyk 32: size_t be_len;
1.4 rob 33: off_t be_offs;
1.1 reyk 34: int be_free;
35: u_int8_t be_class;
1.4 rob 36: void (*be_cb)(void *, size_t);
37: void *be_cbarg;
1.1 reyk 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 {
1.4 rob 49: off_t br_offs;
1.1 reyk 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:
1.5 claudio 57: unsigned int (*br_application)(struct ber_element *);
1.1 reyk 58: };
59:
60: /* well-known ber_element types */
1.5 claudio 61: #define BER_TYPE_DEFAULT ((unsigned int)-1)
1.1 reyk 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 */
1.6 rob 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 */
1.1 reyk 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
1.5 claudio 93: struct ber_element *ber_get_element(unsigned int);
1.1 reyk 94: void ber_set_header(struct ber_element *, int,
1.5 claudio 95: unsigned int);
1.1 reyk 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);
1.8 ! martijn 112: struct ber_element *ber_add_ostring(struct ber_element *,
! 113: struct ber_octetstring *);
1.1 reyk 114: int ber_get_string(struct ber_element *, char **);
115: int ber_get_nstring(struct ber_element *, void **,
116: size_t *);
1.8 ! martijn 117: int ber_get_ostring(struct ber_element *,
! 118: struct ber_octetstring *);
1.1 reyk 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 **);
1.7 rob 136: ssize_t ber_write_elements(struct ber *, struct ber_element *);
1.1 reyk 137: void ber_set_readbuf(struct ber *, void *, size_t);
138: struct ber_element *ber_read_elements(struct ber *, struct ber_element *);
1.4 rob 139: off_t ber_getpos(struct ber_element *);
1.2 rob 140: void ber_free_element(struct ber_element *);
1.1 reyk 141: void ber_free_elements(struct ber_element *);
142: size_t ber_calc_len(struct ber_element *);
143: void ber_set_application(struct ber *,
1.5 claudio 144: unsigned int (*)(struct ber_element *));
1.4 rob 145: void ber_set_writecallback(struct ber_element *,
146: void (*)(void *, size_t), void *);
1.1 reyk 147: void ber_free(struct ber *);
1.4 rob 148: int ber_oid_cmp(struct ber_oid *, struct ber_oid *);
149:
1.1 reyk 150: __END_DECLS
1.4 rob 151:
152: #endif /* _BER_H */