Annotation of src/usr.bin/ldap/ber.h, Revision 1.7
1.7 ! rob 1: /* $OpenBSD: ber.h,v 1.6 2018/08/03 01:51:28 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.1 reyk 23: struct ber_element {
24: struct ber_element *be_next;
1.5 claudio 25: unsigned int be_type;
26: unsigned int be_encoding;
1.1 reyk 27: size_t be_len;
1.4 rob 28: off_t be_offs;
1.1 reyk 29: int be_free;
30: u_int8_t be_class;
1.4 rob 31: void (*be_cb)(void *, size_t);
32: void *be_cbarg;
1.1 reyk 33: union {
34: struct ber_element *bv_sub;
35: void *bv_val;
36: long long bv_numeric;
37: } be_union;
38: #define be_sub be_union.bv_sub
39: #define be_val be_union.bv_val
40: #define be_numeric be_union.bv_numeric
41: };
42:
43: struct ber {
1.4 rob 44: off_t br_offs;
1.1 reyk 45: u_char *br_wbuf;
46: u_char *br_wptr;
47: u_char *br_wend;
48: u_char *br_rbuf;
49: u_char *br_rptr;
50: u_char *br_rend;
51:
1.5 claudio 52: unsigned int (*br_application)(struct ber_element *);
1.1 reyk 53: };
54:
55: /* well-known ber_element types */
1.5 claudio 56: #define BER_TYPE_DEFAULT ((unsigned int)-1)
1.1 reyk 57: #define BER_TYPE_EOC 0
58: #define BER_TYPE_BOOLEAN 1
59: #define BER_TYPE_INTEGER 2
60: #define BER_TYPE_BITSTRING 3
61: #define BER_TYPE_OCTETSTRING 4
62: #define BER_TYPE_NULL 5
63: #define BER_TYPE_OBJECT 6
64: #define BER_TYPE_ENUMERATED 10
65: #define BER_TYPE_SEQUENCE 16
66: #define BER_TYPE_SET 17
67:
68: /* ber classes */
69: #define BER_CLASS_UNIVERSAL 0x0
70: #define BER_CLASS_UNIV BER_CLASS_UNIVERSAL
71: #define BER_CLASS_APPLICATION 0x1
72: #define BER_CLASS_APP BER_CLASS_APPLICATION
73: #define BER_CLASS_CONTEXT 0x2
74: #define BER_CLASS_PRIVATE 0x3
75: #define BER_CLASS_MASK 0x3
76:
77: /* common definitions */
1.6 rob 78: #define BER_MIN_OID_LEN 2 /* OBJECT */
79: #define BER_MAX_OID_LEN 32 /* OBJECT */
80: #define BER_MAX_SEQ_ELEMENTS USHRT_MAX /* 65535 */
1.1 reyk 81:
82: struct ber_oid {
83: u_int32_t bo_id[BER_MAX_OID_LEN + 1];
84: size_t bo_n;
85: };
86:
87: __BEGIN_DECLS
1.5 claudio 88: struct ber_element *ber_get_element(unsigned int);
1.1 reyk 89: void ber_set_header(struct ber_element *, int,
1.5 claudio 90: unsigned int);
1.1 reyk 91: void ber_link_elements(struct ber_element *,
92: struct ber_element *);
93: struct ber_element *ber_unlink_elements(struct ber_element *);
94: void ber_replace_elements(struct ber_element *,
95: struct ber_element *);
96: struct ber_element *ber_add_sequence(struct ber_element *);
97: struct ber_element *ber_add_set(struct ber_element *);
98: struct ber_element *ber_add_integer(struct ber_element *, long long);
99: int ber_get_integer(struct ber_element *, long long *);
100: struct ber_element *ber_add_enumerated(struct ber_element *, long long);
101: int ber_get_enumerated(struct ber_element *, long long *);
102: struct ber_element *ber_add_boolean(struct ber_element *, int);
103: int ber_get_boolean(struct ber_element *, int *);
104: struct ber_element *ber_add_string(struct ber_element *, const char *);
105: struct ber_element *ber_add_nstring(struct ber_element *, const char *,
106: size_t);
107: int ber_get_string(struct ber_element *, char **);
108: int ber_get_nstring(struct ber_element *, void **,
109: size_t *);
110: struct ber_element *ber_add_bitstring(struct ber_element *, const void *,
111: size_t);
112: int ber_get_bitstring(struct ber_element *, void **,
113: size_t *);
114: struct ber_element *ber_add_null(struct ber_element *);
115: int ber_get_null(struct ber_element *);
116: struct ber_element *ber_add_eoc(struct ber_element *);
117: int ber_get_eoc(struct ber_element *);
118: struct ber_element *ber_add_oid(struct ber_element *, struct ber_oid *);
119: struct ber_element *ber_add_noid(struct ber_element *, struct ber_oid *, int);
120: struct ber_element *ber_add_oidstring(struct ber_element *, const char *);
121: int ber_get_oid(struct ber_element *, struct ber_oid *);
122: size_t ber_oid2ber(struct ber_oid *, u_int8_t *, size_t);
123: int ber_string2oid(const char *, struct ber_oid *);
124: struct ber_element *ber_printf_elements(struct ber_element *, char *, ...);
125: int ber_scanf_elements(struct ber_element *, char *, ...);
126: ssize_t ber_get_writebuf(struct ber *, void **);
1.7 ! rob 127: ssize_t ber_write_elements(struct ber *, struct ber_element *);
1.1 reyk 128: void ber_set_readbuf(struct ber *, void *, size_t);
129: struct ber_element *ber_read_elements(struct ber *, struct ber_element *);
1.4 rob 130: off_t ber_getpos(struct ber_element *);
1.2 rob 131: void ber_free_element(struct ber_element *);
1.1 reyk 132: void ber_free_elements(struct ber_element *);
133: size_t ber_calc_len(struct ber_element *);
134: void ber_set_application(struct ber *,
1.5 claudio 135: unsigned int (*)(struct ber_element *));
1.4 rob 136: void ber_set_writecallback(struct ber_element *,
137: void (*)(void *, size_t), void *);
1.1 reyk 138: void ber_free(struct ber *);
1.4 rob 139: int ber_oid_cmp(struct ber_oid *, struct ber_oid *);
140:
1.1 reyk 141: __END_DECLS
1.4 rob 142:
143: #endif /* _BER_H */