2 * src/lib/krb5/asn.1/asn1_make.c
4 * Copyright 1994 by the Massachusetts Institute of Technology.
7 * Export of this software from the United States of America may
8 * require a specific license from the United States Government.
9 * It is the responsibility of any person or organization contemplating
10 * export to obtain such a license before exporting.
12 * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
13 * distribute this software and its documentation for any purpose and
14 * without fee is hereby granted, provided that the above copyright
15 * notice appear in all copies and that both that copyright notice and
16 * this permission notice appear in supporting documentation, and that
17 * the name of M.I.T. not be used in advertising or publicity pertaining
18 * to distribution of the software without specific, written prior
19 * permission. M.I.T. makes no representations about the suitability of
20 * this software for any purpose. It is provided "as is" without express
21 * or implied warranty.
24 #include "asn1_make.h"
26 asn1_error_code asn1_make_etag(buf, class, tagnum, in_len, retlen)
28 const asn1_class class;
29 const asn1_tagnum tagnum;
33 return asn1_make_tag(buf,class,CONSTRUCTED,tagnum,in_len,retlen);
36 asn1_error_code asn1_make_tag(buf, class, construction, tagnum, in_len, retlen)
38 const asn1_class class;
39 const asn1_construction construction;
40 const asn1_tagnum tagnum;
44 asn1_error_code retval;
47 if(tagnum > ASN1_TAGNUM_MAX) return ASN1_OVERFLOW;
49 retval = asn1_make_length(buf,in_len, &length);
50 if(retval) return retval;
52 retval = asn1_make_id(buf,class,construction,tagnum,&length);
53 if(retval) return retval;
60 asn1_error_code asn1_make_length(buf, in_len, retlen)
65 asn1_error_code retval;
68 retval = asn1buf_insert_octet(buf, (asn1_octet)(in_len&0x7F));
69 if(retval) return retval;
72 int in_copy=in_len, length=0;
75 retval = asn1buf_insert_octet(buf, (asn1_octet)(in_copy&0xFF));
76 if(retval) return retval;
77 in_copy = in_copy >> 8;
80 retval = asn1buf_insert_octet(buf, 0x80 | (asn1_octet)(length&0x7F));
81 if(retval) return retval;
89 asn1_error_code asn1_make_id(buf, class, construction, tagnum, retlen)
91 const asn1_class class;
92 const asn1_construction construction;
93 const asn1_tagnum tagnum;
96 asn1_error_code retval;
99 retval = asn1buf_insert_octet(buf, class | construction |
101 if(retval) return retval;
104 asn1_tagnum tagcopy = tagnum;
107 retval = asn1buf_insert_octet(buf, (asn1_octet)(tagcopy&0x7F));
108 if(retval) return retval;
112 for(; tagcopy != 0; tagcopy >>= 7){
113 retval = asn1buf_insert_octet(buf, 0x80 | (asn1_octet)(tagcopy&0x7F));
114 if(retval) return retval;
118 retval = asn1buf_insert_octet(buf, class | construction | 0x1F);
119 if(retval) return retval;
127 asn1_error_code asn1_make_sequence(buf, seq_len, retlen)
132 asn1_error_code retval;
135 retval = asn1_make_length(buf,seq_len,&len);
136 if(retval) return retval;
138 retval = asn1_make_id(buf,UNIVERSAL,CONSTRUCTED,ASN1_SEQUENCE,&len);
139 if(retval) return retval;
146 asn1_error_code asn1_make_set(buf, set_len, retlen)
151 asn1_error_code retval;
154 retval = asn1_make_length(buf,set_len,&len);
155 if(retval) return retval;
157 retval = asn1_make_id(buf,UNIVERSAL,CONSTRUCTED,ASN1_SET,&len);
158 if(retval) return retval;
165 asn1_error_code asn1_make_string(buf, length, string, retlen)
171 asn1_error_code retval;
173 retval = asn1buf_insert_charstring(buf,length,string);
174 if(retval) return retval;