2 * Copyright 2010 Sun Microsystems, Inc. All rights reserved.
3 * Use is subject to license terms.
7 * The contents of this file are subject to the Netscape Public License
8 * Version 1.0(the "NPL"); you may not use this file except in
9 * compliance with the NPL. You may obtain a copy of the NPL at
10 * http:/ /www.mozilla.org/NPL/
12 * Software distributed under the NPL is distributed on an "AS IS" basis,
13 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
14 * for the specific language governing rights and limitations under the
17 * The Initial Developer of this code under the NPL is Netscape
18 * Communications Corporation. Portions created by Netscape are
19 * Copyright(C) 1998 Netscape Communications Corporation. All Rights
24 * This is the header file for some Basic Encoding Rules and Distinguished
25 * Encoding Rules (BER/DER) routines.
35 #define BER_BIT_STRING 3
36 #define BER_OCTET_STRING 4
38 #define BER_OBJECT_IDENTIFIER 6
39 #define BER_ENUMERATED 10
40 #define BER_UTF8_STRING 12
41 #define BER_SEQUENCE 16
43 #define BER_PRINTABLE_STRING 19
44 #define BER_T61STRING 20
45 #define BER_IA5STRING 22
46 #define BER_UTCTIME 23
47 #define BER_GENTIME 24
48 #define BER_GENERALSTRING 27
49 #define BER_UNIVERSAL_STRING 28
50 #define BER_BMP_STRING 30
52 #define BER_CLASS_MASK 0xc0
53 #define BER_CLASS_UNIVERSAL 0x00
54 #define BER_CLASS_APPLICATION 0x40
55 #define BER_CLASS_CONTEXTSPECIFIC 0x80
56 #define BER_CLASS_PRIVATE 0xc0
57 #define BER_CONSTRUCTED 0x20
58 #define BER_CONSTRUCTED_SEQUENCE (BER_CONSTRUCTED | BER_SEQUENCE)
59 #define BER_CONSTRUCTED_SET (BER_CONSTRUCTED | BER_SET)
61 #define KMFBER_BIG_TAG_MASK 0x1f
62 #define KMFBER_MORE_TAG_MASK 0x80
64 #define KMFBER_DEFAULT 0xFFFFFFFF
65 #define KMFBER_ERROR 0xFFFFFFFF
66 #define KMFBER_END_OF_SEQORSET 0xfffffffe
68 /* BerElement set/get options */
69 #define KMFBER_OPT_REMAINING_BYTES 0x01
70 #define KMFBER_OPT_TOTAL_BYTES 0x02
71 #define KMFBER_OPT_USE_DER 0x04
72 #define KMFBER_OPT_TRANSLATE_STRINGS 0x08
73 #define KMFBER_OPT_BYTES_TO_WRITE 0x10
74 #define KMFBER_OPT_DEBUG_LEVEL 0x40
76 typedef size_t ber_len_t
; /* for BER len */
77 typedef long ber_slen_t
; /* signed equivalent of ber_len_t */
78 typedef int32_t ber_tag_t
; /* for BER tags */
79 typedef int32_t ber_int_t
; /* for BER ints, enums, and Booleans */
80 typedef uint32_t ber_uint_t
; /* unsigned equivalent of ber_int_t */
82 typedef struct berelement BerElement
;
83 typedef int (*BERTranslateProc
)(char **, ber_uint_t
*, int);
85 typedef struct berval
{
90 #define SAFEMEMCPY(d, s, n) memmove(d, s, n)
92 BerElement
*kmfder_init(const struct berval
*bv
);
93 BerElement
*kmfber_init(const struct berval
*bv
);
94 int kmfber_calc_taglen(ber_tag_t
);
95 int kmfber_calc_lenlen(ber_int_t
);
96 int kmfber_put_len(BerElement
*, ber_int_t
, int);
99 * public decode routines
101 ber_tag_t
kmfber_first_element(BerElement
*, ber_len_t
*, char **);
102 ber_tag_t
kmfber_next_element(BerElement
*, ber_len_t
*, char *);
103 ber_tag_t
kmfber_scanf(BerElement
*, const char *, ...);
105 void kmfber_bvfree(struct berval
*);
106 void kmfber_bvecfree(struct berval
**);
107 struct berval
*kmfber_bvdup(const struct berval
*);
110 * public encoding routines
112 extern int kmfber_printf(BerElement
*, const char *, ...);
113 extern int kmfber_flatten(BerElement
*, struct berval
**);
114 extern int kmfber_realloc(BerElement
*, ber_len_t
);
117 * miscellaneous public routines
119 extern void kmfber_free(BerElement
*ber
, int freebuf
);
120 extern BerElement
* kmfber_alloc(void);
121 extern BerElement
* kmfder_alloc(void);
122 extern BerElement
* kmfber_alloc_t(int);
123 extern BerElement
* kmfber_dup(BerElement
*);
124 extern ber_int_t
kmfber_read(BerElement
*, char *, ber_len_t
);
125 extern ber_int_t
kmfber_write(BerElement
*, char *, ber_len_t
, int);
126 extern void kmfber_reset(BerElement
*, int);
128 /* Routines KMF uses to encode/decode Cert objects */
129 extern KMF_RETURN
DerDecodeSignedCertificate(const KMF_DATA
*,
130 KMF_X509_CERTIFICATE
**);
131 extern KMF_RETURN
DerEncodeSignedCertificate(KMF_X509_CERTIFICATE
*,
134 KMF_RETURN
DerDecodeTbsCertificate(const KMF_DATA
*,
135 KMF_X509_TBS_CERT
**);
136 KMF_RETURN
DerEncodeTbsCertificate(KMF_X509_TBS_CERT
*, KMF_DATA
*);
138 KMF_RETURN
DerDecodeSignedCsr(const KMF_DATA
*, KMF_CSR_DATA
**);
139 extern KMF_RETURN
DerEncodeSignedCsr(KMF_CSR_DATA
*, KMF_DATA
*);
140 extern KMF_RETURN
DerDecodeTbsCsr(const KMF_DATA
*, KMF_TBS_CSR
**);
141 extern KMF_RETURN
DerEncodeTbsCsr(KMF_TBS_CSR
*, KMF_DATA
*);
143 KMF_RETURN
ExtractX509CertParts(KMF_DATA
*, KMF_DATA
*, KMF_DATA
*);
144 extern KMF_RETURN
DerEncodeName(KMF_X509_NAME
*, KMF_DATA
*);
145 KMF_RETURN
DerDecodeName(KMF_DATA
*, KMF_X509_NAME
*);
146 KMF_RETURN
DerDecodeExtension(KMF_DATA
*, KMF_X509_EXTENSION
**);
147 KMF_RETURN
CopyRDN(KMF_X509_NAME
*, KMF_X509_NAME
**);
148 KMF_RETURN
CopySPKI(KMF_X509_SPKI
*,
150 extern KMF_RETURN
DerDecodeSPKI(KMF_DATA
*, KMF_X509_SPKI
*);
151 extern KMF_RETURN
DerDecodeDSASignature(KMF_DATA
*, KMF_DATA
*);
152 extern KMF_RETURN
DerEncodeDSASignature(KMF_DATA
*, KMF_DATA
*);
153 extern KMF_RETURN
DerEncodeECDSASignature(KMF_DATA
*, KMF_DATA
*);
154 extern KMF_RETURN
DerDecodeECDSASignature(KMF_DATA
*, KMF_DATA
*);
155 KMF_RETURN
DerEncodeAlgoid(KMF_DATA
*, KMF_DATA
*);
156 KMF_RETURN
DerDecodeSPKI(KMF_DATA
*, KMF_X509_SPKI
*);
157 KMF_RETURN
DerEncodeSPKI(KMF_X509_SPKI
*, KMF_DATA
*);
158 extern KMF_RETURN
ExtractSPKIData(const KMF_X509_SPKI
*,
159 KMF_ALGORITHM_INDEX
, KMF_DATA
*, uint32_t *);
160 extern KMF_RETURN
AddRDN(KMF_X509_NAME
*, KMF_X509_RDN
*);
161 KMF_RETURN
DerEncodeRSAPrivateKey(KMF_DATA
*, KMF_RAW_RSA_KEY
*);
162 KMF_RETURN
DerEncodeDSAPrivateKey(KMF_DATA
*, KMF_RAW_DSA_KEY
*);
163 KMF_RETURN
DerEncodeECPrivateKey(KMF_DATA
*, KMF_RAW_EC_KEY
*);
165 #endif /* BER_DER_H */