1*ba7b222eSGlenn Barry /* -*- mode: c; indent-tabs-mode: nil -*- */
27c478bd9Sstevel@tonic-gate /*
37c478bd9Sstevel@tonic-gate  * src/lib/krb5/asn.1/krb5_encode.c
4*ba7b222eSGlenn Barry  *
5*ba7b222eSGlenn Barry  * Copyright 1994, 2008 by the Massachusetts Institute of Technology.
67c478bd9Sstevel@tonic-gate  * All Rights Reserved.
77c478bd9Sstevel@tonic-gate  *
87c478bd9Sstevel@tonic-gate  * Export of this software from the United States of America may
97c478bd9Sstevel@tonic-gate  *   require a specific license from the United States Government.
107c478bd9Sstevel@tonic-gate  *   It is the responsibility of any person or organization contemplating
117c478bd9Sstevel@tonic-gate  *   export to obtain such a license before exporting.
12*ba7b222eSGlenn Barry  *
137c478bd9Sstevel@tonic-gate  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
147c478bd9Sstevel@tonic-gate  * distribute this software and its documentation for any purpose and
157c478bd9Sstevel@tonic-gate  * without fee is hereby granted, provided that the above copyright
167c478bd9Sstevel@tonic-gate  * notice appear in all copies and that both that copyright notice and
177c478bd9Sstevel@tonic-gate  * this permission notice appear in supporting documentation, and that
187c478bd9Sstevel@tonic-gate  * the name of M.I.T. not be used in advertising or publicity pertaining
197c478bd9Sstevel@tonic-gate  * to distribution of the software without specific, written prior
207c478bd9Sstevel@tonic-gate  * permission.  Furthermore if you modify this software you must label
217c478bd9Sstevel@tonic-gate  * your software as modified software and not distribute it in such a
227c478bd9Sstevel@tonic-gate  * fashion that it might be confused with the original M.I.T. software.
237c478bd9Sstevel@tonic-gate  * M.I.T. makes no representations about the suitability of
247c478bd9Sstevel@tonic-gate  * this software for any purpose.  It is provided "as is" without express
257c478bd9Sstevel@tonic-gate  * or implied warranty.
267c478bd9Sstevel@tonic-gate  */
277c478bd9Sstevel@tonic-gate 
28159d09a2SMark Phalan #include "k5-int.h"
297c478bd9Sstevel@tonic-gate #include "asn1_k_encode.h"
307c478bd9Sstevel@tonic-gate #include "asn1_encode.h"
317c478bd9Sstevel@tonic-gate #include "krbasn1.h"
327c478bd9Sstevel@tonic-gate #include "asn1buf.h"
337c478bd9Sstevel@tonic-gate #include "asn1_make.h"
347c478bd9Sstevel@tonic-gate 
357c478bd9Sstevel@tonic-gate /**************** Macros (these save a lot of typing) ****************/
367c478bd9Sstevel@tonic-gate 
377c478bd9Sstevel@tonic-gate /* setup() -- create and initialize bookkeeping variables
387c478bd9Sstevel@tonic-gate      retval: stores error codes returned from subroutines
397c478bd9Sstevel@tonic-gate      buf: the coding buffer
407c478bd9Sstevel@tonic-gate      length: length of the most-recently produced encoding
417c478bd9Sstevel@tonic-gate      sum: cumulative length of the entire encoding */
427c478bd9Sstevel@tonic-gate #define krb5_setup()\
437c478bd9Sstevel@tonic-gate   asn1_error_code retval;\
44*ba7b222eSGlenn Barry   unsigned int length, sum = 0;\
457c478bd9Sstevel@tonic-gate   asn1buf *buf=NULL;\
46*ba7b222eSGlenn Barry   krb5_data *tmpcode;\
47*ba7b222eSGlenn Barry \
48*ba7b222eSGlenn Barry   *code = NULL;\
497c478bd9Sstevel@tonic-gate \
50*ba7b222eSGlenn Barry   if (rep == NULL) return ASN1_MISSING_FIELD;\
517c478bd9Sstevel@tonic-gate \
527c478bd9Sstevel@tonic-gate   retval = asn1buf_create(&buf);\
53*ba7b222eSGlenn Barry   if (retval) return retval
547c478bd9Sstevel@tonic-gate 
557c478bd9Sstevel@tonic-gate /* produce the final output and clean up the workspace */
567c478bd9Sstevel@tonic-gate #define krb5_cleanup()\
57*ba7b222eSGlenn Barry   retval = asn12krb5_buf(buf,&tmpcode);\
58*ba7b222eSGlenn Barry error:\
59*ba7b222eSGlenn Barry   asn1buf_destroy(&buf);\
60*ba7b222eSGlenn Barry   if (retval)\
61*ba7b222eSGlenn Barry     return retval;\
62*ba7b222eSGlenn Barry   *code = tmpcode;\
637c478bd9Sstevel@tonic-gate   return 0
647c478bd9Sstevel@tonic-gate 
65*ba7b222eSGlenn Barry #ifndef DISABLE_PKINIT
encode_krb5_pa_pk_as_req(const krb5_pa_pk_as_req * rep,krb5_data ** code)66159d09a2SMark Phalan krb5_error_code encode_krb5_pa_pk_as_req(const krb5_pa_pk_as_req *rep, krb5_data **code)
67159d09a2SMark Phalan {
68*ba7b222eSGlenn Barry     krb5_setup();
69*ba7b222eSGlenn Barry     retval = asn1_encode_pa_pk_as_req(buf,rep,&length);
70*ba7b222eSGlenn Barry     if (retval) goto error;
71*ba7b222eSGlenn Barry     sum += length;
72*ba7b222eSGlenn Barry     krb5_cleanup();
73159d09a2SMark Phalan }
74159d09a2SMark Phalan 
encode_krb5_pa_pk_as_req_draft9(const krb5_pa_pk_as_req_draft9 * rep,krb5_data ** code)75159d09a2SMark Phalan krb5_error_code encode_krb5_pa_pk_as_req_draft9(const krb5_pa_pk_as_req_draft9 *rep, krb5_data **code)
76159d09a2SMark Phalan {
77*ba7b222eSGlenn Barry     krb5_setup();
78*ba7b222eSGlenn Barry     retval = asn1_encode_pa_pk_as_req_draft9(buf,rep,&length);
79*ba7b222eSGlenn Barry     if (retval) goto error;
80*ba7b222eSGlenn Barry     sum += length;
81*ba7b222eSGlenn Barry     krb5_cleanup();
82159d09a2SMark Phalan }
83159d09a2SMark Phalan 
encode_krb5_pa_pk_as_rep(const krb5_pa_pk_as_rep * rep,krb5_data ** code)84159d09a2SMark Phalan krb5_error_code encode_krb5_pa_pk_as_rep(const krb5_pa_pk_as_rep *rep, krb5_data **code)
85159d09a2SMark Phalan {
86*ba7b222eSGlenn Barry     krb5_setup();
87*ba7b222eSGlenn Barry     retval = asn1_encode_pa_pk_as_rep(buf,rep,&length);
88*ba7b222eSGlenn Barry     if (retval) goto error;
89*ba7b222eSGlenn Barry     sum += length;
90*ba7b222eSGlenn Barry     krb5_cleanup();
91159d09a2SMark Phalan }
92159d09a2SMark Phalan 
encode_krb5_pa_pk_as_rep_draft9(const krb5_pa_pk_as_rep_draft9 * rep,krb5_data ** code)93159d09a2SMark Phalan krb5_error_code encode_krb5_pa_pk_as_rep_draft9(const krb5_pa_pk_as_rep_draft9 *rep, krb5_data **code)
94159d09a2SMark Phalan {
95*ba7b222eSGlenn Barry     krb5_setup();
96*ba7b222eSGlenn Barry     retval = asn1_encode_pa_pk_as_rep_draft9(buf,rep,&length);
97*ba7b222eSGlenn Barry     if (retval) goto error;
98*ba7b222eSGlenn Barry     sum += length;
99*ba7b222eSGlenn Barry     krb5_cleanup();
100159d09a2SMark Phalan }
101159d09a2SMark Phalan 
encode_krb5_auth_pack(const krb5_auth_pack * rep,krb5_data ** code)102159d09a2SMark Phalan krb5_error_code encode_krb5_auth_pack(const krb5_auth_pack *rep, krb5_data **code)
103159d09a2SMark Phalan {
104*ba7b222eSGlenn Barry     krb5_setup();
105*ba7b222eSGlenn Barry     retval = asn1_encode_auth_pack(buf,rep,&length);
106*ba7b222eSGlenn Barry     if (retval) goto error;
107*ba7b222eSGlenn Barry     sum += length;
108*ba7b222eSGlenn Barry     krb5_cleanup();
109159d09a2SMark Phalan }
110159d09a2SMark Phalan 
encode_krb5_auth_pack_draft9(const krb5_auth_pack_draft9 * rep,krb5_data ** code)111159d09a2SMark Phalan krb5_error_code encode_krb5_auth_pack_draft9(const krb5_auth_pack_draft9 *rep, krb5_data **code)
112159d09a2SMark Phalan {
113*ba7b222eSGlenn Barry     krb5_setup();
114*ba7b222eSGlenn Barry     retval = asn1_encode_auth_pack_draft9(buf,rep,&length);
115*ba7b222eSGlenn Barry     if (retval) goto error;
116*ba7b222eSGlenn Barry     sum += length;
117*ba7b222eSGlenn Barry     krb5_cleanup();
118159d09a2SMark Phalan }
119159d09a2SMark Phalan 
encode_krb5_kdc_dh_key_info(const krb5_kdc_dh_key_info * rep,krb5_data ** code)120159d09a2SMark Phalan krb5_error_code encode_krb5_kdc_dh_key_info(const krb5_kdc_dh_key_info *rep, krb5_data **code)
121159d09a2SMark Phalan {
122*ba7b222eSGlenn Barry     krb5_setup();
123*ba7b222eSGlenn Barry     retval = asn1_encode_kdc_dh_key_info(buf,rep,&length);
124*ba7b222eSGlenn Barry     if (retval) goto error;
125*ba7b222eSGlenn Barry     sum += length;
126*ba7b222eSGlenn Barry     krb5_cleanup();
127159d09a2SMark Phalan }
128159d09a2SMark Phalan 
encode_krb5_reply_key_pack(const krb5_reply_key_pack * rep,krb5_data ** code)129159d09a2SMark Phalan krb5_error_code encode_krb5_reply_key_pack(const krb5_reply_key_pack *rep, krb5_data **code)
130159d09a2SMark Phalan {
131*ba7b222eSGlenn Barry     krb5_setup();
132*ba7b222eSGlenn Barry     retval = asn1_encode_reply_key_pack(buf,rep,&length);
133*ba7b222eSGlenn Barry     if (retval) goto error;
134*ba7b222eSGlenn Barry     sum += length;
135*ba7b222eSGlenn Barry     krb5_cleanup();
136159d09a2SMark Phalan }
137159d09a2SMark Phalan 
encode_krb5_reply_key_pack_draft9(const krb5_reply_key_pack_draft9 * rep,krb5_data ** code)138159d09a2SMark Phalan krb5_error_code encode_krb5_reply_key_pack_draft9(const krb5_reply_key_pack_draft9 *rep, krb5_data **code)
139159d09a2SMark Phalan {
140*ba7b222eSGlenn Barry     krb5_setup();
141*ba7b222eSGlenn Barry     retval = asn1_encode_reply_key_pack_draft9(buf,rep,&length);
142*ba7b222eSGlenn Barry     if (retval) goto error;
143*ba7b222eSGlenn Barry     sum += length;
144*ba7b222eSGlenn Barry     krb5_cleanup();
145159d09a2SMark Phalan }
146159d09a2SMark Phalan 
encode_krb5_td_trusted_certifiers(const krb5_external_principal_identifier ** rep,krb5_data ** code)147159d09a2SMark Phalan krb5_error_code encode_krb5_td_trusted_certifiers(const krb5_external_principal_identifier **rep, krb5_data **code)
148159d09a2SMark Phalan {
149*ba7b222eSGlenn Barry     krb5_setup();
150*ba7b222eSGlenn Barry     retval = asn1_encode_td_trusted_certifiers(buf,rep,&length);
151*ba7b222eSGlenn Barry     if (retval) goto error;
152*ba7b222eSGlenn Barry     sum += length;
153*ba7b222eSGlenn Barry     krb5_cleanup();
154159d09a2SMark Phalan }
155159d09a2SMark Phalan 
encode_krb5_td_dh_parameters(const krb5_algorithm_identifier ** rep,krb5_data ** code)156*ba7b222eSGlenn Barry krb5_error_code encode_krb5_td_dh_parameters(const krb5_algorithm_identifier **rep, krb5_data **code)
157159d09a2SMark Phalan {
158*ba7b222eSGlenn Barry     krb5_setup();
159*ba7b222eSGlenn Barry     retval = asn1_encode_sequence_of_algorithm_identifier(buf,rep,&length);
160*ba7b222eSGlenn Barry     if (retval) goto error;
161*ba7b222eSGlenn Barry     sum += length;
162*ba7b222eSGlenn Barry     krb5_cleanup();
163159d09a2SMark Phalan }
164*ba7b222eSGlenn Barry #endif /* DISABLE_PKINIT */
165159d09a2SMark Phalan 
encode_krb5_typed_data(const krb5_typed_data ** rep,krb5_data ** code)166*ba7b222eSGlenn Barry krb5_error_code encode_krb5_typed_data(const krb5_typed_data **rep, krb5_data **code)
167159d09a2SMark Phalan {
168*ba7b222eSGlenn Barry     krb5_setup();
169*ba7b222eSGlenn Barry     retval = asn1_encode_sequence_of_typed_data(buf,rep,&length);
170*ba7b222eSGlenn Barry     if (retval) goto error;
171*ba7b222eSGlenn Barry     sum += length;
172*ba7b222eSGlenn Barry     krb5_cleanup();
173159d09a2SMark Phalan }
174*ba7b222eSGlenn Barry 
175