Discussed with and ok jmc@, schwarze@, claudio@OPENBSD_6_6
@ -1,454 +0,0 @@ | |||
.\" $OpenBSD: ber.3,v 1.2 2019/05/12 19:29:41 rob Exp $ | |||
.\" | |||
.\" Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> | |||
.\" | |||
.\" Permission to use, copy, modify, and distribute this software for any | |||
.\" purpose with or without fee is hereby granted, provided that the above | |||
.\" copyright notice and this permission notice appear in all copies. | |||
.\" | |||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
.\" | |||
.Dd $Mdocdate: May 12 2019 $ | |||
.Dt BER 3 | |||
.Os | |||
.Sh NAME | |||
.Nm ber_get_element , | |||
.Nm ber_set_header , | |||
.Nm ber_link_elements , | |||
.Nm ber_unlink_elements , | |||
.Nm ber_replace_elements , | |||
.Nm ber_add_sequence , | |||
.Nm ber_add_set , | |||
.Nm ber_add_enumerated , | |||
.Nm ber_add_integer , | |||
.Nm ber_get_integer , | |||
.Nm ber_get_enumerated , | |||
.Nm ber_add_boolean , | |||
.Nm ber_get_boolean , | |||
.Nm ber_add_string , | |||
.Nm ber_add_nstring , | |||
.Nm ber_add_ostring , | |||
.Nm ber_add_bitstring , | |||
.Nm ber_get_string , | |||
.Nm ber_get_nstring , | |||
.Nm ber_get_ostring , | |||
.Nm ber_get_bitstring , | |||
.Nm ber_add_null , | |||
.Nm ber_get_null , | |||
.Nm ber_add_eoc , | |||
.Nm ber_get_eoc , | |||
.Nm ber_add_oid , | |||
.Nm ber_add_noid , | |||
.Nm ber_add_oidstring , | |||
.Nm ber_get_oid , | |||
.Nm ber_oid2ber , | |||
.Nm ber_string2oid , | |||
.Nm ber_oid_cmp , | |||
.Nm ber_printf_elements , | |||
.Nm ber_scanf_elements , | |||
.Nm ber_get_writebuf , | |||
.Nm ber_write_elements , | |||
.Nm ber_set_readbuf , | |||
.Nm ber_read_elements , | |||
.Nm ber_getpos , | |||
.Nm ber_free_element , | |||
.Nm ber_free_elements , | |||
.Nm ber_calc_len , | |||
.Nm ber_set_application , | |||
.Nm ber_set_writecallback , | |||
.Nm ber_free | |||
.Nd encode and decode ASN.1 with Basic Encoding Rules | |||
.Sh SYNOPSIS | |||
.In sys/types.h | |||
.In ber.h | |||
.Ft "struct ber_element *" | |||
.Fn "ber_get_element" "unsigned int encoding" | |||
.Ft "void" | |||
.Fn "ber_set_header" "struct ber_element *elm" "int class" "unsigned int type" | |||
.Ft "void" | |||
.Fn "ber_link_elements" "struct ber_element *prev" "struct ber_element *elm" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_unlink_elements" "struct ber_element *prev" | |||
.Ft "void" | |||
.Fn "ber_replace_elements" "struct ber_element *prev" "struct ber_element *elm" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_sequence" "struct ber_element *prev" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_set" "struct ber_element *prev" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_integer" "struct ber_element *prev" "long long val" | |||
.Ft "int" | |||
.Fn "ber_get_integer" "struct ber_element *root" "long long *val" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_enumerated" "struct ber_element *prev" "long long val" | |||
.Ft "int" | |||
.Fn "ber_get_enumerated" "struct ber_element *root" "long long *val" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_boolean" "struct ber_element *prev" "int bool" | |||
.Ft "int" | |||
.Fn "ber_get_boolean" "struct ber_element *root" "int *bool" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_string" "struct ber_element *prev" "const char *string" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_nstring" "struct ber_element *prev" "const char *string" "size_t size" | |||
.Ft "struct ber_element *" | |||
.Fo "ber_add_ostring" | |||
.Fa "struct ber_element *prev" | |||
.Fa "struct ber_octetstring *ostring" | |||
.Fc | |||
.Ft "int" | |||
.Fn "ber_get_string" "struct ber_element *root" "char **charbuf" | |||
.Ft "int" | |||
.Fn "ber_get_nstring" "struct ber_element *root" "void **buf" "size_t *size" | |||
.Ft "int" | |||
.Fn "ber_get_ostring" "struct ber_element *root" "struct ber_octetstring *ostring" | |||
.Ft "struct ber_element *" | |||
.Fo "ber_add_bitstring" | |||
.Fa "struct ber_element *prev" | |||
.Fa "const void *buf" | |||
.Fa "size_t size" | |||
.Fc | |||
.Ft "int" | |||
.Fn "ber_get_bitstring" "struct ber_element *root" "void **buf" "size_t *size" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_null" "struct ber_element *prev" | |||
.Ft "int" | |||
.Fn "ber_get_null" "struct ber_element *root" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_eoc" "struct ber_element *prev" | |||
.Ft "int" | |||
.Fn "ber_get_eoc" "struct ber_element *root" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_oid" "struct ber_element *prev" "struct ber_oid *oid" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_noid" "struct ber_element *prev" "struct ber_oid *oid" "int n" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_oidstring" "struct ber_element *prev" "const char *string" | |||
.Ft "int" | |||
.Fn "ber_get_oid" "struct ber_element *root" "struct ber_oid *oid" | |||
.Ft "size_t" | |||
.Fn "ber_oid2ber" "struct ber_oid *oid" "u_int8_t *buf" "size_t size" | |||
.Ft "int" | |||
.Fn "ber_string2oid" "const char *string" "struct ber_oid *oid" | |||
.Ft "int" | |||
.Fn "ber_oid_cmp" "struct ber_oid *oid" "struct ber_oid *oid" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_printf_elements" "struct ber_element *prev" "char *format" "..." | |||
.Ft "int" | |||
.Fn "ber_scanf_elements" "struct ber_element *root" "char *format" "..." | |||
.Ft "ssize_t" | |||
.Fn "ber_get_writebuf" "struct ber *ber" "void **buf" | |||
.Ft "ssize_t" | |||
.Fn "ber_write_elements" "struct ber *ber" "struct ber_element *root" | |||
.Ft "void" | |||
.Fn "ber_set_readbuf" "struct ber *ber" "void *buf" "size_t len" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_read_elements" "struct ber *ber" "struct ber_element *root" | |||
.Ft off_t | |||
.Fn "ber_getpos" "struct ber_element *elm" | |||
.Ft "void" | |||
.Fn "ber_free_element" "struct ber_element *root" | |||
.Ft "void" | |||
.Fn "ber_free_elements" "struct ber_element *root" | |||
.Ft "size_t" | |||
.Fn "ber_calc_len" "struct ber_element *root" | |||
.Ft "void" | |||
.Fo "ber_set_application" | |||
.Fa "struct ber *ber" | |||
.Fa "unsigned int (*cb)(struct ber_element *)" | |||
.Fc | |||
.Ft "void" | |||
.Fo "ber_set_writecallback" | |||
.Fa "struct ber_element *elm" | |||
.Fa "void (*cb)(void *arg, size_t offs)" | |||
.Fa "void *arg" | |||
.Fc | |||
.Ft "void" | |||
.Fn "ber_free" "struct ber *ber" | |||
.Sh DESCRIPTION | |||
The | |||
.Nm ber | |||
API provides a mechanism to read and write ASN.1 streams and buffers using the | |||
Basic Encoding Rules. | |||
.Pp | |||
Encoded | |||
.Nm ber | |||
is stored in the following structure: | |||
.Bd -literal | |||
struct ber { | |||
off_t br_offs; | |||
u_char *br_wbuf; | |||
u_char *br_wptr; | |||
u_char *br_wend; | |||
u_char *br_rbuf; | |||
u_char *br_rptr; | |||
u_char *br_rend; | |||
unsigned int (*br_application)(struct ber_element *); | |||
}; | |||
.Ed | |||
.Pp | |||
.Fa br_rbuf | |||
and | |||
.Fa br_wbuf | |||
are the read and write buffers for a | |||
.Nm ber | |||
stream. | |||
These buffers are used when reading an existing byte stream (e.g. received from | |||
a TLS connection), or when writing a new byte stream in preparation for | |||
subsequent operations performed by the calling application (e.g. network | |||
transmission or export to a file). | |||
.Pp | |||
Intermediary storage of ber elements during decoding and encoding uses the | |||
following structure: | |||
.Bd -literal | |||
struct ber_element { | |||
struct ber_element *be_next; | |||
unsigned int be_type; | |||
unsigned int be_encoding; | |||
size_t be_len; | |||
off_t be_offs; | |||
int be_free; | |||
u_int8_t be_class; | |||
void (*be_cb)(void *, size_t); | |||
void *be_cbarg; | |||
union { | |||
struct ber_element *bv_sub; | |||
void *bv_val; | |||
long long bv_numeric; | |||
} be_union; | |||
#define be_sub be_union.bv_sub | |||
#define be_val be_union.bv_val | |||
#define be_numeric be_union.bv_numeric | |||
}; | |||
.Ed | |||
.Pp | |||
A linked list containing one or more | |||
.Vt ber_element | |||
is created during the decoding and encoding of | |||
.Vt ber . | |||
.Pp | |||
Once the | |||
.Vt ber | |||
and | |||
.Vt ber_element | |||
data structures have been declared, | |||
.Fn ber_set_readbuf | |||
may be called to initialize | |||
.Fa br_rbuf | |||
in preparation for decoding. | |||
It is assumed that a pointer to a ber byte stream is already available to the | |||
application, commonly obtained by | |||
.Xr read 2 , | |||
.Xr recv 2 , | |||
or | |||
.Xr tls_read 3 . | |||
.Fn ber_read_elements | |||
may then be called to parse, validate, and store the data stream into its | |||
consituent parts for subsequent processing. | |||
.Fn ber_read_elements | |||
returns a pointer to a fully populated list of one or more | |||
.Vt ber_element , | |||
or | |||
.Dv NULL | |||
on a type mismatch or read error. | |||
.Pp | |||
The calling application must have explicit knowledge of the expected data | |||
types in order for correct decoding. | |||
.Fn ber_scanf_elements | |||
may be called to extract | |||
.Vt ber_element | |||
content into local variables. | |||
The | |||
.Fn ber_get_* | |||
functions extract the value of a single | |||
.Vt ber_element | |||
instance. | |||
.Fn ber_scanf_elements | |||
and the | |||
.Fn ber_get_* | |||
functions return 0 on success and -1 on failure. | |||
.Pp | |||
The first step when creating new ber is to populate | |||
.Vt ber_element | |||
with the desired content. | |||
This may be achieved using the | |||
.Fn ber_add_* | |||
and | |||
.Fn ber_printf_elements | |||
functions, each of which return a pointer to | |||
.Vt ber_element | |||
on success or | |||
.Dv NULL | |||
on failure. | |||
.Pp | |||
Once | |||
.Vt ber_element | |||
has been fully populated, | |||
.Fn ber_get_writebuf | |||
may be used to initialize | |||
.Fa br_wbuf | |||
for writing. | |||
.Fn ber_write_elements | |||
encodes | |||
.Vt ber_element | |||
into a compliant | |||
.Nm ber | |||
byte stream for subsequent use by the calling application, most commonly using | |||
.Xr send 2 , | |||
.Xr write 2 , | |||
or | |||
.Xr tls_write 3 . | |||
.Sh I/O OPERATIONS | |||
.Fn ber_get_writebuf , | |||
.Fn ber_write_elements , | |||
.Fn ber_set_readbuf , | |||
.Fn ber_read_elements , | |||
.Fn ber_getpos , | |||
.Fn ber_free_element , | |||
.Fn ber_free_elements , | |||
.Fn ber_set_application , | |||
.Fn ber_set_writecallback , | |||
.Fn ber_free | |||
.Sh BER ELEMENTS | |||
.Fn ber_get_element , | |||
.Fn ber_set_header , | |||
.Fn ber_link_elements , | |||
.Fn ber_unlink_elements , | |||
.Fn ber_replace_elements , | |||
.Fn ber_calc_len | |||
.Sh BER TYPES | |||
.Fn ber_add_sequence , | |||
.Fn ber_add_set , | |||
.Fn ber_add_integer , | |||
.Fn ber_get_integer , | |||
.Fn ber_add_enumerated , | |||
.Fn ber_get_enumerated , | |||
.Fn ber_add_boolean , | |||
.Fn ber_get_boolean , | |||
.Fn ber_add_string , | |||
.Fn ber_add_nstring , | |||
.Fn ber_add_ostring , | |||
.Fn ber_add_bitstring , | |||
.Fn ber_get_string , | |||
.Fn ber_get_nstring , | |||
.Fn ber_get_ostring , | |||
.Fn ber_get_bitstring , | |||
.Fn ber_add_null , | |||
.Fn ber_get_null , | |||
.Fn ber_add_eoc , | |||
.Fn ber_get_eoc | |||
.Sh FORMAT STRINGS | |||
.Fn ber_printf_elements , | |||
.Fn ber_scanf_elements | |||
.Sh OBJECT IDS | |||
Object Identifiers are commonly used in ASN.1-based protocols. | |||
These functions provide an interface to parse OIDs. | |||
For internal representation of OIDs, the following structure | |||
.Vt struct ber_oid | |||
is being used: | |||
.Bd -literal | |||
#define BER_MIN_OID_LEN 2 | |||
#define BER_MAX_OID_LEN 32 | |||
struct ber_oid { | |||
u_int32_t bo_id[BER_MAX_OID_LEN + 1]; | |||
size_t bo_n; | |||
}; | |||
.Ed | |||
.Pp | |||
.Fn ber_add_oid , | |||
.Fn ber_add_noid , | |||
.Fn ber_add_oidstring , | |||
.Fn ber_get_oid , | |||
.Fn ber_oid2ber , | |||
.Fn ber_string2oid | |||
.Fn ber_oid_cmp , | |||
.Sh RETURN VALUES | |||
Upon successful completion | |||
.Fn ber_get_integer , | |||
.Fn ber_get_enumerated , | |||
.Fn ber_get_boolean , | |||
.Fn ber_get_string , | |||
.Fn ber_get_nstring , | |||
.Fn ber_get_ostring , | |||
.Fn ber_get_bitstring , | |||
.Fn ber_get_null , | |||
.Fn ber_get_eoc , | |||
.Fn ber_get_oid , | |||
.Fn ber_string2oid | |||
and | |||
.Fn ber_scanf_elements | |||
return 0, while | |||
.Fn ber_write_elements | |||
returns the number of bytes written. | |||
Otherwise, \-1 is returned and the global variable errno is | |||
set to indicate the error. | |||
.Sh SEE ALSO | |||
.Xr read 2 , | |||
.Xr recv 2 , | |||
.Xr send 2 , | |||
.Xr write 2 , | |||
.Xr tls_read 3 | |||
.Sh STANDARDS | |||
ITU-T Recommendation X.690, also known as ISO/IEC 8825-1: | |||
Information technology - ASN.1 encoding rules. | |||
.Sh HISTORY | |||
The | |||
.Nm ber | |||
manpage first appeared in | |||
.Ox 4.3 . | |||
.Sh AUTHORS | |||
.An -nosplit | |||
The | |||
.Nm ber | |||
library was written by | |||
.An Claudio Jeker Aq Mt claudio@openbsd.org , | |||
.An Marc Balmer Aq Mt marc@openbsd.org | |||
and | |||
.An Reyk Floeter Aq Mt reyk@openbsd.org . | |||
.Sh CAVEATS | |||
The | |||
.Nm ber | |||
API is subject to the following restrictions which are common to the | |||
Distinguished Encoding Rules as defined by X.690: | |||
.Pp | |||
.Bl -enum -compact | |||
.It | |||
Only the definite form of length encoding shall be used, encoded in the | |||
minimum number of octets. | |||
.It | |||
For bitstring, octetstring and restricted character string types, the | |||
constructed form of encoding shall not be used. | |||
.It | |||
If a boolean encoding represents the boolean value TRUE, its single contents | |||
octet shall have all eight bits set to one. | |||
.It | |||
Each unused bit in the final octet of the encoding of a bit string value shall | |||
be set to zero. | |||
.It | |||
If a bitstring value has no 1 bits, then an encoder shall encode the value with | |||
a length of 1 and an initial octet set to 0. | |||
.El | |||
.Pp | |||
In addition, set and sequence values are limited to a maximum of 65535 elements. | |||
No alternative encodings are permitted. | |||
.Pp | |||
.Do | |||
Whereas the basic encoding rules give the sender of an encoding various choices | |||
as to how data values may be encoded, the canonical and distinguished encoding | |||
rules select just one encoding from those allowed by the basic encoding rules. | |||
.Dc | |||
.Bq X.690 | |||
.Pp | |||
The restrictions placed on this API avoid the ambiguity inherent in | |||
.Nm ber | |||
encoded ASN.1 thereby acting as a security mitigation. | |||
.Sh BUGS | |||
This manpage is a stub. |
@ -0,0 +1,167 @@ | |||
.\" $OpenBSD: ber_add_string.3,v 1.1 2019/05/15 03:11:52 rob Exp $ | |||
.\" | |||
.\" Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> | |||
.\" | |||
.\" Permission to use, copy, modify, and distribute this software for any | |||
.\" purpose with or without fee is hereby granted, provided that the above | |||
.\" copyright notice and this permission notice appear in all copies. | |||
.\" | |||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
.\" | |||
.Dd $Mdocdate: May 15 2019 $ | |||
.Dt BER_ADD_STRING 3 | |||
.Os | |||
.Sh NAME | |||
.Nm ber_get_element , | |||
.Nm ber_add_sequence , | |||
.Nm ber_add_set , | |||
.Nm ber_add_null , | |||
.Nm ber_add_eoc , | |||
.Nm ber_add_integer , | |||
.Nm ber_add_enumerated , | |||
.Nm ber_add_boolean , | |||
.Nm ber_add_string , | |||
.Nm ber_add_nstring , | |||
.Nm ber_add_ostring , | |||
.Nm ber_add_bitstring , | |||
.Nm ber_add_oid , | |||
.Nm ber_add_noid , | |||
.Nm ber_add_oidstring , | |||
.Nm ber_printf_elements | |||
.Nd create ASN.1 objects for BER encoding | |||
.Sh SYNOPSIS | |||
.In sys/types.h | |||
.In ber.h | |||
.Ft "struct ber_element *" | |||
.Fn "ber_get_element" "unsigned int encoding" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_sequence" "struct ber_element *prev" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_set" "struct ber_element *prev" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_null" "struct ber_element *prev" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_eoc" "struct ber_element *prev" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_integer" "struct ber_element *prev" "long long val" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_enumerated" "struct ber_element *prev" "long long val" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_boolean" "struct ber_element *prev" "int bool" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_string" "struct ber_element *prev" "const char *string" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_nstring" "struct ber_element *prev" "const char *string" "size_t size" | |||
.Ft "struct ber_element *" | |||
.Fo "ber_add_ostring" | |||
.Fa "struct ber_element *prev" | |||
.Fa "struct ber_octetstring *ostring" | |||
.Fc | |||
.Ft "struct ber_element *" | |||
.Fo "ber_add_bitstring" | |||
.Fa "struct ber_element *prev" | |||
.Fa "const void *buf" | |||
.Fa "size_t size" | |||
.Fc | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_oid" "struct ber_element *prev" "struct ber_oid *oid" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_noid" "struct ber_element *prev" "struct ber_oid *oid" "int n" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_add_oidstring" "struct ber_element *prev" "const char *string" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_printf_elements" "struct ber_element *prev" "char *format" "..." | |||
.Sh DESCRIPTION | |||
Intermediary storage of BER elements during encoding and decoding uses the | |||
following structure: | |||
.Bd -literal | |||
struct ber_element { | |||
struct ber_element *be_next; | |||
unsigned int be_type; | |||
unsigned int be_encoding; | |||
size_t be_len; | |||
off_t be_offs; | |||
int be_free; | |||
u_int8_t be_class; | |||
void (*be_cb)(void *, size_t); | |||
void *be_cbarg; | |||
union { | |||
struct ber_element *bv_sub; | |||
void *bv_val; | |||
long long bv_numeric; | |||
} be_union; | |||
#define be_sub be_union.bv_sub | |||
#define be_val be_union.bv_val | |||
#define be_numeric be_union.bv_numeric | |||
}; | |||
.Ed | |||
.Pp | |||
.Fn ber_get_element | |||
creates a new | |||
.Vt ber_element | |||
with default values, dynamically allocates required storage, and sets | |||
.Fa be_encoding | |||
to | |||
.Fa encoding . | |||
.Pp | |||
The | |||
.Fn ber_add_* | |||
and | |||
.Fn ber_printf_elements | |||
functions may be used to populate | |||
.Vt ber_element . | |||
.Sh RETURN VALUES | |||
Upon successful completion, | |||
.Fn ber_get_element , | |||
.Fn ber_add_sequence , | |||
.Fn ber_add_set , | |||
.Fn ber_add_null , | |||
.Fn ber_add_eoc , | |||
.Fn ber_add_integer , | |||
.Fn ber_add_enumerated , | |||
.Fn ber_add_boolean , | |||
.Fn ber_add_string , | |||
.Fn ber_add_nstring , | |||
.Fn ber_add_ostring , | |||
.Fn ber_add_bitstring , | |||
.Fn ber_add_oid , | |||
.Fn ber_add_noid , | |||
.Fn ber_add_oidstring , | |||
and | |||
.Fn ber_printf_elements | |||
return a pointer to a populated | |||
.Vt ber_element . | |||
Otherwise | |||
.Dv NULL | |||
is returned and the global variable errno is | |||
set to indicate the error. | |||
.Sh SEE ALSO | |||
.Xr ber_get_string 3 , | |||
.Xr ber_oid_cmp 3 , | |||
.Xr ber_read_elements 3 , | |||
.Xr ber_set_header 3 | |||
.Sh STANDARDS | |||
ITU-T Recommendation X.690, also known as ISO/IEC 8825-1: | |||
Information technology - ASN.1 encoding rules. | |||
.Sh HISTORY | |||
These functions first appeared as internal functions in | |||
.Xr snmpd 8 | |||
in | |||
.Ox 4.2 | |||
and were moved to libutil in | |||
.Ox 6.6 . | |||
.Sh AUTHORS | |||
.An -nosplit | |||
The | |||
.Nm ber | |||
library was written by | |||
.An Claudio Jeker Aq Mt claudio@openbsd.org , | |||
.An Marc Balmer Aq Mt marc@openbsd.org | |||
and | |||
.An Reyk Floeter Aq Mt reyk@openbsd.org . |
@ -0,0 +1,120 @@ | |||
.\" $OpenBSD: ber_get_string.3,v 1.1 2019/05/15 03:11:52 rob Exp $ | |||
.\" | |||
.\" Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> | |||
.\" | |||
.\" Permission to use, copy, modify, and distribute this software for any | |||
.\" purpose with or without fee is hereby granted, provided that the above | |||
.\" copyright notice and this permission notice appear in all copies. | |||
.\" | |||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
.\" | |||
.Dd $Mdocdate: May 15 2019 $ | |||
.Dt BER_GET_STRING 3 | |||
.Os | |||
.Sh NAME | |||
.Nm ber_get_null , | |||
.Nm ber_get_eoc , | |||
.Nm ber_get_integer , | |||
.Nm ber_get_enumerated , | |||
.Nm ber_get_boolean , | |||
.Nm ber_get_string , | |||
.Nm ber_get_nstring , | |||
.Nm ber_get_ostring , | |||
.Nm ber_get_bitstring , | |||
.Nm ber_get_oid , | |||
.Nm ber_getpos , | |||
.Nm ber_scanf_elements | |||
.Nd access properties of ASN.1 objects decoded from BER | |||
.Sh SYNOPSIS | |||
.In sys/types.h | |||
.In ber.h | |||
.Ft "int" | |||
.Fn "ber_get_null" "struct ber_element *root" | |||
.Ft "int" | |||
.Fn "ber_get_eoc" "struct ber_element *root" | |||
.Ft "int" | |||
.Fn "ber_get_integer" "struct ber_element *root" "long long *val" | |||
.Ft "int" | |||
.Fn "ber_get_enumerated" "struct ber_element *root" "long long *val" | |||
.Ft "int" | |||
.Fn "ber_get_boolean" "struct ber_element *root" "int *bool" | |||
.Ft "int" | |||
.Fn "ber_get_string" "struct ber_element *root" "char **charbuf" | |||
.Ft "int" | |||
.Fn "ber_get_nstring" "struct ber_element *root" "void **buf" "size_t *size" | |||
.Ft "int" | |||
.Fn "ber_get_ostring" "struct ber_element *root" "struct ber_octetstring *ostring" | |||
.Ft "int" | |||
.Fn "ber_get_bitstring" "struct ber_element *root" "void **buf" "size_t *size" | |||
.Ft "int" | |||
.Fn "ber_get_oid" "struct ber_element *root" "struct ber_oid *oid" | |||
.Ft off_t | |||
.Fn "ber_getpos" "struct ber_element *elm" | |||
.Ft "int" | |||
.Fn "ber_scanf_elements" "struct ber_element *root" "char *format" "..." | |||
.Sh DESCRIPTION | |||
The | |||
.Fn ber_get_* | |||
and | |||
.Fn ber_scanf_elements | |||
functions may be used to save | |||
.Vt ber_element | |||
values into local variables. | |||
.Pp | |||
.Fn ber_getpos | |||
may be used to obtain the | |||
.Vt ber_element | |||
offset | |||
.Fa be_offs . | |||
.Sh RETURN VALUES | |||
Upon successful completion, | |||
.Fn ber_get_null , | |||
.Fn ber_get_eoc , | |||
.Fn ber_get_integer , | |||
.Fn ber_get_enumerated , | |||
.Fn ber_get_boolean , | |||
.Fn ber_get_string , | |||
.Fn ber_get_nstring , | |||
.Fn ber_get_ostring , | |||
.Fn ber_get_bitstring , | |||
.Fn ber_get_oid , | |||
.Fn ber_string2oid | |||
and | |||
.Fn ber_scanf_elements | |||
return 0. | |||
Otherwise \-1 is returned and the global variable errno is | |||
set to indicate the error. | |||
.Pp | |||
.Fn ber_getpos | |||
returns the value of | |||
.Vt be_offs . | |||
.Sh SEE ALSO | |||
.Xr ber_add_string 3 , | |||
.Xr ber_oid_cmp 3 , | |||
.Xr ber_read_elements 3 , | |||
.Xr ber_set_header 3 | |||
.Sh STANDARDS | |||
ITU-T Recommendation X.690, also known as ISO/IEC 8825-1: | |||
Information technology - ASN.1 encoding rules. | |||
.Sh HISTORY | |||
These functions first appeared as internal functions in | |||
.Xr snmpd 8 | |||
in | |||
.Ox 4.2 | |||
and were moved to libutil in | |||
.Ox 6.6 . | |||
.Sh AUTHORS | |||
.An -nosplit | |||
The | |||
.Nm ber | |||
library was written by | |||
.An Claudio Jeker Aq Mt claudio@openbsd.org , | |||
.An Marc Balmer Aq Mt marc@openbsd.org | |||
and | |||
.An Reyk Floeter Aq Mt reyk@openbsd.org . |
@ -0,0 +1,109 @@ | |||
.\" $OpenBSD: ber_oid_cmp.3,v 1.1 2019/05/15 03:11:52 rob Exp $ | |||
.\" | |||
.\" Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> | |||
.\" | |||
.\" Permission to use, copy, modify, and distribute this software for any | |||
.\" purpose with or without fee is hereby granted, provided that the above | |||
.\" copyright notice and this permission notice appear in all copies. | |||
.\" | |||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
.\" | |||
.Dd $Mdocdate: May 15 2019 $ | |||
.Dt BER_OID_CMP 3 | |||
.Os | |||
.Sh NAME | |||
.Nm ber_oid_cmp , | |||
.Nm ber_oid2ber , | |||
.Nm ber_string2oid | |||
.Nd OID helper functions for the BER library | |||
.Sh SYNOPSIS | |||
.In sys/types.h | |||
.In ber.h | |||
.Ft "int" | |||
.Fn "ber_oid_cmp" "struct ber_oid *a" "struct ber_oid *b" | |||
.Ft "size_t" | |||
.Fn "ber_oid2ber" "struct ber_oid *oid" "u_int8_t *buf" "size_t size" | |||
.Ft "int" | |||
.Fn "ber_string2oid" "const char *string" "struct ber_oid *oid" | |||
.Sh DESCRIPTION | |||
Object Identifiers are commonly used in ASN.1-based protocols. | |||
These functions provide an interface to parse OIDs. | |||
For internal representation of OIDs, the following structure | |||
.Vt struct ber_oid | |||
is being used: | |||
.Bd -literal | |||
#define BER_MIN_OID_LEN 2 | |||
#define BER_MAX_OID_LEN 32 | |||
struct ber_oid { | |||
u_int32_t bo_id[BER_MAX_OID_LEN + 1]; | |||
size_t bo_n; | |||
}; | |||
.Ed | |||
.Pp | |||
The | |||
.Fn ber_oid2ber | |||
and | |||
.Fn ber_string2oid | |||
functions may be used to convert from and to | |||
.Vt struct ber_oid . | |||
.Pp | |||
.Fn ber_oid_cmp | |||
may be used to compare two | |||
.Vt ber_oid | |||
structures. | |||
.Sh RETURN VALUES | |||
.Fn ber_oid2ber | |||
returns the number of bytes written or 0 on faliure. | |||
.Pp | |||
.Fn ber_string2oid | |||
returns 0 on success or -1 on failure. | |||
.Pp | |||
.Fn ber_oid_cmp | |||
returns 0 when oids | |||
.Fa a | |||
and | |||
.Fa b | |||
are identical. | |||
If | |||
.Fa b | |||
is a successor of | |||
.Fa a , | |||
1 is returned. | |||
If | |||
.Fa b | |||
is a predecessor of | |||
.Fa a , | |||
-1 is returned. | |||
If | |||
.Fa b | |||
is larger, but a child of | |||
.Fa a , | |||
2 is returned. | |||
.Sh SEE ALSO | |||
.Xr ber_add_string 3 , | |||
.Xr ber_get_string 3 , | |||
.Xr ber_read_elements 3 , | |||
.Xr ber_set_header 3 | |||
.Sh HISTORY | |||
These functions first appeared as internal functions in | |||
.Xr snmpd 8 | |||
in | |||
.Ox 4.2 | |||
and were moved to libutil in | |||
.Ox 6.6 . | |||
.Sh AUTHORS | |||
.An -nosplit | |||
The | |||
.Nm ber | |||
library was written by | |||
.An Claudio Jeker Aq Mt claudio@openbsd.org , | |||
.An Marc Balmer Aq Mt marc@openbsd.org | |||
and | |||
.An Reyk Floeter Aq Mt reyk@openbsd.org . |
@ -0,0 +1,225 @@ | |||
.\" $OpenBSD: ber_read_elements.3,v 1.1 2019/05/15 03:11:52 rob Exp $ | |||
.\" | |||
.\" Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> | |||
.\" | |||
.\" Permission to use, copy, modify, and distribute this software for any | |||
.\" purpose with or without fee is hereby granted, provided that the above | |||
.\" copyright notice and this permission notice appear in all copies. | |||
.\" | |||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
.\" | |||
.Dd $Mdocdate: May 15 2019 $ | |||
.Dt BER_READ_ELEMENTS 3 | |||
.Os | |||
.Sh NAME | |||
.Nm ber_set_readbuf , | |||
.Nm ber_set_application , | |||
.Nm ber_read_elements , | |||
.Nm ber_get_writebuf , | |||
.Nm ber_write_elements , | |||
.Nm ber_free | |||
.Nd encode and decode ASN.1 with Basic Encoding Rules | |||
.Sh SYNOPSIS | |||
.In sys/types.h | |||
.In ber.h | |||
.Ft "void" | |||
.Fn "ber_set_readbuf" "struct ber *ber" "void *buf" "size_t len" | |||
.Ft "void" | |||
.Fo "ber_set_application" | |||
.Fa "struct ber *ber" | |||
.Fa "unsigned int (*cb)(struct ber_element *)" | |||
.Fc | |||
.Ft "struct ber_element *" | |||
.Fn "ber_read_elements" "struct ber *ber" "struct ber_element *root" | |||
.Ft "ssize_t" | |||
.Fn "ber_get_writebuf" "struct ber *ber" "void **buf" | |||
.Ft "ssize_t" | |||
.Fn "ber_write_elements" "struct ber *ber" "struct ber_element *root" | |||
.Ft "void" | |||
.Fn "ber_free" "struct ber *ber" | |||
.Sh DESCRIPTION | |||
The BER API provides a mechanism to read and write ASN.1 using the | |||
Basic Encoding Rules. | |||
.Pp | |||
Encoded BER is stored in the following structure: | |||
.Bd -literal | |||
struct ber { | |||
off_t br_offs; | |||
u_char *br_wbuf; | |||
u_char *br_wptr; | |||
u_char *br_wend; | |||
u_char *br_rbuf; | |||
u_char *br_rptr; | |||
u_char *br_rend; | |||
unsigned int (*br_application)(struct ber_element *); | |||
}; | |||
.Ed | |||
.Pp | |||
.Fa br_rbuf | |||
and | |||
.Fa br_wbuf | |||
are the read and write buffers for a BER byte stream. | |||
These buffers are used when reading an existing byte stream (e.g. received from | |||
a TLS connection), or when writing a new byte stream in preparation for | |||
subsequent operations performed by the calling application (e.g. network | |||
transmission or export to a file). | |||
.Pp | |||
Intermediary storage of BER elements during encoding and decoding uses the | |||
following structure: | |||
.Bd -literal | |||
struct ber_element { | |||
struct ber_element *be_next; | |||
unsigned int be_type; | |||
unsigned int be_encoding; | |||
size_t be_len; | |||
off_t be_offs; | |||
int be_free; | |||
u_int8_t be_class; | |||
void (*be_cb)(void *, size_t); | |||
void *be_cbarg; | |||
union { | |||
struct ber_element *bv_sub; | |||
void *bv_val; | |||
long long bv_numeric; | |||
} be_union; | |||
#define be_sub be_union.bv_sub | |||
#define be_val be_union.bv_val | |||
#define be_numeric be_union.bv_numeric | |||
}; | |||
.Ed | |||
.Pp | |||
.Fn ber_set_readbuf | |||
sets | |||
.Fa br_rbuf | |||
to point an input buffer of BER encoded bytes in preparation for decoding. | |||
It is assumed that | |||
.Fa br_rbuf | |||
is already populated and available to the | |||
application, commonly obtained by | |||
.Xr read 2 , | |||
.Xr recv 2 , | |||
or | |||
.Xr tls_read 3 . | |||
.Pp | |||
.Fn ber_read_elements | |||
may then be called to parse, validate, and store the | |||
.Fa ber | |||
data stream into its | |||
consituent | |||
.Vt ber_element | |||
parts for subsequent processing. | |||
The calling application must have explicit knowledge of the expected data | |||
types in order for correct decoding. | |||
.Pp | |||
.Fn ber_get_writebuf | |||
sets | |||
.Fa br_wbuf | |||
to point to an output buffer for writing a BER byte stream. | |||
.Pp | |||
.Fn ber_write_elements | |||
encodes | |||
.Fa root | |||
into a compliant BER byte stream which is written to | |||
.Fa ber | |||
for subsequent use by the calling | |||
functions such as | |||
.Xr send 2 , | |||
.Xr write 2 , | |||
or | |||
.Xr tls_write 3 . | |||
.Pp | |||
.Fn ber_free | |||
frees any dynamically allocated storage associated with | |||
.Fa ber . | |||
.Sh RETURN VALUES | |||
.Fn ber_read_elements | |||
returns a pointer to a fully populated list of one or more | |||
.Vt ber_element | |||
structures or | |||
.Dv NULL | |||
on a type mismatch or read error. | |||
.Pp | |||
.Fn ber_get_writebuf | |||
returns the number of bytes contained within buffer | |||
.Vt b | |||
within the buffer | |||
.Fa buf | |||
or \-1 on failure. | |||
.Pp | |||
.Fn ber_write_elements | |||
returns the number of bytes written. | |||
Otherwise \-1 is returned and the global variable errno is | |||
set to indicate the error. | |||
.Sh SEE ALSO | |||
.Xr read 2 , | |||
.Xr recv 2 , | |||
.Xr send 2 , | |||
.Xr write 2 , | |||
.Xr ber_add_string 3 , | |||
.Xr ber_get_string 3 , | |||
.Xr ber_oid_cmp 3 , | |||
.Xr ber_set_header 3 , | |||
.Xr tls_read 3 | |||
.Sh STANDARDS | |||
ITU-T Recommendation X.690, also known as ISO/IEC 8825-1: | |||
Information technology - ASN.1 encoding rules. | |||
.Sh HISTORY | |||
These functions first appeared as internal functions in | |||
.Xr snmpd 8 | |||
in | |||
.Ox 4.2 | |||
and were moved to libutil in | |||
.Ox 6.6 . | |||
.Sh AUTHORS | |||
.An -nosplit | |||
The | |||
.Nm ber | |||
library was written by | |||
.An Claudio Jeker Aq Mt claudio@openbsd.org , | |||
.An Marc Balmer Aq Mt marc@openbsd.org | |||
and | |||
.An Reyk Floeter Aq Mt reyk@openbsd.org . | |||
.Sh CAVEATS | |||
The | |||
.Nm ber | |||
API is subject to the following restrictions which are common to the | |||
Distinguished Encoding Rules as defined by X.690: | |||
.Pp | |||
.Bl -enum -compact | |||
.It | |||
Only the definite form of length encoding shall be used, encoded in the | |||
minimum number of octets. | |||
.It | |||
For bitstring, octetstring and restricted character string types, the | |||
constructed form of encoding shall not be used. | |||
.It | |||
If a boolean encoding represents the boolean value TRUE, its single contents | |||
octet shall have all eight bits set to one. | |||
.It | |||
Each unused bit in the final octet of the encoding of a bit string value shall | |||
be set to zero. | |||
.It | |||
If a bitstring value has no 1 bits, then an encoder shall encode the value with | |||
a length of 1 and an initial octet set to 0. | |||
.El | |||
.Pp | |||
In addition, set and sequence values are limited to a maximum of 65535 elements. | |||
No alternative encodings are permitted. | |||
.Pp | |||
.Do | |||
Whereas the basic encoding rules give the sender of an encoding various choices | |||
as to how data values may be encoded, the canonical and distinguished encoding | |||
rules select just one encoding from those allowed by the basic encoding rules. | |||
.Dc | |||
.Bq X.690 | |||
.Pp | |||
The restrictions placed on this API avoid the ambiguity inherent in | |||
.Nm ber | |||
encoded ASN.1 thereby acting as a security mitigation. |
@ -0,0 +1,144 @@ | |||
.\" $OpenBSD: ber_set_header.3,v 1.1 2019/05/15 03:11:52 rob Exp $ | |||
.\" | |||
.\" Copyright (c) 2007, 2012 Reyk Floeter <reyk@openbsd.org> | |||
.\" | |||
.\" Permission to use, copy, modify, and distribute this software for any | |||
.\" purpose with or without fee is hereby granted, provided that the above | |||
.\" copyright notice and this permission notice appear in all copies. | |||
.\" | |||
.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |||
.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |||
.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |||
.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |||
.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |||
.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |||
.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |||
.\" | |||
.Dd $Mdocdate: May 15 2019 $ | |||
.Dt BER_SET_HEADER 3 | |||
.Os | |||
.Sh NAME | |||
.Nm ber_set_header , | |||
.Nm ber_calc_len , | |||
.Nm ber_set_writecallback , | |||
.Nm ber_link_elements , | |||
.Nm ber_replace_elements , | |||
.Nm ber_unlink_elements , | |||
.Nm ber_free_element , | |||
.Nm ber_free_elements | |||
.Nd change and destroy ASN.1 objects for BER encoding | |||
.Sh SYNOPSIS | |||
.In sys/types.h | |||
.In ber.h | |||
.Ft "void" | |||
.Fn "ber_set_header" "struct ber_element *elm" "int class" "unsigned int type" | |||
.Ft "size_t" | |||
.Fn "ber_calc_len" "struct ber_element *root" | |||
.Ft "void" | |||
.Fo "ber_set_writecallback" | |||
.Fa "void (*cb)(void *arg, sizeof_t offs)" | |||
.Fc | |||
.Ft "void" | |||
.Fn "ber_link_elements" "struct ber_element *prev" "struct ber_element *elm" | |||
.Ft "void" | |||
.Fn "ber_replace_elements" "struct ber_element *prev" "struct ber_element *elm" | |||
.Ft "struct ber_element *" | |||
.Fn "ber_unlink_elements" "struct ber_element *prev" | |||
.Ft "void" | |||
.Fn "ber_free_element" "struct ber_element *root" | |||
.Ft "void" | |||
.Fn "ber_free_elements" "struct ber_element *root" | |||
.Pp | |||
.Fd #define BER_TYPE_BOOLEAN 1 | |||
.Fd #define BER_TYPE_INTEGER 2 | |||
.Fd #define BER_TYPE_BITSTRING 3 | |||
.Fd #define BER_TYPE_OCTETSTRING 4 | |||
.Fd #define BER_TYPE_NULL 5 | |||
.Fd #define BER_TYPE_OBJECT 6 | |||
.Fd #define BER_TYPE_ENUMERATED 10 | |||
.Fd #define BER_TYPE_SEQUENCE 16 | |||
.Fd #define BER_TYPE_SET 17 | |||
.Pp | |||
.Fd #define BER_TYPE_CONSTRUCTED 0x20 | |||
.Pp | |||
.Fd #define BER_CLASS_UNIVERSAL 0x0 | |||
.Fd #define BER_CLASS_UNIV BER_CLASS_UNIVERSAL | |||
.Fd #define BER_CLASS_APPLICATION 0x1 | |||
.Fd #define BER_CLASS_APP BER_CLASS_APPLICATION | |||
.Fd #define BER_CLASS_CONTEXT 0x2 | |||
.Fd #define BER_CLASS_PRIVATE 0x3 | |||
.Sh DESCRIPTION | |||
.Fn ber_set_header | |||
sets the | |||
.Fa class | |||
and | |||
.Fa type | |||
of | |||
.Fa elm . | |||
.Pp | |||
.Fn ber_calc_len | |||
determines the total length of | |||
.Fa root . | |||
.Pp | |||
.Fn ber_set_writecallback | |||
registers the | |||
.Vt br_cb | |||
callback function. | |||
.Pp | |||
.Fn ber_link_elements | |||
links | |||
.Fa prev | |||
and | |||
.Fa elm . | |||
.Pp | |||
.Fn ber_replace_elements | |||
replaces | |||
.Fa prev | |||
with | |||
.Fa new | |||
and frees any dynamically allocated storage assocated with | |||
.Fa prev . | |||
.Pp | |||
.Fn ber_unlink_elements | |||
unlinks | |||
.Fa prev . | |||
.Pp | |||
.Fn ber_free_element | |||
and | |||
.Fn ber_free_elements | |||
free any dynamically allocated storage associated with | |||
.Fa root . | |||
.Sh RETURN VALUES | |||
.Fn ber_calc_len | |||
returns the total length of a fully populated | |||
.Fa root | |||
containing one or more | |||
.Vt ber_element . | |||
.Pp | |||
.Fn ber_unlink_elements | |||
returns a pointer to | |||
.Vt ber_element . | |||
.Sh SEE ALSO | |||
.Xr ber_add_string 3 , | |||
.Xr ber_get_string 3 , | |||
.Xr ber_oid_cmp 3 , | |||
.Xr ber_read_elements 3 | |||
.Sh STANDARDS | |||
ITU-T Recommendation X.690, also known as ISO/IEC 8825-1: | |||
Information technology - ASN.1 encoding rules. | |||
.Sh HISTORY | |||
These functions first appeared as internal functions in | |||
.Xr snmpd 8 | |||
in | |||
.Ox 4.2 | |||
and were moved to libutil in | |||
.Ox 6.6 . | |||
.Sh AUTHORS | |||
.An -nosplit | |||
The | |||
.Nm ber | |||
library was written by | |||
.An Claudio Jeker Aq Mt claudio@openbsd.org , | |||
.An Marc Balmer Aq Mt marc@openbsd.org | |||
and | |||
.An Reyk Floeter Aq Mt reyk@openbsd.org . |