|
1 /* -*- Mode: C; tab-width: 8 -*- */ |
|
2 /* This Source Code Form is subject to the terms of the Mozilla Public |
|
3 * License, v. 2.0. If a copy of the MPL was not distributed with this |
|
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ |
|
5 |
|
6 #include "crmf.h" |
|
7 #include "crmfi.h" |
|
8 #include "secoid.h" |
|
9 #include "secasn1.h" |
|
10 |
|
11 SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate) |
|
12 SEC_ASN1_MKSUB(SEC_AnyTemplate) |
|
13 SEC_ASN1_MKSUB(SEC_NullTemplate) |
|
14 SEC_ASN1_MKSUB(SEC_BitStringTemplate) |
|
15 SEC_ASN1_MKSUB(SEC_IntegerTemplate) |
|
16 SEC_ASN1_MKSUB(SEC_OctetStringTemplate) |
|
17 SEC_ASN1_MKSUB(CERT_TimeChoiceTemplate) |
|
18 SEC_ASN1_MKSUB(CERT_SubjectPublicKeyInfoTemplate) |
|
19 SEC_ASN1_MKSUB(CERT_NameTemplate) |
|
20 |
|
21 /* |
|
22 * It's all implicit tagging. |
|
23 */ |
|
24 |
|
25 const SEC_ASN1Template CRMFControlTemplate[] = { |
|
26 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRMFControl)}, |
|
27 { SEC_ASN1_OBJECT_ID, offsetof(CRMFControl, derTag)}, |
|
28 { SEC_ASN1_ANY, offsetof(CRMFControl, derValue) }, |
|
29 { 0 } |
|
30 }; |
|
31 |
|
32 static const SEC_ASN1Template CRMFCertExtensionTemplate[] = { |
|
33 { SEC_ASN1_SEQUENCE, |
|
34 0, NULL, sizeof(CRMFCertExtension) }, |
|
35 { SEC_ASN1_OBJECT_ID, |
|
36 offsetof(CRMFCertExtension,id) }, |
|
37 { SEC_ASN1_OPTIONAL | SEC_ASN1_BOOLEAN, |
|
38 offsetof(CRMFCertExtension,critical) }, |
|
39 { SEC_ASN1_OCTET_STRING, |
|
40 offsetof(CRMFCertExtension,value) }, |
|
41 { 0, } |
|
42 }; |
|
43 |
|
44 static const SEC_ASN1Template CRMFSequenceOfCertExtensionTemplate[] = { |
|
45 { SEC_ASN1_SEQUENCE_OF, 0, CRMFCertExtensionTemplate } |
|
46 }; |
|
47 |
|
48 static const SEC_ASN1Template CRMFOptionalValidityTemplate[] = { |
|
49 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof (CRMFOptionalValidity) }, |
|
50 { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_NO_STREAM | |
|
51 SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_OPTIONAL | SEC_ASN1_XTRN | 0, |
|
52 offsetof (CRMFOptionalValidity, notBefore), |
|
53 SEC_ASN1_SUB(CERT_TimeChoiceTemplate) }, |
|
54 { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | SEC_ASN1_NO_STREAM | |
|
55 SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_OPTIONAL | SEC_ASN1_XTRN | 1, |
|
56 offsetof (CRMFOptionalValidity, notAfter), |
|
57 SEC_ASN1_SUB(CERT_TimeChoiceTemplate) }, |
|
58 { 0 } |
|
59 }; |
|
60 |
|
61 static const SEC_ASN1Template crmfPointerToNameTemplate[] = { |
|
62 { SEC_ASN1_POINTER | SEC_ASN1_XTRN, 0, SEC_ASN1_SUB(CERT_NameTemplate)}, |
|
63 { 0 } |
|
64 }; |
|
65 |
|
66 static const SEC_ASN1Template CRMFCertTemplateTemplate[] = { |
|
67 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRMFCertTemplate) }, |
|
68 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0, |
|
69 offsetof(CRMFCertTemplate, version), |
|
70 SEC_ASN1_SUB(SEC_IntegerTemplate) }, |
|
71 { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_OPTIONAL | SEC_ASN1_XTRN | 1 , |
|
72 offsetof (CRMFCertTemplate, serialNumber), |
|
73 SEC_ASN1_SUB(SEC_IntegerTemplate) }, |
|
74 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_POINTER | |
|
75 SEC_ASN1_XTRN | 2, |
|
76 offsetof (CRMFCertTemplate, signingAlg), |
|
77 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) }, |
|
78 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | |
|
79 SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | 3, |
|
80 offsetof (CRMFCertTemplate, issuer), crmfPointerToNameTemplate }, |
|
81 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_POINTER | 4, |
|
82 offsetof (CRMFCertTemplate, validity), |
|
83 CRMFOptionalValidityTemplate }, |
|
84 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | |
|
85 SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | 5, |
|
86 offsetof (CRMFCertTemplate, subject), crmfPointerToNameTemplate }, |
|
87 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_POINTER | |
|
88 SEC_ASN1_XTRN | 6, |
|
89 offsetof (CRMFCertTemplate, publicKey), |
|
90 SEC_ASN1_SUB(CERT_SubjectPublicKeyInfoTemplate) }, |
|
91 { SEC_ASN1_NO_STREAM | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_OPTIONAL | |
|
92 SEC_ASN1_XTRN | 7, |
|
93 offsetof (CRMFCertTemplate, issuerUID), |
|
94 SEC_ASN1_SUB(SEC_BitStringTemplate) }, |
|
95 { SEC_ASN1_NO_STREAM | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_OPTIONAL | |
|
96 SEC_ASN1_XTRN | 8, |
|
97 offsetof (CRMFCertTemplate, subjectUID), |
|
98 SEC_ASN1_SUB(SEC_BitStringTemplate) }, |
|
99 { SEC_ASN1_CONSTRUCTED | SEC_ASN1_OPTIONAL | |
|
100 SEC_ASN1_CONTEXT_SPECIFIC | 9, |
|
101 offsetof (CRMFCertTemplate, extensions), |
|
102 CRMFSequenceOfCertExtensionTemplate }, |
|
103 { 0 } |
|
104 }; |
|
105 |
|
106 static const SEC_ASN1Template CRMFAttributeTemplate[] = { |
|
107 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRMFAttribute)}, |
|
108 { SEC_ASN1_OBJECT_ID, offsetof(CRMFAttribute, derTag)}, |
|
109 { SEC_ASN1_ANY, offsetof(CRMFAttribute, derValue) }, |
|
110 { 0 } |
|
111 }; |
|
112 |
|
113 const SEC_ASN1Template CRMFCertRequestTemplate[] = { |
|
114 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof (CRMFCertRequest) }, |
|
115 { SEC_ASN1_INTEGER, offsetof(CRMFCertRequest, certReqId)}, |
|
116 { SEC_ASN1_INLINE, offsetof(CRMFCertRequest, certTemplate), |
|
117 CRMFCertTemplateTemplate}, |
|
118 { SEC_ASN1_OPTIONAL | SEC_ASN1_SEQUENCE_OF, |
|
119 offsetof(CRMFCertRequest,controls), |
|
120 CRMFControlTemplate}, /* SEQUENCE SIZE (1...MAX)*/ |
|
121 { 0 } |
|
122 }; |
|
123 |
|
124 const SEC_ASN1Template CRMFCertReqMsgTemplate[] = { |
|
125 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRMFCertReqMsg) }, |
|
126 { SEC_ASN1_POINTER, offsetof(CRMFCertReqMsg, certReq), |
|
127 CRMFCertRequestTemplate }, |
|
128 { SEC_ASN1_ANY | SEC_ASN1_OPTIONAL, |
|
129 offsetof(CRMFCertReqMsg, derPOP) }, |
|
130 { SEC_ASN1_OPTIONAL | SEC_ASN1_SEQUENCE_OF, |
|
131 offsetof(CRMFCertReqMsg, regInfo), |
|
132 CRMFAttributeTemplate}, /* SEQUENCE SIZE (1...MAX)*/ |
|
133 { 0 } |
|
134 }; |
|
135 |
|
136 const SEC_ASN1Template CRMFCertReqMessagesTemplate[] = { |
|
137 { SEC_ASN1_SEQUENCE_OF, offsetof(CRMFCertReqMessages, messages), |
|
138 CRMFCertReqMsgTemplate, sizeof (CRMFCertReqMessages)} |
|
139 }; |
|
140 |
|
141 static const SEC_ASN1Template CRMFPOPOSigningKeyInputTemplate[] = { |
|
142 { SEC_ASN1_SEQUENCE, 0, NULL,sizeof(CRMFPOPOSigningKeyInput) }, |
|
143 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | |
|
144 SEC_ASN1_CONTEXT_SPECIFIC | 0, |
|
145 offsetof(CRMFPOPOSigningKeyInput, authInfo.sender) }, |
|
146 { SEC_ASN1_BIT_STRING | SEC_ASN1_OPTIONAL | 1, |
|
147 offsetof (CRMFPOPOSigningKeyInput, authInfo.publicKeyMAC) }, |
|
148 { SEC_ASN1_INLINE | SEC_ASN1_XTRN, |
|
149 offsetof(CRMFPOPOSigningKeyInput, publicKey), |
|
150 SEC_ASN1_SUB(CERT_SubjectPublicKeyInfoTemplate) }, |
|
151 { 0 } |
|
152 }; |
|
153 |
|
154 const SEC_ASN1Template CRMFRAVerifiedTemplate[] = { |
|
155 { SEC_ASN1_CONTEXT_SPECIFIC | 0 | SEC_ASN1_XTRN, |
|
156 0, |
|
157 SEC_ASN1_SUB(SEC_NullTemplate) }, |
|
158 { 0 } |
|
159 }; |
|
160 |
|
161 |
|
162 /* This template will need to add POPOSigningKeyInput eventually, maybe*/ |
|
163 static const SEC_ASN1Template crmfPOPOSigningKeyTemplate[] = { |
|
164 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRMFPOPOSigningKey) }, |
|
165 { SEC_ASN1_NO_STREAM | SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | |
|
166 SEC_ASN1_XTRN | 0, |
|
167 offsetof(CRMFPOPOSigningKey, derInput), |
|
168 SEC_ASN1_SUB(SEC_AnyTemplate) }, |
|
169 { SEC_ASN1_POINTER | SEC_ASN1_XTRN, |
|
170 offsetof(CRMFPOPOSigningKey, algorithmIdentifier), |
|
171 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) }, |
|
172 { SEC_ASN1_BIT_STRING | SEC_ASN1_XTRN, |
|
173 offsetof(CRMFPOPOSigningKey, signature), |
|
174 SEC_ASN1_SUB(SEC_BitStringTemplate) }, |
|
175 { 0 } |
|
176 }; |
|
177 |
|
178 const SEC_ASN1Template CRMFPOPOSigningKeyTemplate[] = { |
|
179 { SEC_ASN1_CONTEXT_SPECIFIC | 1, |
|
180 0, |
|
181 crmfPOPOSigningKeyTemplate}, |
|
182 { 0 } |
|
183 }; |
|
184 |
|
185 const SEC_ASN1Template CRMFThisMessageTemplate[] = { |
|
186 { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 0, |
|
187 0, |
|
188 SEC_ASN1_SUB(SEC_BitStringTemplate) }, |
|
189 { 0 } |
|
190 }; |
|
191 |
|
192 const SEC_ASN1Template CRMFSubsequentMessageTemplate[] = { |
|
193 { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 1, |
|
194 0, |
|
195 SEC_ASN1_SUB(SEC_IntegerTemplate) }, |
|
196 { 0 } |
|
197 }; |
|
198 |
|
199 const SEC_ASN1Template CRMFDHMACTemplate[] = { |
|
200 { SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 2, |
|
201 0, |
|
202 SEC_ASN1_SUB(SEC_BitStringTemplate) }, |
|
203 { 0 } |
|
204 }; |
|
205 |
|
206 const SEC_ASN1Template CRMFPOPOKeyEnciphermentTemplate[] = { |
|
207 { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | |
|
208 SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 2, |
|
209 0, |
|
210 SEC_ASN1_SUB(SEC_AnyTemplate) }, |
|
211 { 0 } |
|
212 }; |
|
213 |
|
214 const SEC_ASN1Template CRMFPOPOKeyAgreementTemplate[] = { |
|
215 { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | |
|
216 SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_XTRN | 3, |
|
217 0, |
|
218 SEC_ASN1_SUB(SEC_AnyTemplate)}, |
|
219 { 0 } |
|
220 }; |
|
221 |
|
222 const SEC_ASN1Template CRMFEncryptedValueTemplate[] = { |
|
223 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRMFEncryptedValue)}, |
|
224 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_POINTER | |
|
225 SEC_ASN1_XTRN | 0, |
|
226 offsetof(CRMFEncryptedValue, intendedAlg), |
|
227 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) }, |
|
228 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_POINTER | |
|
229 SEC_ASN1_XTRN | 1, |
|
230 offsetof (CRMFEncryptedValue, symmAlg), |
|
231 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) }, |
|
232 { SEC_ASN1_NO_STREAM | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_OPTIONAL | |
|
233 SEC_ASN1_XTRN | 2, |
|
234 offsetof(CRMFEncryptedValue, encSymmKey), |
|
235 SEC_ASN1_SUB(SEC_BitStringTemplate) }, |
|
236 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | SEC_ASN1_POINTER | |
|
237 SEC_ASN1_XTRN | 3, |
|
238 offsetof(CRMFEncryptedValue, keyAlg), |
|
239 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) }, |
|
240 { SEC_ASN1_NO_STREAM | SEC_ASN1_OPTIONAL | SEC_ASN1_CONTEXT_SPECIFIC | |
|
241 SEC_ASN1_XTRN | 4, |
|
242 offsetof(CRMFEncryptedValue, valueHint), |
|
243 SEC_ASN1_SUB(SEC_OctetStringTemplate) }, |
|
244 { SEC_ASN1_BIT_STRING, offsetof(CRMFEncryptedValue, encValue) }, |
|
245 { 0 } |
|
246 }; |
|
247 |
|
248 const SEC_ASN1Template CRMFEncryptedKeyWithEncryptedValueTemplate [] = { |
|
249 { SEC_ASN1_EXPLICIT | SEC_ASN1_CONSTRUCTED | |
|
250 SEC_ASN1_CONTEXT_SPECIFIC | 0, |
|
251 0, |
|
252 CRMFEncryptedValueTemplate}, |
|
253 { 0 } |
|
254 }; |
|
255 |
|
256 static const SEC_ASN1Template CRMFSinglePubInfoTemplate[] = { |
|
257 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof (CRMFSinglePubInfo)}, |
|
258 { SEC_ASN1_INTEGER, offsetof(CRMFSinglePubInfo, pubMethod) }, |
|
259 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_CONTEXT_SPECIFIC, |
|
260 offsetof(CRMFSinglePubInfo, pubLocation) }, |
|
261 { 0 } |
|
262 }; |
|
263 |
|
264 static const SEC_ASN1Template CRMFPublicationInfoTemplate[] ={ |
|
265 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CRMFPKIPublicationInfo) }, |
|
266 { SEC_ASN1_INTEGER, offsetof(CRMFPKIPublicationInfo, action) }, |
|
267 { SEC_ASN1_POINTER, offsetof(CRMFPKIPublicationInfo, pubInfos), |
|
268 CRMFSinglePubInfoTemplate}, |
|
269 { 0 } |
|
270 }; |