1207614Simp/* $OpenBSD: ber.h,v 1.2 2008/12/29 15:48:13 aschrijver Exp $ */ 2207614Simp/* $FreeBSD$ */ 3207614Simp 4207614Simp/* 5207614Simp * Copyright (c) 2007 Reyk Floeter <reyk@vantronix.net> 6207614Simp * Copyright (c) 2006, 2007 Claudio Jeker <claudio@openbsd.org> 7207614Simp * 8207614Simp * Permission to use, copy, modify, and distribute this software for any 9207614Simp * purpose with or without fee is hereby granted, provided that the above 10207614Simp * copyright notice and this permission notice appear in all copies. 11207614Simp * 12207614Simp * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13207614Simp * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14207614Simp * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15207614Simp * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16207614Simp * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17207614Simp * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18207614Simp * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19207614Simp */ 20207614Simp 21207614Simpstruct ber_element { 22207614Simp struct ber_element *be_next; 23207614Simp unsigned long be_type; 24207614Simp unsigned long be_encoding; 25207614Simp size_t be_len; 26207614Simp int be_free; 27207614Simp u_int8_t be_class; 28207614Simp union { 29207614Simp struct ber_element *bv_sub; 30207614Simp void *bv_val; 31207614Simp long long bv_numeric; 32207614Simp } be_union; 33207614Simp#define be_sub be_union.bv_sub 34207614Simp#define be_val be_union.bv_val 35207614Simp#define be_numeric be_union.bv_numeric 36207614Simp}; 37207614Simp 38207614Simpstruct ber { 39207614Simp int fd; 40207614Simp u_char *br_wbuf; 41207614Simp u_char *br_wptr; 42207614Simp u_char *br_wend; 43207614Simp u_char *br_rbuf; 44207614Simp u_char *br_rptr; 45207614Simp u_char *br_rend; 46207614Simp 47207614Simp unsigned long (*br_application)(struct ber_element *); 48207614Simp}; 49207614Simp 50207614Simp/* well-known ber_element types */ 51207614Simp#define BER_TYPE_DEFAULT ((unsigned long)-1) 52207614Simp#define BER_TYPE_EOC 0 53207614Simp#define BER_TYPE_BOOLEAN 1 54207614Simp#define BER_TYPE_INTEGER 2 55207614Simp#define BER_TYPE_BITSTRING 3 56207614Simp#define BER_TYPE_OCTETSTRING 4 57207614Simp#define BER_TYPE_NULL 5 58207614Simp#define BER_TYPE_OBJECT 6 59207614Simp#define BER_TYPE_ENUMERATED 10 60207614Simp#define BER_TYPE_SEQUENCE 16 61207614Simp#define BER_TYPE_SET 17 62207614Simp 63207614Simp/* ber classes */ 64207614Simp#define BER_CLASS_UNIVERSAL 0x0 65207614Simp#define BER_CLASS_UNIV BER_CLASS_UNIVERSAL 66207614Simp#define BER_CLASS_APPLICATION 0x1 67207614Simp#define BER_CLASS_APP BER_CLASS_APPLICATION 68207614Simp#define BER_CLASS_CONTEXT 0x2 69207614Simp#define BER_CLASS_PRIVATE 0x3 70207614Simp#define BER_CLASS_MASK 0x3 71207614Simp 72207614Simp/* common definitions */ 73207614Simp#define BER_MIN_OID_LEN 2 /* OBJECT */ 74207614Simp#define BER_MAX_OID_LEN 32 /* OBJECT */ 75207614Simp 76207614Simpstruct ber_oid { 77207614Simp u_int32_t bo_id[BER_MAX_OID_LEN + 1]; 78207614Simp size_t bo_n; 79207614Simp}; 80207614Simp 81207614Simp__BEGIN_DECLS 82213099Smariusstruct ber_element *ber_get_element(unsigned long); 83213099Smariusvoid ber_set_header(struct ber_element *, int, 84207614Simp unsigned long); 85207614Simpvoid ber_link_elements(struct ber_element *, 86207614Simp struct ber_element *); 87207614Simpstruct ber_element *ber_unlink_elements(struct ber_element *); 88207614Simpvoid ber_replace_elements(struct ber_element *, 89207614Simp struct ber_element *); 90207614Simpstruct ber_element *ber_add_sequence(struct ber_element *); 91207614Simpstruct ber_element *ber_add_set(struct ber_element *); 92207614Simpstruct ber_element *ber_add_integer(struct ber_element *, long long); 93207614Simpint ber_get_integer(struct ber_element *, long long *); 94207614Simpstruct ber_element *ber_add_enumerated(struct ber_element *, long long); 95207614Simpint ber_get_enumerated(struct ber_element *, long long *); 96207614Simpstruct ber_element *ber_add_boolean(struct ber_element *, int); 97207614Simpint ber_get_boolean(struct ber_element *, int *); 98207614Simpstruct ber_element *ber_add_string(struct ber_element *, const char *); 99207614Simpstruct ber_element *ber_add_nstring(struct ber_element *, const char *, 100207614Simp size_t); 101207614Simpint ber_get_string(struct ber_element *, char **); 102246139Smariusint ber_get_nstring(struct ber_element *, void **, 103207614Simp size_t *); 104207614Simpstruct ber_element *ber_add_bitstring(struct ber_element *, const void *, 105207614Simp size_t); 106207614Simpint ber_get_bitstring(struct ber_element *, void **, 107246139Smarius size_t *); 108207614Simpstruct ber_element *ber_add_null(struct ber_element *); 109207614Simpint ber_get_null(struct ber_element *); 110207614Simpstruct ber_element *ber_add_eoc(struct ber_element *); 111246139Smariusint ber_get_eoc(struct ber_element *); 112246139Smariusstruct ber_element *ber_add_oid(struct ber_element *, struct ber_oid *); 113207614Simpstruct ber_element *ber_add_noid(struct ber_element *, struct ber_oid *, int); 114207614Simpstruct ber_element *ber_add_oidstring(struct ber_element *, const char *); 115207614Simpint ber_get_oid(struct ber_element *, struct ber_oid *); 116207614Simpsize_t ber_oid2ber(struct ber_oid *, u_int8_t *, size_t); 117207614Simpint ber_string2oid(const char *, struct ber_oid *); 118207614Simpstruct ber_element *ber_printf_elements(struct ber_element *, char *, ...); 119207614Simpint ber_scanf_elements(struct ber_element *, char *, ...); 120207614Simpssize_t ber_get_writebuf(struct ber *, void **); 121207614Simpint ber_write_elements(struct ber *, struct ber_element *); 122207614Simpvoid ber_set_readbuf(struct ber *, void *, size_t); 123207614Simpstruct ber_element *ber_read_elements(struct ber *, struct ber_element *); 124207614Simpvoid ber_free_elements(struct ber_element *); 125207614Simpsize_t ber_calc_len(struct ber_element *); 126207614Simpvoid ber_set_application(struct ber *, 127207614Simp unsigned long (*)(struct ber_element *)); 128207614Simpvoid ber_free(struct ber *); 129207614Simp__END_DECLS 130207614Simp