1#pragma ident	"%Z%%M%	%I%	%E% SMI"
2
3/* Coding Buffer Specifications */
4#ifndef __ASN1BUF_H__
5#define __ASN1BUF_H__
6
7#include "k5-int.h"
8#include "krbasn1.h"
9
10typedef struct code_buffer_rep {
11  char *base, *bound, *next;
12} asn1buf;
13
14
15/**************** Private Procedures ****************/
16
17int asn1buf_size
18	(const asn1buf *buf);
19/* requires  *buf has been created and not destroyed
20   effects   Returns the total size
21	(in octets) of buf's octet buffer. */
22#define asn1buf_size(buf) \
23  (((buf) == NULL || (buf)->base == NULL) \
24   ? 0 \
25   : ((buf)->bound - (buf)->base + 1))
26
27int asn1buf_free
28	(const asn1buf *buf);
29/* requires  *buf is allocated
30   effects   Returns the number of unused, allocated octets in *buf. */
31#define asn1buf_free(buf) \
32  (((buf) == NULL || (buf)->base == NULL) \
33   ? 0 \
34   : ((buf)->bound - (buf)->next + 1))
35
36
37asn1_error_code asn1buf_ensure_space
38	(asn1buf *buf, const unsigned int amount);
39/* requires  *buf is allocated
40   modifies  *buf
41   effects  If buf has less than amount octets of free space, then it is
42            expanded to have at least amount octets of free space.
43            Returns ENOMEM memory is exhausted. */
44#define asn1buf_ensure_space(buf,amount) \
45  ((asn1buf_free(buf) < (amount)) \
46   ? (asn1buf_expand((buf), (amount)-asn1buf_free(buf))) \
47   : 0)
48
49
50asn1_error_code asn1buf_expand
51	(asn1buf *buf, unsigned int inc);
52/* requires  *buf is allocated
53   modifies  *buf
54   effects   Expands *buf by allocating space for inc more octets.
55             Returns ENOMEM if memory is exhausted. */
56
57int asn1buf_len
58	(const asn1buf *buf);
59/* requires  *buf is allocated
60   effects   Returns the length of the encoding in *buf. */
61#define asn1buf_len(buf)	((buf)->next - (buf)->base)
62
63/****** End of private procedures *****/
64
65/*
66  Overview
67
68    The coding buffer is an array of char (to match a krb5_data structure)
69     with 3 reference pointers:
70     1) base - The bottom of the octet array.  Used for memory management
71               operations on the array (e.g. alloc, realloc, free).
72     2) next - Points to the next available octet position in the array.
73               During encoding, this is the next free position, and it
74                 advances as octets are added to the array.
75	       During decoding, this is the next unread position, and it
76                 advances as octets are read from the array.
77     3) bound - Points to the top of the array. Used for bounds-checking.
78
79    All pointers to encoding buffers should be initalized to NULL.
80
81  Operations
82
83    asn1buf_create
84    asn1buf_wrap_data
85    asn1buf_destroy
86    asn1buf_insert_octet
87    asn1buf_insert_charstring
88    asn1buf_remove_octet
89    asn1buf_remove_charstring
90    asn1buf_unparse
91    asn1buf_hex_unparse
92    asn12krb5_buf
93    asn1buf_remains
94
95    (asn1buf_size)
96    (asn1buf_free)
97    (asn1buf_ensure_space)
98    (asn1buf_expand)
99    (asn1buf_len)
100*/
101
102asn1_error_code asn1buf_create
103	(asn1buf **buf);
104/* effects   Creates a new encoding buffer pointed to by *buf.
105             Returns ENOMEM if the buffer can't be created. */
106
107asn1_error_code asn1buf_wrap_data
108	(asn1buf *buf, const krb5_data *code);
109/* requires  *buf has already been allocated
110   effects   Turns *buf into a "wrapper" for *code.  i.e. *buf is set up
111              such that its bottom is the beginning of *code, and its top
112	      is the top of *code.
113	     Returns ASN1_MISSING_FIELD if code is empty. */
114
115asn1_error_code asn1buf_imbed
116	(asn1buf *subbuf, const asn1buf *buf,
117		   const unsigned int length,
118		   const int indef);
119/* requires  *subbuf and *buf are allocated
120   effects   *subbuf becomes a sub-buffer of *buf.  *subbuf begins
121              at *buf's current position and is length octets long.
122              (Unless this would exceed the bounds of *buf -- in
123	      that case, ASN1_OVERRUN is returned)  *subbuf's current
124	      position starts at the beginning of *subbuf. */
125
126asn1_error_code asn1buf_sync
127	(asn1buf *buf, asn1buf *subbuf, const asn1_class Class,
128		   const asn1_tagnum lasttag,
129		   const unsigned int length, const int indef,
130		   const int seqindef);
131/* requires  *subbuf is a sub-buffer of *buf, as created by asn1buf_imbed.
132             lasttag is the last tagnumber read.
133   effects   Synchronizes *buf's current position to match that of *subbuf. */
134
135asn1_error_code asn1buf_skiptail
136	(asn1buf *buf, const unsigned int length,
137		   const int indef);
138/* requires  *buf is a subbuffer used in a decoding of a
139             constructed indefinite sequence.
140   effects   skips trailing fields. */
141
142asn1_error_code asn1buf_destroy
143	(asn1buf **buf);
144/* effects   Deallocates **buf, sets *buf to NULL. */
145
146asn1_error_code asn1buf_insert_octet
147	(asn1buf *buf, const int o);
148/* requires  *buf is allocated
149   effects   Inserts o into the buffer *buf, expanding the buffer if
150             necessary.  Returns ENOMEM memory is exhausted. */
151#if ((__GNUC__ >= 2) && !defined(ASN1BUF_OMIT_INLINE_FUNCS))
152extern __inline__ asn1_error_code asn1buf_insert_octet(asn1buf *buf, const int o)
153{
154  asn1_error_code retval;
155
156  retval = asn1buf_ensure_space(buf,1U);
157  if(retval) return retval;
158  *(buf->next) = (char)o;
159  (buf->next)++;
160  return 0;
161}
162#endif
163
164asn1_error_code asn1buf_insert_octetstring
165	(asn1buf *buf, const unsigned int len, const asn1_octet *s);
166/* requires  *buf is allocated
167   modifies  *buf
168   effects   Inserts the contents of s (an octet array of length len)
169              into the buffer *buf, expanding the buffer if necessary.
170	     Returns ENOMEM if memory is exhausted. */
171
172asn1_error_code asn1buf_insert_charstring
173	(asn1buf *buf, const unsigned int len, const char *s);
174/* requires  *buf is allocated
175   modifies  *buf
176   effects   Inserts the contents of s (a character array of length len)
177              into the buffer *buf, expanding the buffer if necessary.
178	     Returns ENOMEM if memory is exhausted. */
179
180asn1_error_code asn1buf_remove_octet
181	(asn1buf *buf, asn1_octet *o);
182/* requires  *buf is allocated
183   effects   Returns *buf's current octet in *o and advances to
184              the next octet.
185	     Returns ASN1_OVERRUN if *buf has already been exhausted. */
186#define asn1buf_remove_octet(buf,o) \
187  (((buf)->next > (buf)->bound) \
188   ? ASN1_OVERRUN \
189   : ((*(o) = (asn1_octet)(*(((buf)->next)++))),0))
190
191asn1_error_code asn1buf_remove_octetstring
192	(asn1buf *buf, const unsigned int len, asn1_octet **s);
193/* requires  *buf is allocated
194   effects   Removes the next len octets of *buf and returns them in **s.
195	     Returns ASN1_OVERRUN if there are fewer than len unread octets
196	      left in *buf.
197	     Returns ENOMEM if *s could not be allocated. */
198
199asn1_error_code asn1buf_remove_charstring
200	(asn1buf *buf, const unsigned int len,
201					  char **s);
202/* requires  *buf is allocated
203   effects   Removes the next len octets of *buf and returns them in **s.
204	     Returns ASN1_OVERRUN if there are fewer than len unread octets
205	      left in *buf.
206	     Returns ENOMEM if *s could not be allocated. */
207
208asn1_error_code asn1buf_unparse
209	(const asn1buf *buf, char **s);
210/* modifies  *s
211   effects   Returns a human-readable representation of *buf in *s,
212             where each octet in *buf is represented by a character in *s. */
213
214asn1_error_code asn1buf_hex_unparse
215	(const asn1buf *buf, char **s);
216/* modifies  *s
217   effects   Returns a human-readable representation of *buf in *s,
218             where each octet in *buf is represented by a 2-digit
219	     hexadecimal number in *s. */
220
221asn1_error_code asn12krb5_buf
222	(const asn1buf *buf, krb5_data **code);
223/* modifies  *code
224   effects   Instantiates **code with the krb5_data representation of **buf. */
225
226
227int asn1buf_remains
228	(asn1buf *buf, int indef);
229/* requires  *buf is a buffer containing an asn.1 structure or array
230   modifies  *buf
231   effects   Returns the number of unprocessed octets remaining in *buf. */
232
233#endif
234