Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(296)

Side by Side Diff: nss/lib/cryptohi/seckey.c

Issue 1843333003: Update NSPR to 4.12 and NSS to 3.23 on iOS (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/nss.git@master
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* This Source Code Form is subject to the terms of the Mozilla Public 1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this 2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 #include "cryptohi.h" 4 #include "cryptohi.h"
5 #include "keyhi.h" 5 #include "keyhi.h"
6 #include "secoid.h" 6 #include "secoid.h"
7 #include "secitem.h" 7 #include "secitem.h"
8 #include "secder.h" 8 #include "secder.h"
9 #include "base64.h" 9 #include "base64.h"
10 #include "secasn1.h" 10 #include "secasn1.h"
11 #include "cert.h" 11 #include "cert.h"
12 #include "pk11func.h" 12 #include "pk11func.h"
13 #include "secerr.h" 13 #include "secerr.h"
14 #include "secdig.h" 14 #include "secdig.h"
15 #include "prtime.h" 15 #include "prtime.h"
16 #include "keyi.h" 16 #include "keyi.h"
17 17
18 SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate) 18 SEC_ASN1_MKSUB(SECOID_AlgorithmIDTemplate)
19 SEC_ASN1_MKSUB(SEC_IntegerTemplate) 19 SEC_ASN1_MKSUB(SEC_IntegerTemplate)
20 20
21 const SEC_ASN1Template CERT_SubjectPublicKeyInfoTemplate[] = { 21 const SEC_ASN1Template CERT_SubjectPublicKeyInfoTemplate[] = {
22 { SEC_ASN1_SEQUENCE, 22 { SEC_ASN1_SEQUENCE,
23 » 0, NULL, sizeof(CERTSubjectPublicKeyInfo) }, 23 0, NULL, sizeof(CERTSubjectPublicKeyInfo) },
24 { SEC_ASN1_INLINE | SEC_ASN1_XTRN, 24 { SEC_ASN1_INLINE | SEC_ASN1_XTRN,
25 » offsetof(CERTSubjectPublicKeyInfo,algorithm), 25 offsetof(CERTSubjectPublicKeyInfo, algorithm),
26 » SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) }, 26 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) },
27 { SEC_ASN1_BIT_STRING, 27 { SEC_ASN1_BIT_STRING,
28 » offsetof(CERTSubjectPublicKeyInfo,subjectPublicKey), }, 28 offsetof(CERTSubjectPublicKeyInfo, subjectPublicKey) },
29 { 0, } 29 { 0 }
30 }; 30 };
31 31
32 const SEC_ASN1Template CERT_PublicKeyAndChallengeTemplate[] = 32 const SEC_ASN1Template CERT_PublicKeyAndChallengeTemplate[] =
33 { 33 {
34 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CERTPublicKeyAndChallenge) }, 34 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(CERTPublicKeyAndChallenge) },
35 { SEC_ASN1_ANY, offsetof(CERTPublicKeyAndChallenge,spki) }, 35 { SEC_ASN1_ANY, offsetof(CERTPublicKeyAndChallenge, spki) },
36 { SEC_ASN1_IA5_STRING, offsetof(CERTPublicKeyAndChallenge,challenge) }, 36 { SEC_ASN1_IA5_STRING, offsetof(CERTPublicKeyAndChallenge, challenge) },
37 { 0 }
38 };
39
40 const SEC_ASN1Template SECKEY_RSAPublicKeyTemplate[] = {
41 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYPublicKey) },
42 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey, u.rsa.modulus) },
43 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey, u.rsa.publicExponent) },
37 { 0 } 44 { 0 }
38 }; 45 };
39 46
40 const SEC_ASN1Template SECKEY_RSAPublicKeyTemplate[] = {
41 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYPublicKey) },
42 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey,u.rsa.modulus), },
43 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey,u.rsa.publicExponent), },
44 { 0, }
45 };
46
47 static const SEC_ASN1Template seckey_PointerToAlgorithmIDTemplate[] = { 47 static const SEC_ASN1Template seckey_PointerToAlgorithmIDTemplate[] = {
48 { SEC_ASN1_POINTER | SEC_ASN1_XTRN, 0, 48 { SEC_ASN1_POINTER | SEC_ASN1_XTRN, 0,
49 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) } 49 SEC_ASN1_SUB(SECOID_AlgorithmIDTemplate) }
50 }; 50 };
51 51
52 /* Parameters for SEC_OID_PKCS1_RSA_PSS_SIGNATURE */ 52 /* Parameters for SEC_OID_PKCS1_RSA_PSS_SIGNATURE */
53 const SEC_ASN1Template SECKEY_RSAPSSParamsTemplate[] = 53 const SEC_ASN1Template SECKEY_RSAPSSParamsTemplate[] =
54 { 54 {
55 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYRSAPSSParams) }, 55 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYRSAPSSParams) },
56 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | 56 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT |
57 SEC_ASN1_CONTEXT_SPECIFIC | 0, 57 SEC_ASN1_CONTEXT_SPECIFIC | 0,
58 offsetof(SECKEYRSAPSSParams, hashAlg), 58 offsetof(SECKEYRSAPSSParams, hashAlg),
59 seckey_PointerToAlgorithmIDTemplate }, 59 seckey_PointerToAlgorithmIDTemplate },
60 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | 60 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT |
61 SEC_ASN1_CONTEXT_SPECIFIC | 1, 61 SEC_ASN1_CONTEXT_SPECIFIC | 1,
62 offsetof(SECKEYRSAPSSParams, maskAlg), 62 offsetof(SECKEYRSAPSSParams, maskAlg),
63 seckey_PointerToAlgorithmIDTemplate }, 63 seckey_PointerToAlgorithmIDTemplate },
64 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | 64 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT |
65 SEC_ASN1_XTRN | SEC_ASN1_CONTEXT_SPECIFIC | 2, 65 SEC_ASN1_XTRN | SEC_ASN1_CONTEXT_SPECIFIC | 2,
66 offsetof(SECKEYRSAPSSParams, saltLength), 66 offsetof(SECKEYRSAPSSParams, saltLength),
67 SEC_ASN1_SUB(SEC_IntegerTemplate) }, 67 SEC_ASN1_SUB(SEC_IntegerTemplate) },
68 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT | 68 { SEC_ASN1_OPTIONAL | SEC_ASN1_CONSTRUCTED | SEC_ASN1_EXPLICIT |
69 SEC_ASN1_XTRN | SEC_ASN1_CONTEXT_SPECIFIC | 3, 69 SEC_ASN1_XTRN | SEC_ASN1_CONTEXT_SPECIFIC | 3,
70 offsetof(SECKEYRSAPSSParams, trailerField), 70 offsetof(SECKEYRSAPSSParams, trailerField),
71 SEC_ASN1_SUB(SEC_IntegerTemplate) }, 71 SEC_ASN1_SUB(SEC_IntegerTemplate) },
72 { 0 } 72 { 0 }
73 }; 73 };
74 74
75 const SEC_ASN1Template SECKEY_DSAPublicKeyTemplate[] = { 75 const SEC_ASN1Template SECKEY_DSAPublicKeyTemplate[] = {
76 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey,u.dsa.publicValue), }, 76 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey, u.dsa.publicValue) },
77 { 0, } 77 { 0 }
78 }; 78 };
79 79
80 const SEC_ASN1Template SECKEY_PQGParamsTemplate[] = { 80 const SEC_ASN1Template SECKEY_PQGParamsTemplate[] = {
81 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYPQGParams) }, 81 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYPQGParams) },
82 { SEC_ASN1_INTEGER, offsetof(SECKEYPQGParams,prime) }, 82 { SEC_ASN1_INTEGER, offsetof(SECKEYPQGParams, prime) },
83 { SEC_ASN1_INTEGER, offsetof(SECKEYPQGParams,subPrime) }, 83 { SEC_ASN1_INTEGER, offsetof(SECKEYPQGParams, subPrime) },
84 { SEC_ASN1_INTEGER, offsetof(SECKEYPQGParams,base) }, 84 { SEC_ASN1_INTEGER, offsetof(SECKEYPQGParams, base) },
85 { 0, } 85 { 0 }
86 }; 86 };
87 87
88 const SEC_ASN1Template SECKEY_DHPublicKeyTemplate[] = { 88 const SEC_ASN1Template SECKEY_DHPublicKeyTemplate[] = {
89 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey,u.dh.publicValue), }, 89 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey, u.dh.publicValue) },
90 { 0, } 90 { 0 }
91 }; 91 };
92 92
93 const SEC_ASN1Template SECKEY_DHParamKeyTemplate[] = { 93 const SEC_ASN1Template SECKEY_DHParamKeyTemplate[] = {
94 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYPublicKey) }, 94 { SEC_ASN1_SEQUENCE, 0, NULL, sizeof(SECKEYPublicKey) },
95 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey,u.dh.prime), }, 95 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey, u.dh.prime) },
96 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey,u.dh.base), }, 96 { SEC_ASN1_INTEGER, offsetof(SECKEYPublicKey, u.dh.base) },
97 /* XXX chrisk: this needs to be expanded for decoding of j and validationPar ms (RFC2459 7.3.2) */ 97 /* XXX chrisk: this needs to be expanded for decoding of j and validationPar ms (RFC2459 7.3.2) */
98 { SEC_ASN1_SKIP_REST }, 98 { SEC_ASN1_SKIP_REST },
99 { 0, } 99 { 0 }
100 }; 100 };
101 101
102 SEC_ASN1_CHOOSER_IMPLEMENT(SECKEY_DSAPublicKeyTemplate) 102 SEC_ASN1_CHOOSER_IMPLEMENT(SECKEY_DSAPublicKeyTemplate)
103 SEC_ASN1_CHOOSER_IMPLEMENT(SECKEY_RSAPublicKeyTemplate) 103 SEC_ASN1_CHOOSER_IMPLEMENT(SECKEY_RSAPublicKeyTemplate)
104 SEC_ASN1_CHOOSER_IMPLEMENT(SECKEY_RSAPSSParamsTemplate) 104 SEC_ASN1_CHOOSER_IMPLEMENT(SECKEY_RSAPSSParamsTemplate)
105 SEC_ASN1_CHOOSER_IMPLEMENT(CERT_SubjectPublicKeyInfoTemplate) 105 SEC_ASN1_CHOOSER_IMPLEMENT(CERT_SubjectPublicKeyInfoTemplate)
106 106
107 /* 107 /*
108 * See bugzilla bug 125359 108 * See bugzilla bug 125359
109 * Since NSS (via PKCS#11) wants to handle big integers as unsigned ints, 109 * Since NSS (via PKCS#11) wants to handle big integers as unsigned ints,
(...skipping 25 matching lines...) Expand all
135 135
136 static void 136 static void
137 prepare_dh_pub_key_for_asn1(SECKEYPublicKey *pubk) 137 prepare_dh_pub_key_for_asn1(SECKEYPublicKey *pubk)
138 { 138 {
139 pubk->u.dh.prime.type = siUnsignedInteger; 139 pubk->u.dh.prime.type = siUnsignedInteger;
140 pubk->u.dh.base.type = siUnsignedInteger; 140 pubk->u.dh.base.type = siUnsignedInteger;
141 pubk->u.dh.publicValue.type = siUnsignedInteger; 141 pubk->u.dh.publicValue.type = siUnsignedInteger;
142 } 142 }
143 143
144 /* Create an RSA key pair is any slot able to do so. 144 /* Create an RSA key pair is any slot able to do so.
145 ** The created keys are "session" (temporary), not "token" (permanent), 145 ** The created keys are "session" (temporary), not "token" (permanent),
146 ** and they are "sensitive", which makes them costly to move to another token. 146 ** and they are "sensitive", which makes them costly to move to another token.
147 */ 147 */
148 SECKEYPrivateKey * 148 SECKEYPrivateKey *
149 SECKEY_CreateRSAPrivateKey(int keySizeInBits,SECKEYPublicKey **pubk, void *cx) 149 SECKEY_CreateRSAPrivateKey(int keySizeInBits, SECKEYPublicKey **pubk, void *cx)
150 { 150 {
151 SECKEYPrivateKey *privk; 151 SECKEYPrivateKey *privk;
152 PK11RSAGenParams param; 152 PK11RSAGenParams param;
153 PK11SlotInfo *slot = PK11_GetBestSlot(CKM_RSA_PKCS_KEY_PAIR_GEN,cx); 153 PK11SlotInfo *slot = PK11_GetBestSlot(CKM_RSA_PKCS_KEY_PAIR_GEN, cx);
154 if (!slot) { 154 if (!slot) {
155 » return NULL; 155 return NULL;
156 } 156 }
157 157
158 param.keySizeInBits = keySizeInBits; 158 param.keySizeInBits = keySizeInBits;
159 param.pe = 65537L; 159 param.pe = 65537L;
160 160
161 privk = PK11_GenerateKeyPair(slot,CKM_RSA_PKCS_KEY_PAIR_GEN,&param,pubk, 161 privk = PK11_GenerateKeyPair(slot, CKM_RSA_PKCS_KEY_PAIR_GEN, &param, pubk,
162 » » » » » PR_FALSE, PR_TRUE, cx); 162 PR_FALSE, PR_TRUE, cx);
163 PK11_FreeSlot(slot); 163 PK11_FreeSlot(slot);
164 return(privk); 164 return (privk);
165 } 165 }
166 166
167 /* Create a DH key pair in any slot able to do so, 167 /* Create a DH key pair in any slot able to do so,
168 ** This is a "session" (temporary), not "token" (permanent) key. 168 ** This is a "session" (temporary), not "token" (permanent) key.
169 ** Because of the high probability that this key will need to be moved to 169 ** Because of the high probability that this key will need to be moved to
170 ** another token, and the high cost of moving "sensitive" keys, we attempt 170 ** another token, and the high cost of moving "sensitive" keys, we attempt
171 ** to create this key pair without the "sensitive" attribute, but revert to 171 ** to create this key pair without the "sensitive" attribute, but revert to
172 ** creating a "sensitive" key if necessary. 172 ** creating a "sensitive" key if necessary.
173 */ 173 */
174 SECKEYPrivateKey * 174 SECKEYPrivateKey *
175 SECKEY_CreateDHPrivateKey(SECKEYDHParams *param, SECKEYPublicKey **pubk, void *c x) 175 SECKEY_CreateDHPrivateKey(SECKEYDHParams *param, SECKEYPublicKey **pubk, void *c x)
176 { 176 {
177 SECKEYPrivateKey *privk; 177 SECKEYPrivateKey *privk;
178 PK11SlotInfo *slot; 178 PK11SlotInfo *slot;
179 179
180 if (!param || !param->base.data || !param->prime.data || 180 if (!param || !param->base.data || !param->prime.data ||
181 SECKEY_BigIntegerBitLength(&param->prime) < DH_MIN_P_BITS || 181 SECKEY_BigIntegerBitLength(&param->prime) < DH_MIN_P_BITS ||
182 param->base.len == 0 || param->base.len > param->prime.len + 1 || 182 param->base.len == 0 || param->base.len > param->prime.len + 1 ||
183 » (param->base.len == 1 && param->base.data[0] == 0)) { 183 (param->base.len == 1 && param->base.data[0] == 0)) {
184 » PORT_SetError(SEC_ERROR_INVALID_ARGS); 184 PORT_SetError(SEC_ERROR_INVALID_ARGS);
185 » return NULL; 185 return NULL;
186 } 186 }
187 187
188 slot = PK11_GetBestSlot(CKM_DH_PKCS_KEY_PAIR_GEN,cx); 188 slot = PK11_GetBestSlot(CKM_DH_PKCS_KEY_PAIR_GEN, cx);
189 if (!slot) { 189 if (!slot) {
190 » return NULL; 190 return NULL;
191 } 191 }
192 192
193 privk = PK11_GenerateKeyPair(slot, CKM_DH_PKCS_KEY_PAIR_GEN, param, 193 privk = PK11_GenerateKeyPair(slot, CKM_DH_PKCS_KEY_PAIR_GEN, param,
194 pubk, PR_FALSE, PR_FALSE, cx); 194 pubk, PR_FALSE, PR_FALSE, cx);
195 if (!privk) 195 if (!privk)
196 » privk = PK11_GenerateKeyPair(slot, CKM_DH_PKCS_KEY_PAIR_GEN, param, 196 privk = PK11_GenerateKeyPair(slot, CKM_DH_PKCS_KEY_PAIR_GEN, param,
197 » pubk, PR_FALSE, PR_TRUE, cx); 197 pubk, PR_FALSE, PR_TRUE, cx);
198 198
199 PK11_FreeSlot(slot); 199 PK11_FreeSlot(slot);
200 return(privk); 200 return (privk);
201 } 201 }
202 202
203 /* Create an EC key pair in any slot able to do so, 203 /* Create an EC key pair in any slot able to do so,
204 ** This is a "session" (temporary), not "token" (permanent) key. 204 ** This is a "session" (temporary), not "token" (permanent) key.
205 ** Because of the high probability that this key will need to be moved to 205 ** Because of the high probability that this key will need to be moved to
206 ** another token, and the high cost of moving "sensitive" keys, we attempt 206 ** another token, and the high cost of moving "sensitive" keys, we attempt
207 ** to create this key pair without the "sensitive" attribute, but revert to 207 ** to create this key pair without the "sensitive" attribute, but revert to
208 ** creating a "sensitive" key if necessary. 208 ** creating a "sensitive" key if necessary.
209 */ 209 */
210 SECKEYPrivateKey * 210 SECKEYPrivateKey *
211 SECKEY_CreateECPrivateKey(SECKEYECParams *param, SECKEYPublicKey **pubk, void *c x) 211 SECKEY_CreateECPrivateKey(SECKEYECParams *param, SECKEYPublicKey **pubk, void *c x)
212 { 212 {
213 SECKEYPrivateKey *privk; 213 SECKEYPrivateKey *privk;
214 PK11SlotInfo *slot = PK11_GetBestSlot(CKM_EC_KEY_PAIR_GEN,cx); 214 PK11SlotInfo *slot = PK11_GetBestSlot(CKM_EC_KEY_PAIR_GEN, cx);
215 if (!slot) { 215 if (!slot) {
216 » return NULL; 216 return NULL;
217 } 217 }
218 218
219 privk = PK11_GenerateKeyPairWithOpFlags(slot, CKM_EC_KEY_PAIR_GEN, 219 privk = PK11_GenerateKeyPairWithOpFlags(slot, CKM_EC_KEY_PAIR_GEN,
220 param, pubk, 220 param, pubk,
221 PK11_ATTR_SESSION | PK11_ATTR_INSENSITIVE | 221 PK11_ATTR_SESSION |
222 PK11_ATTR_PUBLIC, 222 PK11_ATTR_INSENSITIVE |
223 CKF_DERIVE, CKF_DERIVE|CKF_SIGN,cx); 223 PK11_ATTR_PUBLIC,
224 if (!privk) 224 CKF_DERIVE, CKF_DERIVE |
225 privk = PK11_GenerateKeyPairWithOpFlags(slot, CKM_EC_KEY_PAIR_GEN, 225 CKF_SIGN,
226 param, pubk, 226 cx);
227 PK11_ATTR_SESSION | PK11_ATTR_SENSITIVE | 227 if (!privk)
228 PK11_ATTR_PRIVATE, 228 privk = PK11_GenerateKeyPairWithOpFlags(slot, CKM_EC_KEY_PAIR_GEN,
229 CKF_DERIVE, CKF_DERIVE|CKF_SIGN,cx); 229 param, pubk,
230 PK11_ATTR_SESSION |
231 PK11_ATTR_SENSITIVE |
232 PK11_ATTR_PRIVATE,
233 CKF_DERIVE, CKF_DERIVE |
234 CKF_SIGN,
235 cx);
230 236
231 PK11_FreeSlot(slot); 237 PK11_FreeSlot(slot);
232 return(privk); 238 return (privk);
233 } 239 }
234 240
235 void 241 void
236 SECKEY_DestroyPrivateKey(SECKEYPrivateKey *privk) 242 SECKEY_DestroyPrivateKey(SECKEYPrivateKey *privk)
237 { 243 {
238 if (privk) { 244 if (privk) {
239 » if (privk->pkcs11Slot) { 245 if (privk->pkcs11Slot) {
240 » if (privk->pkcs11IsTemp) { 246 if (privk->pkcs11IsTemp) {
241 » » PK11_DestroyObject(privk->pkcs11Slot,privk->pkcs11ID); 247 PK11_DestroyObject(privk->pkcs11Slot, privk->pkcs11ID);
242 » } 248 }
243 » PK11_FreeSlot(privk->pkcs11Slot); 249 PK11_FreeSlot(privk->pkcs11Slot);
244 250 }
245 » } 251 if (privk->arena) {
246 » if (privk->arena) { 252 PORT_FreeArena(privk->arena, PR_TRUE);
247 » PORT_FreeArena(privk->arena, PR_TRUE); 253 }
248 » }
249 } 254 }
250 } 255 }
251 256
252 void 257 void
253 SECKEY_DestroyPublicKey(SECKEYPublicKey *pubk) 258 SECKEY_DestroyPublicKey(SECKEYPublicKey *pubk)
254 { 259 {
255 if (pubk) { 260 if (pubk) {
256 » if (pubk->pkcs11Slot) { 261 if (pubk->pkcs11Slot) {
257 » if (!PK11_IsPermObject(pubk->pkcs11Slot,pubk->pkcs11ID)) { 262 if (!PK11_IsPermObject(pubk->pkcs11Slot, pubk->pkcs11ID)) {
258 » » PK11_DestroyObject(pubk->pkcs11Slot,pubk->pkcs11ID); 263 PK11_DestroyObject(pubk->pkcs11Slot, pubk->pkcs11ID);
259 » } 264 }
260 » PK11_FreeSlot(pubk->pkcs11Slot); 265 PK11_FreeSlot(pubk->pkcs11Slot);
261 » } 266 }
262 » if (pubk->arena) { 267 if (pubk->arena) {
263 » PORT_FreeArena(pubk->arena, PR_FALSE); 268 PORT_FreeArena(pubk->arena, PR_FALSE);
264 » } 269 }
265 } 270 }
266 } 271 }
267 272
268 SECStatus 273 SECStatus
269 SECKEY_CopySubjectPublicKeyInfo(PLArenaPool *arena, 274 SECKEY_CopySubjectPublicKeyInfo(PLArenaPool *arena,
270 » » » CERTSubjectPublicKeyInfo *to, 275 CERTSubjectPublicKeyInfo *to,
271 » » » CERTSubjectPublicKeyInfo *from) 276 CERTSubjectPublicKeyInfo *from)
272 { 277 {
273 SECStatus rv; 278 SECStatus rv;
274 SECItem spk; 279 SECItem spk;
275 280
276 rv = SECOID_CopyAlgorithmID(arena, &to->algorithm, &from->algorithm); 281 rv = SECOID_CopyAlgorithmID(arena, &to->algorithm, &from->algorithm);
277 if (rv == SECSuccess) { 282 if (rv == SECSuccess) {
278 » /* 283 /*
279 » * subjectPublicKey is a bit string, whose length is in bits. 284 * subjectPublicKey is a bit string, whose length is in bits.
280 » * Convert the length from bits to bytes for SECITEM_CopyItem. 285 * Convert the length from bits to bytes for SECITEM_CopyItem.
281 » */ 286 */
282 » spk = from->subjectPublicKey; 287 spk = from->subjectPublicKey;
283 » DER_ConvertBitString(&spk); 288 DER_ConvertBitString(&spk);
284 » rv = SECITEM_CopyItem(arena, &to->subjectPublicKey, &spk); 289 rv = SECITEM_CopyItem(arena, &to->subjectPublicKey, &spk);
285 » /* Set the length back to bits. */ 290 /* Set the length back to bits. */
286 » if (rv == SECSuccess) { 291 if (rv == SECSuccess) {
287 » to->subjectPublicKey.len = from->subjectPublicKey.len; 292 to->subjectPublicKey.len = from->subjectPublicKey.len;
288 » } 293 }
289 } 294 }
290 295
291 return rv; 296 return rv;
292 } 297 }
293 298
294 /* Procedure to update the pqg parameters for a cert's public key. 299 /* Procedure to update the pqg parameters for a cert's public key.
295 * pqg parameters only need to be updated for DSA certificates. 300 * pqg parameters only need to be updated for DSA certificates.
296 * The procedure uses calls to itself recursively to update a certificate 301 * The procedure uses calls to itself recursively to update a certificate
297 * issuer's pqg parameters. Some important rules are: 302 * issuer's pqg parameters. Some important rules are:
298 * - Do nothing if the cert already has PQG parameters. 303 * - Do nothing if the cert already has PQG parameters.
299 * - If the cert does not have PQG parameters, obtain them from the issuer. 304 * - If the cert does not have PQG parameters, obtain them from the issuer.
300 * - A valid cert chain cannot have a DSA cert without 305 * - A valid cert chain cannot have a DSA cert without
301 * pqg parameters that has a parent that is not a DSA cert. */ 306 * pqg parameters that has a parent that is not a DSA cert. */
302 307
303 static SECStatus 308 static SECStatus
304 seckey_UpdateCertPQGChain(CERTCertificate * subjectCert, int count) 309 seckey_UpdateCertPQGChain(CERTCertificate *subjectCert, int count)
305 { 310 {
306 SECStatus rv; 311 SECStatus rv;
307 SECOidData *oid=NULL; 312 SECOidData *oid = NULL;
308 int tag; 313 int tag;
309 CERTSubjectPublicKeyInfo * subjectSpki=NULL; 314 CERTSubjectPublicKeyInfo *subjectSpki = NULL;
310 CERTSubjectPublicKeyInfo * issuerSpki=NULL; 315 CERTSubjectPublicKeyInfo *issuerSpki = NULL;
311 CERTCertificate *issuerCert = NULL; 316 CERTCertificate *issuerCert = NULL;
312 317
313 rv = SECSuccess; 318 rv = SECSuccess;
314 319
315 /* increment cert chain length counter*/ 320 /* increment cert chain length counter*/
316 count++; 321 count++;
317 322
318 /* check if cert chain length exceeds the maximum length*/ 323 /* check if cert chain length exceeds the maximum length*/
319 if (count > CERT_MAX_CERT_CHAIN) { 324 if (count > CERT_MAX_CERT_CHAIN) {
320 » return SECFailure; 325 return SECFailure;
321 } 326 }
322 327
323 oid = SECOID_FindOID(&subjectCert->subjectPublicKeyInfo.algorithm.algorithm) ; 328 oid = SECOID_FindOID(&subjectCert->subjectPublicKeyInfo.algorithm.algorithm) ;
324 if (oid != NULL) { 329 if (oid != NULL) {
325 tag = oid->offset; 330 tag = oid->offset;
326 331
327 /* Check if cert has a DSA or EC public key. If not, return 332 /* Check if cert has a DSA or EC public key. If not, return
328 * success since no PQG params need to be updated. 333 * success since no PQG params need to be updated.
329 » * 334 *
330 » * Question: do we really need to do this for EC keys. They don't have 335 * Question: do we really need to do this for EC keys. They don't have
331 » * PQG parameters, but they do have parameters. The question is does 336 * PQG parameters, but they do have parameters. The question is does
332 » * the child cert inherit thost parameters for EC from the parent, or 337 * the child cert inherit thost parameters for EC from the parent, or
333 » * do we always include those parameters in each cert. 338 * do we always include those parameters in each cert.
334 » */ 339 */
335 340
336 » if ( (tag != SEC_OID_ANSIX9_DSA_SIGNATURE) && 341 if ((tag != SEC_OID_ANSIX9_DSA_SIGNATURE) &&
337 (tag != SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST) && 342 (tag != SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST) &&
338 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA224_DIGEST) && 343 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA224_DIGEST) &&
339 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA256_DIGEST) && 344 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA256_DIGEST) &&
340 (tag != SEC_OID_BOGUS_DSA_SIGNATURE_WITH_SHA1_DIGEST) && 345 (tag != SEC_OID_BOGUS_DSA_SIGNATURE_WITH_SHA1_DIGEST) &&
341 (tag != SEC_OID_SDN702_DSA_SIGNATURE) && 346 (tag != SEC_OID_SDN702_DSA_SIGNATURE) &&
342 (tag != SEC_OID_ANSIX962_EC_PUBLIC_KEY) ) { 347 (tag != SEC_OID_ANSIX962_EC_PUBLIC_KEY)) {
343 348
344 return SECSuccess; 349 return SECSuccess;
345 } 350 }
346 } else { 351 } else {
347 return SECFailure; /* return failure if oid is NULL */ 352 return SECFailure; /* return failure if oid is NULL */
348 } 353 }
349 354
350 /* if cert has PQG parameters, return success */ 355 /* if cert has PQG parameters, return success */
351 356
352 subjectSpki=&subjectCert->subjectPublicKeyInfo; 357 subjectSpki = &subjectCert->subjectPublicKeyInfo;
353 358
354 if (subjectSpki->algorithm.parameters.len != 0) { 359 if (subjectSpki->algorithm.parameters.len != 0) {
355 return SECSuccess; 360 return SECSuccess;
356 } 361 }
357 362
358 /* check if the cert is self-signed */ 363 /* check if the cert is self-signed */
359 if (subjectCert->isRoot) { 364 if (subjectCert->isRoot) {
360 /* fail since cert is self-signed and has no pqg params. */ 365 /* fail since cert is self-signed and has no pqg params. */
361 » return SECFailure; 366 return SECFailure;
362 } 367 }
363 368
364 /* get issuer cert */ 369 /* get issuer cert */
365 issuerCert = CERT_FindCertIssuer(subjectCert, PR_Now(), certUsageAnyCA); 370 issuerCert = CERT_FindCertIssuer(subjectCert, PR_Now(), certUsageAnyCA);
366 if ( ! issuerCert ) { 371 if (!issuerCert) {
367 » return SECFailure; 372 return SECFailure;
368 } 373 }
369 374
370 /* if parent is not DSA, return failure since 375 /* if parent is not DSA, return failure since
371 we don't allow this case. */ 376 we don't allow this case. */
372 377
373 oid = SECOID_FindOID(&issuerCert->subjectPublicKeyInfo.algorithm.algorithm); 378 oid = SECOID_FindOID(&issuerCert->subjectPublicKeyInfo.algorithm.algorithm);
374 if (oid != NULL) { 379 if (oid != NULL) {
375 tag = oid->offset; 380 tag = oid->offset;
376 381
377 /* Check if issuer cert has a DSA public key. If not, 382 /* Check if issuer cert has a DSA public key. If not,
378 * return failure. */ 383 * return failure. */
379 384
380 » if ( (tag != SEC_OID_ANSIX9_DSA_SIGNATURE) && 385 if ((tag != SEC_OID_ANSIX9_DSA_SIGNATURE) &&
381 (tag != SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST) && 386 (tag != SEC_OID_ANSIX9_DSA_SIGNATURE_WITH_SHA1_DIGEST) &&
382 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA224_DIGEST) && 387 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA224_DIGEST) &&
383 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA256_DIGEST) && 388 (tag != SEC_OID_NIST_DSA_SIGNATURE_WITH_SHA256_DIGEST) &&
384 (tag != SEC_OID_BOGUS_DSA_SIGNATURE_WITH_SHA1_DIGEST) && 389 (tag != SEC_OID_BOGUS_DSA_SIGNATURE_WITH_SHA1_DIGEST) &&
385 (tag != SEC_OID_SDN702_DSA_SIGNATURE) && 390 (tag != SEC_OID_SDN702_DSA_SIGNATURE) &&
386 (tag != SEC_OID_ANSIX962_EC_PUBLIC_KEY) ) { 391 (tag != SEC_OID_ANSIX962_EC_PUBLIC_KEY)) {
387 rv = SECFailure; 392 rv = SECFailure;
388 goto loser; 393 goto loser;
389 } 394 }
390 } else { 395 } else {
391 rv = SECFailure; /* return failure if oid is NULL */ 396 rv = SECFailure; /* return failure if oid is NULL */
392 goto loser; 397 goto loser;
393 } 398 }
394 399
395
396 /* at this point the subject cert has no pqg parameters and the 400 /* at this point the subject cert has no pqg parameters and the
397 * issuer cert has a DSA public key. Update the issuer's 401 * issuer cert has a DSA public key. Update the issuer's
398 * pqg parameters with a recursive call to this same function. */ 402 * pqg parameters with a recursive call to this same function. */
399 403
400 rv = seckey_UpdateCertPQGChain(issuerCert, count); 404 rv = seckey_UpdateCertPQGChain(issuerCert, count);
401 if (rv != SECSuccess) { 405 if (rv != SECSuccess) {
402 rv = SECFailure; 406 rv = SECFailure;
403 goto loser; 407 goto loser;
404 } 408 }
405 409
406 /* ensure issuer has pqg parameters */ 410 /* ensure issuer has pqg parameters */
407 411
408 issuerSpki=&issuerCert->subjectPublicKeyInfo; 412 issuerSpki = &issuerCert->subjectPublicKeyInfo;
409 if (issuerSpki->algorithm.parameters.len == 0) { 413 if (issuerSpki->algorithm.parameters.len == 0) {
410 rv = SECFailure; 414 rv = SECFailure;
411 } 415 }
412 416
413 /* if update was successful and pqg params present, then copy the 417 /* if update was successful and pqg params present, then copy the
414 * parameters to the subject cert's key. */ 418 * parameters to the subject cert's key. */
415 419
416 if (rv == SECSuccess) { 420 if (rv == SECSuccess) {
417 rv = SECITEM_CopyItem(subjectCert->arena, 421 rv = SECITEM_CopyItem(subjectCert->arena,
418 &subjectSpki->algorithm.parameters, 422 &subjectSpki->algorithm.parameters,
419 » » » &issuerSpki->algorithm.parameters); 423 &issuerSpki->algorithm.parameters);
420 } 424 }
421 425
422 loser: 426 loser:
423 if (issuerCert) { 427 if (issuerCert) {
424 CERT_DestroyCertificate(issuerCert); 428 CERT_DestroyCertificate(issuerCert);
425 } 429 }
426 return rv; 430 return rv;
427
428 } 431 }
429
430 432
431 SECStatus 433 SECStatus
432 SECKEY_UpdateCertPQG(CERTCertificate * subjectCert) 434 SECKEY_UpdateCertPQG(CERTCertificate *subjectCert)
433 { 435 {
434 if (!subjectCert) { 436 if (!subjectCert) {
435 PORT_SetError(SEC_ERROR_INVALID_ARGS); 437 PORT_SetError(SEC_ERROR_INVALID_ARGS);
436 » return SECFailure; 438 return SECFailure;
437 } 439 }
438 return seckey_UpdateCertPQGChain(subjectCert,0); 440 return seckey_UpdateCertPQGChain(subjectCert, 0);
439 } 441 }
440
441 442
442 /* Decode the DSA PQG parameters. The params could be stored in two 443 /* Decode the DSA PQG parameters. The params could be stored in two
443 * possible formats, the old fortezza-only wrapped format or 444 * possible formats, the old fortezza-only wrapped format or
444 * the normal standard format. Store the decoded parameters in 445 * the normal standard format. Store the decoded parameters in
445 * a V3 certificate data structure. */ 446 * a V3 certificate data structure. */
446 447
447 static SECStatus 448 static SECStatus
448 seckey_DSADecodePQG(PLArenaPool *arena, SECKEYPublicKey *pubk, 449 seckey_DSADecodePQG(PLArenaPool *arena, SECKEYPublicKey *pubk,
449 const SECItem *params) { 450 const SECItem *params)
451 {
450 SECStatus rv; 452 SECStatus rv;
451 SECItem newparams; 453 SECItem newparams;
452 454
453 if (params == NULL) return SECFailure; 455 if (params == NULL)
454 456 return SECFailure;
455 if (params->data == NULL) return SECFailure; 457
458 if (params->data == NULL)
459 return SECFailure;
456 460
457 PORT_Assert(arena); 461 PORT_Assert(arena);
458 462
459 /* make a copy of the data into the arena so QuickDER output is valid */ 463 /* make a copy of the data into the arena so QuickDER output is valid */
460 rv = SECITEM_CopyItem(arena, &newparams, params); 464 rv = SECITEM_CopyItem(arena, &newparams, params);
461 465
462 /* Check if params use the standard format. 466 /* Check if params use the standard format.
463 * The value 0xa1 will appear in the first byte of the parameter data 467 * The value 0xa1 will appear in the first byte of the parameter data
464 * if the PQG parameters are not using the standard format. This 468 * if the PQG parameters are not using the standard format. This
465 * code should be changed to use a better method to detect non-standard 469 * code should be changed to use a better method to detect non-standard
466 * parameters. */ 470 * parameters. */
467 471
468 if ((newparams.data[0] != 0xa1) && 472 if ((newparams.data[0] != 0xa1) &&
469 (newparams.data[0] != 0xa0)) { 473 (newparams.data[0] != 0xa0)) {
470 474
471 if (SECSuccess == rv) { 475 if (SECSuccess == rv) {
472 /* PQG params are in the standard format */ 476 /* PQG params are in the standard format */
473 prepare_pqg_params_for_asn1(&pubk->u.dsa.params); 477 prepare_pqg_params_for_asn1(&pubk->u.dsa.params);
474 rv = SEC_QuickDERDecodeItem(arena, &pubk->u.dsa.params, 478 rv = SEC_QuickDERDecodeItem(arena, &pubk->u.dsa.params,
475 SECKEY_PQGParamsTemplate, 479 SECKEY_PQGParamsTemplate,
476 &newparams); 480 &newparams);
477 } 481 }
478 } else { 482 } else {
479 483
480 if (SECSuccess == rv) { 484 if (SECSuccess == rv) {
481 /* else the old fortezza-only wrapped format is used. */ 485 /* else the old fortezza-only wrapped format is used. */
482 PORT_SetError(SEC_ERROR_BAD_DER); 486 PORT_SetError(SEC_ERROR_BAD_DER);
483 rv = SECFailure; 487 rv = SECFailure;
484 } 488 }
485 } 489 }
486 return rv; 490 return rv;
487 } 491 }
488 492
489
490 /* Function used to make an oid tag to a key type */ 493 /* Function used to make an oid tag to a key type */
491 KeyType 494 KeyType
492 seckey_GetKeyType (SECOidTag tag) { 495 seckey_GetKeyType(SECOidTag tag)
496 {
493 KeyType keyType; 497 KeyType keyType;
494 498
495 switch (tag) { 499 switch (tag) {
496 case SEC_OID_X500_RSA_ENCRYPTION: 500 case SEC_OID_X500_RSA_ENCRYPTION:
497 case SEC_OID_PKCS1_RSA_ENCRYPTION: 501 case SEC_OID_PKCS1_RSA_ENCRYPTION:
498 » keyType = rsaKey; 502 keyType = rsaKey;
499 » break; 503 break;
500 case SEC_OID_PKCS1_RSA_PSS_SIGNATURE: 504 case SEC_OID_PKCS1_RSA_PSS_SIGNATURE:
501 » keyType = rsaPssKey; 505 keyType = rsaPssKey;
502 » break; 506 break;
503 case SEC_OID_PKCS1_RSA_OAEP_ENCRYPTION: 507 case SEC_OID_PKCS1_RSA_OAEP_ENCRYPTION:
504 » keyType = rsaOaepKey; 508 keyType = rsaOaepKey;
505 » break; 509 break;
506 case SEC_OID_ANSIX9_DSA_SIGNATURE: 510 case SEC_OID_ANSIX9_DSA_SIGNATURE:
507 » keyType = dsaKey; 511 keyType = dsaKey;
508 » break; 512 break;
509 case SEC_OID_MISSI_KEA_DSS_OLD: 513 case SEC_OID_MISSI_KEA_DSS_OLD:
510 case SEC_OID_MISSI_KEA_DSS: 514 case SEC_OID_MISSI_KEA_DSS:
511 case SEC_OID_MISSI_DSS_OLD: 515 case SEC_OID_MISSI_DSS_OLD:
512 case SEC_OID_MISSI_DSS: 516 case SEC_OID_MISSI_DSS:
513 » keyType = fortezzaKey; 517 keyType = fortezzaKey;
514 » break; 518 break;
515 case SEC_OID_MISSI_KEA: 519 case SEC_OID_MISSI_KEA:
516 case SEC_OID_MISSI_ALT_KEA: 520 case SEC_OID_MISSI_ALT_KEA:
517 » keyType = keaKey; 521 keyType = keaKey;
518 » break; 522 break;
519 case SEC_OID_X942_DIFFIE_HELMAN_KEY: 523 case SEC_OID_X942_DIFFIE_HELMAN_KEY:
520 » keyType = dhKey; 524 keyType = dhKey;
521 » break; 525 break;
522 case SEC_OID_ANSIX962_EC_PUBLIC_KEY: 526 case SEC_OID_ANSIX962_EC_PUBLIC_KEY:
523 » keyType = ecKey; 527 keyType = ecKey;
524 » break; 528 break;
525 /* accommodate applications that hand us a signature type when they 529 /* accommodate applications that hand us a signature type when they
526 » * should be handing us a cipher type */ 530 * should be handing us a cipher type */
527 case SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION: 531 case SEC_OID_PKCS1_MD5_WITH_RSA_ENCRYPTION:
528 case SEC_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION: 532 case SEC_OID_PKCS1_SHA1_WITH_RSA_ENCRYPTION:
529 case SEC_OID_PKCS1_SHA224_WITH_RSA_ENCRYPTION: 533 case SEC_OID_PKCS1_SHA224_WITH_RSA_ENCRYPTION:
530 case SEC_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION: 534 case SEC_OID_PKCS1_SHA256_WITH_RSA_ENCRYPTION:
531 case SEC_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION: 535 case SEC_OID_PKCS1_SHA384_WITH_RSA_ENCRYPTION:
532 case SEC_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION: 536 case SEC_OID_PKCS1_SHA512_WITH_RSA_ENCRYPTION:
533 » keyType = rsaKey; 537 keyType = rsaKey;
534 » break; 538 break;
535 default: 539 default:
536 » keyType = nullKey; 540 keyType = nullKey;
537 } 541 }
538 return keyType; 542 return keyType;
539 } 543 }
540 544
541 /* Function used to determine what kind of cert we are dealing with. */ 545 /* Function used to determine what kind of cert we are dealing with. */
542 KeyType 546 KeyType
543 CERT_GetCertKeyType (const CERTSubjectPublicKeyInfo *spki) 547 CERT_GetCertKeyType(const CERTSubjectPublicKeyInfo *spki)
544 { 548 {
545 return seckey_GetKeyType(SECOID_GetAlgorithmTag(&spki->algorithm)); 549 return seckey_GetKeyType(SECOID_GetAlgorithmTag(&spki->algorithm));
546 } 550 }
547 551
548 static SECKEYPublicKey * 552 static SECKEYPublicKey *
549 seckey_ExtractPublicKey(const CERTSubjectPublicKeyInfo *spki) 553 seckey_ExtractPublicKey(const CERTSubjectPublicKeyInfo *spki)
550 { 554 {
551 SECKEYPublicKey *pubk; 555 SECKEYPublicKey *pubk;
552 SECItem os, newOs, newParms; 556 SECItem os, newOs, newParms;
553 SECStatus rv; 557 SECStatus rv;
554 PLArenaPool *arena; 558 PLArenaPool *arena;
555 SECOidTag tag; 559 SECOidTag tag;
556 560
557 arena = PORT_NewArena (DER_DEFAULT_CHUNKSIZE); 561 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
558 if (arena == NULL) 562 if (arena == NULL)
559 » return NULL; 563 return NULL;
560 564
561 pubk = (SECKEYPublicKey *) PORT_ArenaZAlloc(arena, sizeof(SECKEYPublicKey)); 565 pubk = (SECKEYPublicKey *)PORT_ArenaZAlloc(arena, sizeof(SECKEYPublicKey));
562 if (pubk == NULL) { 566 if (pubk == NULL) {
563 » PORT_FreeArena (arena, PR_FALSE); 567 PORT_FreeArena(arena, PR_FALSE);
564 » return NULL; 568 return NULL;
565 } 569 }
566 570
567 pubk->arena = arena; 571 pubk->arena = arena;
568 pubk->pkcs11Slot = 0; 572 pubk->pkcs11Slot = 0;
569 pubk->pkcs11ID = CK_INVALID_HANDLE; 573 pubk->pkcs11ID = CK_INVALID_HANDLE;
570 574
571
572 /* Convert bit string length from bits to bytes */ 575 /* Convert bit string length from bits to bytes */
573 os = spki->subjectPublicKey; 576 os = spki->subjectPublicKey;
574 DER_ConvertBitString (&os); 577 DER_ConvertBitString(&os);
575 578
576 tag = SECOID_GetAlgorithmTag(&spki->algorithm); 579 tag = SECOID_GetAlgorithmTag(&spki->algorithm);
577 580
578 /* copy the DER into the arena, since Quick DER returns data that points 581 /* copy the DER into the arena, since Quick DER returns data that points
579 into the DER input, which may get freed by the caller */ 582 into the DER input, which may get freed by the caller */
580 rv = SECITEM_CopyItem(arena, &newOs, &os); 583 rv = SECITEM_CopyItem(arena, &newOs, &os);
581 if ( rv == SECSuccess ) 584 if (rv == SECSuccess)
582 switch ( tag ) { 585 switch (tag) {
583 case SEC_OID_X500_RSA_ENCRYPTION: 586 case SEC_OID_X500_RSA_ENCRYPTION:
584 case SEC_OID_PKCS1_RSA_ENCRYPTION: 587 case SEC_OID_PKCS1_RSA_ENCRYPTION:
585 » pubk->keyType = rsaKey; 588 pubk->keyType = rsaKey;
586 » prepare_rsa_pub_key_for_asn1(pubk); 589 prepare_rsa_pub_key_for_asn1(pubk);
587 rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_RSAPublicKeyTemplate, &n ewOs); 590 rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_RSAPublicKeyTemp late, &newOs);
588 » if (rv == SECSuccess) 591 if (rv == SECSuccess)
589 » return pubk; 592 return pubk;
590 » break; 593 break;
591 case SEC_OID_ANSIX9_DSA_SIGNATURE: 594 case SEC_OID_ANSIX9_DSA_SIGNATURE:
592 case SEC_OID_SDN702_DSA_SIGNATURE: 595 case SEC_OID_SDN702_DSA_SIGNATURE:
593 » pubk->keyType = dsaKey; 596 pubk->keyType = dsaKey;
594 » prepare_dsa_pub_key_for_asn1(pubk); 597 prepare_dsa_pub_key_for_asn1(pubk);
595 » rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_DSAPublicKeyTemplate, &n ewOs); 598 rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_DSAPublicKeyTemp late, &newOs);
596 » if (rv != SECSuccess) break; 599 if (rv != SECSuccess)
600 break;
597 601
598 rv = seckey_DSADecodePQG(arena, pubk, 602 rv = seckey_DSADecodePQG(arena, pubk,
599 &spki->algorithm.parameters); 603 &spki->algorithm.parameters);
600 604
601 » if (rv == SECSuccess) return pubk; 605 if (rv == SECSuccess)
602 » break; 606 return pubk;
603 case SEC_OID_X942_DIFFIE_HELMAN_KEY: 607 break;
604 » pubk->keyType = dhKey; 608 case SEC_OID_X942_DIFFIE_HELMAN_KEY:
605 » prepare_dh_pub_key_for_asn1(pubk); 609 pubk->keyType = dhKey;
606 » rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_DHPublicKeyTemplate, &ne wOs); 610 prepare_dh_pub_key_for_asn1(pubk);
607 » if (rv != SECSuccess) break; 611 rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_DHPublicKeyTempl ate, &newOs);
612 if (rv != SECSuccess)
613 break;
608 614
609 /* copy the DER into the arena, since Quick DER returns data that points 615 /* copy the DER into the arena, since Quick DER returns data tha t points
610 into the DER input, which may get freed by the caller */ 616 into the DER input, which may get freed by the caller */
611 rv = SECITEM_CopyItem(arena, &newParms, &spki->algorithm.parameters); 617 rv = SECITEM_CopyItem(arena, &newParms, &spki->algorithm.paramet ers);
612 if ( rv != SECSuccess ) 618 if (rv != SECSuccess)
613 break; 619 break;
614 620
615 rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_DHParamKeyTemplate, 621 rv = SEC_QuickDERDecodeItem(arena, pubk, SECKEY_DHParamKeyTempla te,
616 &newParms); 622 &newParms);
617 623
618 » if (rv == SECSuccess) return pubk; 624 if (rv == SECSuccess)
619 » break; 625 return pubk;
620 case SEC_OID_ANSIX962_EC_PUBLIC_KEY: 626 break;
621 » pubk->keyType = ecKey; 627 case SEC_OID_ANSIX962_EC_PUBLIC_KEY:
622 » pubk->u.ec.size = 0; 628 pubk->keyType = ecKey;
629 pubk->u.ec.size = 0;
623 630
624 » /* Since PKCS#11 directly takes the DER encoding of EC params 631 /* Since PKCS#11 directly takes the DER encoding of EC params
625 » * and public value, we don't need any decoding here. 632 * and public value, we don't need any decoding here.
626 » */ 633 */
627 rv = SECITEM_CopyItem(arena, &pubk->u.ec.DEREncodedParams, 634 rv = SECITEM_CopyItem(arena, &pubk->u.ec.DEREncodedParams,
628 » &spki->algorithm.parameters); 635 &spki->algorithm.parameters);
629 if ( rv != SECSuccess ) 636 if (rv != SECSuccess)
630 break; 637 break;
631 rv = SECITEM_CopyItem(arena, &pubk->u.ec.publicValue, &newOs); 638 rv = SECITEM_CopyItem(arena, &pubk->u.ec.publicValue, &newOs);
632 » if (rv == SECSuccess) return pubk; 639 if (rv == SECSuccess)
633 » break; 640 return pubk;
641 break;
634 642
635 default: 643 default:
636 » PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG); 644 PORT_SetError(SEC_ERROR_UNSUPPORTED_KEYALG);
637 » rv = SECFailure; 645 rv = SECFailure;
638 » break; 646 break;
639 } 647 }
640 648
641 SECKEY_DestroyPublicKey (pubk); 649 SECKEY_DestroyPublicKey(pubk);
642 return NULL; 650 return NULL;
643 } 651 }
644 652
645
646 /* required for JSS */ 653 /* required for JSS */
647 SECKEYPublicKey * 654 SECKEYPublicKey *
648 SECKEY_ExtractPublicKey(const CERTSubjectPublicKeyInfo *spki) 655 SECKEY_ExtractPublicKey(const CERTSubjectPublicKeyInfo *spki)
649 { 656 {
650 return seckey_ExtractPublicKey(spki); 657 return seckey_ExtractPublicKey(spki);
651 } 658 }
652 659
653 SECKEYPublicKey * 660 SECKEYPublicKey *
654 CERT_ExtractPublicKey(CERTCertificate *cert) 661 CERT_ExtractPublicKey(CERTCertificate *cert)
655 { 662 {
656 SECStatus rv; 663 SECStatus rv;
657 664
658 if (!cert) { 665 if (!cert) {
659 PORT_SetError(SEC_ERROR_INVALID_ARGS); 666 PORT_SetError(SEC_ERROR_INVALID_ARGS);
660 » return NULL; 667 return NULL;
661 } 668 }
662 rv = SECKEY_UpdateCertPQG(cert); 669 rv = SECKEY_UpdateCertPQG(cert);
663 if (rv != SECSuccess) return NULL; 670 if (rv != SECSuccess)
671 return NULL;
664 672
665 return seckey_ExtractPublicKey(&cert->subjectPublicKeyInfo); 673 return seckey_ExtractPublicKey(&cert->subjectPublicKeyInfo);
666 } 674 }
667 675
668 int 676 int
669 SECKEY_ECParamsToKeySize(const SECItem *encodedParams) 677 SECKEY_ECParamsToKeySize(const SECItem *encodedParams)
670 { 678 {
671 SECOidTag tag; 679 SECOidTag tag;
672 SECItem oid = { siBuffer, NULL, 0}; 680 SECItem oid = { siBuffer, NULL, 0 };
673 » 681
674 /* The encodedParams data contains 0x06 (SEC_ASN1_OBJECT_ID), 682 /* The encodedParams data contains 0x06 (SEC_ASN1_OBJECT_ID),
675 * followed by the length of the curve oid and the curve oid. 683 * followed by the length of the curve oid and the curve oid.
676 */ 684 */
677 oid.len = encodedParams->data[1]; 685 oid.len = encodedParams->data[1];
678 oid.data = encodedParams->data + 2; 686 oid.data = encodedParams->data + 2;
679 if ((tag = SECOID_FindOIDTag(&oid)) == SEC_OID_UNKNOWN) 687 if ((tag = SECOID_FindOIDTag(&oid)) == SEC_OID_UNKNOWN)
680 » return 0; 688 return 0;
681 689
682 switch (tag) { 690 switch (tag) {
683 case SEC_OID_SECG_EC_SECP112R1: 691 case SEC_OID_SECG_EC_SECP112R1:
684 case SEC_OID_SECG_EC_SECP112R2: 692 case SEC_OID_SECG_EC_SECP112R2:
685 return 112; 693 return 112;
686 694
687 case SEC_OID_SECG_EC_SECT113R1: 695 case SEC_OID_SECG_EC_SECT113R1:
688 case SEC_OID_SECG_EC_SECT113R2: 696 case SEC_OID_SECG_EC_SECT113R2:
689 » return 113; 697 return 113;
690 698
691 case SEC_OID_SECG_EC_SECP128R1: 699 case SEC_OID_SECG_EC_SECP128R1:
692 case SEC_OID_SECG_EC_SECP128R2: 700 case SEC_OID_SECG_EC_SECP128R2:
693 » return 128; 701 return 128;
694 702
695 case SEC_OID_SECG_EC_SECT131R1: 703 case SEC_OID_SECG_EC_SECT131R1:
696 case SEC_OID_SECG_EC_SECT131R2: 704 case SEC_OID_SECG_EC_SECT131R2:
697 » return 131; 705 return 131;
698 706
699 case SEC_OID_SECG_EC_SECP160K1: 707 case SEC_OID_SECG_EC_SECP160K1:
700 case SEC_OID_SECG_EC_SECP160R1: 708 case SEC_OID_SECG_EC_SECP160R1:
701 case SEC_OID_SECG_EC_SECP160R2: 709 case SEC_OID_SECG_EC_SECP160R2:
702 » return 160; 710 return 160;
703 711
704 case SEC_OID_SECG_EC_SECT163K1: 712 case SEC_OID_SECG_EC_SECT163K1:
705 case SEC_OID_SECG_EC_SECT163R1: 713 case SEC_OID_SECG_EC_SECT163R1:
706 case SEC_OID_SECG_EC_SECT163R2: 714 case SEC_OID_SECG_EC_SECT163R2:
707 case SEC_OID_ANSIX962_EC_C2PNB163V1: 715 case SEC_OID_ANSIX962_EC_C2PNB163V1:
708 case SEC_OID_ANSIX962_EC_C2PNB163V2: 716 case SEC_OID_ANSIX962_EC_C2PNB163V2:
709 case SEC_OID_ANSIX962_EC_C2PNB163V3: 717 case SEC_OID_ANSIX962_EC_C2PNB163V3:
710 » return 163; 718 return 163;
711 719
712 case SEC_OID_ANSIX962_EC_C2PNB176V1: 720 case SEC_OID_ANSIX962_EC_C2PNB176V1:
713 » return 176; 721 return 176;
714 722
715 case SEC_OID_ANSIX962_EC_C2TNB191V1: 723 case SEC_OID_ANSIX962_EC_C2TNB191V1:
716 case SEC_OID_ANSIX962_EC_C2TNB191V2: 724 case SEC_OID_ANSIX962_EC_C2TNB191V2:
717 case SEC_OID_ANSIX962_EC_C2TNB191V3: 725 case SEC_OID_ANSIX962_EC_C2TNB191V3:
718 case SEC_OID_ANSIX962_EC_C2ONB191V4: 726 case SEC_OID_ANSIX962_EC_C2ONB191V4:
719 case SEC_OID_ANSIX962_EC_C2ONB191V5: 727 case SEC_OID_ANSIX962_EC_C2ONB191V5:
720 » return 191; 728 return 191;
721 729
722 case SEC_OID_SECG_EC_SECP192K1: 730 case SEC_OID_SECG_EC_SECP192K1:
723 case SEC_OID_ANSIX962_EC_PRIME192V1: 731 case SEC_OID_ANSIX962_EC_PRIME192V1:
724 case SEC_OID_ANSIX962_EC_PRIME192V2: 732 case SEC_OID_ANSIX962_EC_PRIME192V2:
725 case SEC_OID_ANSIX962_EC_PRIME192V3: 733 case SEC_OID_ANSIX962_EC_PRIME192V3:
726 » return 192; 734 return 192;
727 735
728 case SEC_OID_SECG_EC_SECT193R1: 736 case SEC_OID_SECG_EC_SECT193R1:
729 case SEC_OID_SECG_EC_SECT193R2: 737 case SEC_OID_SECG_EC_SECT193R2:
730 » return 193; 738 return 193;
731 739
732 case SEC_OID_ANSIX962_EC_C2PNB208W1: 740 case SEC_OID_ANSIX962_EC_C2PNB208W1:
733 » return 208; 741 return 208;
734 742
735 case SEC_OID_SECG_EC_SECP224K1: 743 case SEC_OID_SECG_EC_SECP224K1:
736 case SEC_OID_SECG_EC_SECP224R1: 744 case SEC_OID_SECG_EC_SECP224R1:
737 » return 224; 745 return 224;
738 746
739 case SEC_OID_SECG_EC_SECT233K1: 747 case SEC_OID_SECG_EC_SECT233K1:
740 case SEC_OID_SECG_EC_SECT233R1: 748 case SEC_OID_SECG_EC_SECT233R1:
741 » return 233; 749 return 233;
742 750
743 case SEC_OID_SECG_EC_SECT239K1: 751 case SEC_OID_SECG_EC_SECT239K1:
744 case SEC_OID_ANSIX962_EC_C2TNB239V1: 752 case SEC_OID_ANSIX962_EC_C2TNB239V1:
745 case SEC_OID_ANSIX962_EC_C2TNB239V2: 753 case SEC_OID_ANSIX962_EC_C2TNB239V2:
746 case SEC_OID_ANSIX962_EC_C2TNB239V3: 754 case SEC_OID_ANSIX962_EC_C2TNB239V3:
747 case SEC_OID_ANSIX962_EC_C2ONB239V4: 755 case SEC_OID_ANSIX962_EC_C2ONB239V4:
748 case SEC_OID_ANSIX962_EC_C2ONB239V5: 756 case SEC_OID_ANSIX962_EC_C2ONB239V5:
749 case SEC_OID_ANSIX962_EC_PRIME239V1: 757 case SEC_OID_ANSIX962_EC_PRIME239V1:
750 case SEC_OID_ANSIX962_EC_PRIME239V2: 758 case SEC_OID_ANSIX962_EC_PRIME239V2:
751 case SEC_OID_ANSIX962_EC_PRIME239V3: 759 case SEC_OID_ANSIX962_EC_PRIME239V3:
752 » return 239; 760 return 239;
753 761
754 case SEC_OID_SECG_EC_SECP256K1: 762 case SEC_OID_SECG_EC_SECP256K1:
755 case SEC_OID_ANSIX962_EC_PRIME256V1: 763 case SEC_OID_ANSIX962_EC_PRIME256V1:
756 » return 256; 764 return 256;
757 765
758 case SEC_OID_ANSIX962_EC_C2PNB272W1: 766 case SEC_OID_ANSIX962_EC_C2PNB272W1:
759 » return 272; 767 return 272;
760 768
761 case SEC_OID_SECG_EC_SECT283K1: 769 case SEC_OID_SECG_EC_SECT283K1:
762 case SEC_OID_SECG_EC_SECT283R1: 770 case SEC_OID_SECG_EC_SECT283R1:
763 » return 283; 771 return 283;
764 772
765 case SEC_OID_ANSIX962_EC_C2PNB304W1: 773 case SEC_OID_ANSIX962_EC_C2PNB304W1:
766 » return 304; 774 return 304;
767 775
768 case SEC_OID_ANSIX962_EC_C2TNB359V1: 776 case SEC_OID_ANSIX962_EC_C2TNB359V1:
769 » return 359; 777 return 359;
770 778
771 case SEC_OID_ANSIX962_EC_C2PNB368W1: 779 case SEC_OID_ANSIX962_EC_C2PNB368W1:
772 » return 368; 780 return 368;
773 781
774 case SEC_OID_SECG_EC_SECP384R1: 782 case SEC_OID_SECG_EC_SECP384R1:
775 » return 384; 783 return 384;
776 784
777 case SEC_OID_SECG_EC_SECT409K1: 785 case SEC_OID_SECG_EC_SECT409K1:
778 case SEC_OID_SECG_EC_SECT409R1: 786 case SEC_OID_SECG_EC_SECT409R1:
779 » return 409; 787 return 409;
780 788
781 case SEC_OID_ANSIX962_EC_C2TNB431R1: 789 case SEC_OID_ANSIX962_EC_C2TNB431R1:
782 » return 431; 790 return 431;
783 791
784 case SEC_OID_SECG_EC_SECP521R1: 792 case SEC_OID_SECG_EC_SECP521R1:
785 » return 521; 793 return 521;
786 794
787 case SEC_OID_SECG_EC_SECT571K1: 795 case SEC_OID_SECG_EC_SECT571K1:
788 case SEC_OID_SECG_EC_SECT571R1: 796 case SEC_OID_SECG_EC_SECT571R1:
789 » return 571; 797 return 571;
790 798
791 default: 799 default:
792 » PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); 800 PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE);
793 » return 0; 801 return 0;
794 } 802 }
795 } 803 }
796 804
797 int 805 int
798 SECKEY_ECParamsToBasePointOrderLen(const SECItem *encodedParams) 806 SECKEY_ECParamsToBasePointOrderLen(const SECItem *encodedParams)
799 { 807 {
800 SECOidTag tag; 808 SECOidTag tag;
801 SECItem oid = { siBuffer, NULL, 0}; 809 SECItem oid = { siBuffer, NULL, 0 };
802 » 810
803 /* The encodedParams data contains 0x06 (SEC_ASN1_OBJECT_ID), 811 /* The encodedParams data contains 0x06 (SEC_ASN1_OBJECT_ID),
804 * followed by the length of the curve oid and the curve oid. 812 * followed by the length of the curve oid and the curve oid.
805 */ 813 */
806 oid.len = encodedParams->data[1]; 814 oid.len = encodedParams->data[1];
807 oid.data = encodedParams->data + 2; 815 oid.data = encodedParams->data + 2;
808 if ((tag = SECOID_FindOIDTag(&oid)) == SEC_OID_UNKNOWN) 816 if ((tag = SECOID_FindOIDTag(&oid)) == SEC_OID_UNKNOWN)
809 » return 0; 817 return 0;
810 818
811 switch (tag) { 819 switch (tag) {
812 case SEC_OID_SECG_EC_SECP112R1: 820 case SEC_OID_SECG_EC_SECP112R1:
813 return 112; 821 return 112;
814 case SEC_OID_SECG_EC_SECP112R2: 822 case SEC_OID_SECG_EC_SECP112R2:
815 return 110; 823 return 110;
816 824
817 case SEC_OID_SECG_EC_SECT113R1: 825 case SEC_OID_SECG_EC_SECT113R1:
818 case SEC_OID_SECG_EC_SECT113R2: 826 case SEC_OID_SECG_EC_SECT113R2:
819 » return 113; 827 return 113;
820 828
821 case SEC_OID_SECG_EC_SECP128R1: 829 case SEC_OID_SECG_EC_SECP128R1:
822 » return 128; 830 return 128;
823 case SEC_OID_SECG_EC_SECP128R2: 831 case SEC_OID_SECG_EC_SECP128R2:
824 » return 126; 832 return 126;
825 833
826 case SEC_OID_SECG_EC_SECT131R1: 834 case SEC_OID_SECG_EC_SECT131R1:
827 case SEC_OID_SECG_EC_SECT131R2: 835 case SEC_OID_SECG_EC_SECT131R2:
828 » return 131; 836 return 131;
829 837
830 case SEC_OID_SECG_EC_SECP160K1: 838 case SEC_OID_SECG_EC_SECP160K1:
831 case SEC_OID_SECG_EC_SECP160R1: 839 case SEC_OID_SECG_EC_SECP160R1:
832 case SEC_OID_SECG_EC_SECP160R2: 840 case SEC_OID_SECG_EC_SECP160R2:
833 » return 161; 841 return 161;
834 842
835 case SEC_OID_SECG_EC_SECT163K1: 843 case SEC_OID_SECG_EC_SECT163K1:
836 » return 163; 844 return 163;
837 case SEC_OID_SECG_EC_SECT163R1: 845 case SEC_OID_SECG_EC_SECT163R1:
838 » return 162; 846 return 162;
839 case SEC_OID_SECG_EC_SECT163R2: 847 case SEC_OID_SECG_EC_SECT163R2:
840 case SEC_OID_ANSIX962_EC_C2PNB163V1: 848 case SEC_OID_ANSIX962_EC_C2PNB163V1:
841 » return 163; 849 return 163;
842 case SEC_OID_ANSIX962_EC_C2PNB163V2: 850 case SEC_OID_ANSIX962_EC_C2PNB163V2:
843 case SEC_OID_ANSIX962_EC_C2PNB163V3: 851 case SEC_OID_ANSIX962_EC_C2PNB163V3:
844 » return 162; 852 return 162;
845 853
846 case SEC_OID_ANSIX962_EC_C2PNB176V1: 854 case SEC_OID_ANSIX962_EC_C2PNB176V1:
847 » return 161; 855 return 161;
848 856
849 case SEC_OID_ANSIX962_EC_C2TNB191V1: 857 case SEC_OID_ANSIX962_EC_C2TNB191V1:
850 » return 191; 858 return 191;
851 case SEC_OID_ANSIX962_EC_C2TNB191V2: 859 case SEC_OID_ANSIX962_EC_C2TNB191V2:
852 » return 190; 860 return 190;
853 case SEC_OID_ANSIX962_EC_C2TNB191V3: 861 case SEC_OID_ANSIX962_EC_C2TNB191V3:
854 » return 189; 862 return 189;
855 case SEC_OID_ANSIX962_EC_C2ONB191V4: 863 case SEC_OID_ANSIX962_EC_C2ONB191V4:
856 » return 191; 864 return 191;
857 case SEC_OID_ANSIX962_EC_C2ONB191V5: 865 case SEC_OID_ANSIX962_EC_C2ONB191V5:
858 » return 188; 866 return 188;
859 867
860 case SEC_OID_SECG_EC_SECP192K1: 868 case SEC_OID_SECG_EC_SECP192K1:
861 case SEC_OID_ANSIX962_EC_PRIME192V1: 869 case SEC_OID_ANSIX962_EC_PRIME192V1:
862 case SEC_OID_ANSIX962_EC_PRIME192V2: 870 case SEC_OID_ANSIX962_EC_PRIME192V2:
863 case SEC_OID_ANSIX962_EC_PRIME192V3: 871 case SEC_OID_ANSIX962_EC_PRIME192V3:
864 » return 192; 872 return 192;
865 873
866 case SEC_OID_SECG_EC_SECT193R1: 874 case SEC_OID_SECG_EC_SECT193R1:
867 case SEC_OID_SECG_EC_SECT193R2: 875 case SEC_OID_SECG_EC_SECT193R2:
868 » return 193; 876 return 193;
869 877
870 case SEC_OID_ANSIX962_EC_C2PNB208W1: 878 case SEC_OID_ANSIX962_EC_C2PNB208W1:
871 » return 193; 879 return 193;
872 880
873 case SEC_OID_SECG_EC_SECP224K1: 881 case SEC_OID_SECG_EC_SECP224K1:
874 » return 225; 882 return 225;
875 case SEC_OID_SECG_EC_SECP224R1: 883 case SEC_OID_SECG_EC_SECP224R1:
876 » return 224; 884 return 224;
877 885
878 case SEC_OID_SECG_EC_SECT233K1: 886 case SEC_OID_SECG_EC_SECT233K1:
879 » return 232; 887 return 232;
880 case SEC_OID_SECG_EC_SECT233R1: 888 case SEC_OID_SECG_EC_SECT233R1:
881 » return 233; 889 return 233;
882 890
883 case SEC_OID_SECG_EC_SECT239K1: 891 case SEC_OID_SECG_EC_SECT239K1:
884 case SEC_OID_ANSIX962_EC_C2TNB239V1: 892 case SEC_OID_ANSIX962_EC_C2TNB239V1:
885 » return 238; 893 return 238;
886 case SEC_OID_ANSIX962_EC_C2TNB239V2: 894 case SEC_OID_ANSIX962_EC_C2TNB239V2:
887 » return 237; 895 return 237;
888 case SEC_OID_ANSIX962_EC_C2TNB239V3: 896 case SEC_OID_ANSIX962_EC_C2TNB239V3:
889 » return 236; 897 return 236;
890 case SEC_OID_ANSIX962_EC_C2ONB239V4: 898 case SEC_OID_ANSIX962_EC_C2ONB239V4:
891 » return 238; 899 return 238;
892 case SEC_OID_ANSIX962_EC_C2ONB239V5: 900 case SEC_OID_ANSIX962_EC_C2ONB239V5:
893 » return 237; 901 return 237;
894 case SEC_OID_ANSIX962_EC_PRIME239V1: 902 case SEC_OID_ANSIX962_EC_PRIME239V1:
895 case SEC_OID_ANSIX962_EC_PRIME239V2: 903 case SEC_OID_ANSIX962_EC_PRIME239V2:
896 case SEC_OID_ANSIX962_EC_PRIME239V3: 904 case SEC_OID_ANSIX962_EC_PRIME239V3:
897 » return 239; 905 return 239;
898 906
899 case SEC_OID_SECG_EC_SECP256K1: 907 case SEC_OID_SECG_EC_SECP256K1:
900 case SEC_OID_ANSIX962_EC_PRIME256V1: 908 case SEC_OID_ANSIX962_EC_PRIME256V1:
901 » return 256; 909 return 256;
902 910
903 case SEC_OID_ANSIX962_EC_C2PNB272W1: 911 case SEC_OID_ANSIX962_EC_C2PNB272W1:
904 » return 257; 912 return 257;
905 913
906 case SEC_OID_SECG_EC_SECT283K1: 914 case SEC_OID_SECG_EC_SECT283K1:
907 » return 281; 915 return 281;
908 case SEC_OID_SECG_EC_SECT283R1: 916 case SEC_OID_SECG_EC_SECT283R1:
909 » return 282; 917 return 282;
910 918
911 case SEC_OID_ANSIX962_EC_C2PNB304W1: 919 case SEC_OID_ANSIX962_EC_C2PNB304W1:
912 » return 289; 920 return 289;
913 921
914 case SEC_OID_ANSIX962_EC_C2TNB359V1: 922 case SEC_OID_ANSIX962_EC_C2TNB359V1:
915 » return 353; 923 return 353;
916 924
917 case SEC_OID_ANSIX962_EC_C2PNB368W1: 925 case SEC_OID_ANSIX962_EC_C2PNB368W1:
918 » return 353; 926 return 353;
919 927
920 case SEC_OID_SECG_EC_SECP384R1: 928 case SEC_OID_SECG_EC_SECP384R1:
921 » return 384; 929 return 384;
922 930
923 case SEC_OID_SECG_EC_SECT409K1: 931 case SEC_OID_SECG_EC_SECT409K1:
924 » return 407; 932 return 407;
925 case SEC_OID_SECG_EC_SECT409R1: 933 case SEC_OID_SECG_EC_SECT409R1:
926 » return 409; 934 return 409;
927 935
928 case SEC_OID_ANSIX962_EC_C2TNB431R1: 936 case SEC_OID_ANSIX962_EC_C2TNB431R1:
929 » return 418; 937 return 418;
930 938
931 case SEC_OID_SECG_EC_SECP521R1: 939 case SEC_OID_SECG_EC_SECP521R1:
932 » return 521; 940 return 521;
933 941
934 case SEC_OID_SECG_EC_SECT571K1: 942 case SEC_OID_SECG_EC_SECT571K1:
935 case SEC_OID_SECG_EC_SECT571R1: 943 case SEC_OID_SECG_EC_SECT571R1:
936 » return 570; 944 return 570;
937 945
938 default: 946 default:
939 » PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE); 947 PORT_SetError(SEC_ERROR_UNSUPPORTED_ELLIPTIC_CURVE);
940 » return 0; 948 return 0;
941 } 949 }
942 } 950 }
943 951
944 /* The number of bits in the number from the first non-zero bit onward. */ 952 /* The number of bits in the number from the first non-zero bit onward. */
945 unsigned 953 unsigned
946 SECKEY_BigIntegerBitLength(const SECItem *number) 954 SECKEY_BigIntegerBitLength(const SECItem *number)
947 { 955 {
948 const unsigned char *p; 956 const unsigned char *p;
949 unsigned octets; 957 unsigned octets;
950 unsigned bits; 958 unsigned bits;
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
987 { 995 {
988 unsigned bitSize = 0; 996 unsigned bitSize = 0;
989 997
990 if (!pubk) { 998 if (!pubk) {
991 PORT_SetError(SEC_ERROR_INVALID_KEY); 999 PORT_SetError(SEC_ERROR_INVALID_KEY);
992 return 0; 1000 return 0;
993 } 1001 }
994 1002
995 /* interpret modulus length as key strength */ 1003 /* interpret modulus length as key strength */
996 switch (pubk->keyType) { 1004 switch (pubk->keyType) {
997 case rsaKey: 1005 case rsaKey:
998 bitSize = SECKEY_BigIntegerBitLength(&pubk->u.rsa.modulus); 1006 bitSize = SECKEY_BigIntegerBitLength(&pubk->u.rsa.modulus);
999 break; 1007 break;
1000 case dsaKey: 1008 case dsaKey:
1001 bitSize = SECKEY_BigIntegerBitLength(&pubk->u.dsa.publicValue); 1009 bitSize = SECKEY_BigIntegerBitLength(&pubk->u.dsa.params.prime);
1002 break; 1010 break;
1003 case dhKey: 1011 case dhKey:
1004 bitSize = SECKEY_BigIntegerBitLength(&pubk->u.dh.publicValue); 1012 bitSize = SECKEY_BigIntegerBitLength(&pubk->u.dh.prime);
1005 break; 1013 break;
1006 case ecKey: 1014 case ecKey:
1007 bitSize = SECKEY_ECParamsToKeySize(&pubk->u.ec.DEREncodedParams); 1015 bitSize = SECKEY_ECParamsToKeySize(&pubk->u.ec.DEREncodedParams);
1008 break; 1016 break;
1009 default: 1017 default:
1010 PORT_SetError(SEC_ERROR_INVALID_KEY); 1018 PORT_SetError(SEC_ERROR_INVALID_KEY);
1011 break; 1019 break;
1012 } 1020 }
1013 return bitSize; 1021 return bitSize;
1014 } 1022 }
1015 1023
1016 /* returns signature length in bytes (not bits) */ 1024 /* returns signature length in bytes (not bits) */
1017 unsigned 1025 unsigned
1018 SECKEY_SignatureLen(const SECKEYPublicKey *pubk) 1026 SECKEY_SignatureLen(const SECKEYPublicKey *pubk)
1019 { 1027 {
1020 unsigned char b0; 1028 unsigned char b0;
1021 unsigned size; 1029 unsigned size;
1022 1030
1023 switch (pubk->keyType) { 1031 switch (pubk->keyType) {
1024 case rsaKey: 1032 case rsaKey:
1025 » b0 = pubk->u.rsa.modulus.data[0]; 1033 b0 = pubk->u.rsa.modulus.data[0];
1026 » return b0 ? pubk->u.rsa.modulus.len : pubk->u.rsa.modulus.len - 1; 1034 return b0 ? pubk->u.rsa.modulus.len : pubk->u.rsa.modulus.len - 1;
1027 case dsaKey: 1035 case dsaKey:
1028 » return pubk->u.dsa.params.subPrime.len * 2; 1036 return pubk->u.dsa.params.subPrime.len * 2;
1029 case ecKey: 1037 case ecKey:
1030 » /* Get the base point order length in bits and adjust */ 1038 /* Get the base point order length in bits and adjust */
1031 » size =» SECKEY_ECParamsToBasePointOrderLen( 1039 size = SECKEY_ECParamsToBasePointOrderLen(
1032 » » &pubk->u.ec.DEREncodedParams); 1040 &pubk->u.ec.DEREncodedParams);
1033 » return ((size + 7)/8) * 2; 1041 return ((size + 7) / 8) * 2;
1034 default: 1042 default:
1035 » break; 1043 break;
1036 } 1044 }
1037 PORT_SetError(SEC_ERROR_INVALID_KEY); 1045 PORT_SetError(SEC_ERROR_INVALID_KEY);
1038 return 0; 1046 return 0;
1039 } 1047 }
1040 1048
1041 SECKEYPrivateKey * 1049 SECKEYPrivateKey *
1042 SECKEY_CopyPrivateKey(const SECKEYPrivateKey *privk) 1050 SECKEY_CopyPrivateKey(const SECKEYPrivateKey *privk)
1043 { 1051 {
1044 SECKEYPrivateKey *copyk; 1052 SECKEYPrivateKey *copyk;
1045 PLArenaPool *arena; 1053 PLArenaPool *arena;
1046 1054
1047 if (!privk || !privk->pkcs11Slot) { 1055 if (!privk || !privk->pkcs11Slot) {
1048 » PORT_SetError(SEC_ERROR_INVALID_ARGS); 1056 PORT_SetError(SEC_ERROR_INVALID_ARGS);
1049 » return NULL; 1057 return NULL;
1050 } 1058 }
1051 1059
1052 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1060 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1053 if (arena == NULL) { 1061 if (arena == NULL) {
1054 » return NULL; 1062 return NULL;
1055 } 1063 }
1056 1064
1057 copyk = (SECKEYPrivateKey *) PORT_ArenaZAlloc (arena, sizeof (SECKEYPrivateK ey)); 1065 copyk = (SECKEYPrivateKey *)PORT_ArenaZAlloc(arena, sizeof(SECKEYPrivateKey) );
1058 if (copyk) { 1066 if (copyk) {
1059 » copyk->arena = arena; 1067 copyk->arena = arena;
1060 » copyk->keyType = privk->keyType; 1068 copyk->keyType = privk->keyType;
1061 1069
1062 » /* copy the PKCS #11 parameters */ 1070 /* copy the PKCS #11 parameters */
1063 » copyk->pkcs11Slot = PK11_ReferenceSlot(privk->pkcs11Slot); 1071 copyk->pkcs11Slot = PK11_ReferenceSlot(privk->pkcs11Slot);
1064 » /* if the key we're referencing was a temparary key we have just 1072 /* if the key we're referencing was a temparary key we have just
1065 » * created, that we want to go away when we're through, we need 1073 * created, that we want to go away when we're through, we need
1066 » * to make a copy of it */ 1074 * to make a copy of it */
1067 » if (privk->pkcs11IsTemp) { 1075 if (privk->pkcs11IsTemp) {
1068 » copyk->pkcs11ID = 1076 copyk->pkcs11ID =
1069 » » » PK11_CopyKey(privk->pkcs11Slot,privk->pkcs11ID); 1077 PK11_CopyKey(privk->pkcs11Slot, privk->pkcs11ID);
1070 » if (copyk->pkcs11ID == CK_INVALID_HANDLE) goto fail; 1078 if (copyk->pkcs11ID == CK_INVALID_HANDLE)
1071 » } else { 1079 goto fail;
1072 » copyk->pkcs11ID = privk->pkcs11ID; 1080 } else {
1073 » } 1081 copyk->pkcs11ID = privk->pkcs11ID;
1074 » copyk->pkcs11IsTemp = privk->pkcs11IsTemp; 1082 }
1075 » copyk->wincx = privk->wincx; 1083 copyk->pkcs11IsTemp = privk->pkcs11IsTemp;
1076 » copyk->staticflags = privk->staticflags; 1084 copyk->wincx = privk->wincx;
1077 » return copyk; 1085 copyk->staticflags = privk->staticflags;
1086 return copyk;
1078 } else { 1087 } else {
1079 » PORT_SetError (SEC_ERROR_NO_MEMORY); 1088 PORT_SetError(SEC_ERROR_NO_MEMORY);
1080 } 1089 }
1081 1090
1082 fail: 1091 fail:
1083 PORT_FreeArena (arena, PR_FALSE); 1092 PORT_FreeArena(arena, PR_FALSE);
1084 return NULL; 1093 return NULL;
1085 } 1094 }
1086 1095
1087 SECKEYPublicKey * 1096 SECKEYPublicKey *
1088 SECKEY_CopyPublicKey(const SECKEYPublicKey *pubk) 1097 SECKEY_CopyPublicKey(const SECKEYPublicKey *pubk)
1089 { 1098 {
1090 SECKEYPublicKey *copyk; 1099 SECKEYPublicKey *copyk;
1091 PLArenaPool *arena; 1100 PLArenaPool *arena;
1092 SECStatus rv = SECSuccess; 1101 SECStatus rv = SECSuccess;
1093 1102
1094 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1103 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1095 if (arena == NULL) { 1104 if (arena == NULL) {
1096 » PORT_SetError (SEC_ERROR_NO_MEMORY); 1105 PORT_SetError(SEC_ERROR_NO_MEMORY);
1097 » return NULL; 1106 return NULL;
1098 } 1107 }
1099 1108
1100 copyk = (SECKEYPublicKey *) PORT_ArenaZAlloc (arena, sizeof (SECKEYPublicKey )); 1109 copyk = (SECKEYPublicKey *)PORT_ArenaZAlloc(arena, sizeof(SECKEYPublicKey));
1101 if (!copyk) { 1110 if (!copyk) {
1102 PORT_FreeArena (arena, PR_FALSE); 1111 PORT_FreeArena(arena, PR_FALSE);
1103 PORT_SetError (SEC_ERROR_NO_MEMORY); 1112 PORT_SetError(SEC_ERROR_NO_MEMORY);
1104 return NULL; 1113 return NULL;
1105 } 1114 }
1106 1115
1107 copyk->arena = arena; 1116 copyk->arena = arena;
1108 copyk->keyType = pubk->keyType; 1117 copyk->keyType = pubk->keyType;
1109 if (pubk->pkcs11Slot && 1118 if (pubk->pkcs11Slot &&
1110 PK11_IsPermObject(pubk->pkcs11Slot,pubk->pkcs11ID)) { 1119 PK11_IsPermObject(pubk->pkcs11Slot, pubk->pkcs11ID)) {
1111 copyk->pkcs11Slot = PK11_ReferenceSlot(pubk->pkcs11Slot); 1120 copyk->pkcs11Slot = PK11_ReferenceSlot(pubk->pkcs11Slot);
1112 copyk->pkcs11ID = pubk->pkcs11ID; 1121 copyk->pkcs11ID = pubk->pkcs11ID;
1113 } else { 1122 } else {
1114 copyk->pkcs11Slot = NULL;» /* go get own reference */ 1123 copyk->pkcs11Slot = NULL; /* go get own reference */
1115 copyk->pkcs11ID = CK_INVALID_HANDLE; 1124 copyk->pkcs11ID = CK_INVALID_HANDLE;
1116 } 1125 }
1117 switch (pubk->keyType) { 1126 switch (pubk->keyType) {
1118 case rsaKey: 1127 case rsaKey:
1119 rv = SECITEM_CopyItem(arena, &copyk->u.rsa.modulus, 1128 rv = SECITEM_CopyItem(arena, &copyk->u.rsa.modulus,
1120 &pubk->u.rsa.modulus); 1129 &pubk->u.rsa.modulus);
1121 if (rv == SECSuccess) { 1130 if (rv == SECSuccess) {
1122 rv = SECITEM_CopyItem (arena, &copyk->u.rsa.publicExponent, 1131 rv = SECITEM_CopyItem(arena, &copyk->u.rsa.publicExponent,
1123 &pubk->u.rsa.publicExponent); 1132 &pubk->u.rsa.publicExponent);
1124 if (rv == SECSuccess) 1133 if (rv == SECSuccess)
1125 return copyk; 1134 return copyk;
1126 } 1135 }
1127 break; 1136 break;
1128 case dsaKey: 1137 case dsaKey:
1129 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.publicValue, 1138 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.publicValue,
1130 &pubk->u.dsa.publicValue); 1139 &pubk->u.dsa.publicValue);
1131 if (rv != SECSuccess) break; 1140 if (rv != SECSuccess)
1132 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.params.prime, 1141 break;
1133 &pubk->u.dsa.params.prime); 1142 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.params.prime,
1134 if (rv != SECSuccess) break; 1143 &pubk->u.dsa.params.prime);
1135 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.params.subPrime, 1144 if (rv != SECSuccess)
1136 &pubk->u.dsa.params.subPrime); 1145 break;
1137 if (rv != SECSuccess) break; 1146 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.params.subPrime,
1138 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.params.base, 1147 &pubk->u.dsa.params.subPrime);
1139 &pubk->u.dsa.params.base); 1148 if (rv != SECSuccess)
1140 break; 1149 break;
1141 case dhKey: 1150 rv = SECITEM_CopyItem(arena, &copyk->u.dsa.params.base,
1142 rv = SECITEM_CopyItem(arena,&copyk->u.dh.prime,&pubk->u.dh.prime); 1151 &pubk->u.dsa.params.base);
1143 if (rv != SECSuccess) break; 1152 break;
1144 rv = SECITEM_CopyItem(arena,&copyk->u.dh.base,&pubk->u.dh.base); 1153 case dhKey:
1145 if (rv != SECSuccess) break; 1154 rv = SECITEM_CopyItem(arena, &copyk->u.dh.prime, &pubk->u.dh.prime);
1146 rv = SECITEM_CopyItem(arena, &copyk->u.dh.publicValue, 1155 if (rv != SECSuccess)
1147 &pubk->u.dh.publicValue); 1156 break;
1148 break; 1157 rv = SECITEM_CopyItem(arena, &copyk->u.dh.base, &pubk->u.dh.base);
1149 case ecKey: 1158 if (rv != SECSuccess)
1150 copyk->u.ec.size = pubk->u.ec.size; 1159 break;
1151 rv = SECITEM_CopyItem(arena,&copyk->u.ec.DEREncodedParams, 1160 rv = SECITEM_CopyItem(arena, &copyk->u.dh.publicValue,
1152 &pubk->u.ec.DEREncodedParams); 1161 &pubk->u.dh.publicValue);
1153 if (rv != SECSuccess) break; 1162 break;
1154 rv = SECITEM_CopyItem(arena,&copyk->u.ec.publicValue, 1163 case ecKey:
1155 &pubk->u.ec.publicValue); 1164 copyk->u.ec.size = pubk->u.ec.size;
1156 break; 1165 rv = SECITEM_CopyItem(arena, &copyk->u.ec.DEREncodedParams,
1157 case nullKey: 1166 &pubk->u.ec.DEREncodedParams);
1158 return copyk; 1167 if (rv != SECSuccess)
1159 default: 1168 break;
1160 PORT_SetError(SEC_ERROR_INVALID_KEY); 1169 rv = SECITEM_CopyItem(arena, &copyk->u.ec.publicValue,
1161 rv = SECFailure; 1170 &pubk->u.ec.publicValue);
1162 break; 1171 break;
1172 case nullKey:
1173 return copyk;
1174 default:
1175 PORT_SetError(SEC_ERROR_INVALID_KEY);
1176 rv = SECFailure;
1177 break;
1163 } 1178 }
1164 if (rv == SECSuccess) 1179 if (rv == SECSuccess)
1165 return copyk; 1180 return copyk;
1166 1181
1167 SECKEY_DestroyPublicKey (copyk); 1182 SECKEY_DestroyPublicKey(copyk);
1168 return NULL; 1183 return NULL;
1169 } 1184 }
1170 1185
1171
1172 SECKEYPublicKey * 1186 SECKEYPublicKey *
1173 SECKEY_ConvertToPublicKey(SECKEYPrivateKey *privk) 1187 SECKEY_ConvertToPublicKey(SECKEYPrivateKey *privk)
1174 { 1188 {
1175 SECKEYPublicKey *pubk; 1189 SECKEYPublicKey *pubk;
1176 PLArenaPool *arena; 1190 PLArenaPool *arena;
1177 CERTCertificate *cert; 1191 CERTCertificate *cert;
1178 SECStatus rv; 1192 SECStatus rv;
1179 1193
1180 /* 1194 /*
1181 * First try to look up the cert. 1195 * First try to look up the cert.
1182 */ 1196 */
1183 cert = PK11_GetCertFromPrivateKey(privk); 1197 cert = PK11_GetCertFromPrivateKey(privk);
1184 if (cert) { 1198 if (cert) {
1185 » pubk = CERT_ExtractPublicKey(cert); 1199 pubk = CERT_ExtractPublicKey(cert);
1186 » CERT_DestroyCertificate(cert); 1200 CERT_DestroyCertificate(cert);
1187 » return pubk; 1201 return pubk;
1188 } 1202 }
1189 1203
1190 /* couldn't find the cert, build pub key by hand */ 1204 /* couldn't find the cert, build pub key by hand */
1191 arena = PORT_NewArena (DER_DEFAULT_CHUNKSIZE); 1205 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1192 if (arena == NULL) { 1206 if (arena == NULL) {
1193 » PORT_SetError (SEC_ERROR_NO_MEMORY); 1207 PORT_SetError(SEC_ERROR_NO_MEMORY);
1194 » return NULL; 1208 return NULL;
1195 } 1209 }
1196 pubk = (SECKEYPublicKey *)PORT_ArenaZAlloc(arena, 1210 pubk = (SECKEYPublicKey *)PORT_ArenaZAlloc(arena,
1197 » » » » » » sizeof (SECKEYPublicKey)); 1211 sizeof(SECKEYPublicKey));
1198 if (pubk == NULL) { 1212 if (pubk == NULL) {
1199 » PORT_FreeArena(arena,PR_FALSE); 1213 PORT_FreeArena(arena, PR_FALSE);
1200 » return NULL; 1214 return NULL;
1201 } 1215 }
1202 pubk->keyType = privk->keyType; 1216 pubk->keyType = privk->keyType;
1203 pubk->pkcs11Slot = NULL; 1217 pubk->pkcs11Slot = NULL;
1204 pubk->pkcs11ID = CK_INVALID_HANDLE; 1218 pubk->pkcs11ID = CK_INVALID_HANDLE;
1205 pubk->arena = arena; 1219 pubk->arena = arena;
1206 1220
1207 switch(privk->keyType) { 1221 switch (privk->keyType) {
1208 case nullKey: 1222 case nullKey:
1209 case dhKey: 1223 case dhKey:
1210 case dsaKey: 1224 case dsaKey:
1211 » /* Nothing to query, if the cert isn't there, we're done -- no way 1225 /* Nothing to query, if the cert isn't there, we're done -- no way
1212 » * to get the public key */ 1226 * to get the public key */
1213 » break; 1227 break;
1214 case rsaKey: 1228 case rsaKey:
1215 » rv = PK11_ReadAttribute(privk->pkcs11Slot,privk->pkcs11ID, 1229 rv = PK11_ReadAttribute(privk->pkcs11Slot, privk->pkcs11ID,
1216 » » » » CKA_MODULUS,arena,&pubk->u.rsa.modulus); 1230 CKA_MODULUS, arena, &pubk->u.rsa.modulus);
1217 » if (rv != SECSuccess) break; 1231 if (rv != SECSuccess)
1218 » rv = PK11_ReadAttribute(privk->pkcs11Slot,privk->pkcs11ID, 1232 break;
1219 » » » CKA_PUBLIC_EXPONENT,arena,&pubk->u.rsa.publicExponent); 1233 rv = PK11_ReadAttribute(privk->pkcs11Slot, privk->pkcs11ID,
1220 » if (rv != SECSuccess) break; 1234 CKA_PUBLIC_EXPONENT, arena, &pubk->u.rsa.pub licExponent);
1221 » return pubk; 1235 if (rv != SECSuccess)
1222 » break; 1236 break;
1223 default: 1237 return pubk;
1224 » break; 1238 break;
1239 default:
1240 break;
1225 } 1241 }
1226 1242
1227 PORT_FreeArena (arena, PR_FALSE); 1243 PORT_FreeArena(arena, PR_FALSE);
1228 return NULL; 1244 return NULL;
1229 } 1245 }
1230 1246
1231 static CERTSubjectPublicKeyInfo * 1247 static CERTSubjectPublicKeyInfo *
1232 seckey_CreateSubjectPublicKeyInfo_helper(SECKEYPublicKey *pubk) 1248 seckey_CreateSubjectPublicKeyInfo_helper(SECKEYPublicKey *pubk)
1233 { 1249 {
1234 CERTSubjectPublicKeyInfo *spki; 1250 CERTSubjectPublicKeyInfo *spki;
1235 PLArenaPool *arena; 1251 PLArenaPool *arena;
1236 SECItem params = { siBuffer, NULL, 0 }; 1252 SECItem params = { siBuffer, NULL, 0 };
1237 1253
1238 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1254 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1239 if (arena == NULL) { 1255 if (arena == NULL) {
1240 » PORT_SetError(SEC_ERROR_NO_MEMORY); 1256 PORT_SetError(SEC_ERROR_NO_MEMORY);
1241 » return NULL; 1257 return NULL;
1242 } 1258 }
1243 1259
1244 spki = (CERTSubjectPublicKeyInfo *) PORT_ArenaZAlloc(arena, sizeof (*spki)); 1260 spki = (CERTSubjectPublicKeyInfo *)PORT_ArenaZAlloc(arena, sizeof(*spki));
1245 if (spki != NULL) { 1261 if (spki != NULL) {
1246 » SECStatus rv; 1262 SECStatus rv;
1247 » SECItem *rv_item; 1263 SECItem *rv_item;
1248 »
1249 » spki->arena = arena;
1250 » switch(pubk->keyType) {
1251 » case rsaKey:
1252 » rv = SECOID_SetAlgorithmID(arena, &spki->algorithm,
1253 » » » » SEC_OID_PKCS1_RSA_ENCRYPTION, 0);
1254 » if (rv == SECSuccess) {
1255 » » /*
1256 » » * DER encode the public key into the subjectPublicKeyInfo.
1257 » » */
1258 » » prepare_rsa_pub_key_for_asn1(pubk);
1259 » » rv_item = SEC_ASN1EncodeItem(arena, &spki->subjectPublicKey,
1260 » » » » » pubk, SECKEY_RSAPublicKeyTemplate);
1261 » » if (rv_item != NULL) {
1262 » » /*
1263 » » * The stored value is supposed to be a BIT_STRING,
1264 » » * so convert the length.
1265 » » */
1266 » » spki->subjectPublicKey.len <<= 3;
1267 » » /*
1268 » » * We got a good one; return it.
1269 » » */
1270 » » return spki;
1271 » » }
1272 » }
1273 » break;
1274 » case dsaKey:
1275 » /* DER encode the params. */
1276 » prepare_pqg_params_for_asn1(&pubk->u.dsa.params);
1277 » rv_item = SEC_ASN1EncodeItem(arena, &params, &pubk->u.dsa.params,
1278 » » » » » SECKEY_PQGParamsTemplate);
1279 » if (rv_item != NULL) {
1280 » » rv = SECOID_SetAlgorithmID(arena, &spki->algorithm,
1281 » » » » » SEC_OID_ANSIX9_DSA_SIGNATURE,
1282 » » » » » &params);
1283 » » if (rv == SECSuccess) {
1284 » » /*
1285 » » * DER encode the public key into the subjectPublicKeyInfo.
1286 » » */
1287 » » prepare_dsa_pub_key_for_asn1(pubk);
1288 » » rv_item = SEC_ASN1EncodeItem(arena, &spki->subjectPublicKey,
1289 » » » » » » pubk,
1290 » » » » » » SECKEY_DSAPublicKeyTemplate);
1291 » » if (rv_item != NULL) {
1292 » » » /*
1293 » » » * The stored value is supposed to be a BIT_STRING,
1294 » » » * so convert the length.
1295 » » » */
1296 » » » spki->subjectPublicKey.len <<= 3;
1297 » » » /*
1298 » » » * We got a good one; return it.
1299 » » » */
1300 » » » return spki;
1301 » » }
1302 » » }
1303 » }
1304 » SECITEM_FreeItem(&params, PR_FALSE);
1305 » break;
1306 » case ecKey:
1307 » rv = SECITEM_CopyItem(arena, &params,
1308 » » » » &pubk->u.ec.DEREncodedParams);
1309 » if (rv != SECSuccess) break;
1310 1264
1311 » rv = SECOID_SetAlgorithmID(arena, &spki->algorithm, 1265 spki->arena = arena;
1312 » » » » SEC_OID_ANSIX962_EC_PUBLIC_KEY, 1266 switch (pubk->keyType) {
1313 » » » » &params); 1267 case rsaKey:
1314 » if (rv != SECSuccess) break; 1268 rv = SECOID_SetAlgorithmID(arena, &spki->algorithm,
1269 SEC_OID_PKCS1_RSA_ENCRYPTION, 0);
1270 if (rv == SECSuccess) {
1271 /*
1272 * DER encode the public key into the subjectPublicKeyInfo.
1273 */
1274 prepare_rsa_pub_key_for_asn1(pubk);
1275 rv_item = SEC_ASN1EncodeItem(arena, &spki->subjectPublicKey,
1276 pubk, SECKEY_RSAPublicKeyTempla te);
1277 if (rv_item != NULL) {
1278 /*
1279 * The stored value is supposed to be a BIT_STRING,
1280 * so convert the length.
1281 */
1282 spki->subjectPublicKey.len <<= 3;
1283 /*
1284 * We got a good one; return it.
1285 */
1286 return spki;
1287 }
1288 }
1289 break;
1290 case dsaKey:
1291 /* DER encode the params. */
1292 prepare_pqg_params_for_asn1(&pubk->u.dsa.params);
1293 rv_item = SEC_ASN1EncodeItem(arena, &params, &pubk->u.dsa.params ,
1294 SECKEY_PQGParamsTemplate);
1295 if (rv_item != NULL) {
1296 rv = SECOID_SetAlgorithmID(arena, &spki->algorithm,
1297 SEC_OID_ANSIX9_DSA_SIGNATURE,
1298 &params);
1299 if (rv == SECSuccess) {
1300 /*
1301 * DER encode the public key into the subjectPublicKeyIn fo.
1302 */
1303 prepare_dsa_pub_key_for_asn1(pubk);
1304 rv_item = SEC_ASN1EncodeItem(arena, &spki->subjectPublic Key,
1305 pubk,
1306 SECKEY_DSAPublicKeyTemplate );
1307 if (rv_item != NULL) {
1308 /*
1309 * The stored value is supposed to be a BIT_STRING,
1310 * so convert the length.
1311 */
1312 spki->subjectPublicKey.len <<= 3;
1313 /*
1314 * We got a good one; return it.
1315 */
1316 return spki;
1317 }
1318 }
1319 }
1320 SECITEM_FreeItem(&params, PR_FALSE);
1321 break;
1322 case ecKey:
1323 rv = SECITEM_CopyItem(arena, &params,
1324 &pubk->u.ec.DEREncodedParams);
1325 if (rv != SECSuccess)
1326 break;
1315 1327
1316 » rv = SECITEM_CopyItem(arena, &spki->subjectPublicKey, 1328 rv = SECOID_SetAlgorithmID(arena, &spki->algorithm,
1317 » » » » &pubk->u.ec.publicValue); 1329 SEC_OID_ANSIX962_EC_PUBLIC_KEY,
1330 &params);
1331 if (rv != SECSuccess)
1332 break;
1318 1333
1319 » if (rv == SECSuccess) { 1334 rv = SECITEM_CopyItem(arena, &spki->subjectPublicKey,
1320 » /* 1335 &pubk->u.ec.publicValue);
1321 » » * The stored value is supposed to be a BIT_STRING,
1322 » » * so convert the length.
1323 » » */
1324 » spki->subjectPublicKey.len <<= 3;
1325 » » /*
1326 » » * We got a good one; return it.
1327 » » */
1328 » » return spki;
1329 » }
1330 » break;
1331 » case dhKey: /* later... */
1332 1336
1333 » break; 1337 if (rv == SECSuccess) {
1334 » default: 1338 /*
1335 » break; 1339 * The stored value is supposed to be a BIT_STRING,
1336 » } 1340 * so convert the length.
1341 */
1342 spki->subjectPublicKey.len <<= 3;
1343 /*
1344 * We got a good one; return it.
1345 */
1346 return spki;
1347 }
1348 break;
1349 case dhKey: /* later... */
1350
1351 break;
1352 default:
1353 break;
1354 }
1337 } else { 1355 } else {
1338 » PORT_SetError(SEC_ERROR_NO_MEMORY); 1356 PORT_SetError(SEC_ERROR_NO_MEMORY);
1339 } 1357 }
1340 1358
1341 PORT_FreeArena(arena, PR_FALSE); 1359 PORT_FreeArena(arena, PR_FALSE);
1342 return NULL; 1360 return NULL;
1343 } 1361 }
1344 1362
1345 CERTSubjectPublicKeyInfo * 1363 CERTSubjectPublicKeyInfo *
1346 SECKEY_CreateSubjectPublicKeyInfo(const SECKEYPublicKey *pubk) 1364 SECKEY_CreateSubjectPublicKeyInfo(const SECKEYPublicKey *pubk)
1347 { 1365 {
1348 CERTSubjectPublicKeyInfo *spki; 1366 CERTSubjectPublicKeyInfo *spki;
(...skipping 10 matching lines...) Expand all
1359 } 1377 }
1360 spki = seckey_CreateSubjectPublicKeyInfo_helper(tempKey); 1378 spki = seckey_CreateSubjectPublicKeyInfo_helper(tempKey);
1361 SECKEY_DestroyPublicKey(tempKey); 1379 SECKEY_DestroyPublicKey(tempKey);
1362 return spki; 1380 return spki;
1363 } 1381 }
1364 1382
1365 void 1383 void
1366 SECKEY_DestroySubjectPublicKeyInfo(CERTSubjectPublicKeyInfo *spki) 1384 SECKEY_DestroySubjectPublicKeyInfo(CERTSubjectPublicKeyInfo *spki)
1367 { 1385 {
1368 if (spki && spki->arena) { 1386 if (spki && spki->arena) {
1369 » PORT_FreeArena(spki->arena, PR_FALSE); 1387 PORT_FreeArena(spki->arena, PR_FALSE);
1370 } 1388 }
1371 } 1389 }
1372 1390
1373 SECItem * 1391 SECItem *
1374 SECKEY_EncodeDERSubjectPublicKeyInfo(const SECKEYPublicKey *pubk) 1392 SECKEY_EncodeDERSubjectPublicKeyInfo(const SECKEYPublicKey *pubk)
1375 { 1393 {
1376 CERTSubjectPublicKeyInfo *spki=NULL; 1394 CERTSubjectPublicKeyInfo *spki = NULL;
1377 SECItem *spkiDER=NULL; 1395 SECItem *spkiDER = NULL;
1378 1396
1379 /* get the subjectpublickeyinfo */ 1397 /* get the subjectpublickeyinfo */
1380 spki = SECKEY_CreateSubjectPublicKeyInfo(pubk); 1398 spki = SECKEY_CreateSubjectPublicKeyInfo(pubk);
1381 if( spki == NULL ) { 1399 if (spki == NULL) {
1382 » goto finish; 1400 goto finish;
1383 } 1401 }
1384 1402
1385 /* DER-encode the subjectpublickeyinfo */ 1403 /* DER-encode the subjectpublickeyinfo */
1386 spkiDER = SEC_ASN1EncodeItem(NULL /*arena*/, NULL/*dest*/, spki, 1404 spkiDER = SEC_ASN1EncodeItem(NULL /*arena*/, NULL /*dest*/, spki,
1387 » » » » » CERT_SubjectPublicKeyInfoTemplate); 1405 CERT_SubjectPublicKeyInfoTemplate);
1388 1406
1389 SECKEY_DestroySubjectPublicKeyInfo(spki); 1407 SECKEY_DestroySubjectPublicKeyInfo(spki);
1390 1408
1391 finish: 1409 finish:
1392 return spkiDER; 1410 return spkiDER;
1393 } 1411 }
1394 1412
1395
1396 CERTSubjectPublicKeyInfo * 1413 CERTSubjectPublicKeyInfo *
1397 SECKEY_DecodeDERSubjectPublicKeyInfo(const SECItem *spkider) 1414 SECKEY_DecodeDERSubjectPublicKeyInfo(const SECItem *spkider)
1398 { 1415 {
1399 PLArenaPool *arena; 1416 PLArenaPool *arena;
1400 CERTSubjectPublicKeyInfo *spki; 1417 CERTSubjectPublicKeyInfo *spki;
1401 SECStatus rv; 1418 SECStatus rv;
1402 SECItem newSpkider; 1419 SECItem newSpkider;
1403 1420
1404 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1421 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1405 if (arena == NULL) { 1422 if (arena == NULL) {
1406 » PORT_SetError(SEC_ERROR_NO_MEMORY); 1423 PORT_SetError(SEC_ERROR_NO_MEMORY);
1407 » return NULL; 1424 return NULL;
1408 } 1425 }
1409 1426
1410 spki = (CERTSubjectPublicKeyInfo *) 1427 spki = (CERTSubjectPublicKeyInfo *)
1411 » » PORT_ArenaZAlloc(arena, sizeof (CERTSubjectPublicKeyInfo)); 1428 PORT_ArenaZAlloc(arena, sizeof(CERTSubjectPublicKeyInfo));
1412 if (spki != NULL) { 1429 if (spki != NULL) {
1413 » spki->arena = arena; 1430 spki->arena = arena;
1414 1431
1415 /* copy the DER into the arena, since Quick DER returns data that points 1432 /* copy the DER into the arena, since Quick DER returns data that points
1416 into the DER input, which may get freed by the caller */ 1433 into the DER input, which may get freed by the caller */
1417 rv = SECITEM_CopyItem(arena, &newSpkider, spkider); 1434 rv = SECITEM_CopyItem(arena, &newSpkider, spkider);
1418 if ( rv == SECSuccess ) { 1435 if (rv == SECSuccess) {
1419 rv = SEC_QuickDERDecodeItem(arena,spki, 1436 rv = SEC_QuickDERDecodeItem(arena, spki,
1420 » » » » CERT_SubjectPublicKeyInfoTemplate, &newSpkid er); 1437 CERT_SubjectPublicKeyInfoTemplate, &newS pkider);
1421 } 1438 }
1422 » if (rv == SECSuccess) 1439 if (rv == SECSuccess)
1423 » return spki; 1440 return spki;
1424 } else { 1441 } else {
1425 » PORT_SetError(SEC_ERROR_NO_MEMORY); 1442 PORT_SetError(SEC_ERROR_NO_MEMORY);
1426 } 1443 }
1427 1444
1428 PORT_FreeArena(arena, PR_FALSE); 1445 PORT_FreeArena(arena, PR_FALSE);
1429 return NULL; 1446 return NULL;
1430 } 1447 }
1431 1448
1432 /* 1449 /*
1433 * Decode a base64 ascii encoded DER encoded subject public key info. 1450 * Decode a base64 ascii encoded DER encoded subject public key info.
1434 */ 1451 */
1435 CERTSubjectPublicKeyInfo * 1452 CERTSubjectPublicKeyInfo *
1436 SECKEY_ConvertAndDecodeSubjectPublicKeyInfo(const char *spkistr) 1453 SECKEY_ConvertAndDecodeSubjectPublicKeyInfo(const char *spkistr)
1437 { 1454 {
1438 CERTSubjectPublicKeyInfo *spki; 1455 CERTSubjectPublicKeyInfo *spki;
1439 SECStatus rv; 1456 SECStatus rv;
1440 SECItem der; 1457 SECItem der;
1441 1458
1442 rv = ATOB_ConvertAsciiToItem(&der, spkistr); 1459 rv = ATOB_ConvertAsciiToItem(&der, spkistr);
1443 if (rv != SECSuccess) 1460 if (rv != SECSuccess)
1444 » return NULL; 1461 return NULL;
1445 1462
1446 spki = SECKEY_DecodeDERSubjectPublicKeyInfo(&der); 1463 spki = SECKEY_DecodeDERSubjectPublicKeyInfo(&der);
1447 1464
1448 PORT_Free(der.data); 1465 PORT_Free(der.data);
1449 return spki; 1466 return spki;
1450 } 1467 }
1451 1468
1452 /* 1469 /*
1453 * Decode a base64 ascii encoded DER encoded public key and challenge 1470 * Decode a base64 ascii encoded DER encoded public key and challenge
1454 * Verify digital signature and make sure challenge matches 1471 * Verify digital signature and make sure challenge matches
1455 */ 1472 */
1456 CERTSubjectPublicKeyInfo * 1473 CERTSubjectPublicKeyInfo *
1457 SECKEY_ConvertAndDecodePublicKeyAndChallenge(char *pkacstr, char *challenge, 1474 SECKEY_ConvertAndDecodePublicKeyAndChallenge(char *pkacstr, char *challenge,
1458 » » » » » » » » void *wincx) 1475 void *wincx)
1459 { 1476 {
1460 CERTSubjectPublicKeyInfo *spki = NULL; 1477 CERTSubjectPublicKeyInfo *spki = NULL;
1461 CERTPublicKeyAndChallenge pkac; 1478 CERTPublicKeyAndChallenge pkac;
1462 SECStatus rv; 1479 SECStatus rv;
1463 SECItem signedItem; 1480 SECItem signedItem;
1464 PLArenaPool *arena = NULL; 1481 PLArenaPool *arena = NULL;
1465 CERTSignedData sd; 1482 CERTSignedData sd;
1466 SECItem sig; 1483 SECItem sig;
1467 SECKEYPublicKey *pubKey = NULL; 1484 SECKEYPublicKey *pubKey = NULL;
1468 unsigned int len; 1485 unsigned int len;
1469 1486
1470 signedItem.data = NULL; 1487 signedItem.data = NULL;
1471 1488
1472 /* convert the base64 encoded data to binary */ 1489 /* convert the base64 encoded data to binary */
1473 rv = ATOB_ConvertAsciiToItem(&signedItem, pkacstr); 1490 rv = ATOB_ConvertAsciiToItem(&signedItem, pkacstr);
1474 if (rv != SECSuccess) { 1491 if (rv != SECSuccess) {
1475 » goto loser; 1492 goto loser;
1476 } 1493 }
1477 1494
1478 /* create an arena */ 1495 /* create an arena */
1479 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1496 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1480 if (arena == NULL) { 1497 if (arena == NULL) {
1481 » goto loser; 1498 goto loser;
1482 } 1499 }
1483 1500
1484 /* decode the outer wrapping of signed data */ 1501 /* decode the outer wrapping of signed data */
1485 PORT_Memset(&sd, 0, sizeof(CERTSignedData)); 1502 PORT_Memset(&sd, 0, sizeof(CERTSignedData));
1486 rv = SEC_QuickDERDecodeItem(arena, &sd, CERT_SignedDataTemplate, &signedItem ); 1503 rv = SEC_QuickDERDecodeItem(arena, &sd, CERT_SignedDataTemplate, &signedItem );
1487 if ( rv ) { 1504 if (rv) {
1488 » goto loser; 1505 goto loser;
1489 } 1506 }
1490 1507
1491 /* decode the public key and challenge wrapper */ 1508 /* decode the public key and challenge wrapper */
1492 PORT_Memset(&pkac, 0, sizeof(CERTPublicKeyAndChallenge)); 1509 PORT_Memset(&pkac, 0, sizeof(CERTPublicKeyAndChallenge));
1493 rv = SEC_QuickDERDecodeItem(arena, &pkac, CERT_PublicKeyAndChallengeTemplate , 1510 rv = SEC_QuickDERDecodeItem(arena, &pkac, CERT_PublicKeyAndChallengeTemplate ,
1494 » » » &sd.data); 1511 &sd.data);
1495 if ( rv ) { 1512 if (rv) {
1496 » goto loser; 1513 goto loser;
1497 } 1514 }
1498 1515
1499 /* decode the subject public key info */ 1516 /* decode the subject public key info */
1500 spki = SECKEY_DecodeDERSubjectPublicKeyInfo(&pkac.spki); 1517 spki = SECKEY_DecodeDERSubjectPublicKeyInfo(&pkac.spki);
1501 if ( spki == NULL ) { 1518 if (spki == NULL) {
1502 » goto loser; 1519 goto loser;
1503 } 1520 }
1504 1521
1505 /* get the public key */ 1522 /* get the public key */
1506 pubKey = seckey_ExtractPublicKey(spki); 1523 pubKey = seckey_ExtractPublicKey(spki);
1507 if ( pubKey == NULL ) { 1524 if (pubKey == NULL) {
1508 » goto loser; 1525 goto loser;
1509 } 1526 }
1510 1527
1511 /* check the signature */ 1528 /* check the signature */
1512 sig = sd.signature; 1529 sig = sd.signature;
1513 DER_ConvertBitString(&sig); 1530 DER_ConvertBitString(&sig);
1514 rv = VFY_VerifyDataWithAlgorithmID(sd.data.data, sd.data.len, pubKey, &sig, 1531 rv = VFY_VerifyDataWithAlgorithmID(sd.data.data, sd.data.len, pubKey, &sig,
1515 » » » &(sd.signatureAlgorithm), NULL, wincx); 1532 &(sd.signatureAlgorithm), NULL, wincx);
1516 if ( rv != SECSuccess ) { 1533 if (rv != SECSuccess) {
1517 » goto loser; 1534 goto loser;
1518 } 1535 }
1519 1536
1520 /* check the challenge */ 1537 /* check the challenge */
1521 if ( challenge ) { 1538 if (challenge) {
1522 » len = PORT_Strlen(challenge); 1539 len = PORT_Strlen(challenge);
1523 » /* length is right */ 1540 /* length is right */
1524 » if ( len != pkac.challenge.len ) { 1541 if (len != pkac.challenge.len) {
1525 » goto loser; 1542 goto loser;
1526 » } 1543 }
1527 » /* actual data is right */ 1544 /* actual data is right */
1528 » if ( PORT_Memcmp(challenge, pkac.challenge.data, len) != 0 ) { 1545 if (PORT_Memcmp(challenge, pkac.challenge.data, len) != 0) {
1529 » goto loser; 1546 goto loser;
1530 » } 1547 }
1531 } 1548 }
1532 goto done; 1549 goto done;
1533 1550
1534 loser: 1551 loser:
1535 /* make sure that we return null if we got an error */ 1552 /* make sure that we return null if we got an error */
1536 if ( spki ) { 1553 if (spki) {
1537 » SECKEY_DestroySubjectPublicKeyInfo(spki); 1554 SECKEY_DestroySubjectPublicKeyInfo(spki);
1538 } 1555 }
1539 spki = NULL; 1556 spki = NULL;
1540 1557
1541 done: 1558 done:
1542 if ( signedItem.data ) { 1559 if (signedItem.data) {
1543 » PORT_Free(signedItem.data); 1560 PORT_Free(signedItem.data);
1544 } 1561 }
1545 if ( arena ) { 1562 if (arena) {
1546 » PORT_FreeArena(arena, PR_FALSE); 1563 PORT_FreeArena(arena, PR_FALSE);
1547 } 1564 }
1548 if ( pubKey ) { 1565 if (pubKey) {
1549 » SECKEY_DestroyPublicKey(pubKey); 1566 SECKEY_DestroyPublicKey(pubKey);
1550 } 1567 }
1551 1568
1552 return spki; 1569 return spki;
1553 } 1570 }
1554 1571
1555 void 1572 void
1556 SECKEY_DestroyPrivateKeyInfo(SECKEYPrivateKeyInfo *pvk, 1573 SECKEY_DestroyPrivateKeyInfo(SECKEYPrivateKeyInfo *pvk,
1557 » » » PRBool freeit) 1574 PRBool freeit)
1558 { 1575 {
1559 PLArenaPool *poolp; 1576 PLArenaPool *poolp;
1560 1577
1561 if(pvk != NULL) { 1578 if (pvk != NULL) {
1562 » if(pvk->arena) { 1579 if (pvk->arena) {
1563 » poolp = pvk->arena; 1580 poolp = pvk->arena;
1564 » /* zero structure since PORT_FreeArena does not support 1581 /* zero structure since PORT_FreeArena does not support
1565 » * this yet. 1582 * this yet.
1566 » */ 1583 */
1567 » PORT_Memset(pvk->privateKey.data, 0, pvk->privateKey.len); 1584 PORT_Memset(pvk->privateKey.data, 0, pvk->privateKey.len);
1568 » PORT_Memset(pvk, 0, sizeof(*pvk)); 1585 PORT_Memset(pvk, 0, sizeof(*pvk));
1569 » if(freeit == PR_TRUE) { 1586 if (freeit == PR_TRUE) {
1570 » » PORT_FreeArena(poolp, PR_TRUE); 1587 PORT_FreeArena(poolp, PR_TRUE);
1571 » } else { 1588 } else {
1572 » » pvk->arena = poolp; 1589 pvk->arena = poolp;
1573 » } 1590 }
1574 » } else { 1591 } else {
1575 » SECITEM_ZfreeItem(&pvk->version, PR_FALSE); 1592 SECITEM_ZfreeItem(&pvk->version, PR_FALSE);
1576 » SECITEM_ZfreeItem(&pvk->privateKey, PR_FALSE); 1593 SECITEM_ZfreeItem(&pvk->privateKey, PR_FALSE);
1577 » SECOID_DestroyAlgorithmID(&pvk->algorithm, PR_FALSE); 1594 SECOID_DestroyAlgorithmID(&pvk->algorithm, PR_FALSE);
1578 » PORT_Memset(pvk, 0, sizeof(*pvk)); 1595 PORT_Memset(pvk, 0, sizeof(*pvk));
1579 » if(freeit == PR_TRUE) { 1596 if (freeit == PR_TRUE) {
1580 » » PORT_Free(pvk); 1597 PORT_Free(pvk);
1581 » } 1598 }
1582 » } 1599 }
1583 } 1600 }
1584 } 1601 }
1585 1602
1586 void 1603 void
1587 SECKEY_DestroyEncryptedPrivateKeyInfo(SECKEYEncryptedPrivateKeyInfo *epki, 1604 SECKEY_DestroyEncryptedPrivateKeyInfo(SECKEYEncryptedPrivateKeyInfo *epki,
1588 » » » » PRBool freeit) 1605 PRBool freeit)
1589 { 1606 {
1590 PLArenaPool *poolp; 1607 PLArenaPool *poolp;
1591 1608
1592 if(epki != NULL) { 1609 if (epki != NULL) {
1593 » if(epki->arena) { 1610 if (epki->arena) {
1594 » poolp = epki->arena; 1611 poolp = epki->arena;
1595 » /* zero structure since PORT_FreeArena does not support 1612 /* zero structure since PORT_FreeArena does not support
1596 » * this yet. 1613 * this yet.
1597 » */ 1614 */
1598 » PORT_Memset(epki->encryptedData.data, 0, epki->encryptedData.len); 1615 PORT_Memset(epki->encryptedData.data, 0, epki->encryptedData.len);
1599 » PORT_Memset(epki, 0, sizeof(*epki)); 1616 PORT_Memset(epki, 0, sizeof(*epki));
1600 » if(freeit == PR_TRUE) { 1617 if (freeit == PR_TRUE) {
1601 » » PORT_FreeArena(poolp, PR_TRUE); 1618 PORT_FreeArena(poolp, PR_TRUE);
1602 » } else { 1619 } else {
1603 » » epki->arena = poolp; 1620 epki->arena = poolp;
1604 » } 1621 }
1605 » } else { 1622 } else {
1606 » SECITEM_ZfreeItem(&epki->encryptedData, PR_FALSE); 1623 SECITEM_ZfreeItem(&epki->encryptedData, PR_FALSE);
1607 » SECOID_DestroyAlgorithmID(&epki->algorithm, PR_FALSE); 1624 SECOID_DestroyAlgorithmID(&epki->algorithm, PR_FALSE);
1608 » PORT_Memset(epki, 0, sizeof(*epki)); 1625 PORT_Memset(epki, 0, sizeof(*epki));
1609 » if(freeit == PR_TRUE) { 1626 if (freeit == PR_TRUE) {
1610 » » PORT_Free(epki); 1627 PORT_Free(epki);
1611 » } 1628 }
1612 » } 1629 }
1613 } 1630 }
1614 } 1631 }
1615 1632
1616 SECStatus 1633 SECStatus
1617 SECKEY_CopyPrivateKeyInfo(PLArenaPool *poolp, 1634 SECKEY_CopyPrivateKeyInfo(PLArenaPool *poolp,
1618 » » » SECKEYPrivateKeyInfo *to, 1635 SECKEYPrivateKeyInfo *to,
1619 » » » const SECKEYPrivateKeyInfo *from) 1636 const SECKEYPrivateKeyInfo *from)
1620 { 1637 {
1621 SECStatus rv = SECFailure; 1638 SECStatus rv = SECFailure;
1622 1639
1623 if((to == NULL) || (from == NULL)) { 1640 if ((to == NULL) || (from == NULL)) {
1624 » return SECFailure; 1641 return SECFailure;
1625 } 1642 }
1626 1643
1627 rv = SECOID_CopyAlgorithmID(poolp, &to->algorithm, &from->algorithm); 1644 rv = SECOID_CopyAlgorithmID(poolp, &to->algorithm, &from->algorithm);
1628 if(rv != SECSuccess) { 1645 if (rv != SECSuccess) {
1629 » return SECFailure; 1646 return SECFailure;
1630 } 1647 }
1631 rv = SECITEM_CopyItem(poolp, &to->privateKey, &from->privateKey); 1648 rv = SECITEM_CopyItem(poolp, &to->privateKey, &from->privateKey);
1632 if(rv != SECSuccess) { 1649 if (rv != SECSuccess) {
1633 » return SECFailure; 1650 return SECFailure;
1634 } 1651 }
1635 rv = SECITEM_CopyItem(poolp, &to->version, &from->version); 1652 rv = SECITEM_CopyItem(poolp, &to->version, &from->version);
1636 1653
1637 return rv; 1654 return rv;
1638 } 1655 }
1639 1656
1640 SECStatus 1657 SECStatus
1641 SECKEY_CopyEncryptedPrivateKeyInfo(PLArenaPool *poolp, 1658 SECKEY_CopyEncryptedPrivateKeyInfo(PLArenaPool *poolp,
1642 » » » » SECKEYEncryptedPrivateKeyInfo *to, 1659 SECKEYEncryptedPrivateKeyInfo *to,
1643 » » » » const SECKEYEncryptedPrivateKeyInfo *from) 1660 const SECKEYEncryptedPrivateKeyInfo *from)
1644 { 1661 {
1645 SECStatus rv = SECFailure; 1662 SECStatus rv = SECFailure;
1646 1663
1647 if((to == NULL) || (from == NULL)) { 1664 if ((to == NULL) || (from == NULL)) {
1648 » return SECFailure; 1665 return SECFailure;
1649 } 1666 }
1650 1667
1651 rv = SECOID_CopyAlgorithmID(poolp, &to->algorithm, &from->algorithm); 1668 rv = SECOID_CopyAlgorithmID(poolp, &to->algorithm, &from->algorithm);
1652 if(rv != SECSuccess) { 1669 if (rv != SECSuccess) {
1653 » return SECFailure; 1670 return SECFailure;
1654 } 1671 }
1655 rv = SECITEM_CopyItem(poolp, &to->encryptedData, &from->encryptedData); 1672 rv = SECITEM_CopyItem(poolp, &to->encryptedData, &from->encryptedData);
1656 1673
1657 return rv; 1674 return rv;
1658 } 1675 }
1659 1676
1660 KeyType 1677 KeyType
1661 SECKEY_GetPrivateKeyType(const SECKEYPrivateKey *privKey) 1678 SECKEY_GetPrivateKeyType(const SECKEYPrivateKey *privKey)
1662 { 1679 {
1663 return privKey->keyType; 1680 return privKey->keyType;
1664 } 1681 }
1665 1682
1666 KeyType 1683 KeyType
1667 SECKEY_GetPublicKeyType(const SECKEYPublicKey *pubKey) 1684 SECKEY_GetPublicKeyType(const SECKEYPublicKey *pubKey)
1668 { 1685 {
1669 return pubKey->keyType; 1686 return pubKey->keyType;
1670 } 1687 }
1671 1688
1672 SECKEYPublicKey* 1689 SECKEYPublicKey *
1673 SECKEY_ImportDERPublicKey(const SECItem *derKey, CK_KEY_TYPE type) 1690 SECKEY_ImportDERPublicKey(const SECItem *derKey, CK_KEY_TYPE type)
1674 { 1691 {
1675 SECKEYPublicKey *pubk = NULL; 1692 SECKEYPublicKey *pubk = NULL;
1676 SECStatus rv = SECFailure; 1693 SECStatus rv = SECFailure;
1677 SECItem newDerKey; 1694 SECItem newDerKey;
1678 PLArenaPool *arena = NULL; 1695 PLArenaPool *arena = NULL;
1679 1696
1680 if (!derKey) { 1697 if (!derKey) {
1681 return NULL; 1698 return NULL;
1682 } 1699 }
1683 1700
1684 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1701 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1685 if (arena == NULL) { 1702 if (arena == NULL) {
1686 » PORT_SetError(SEC_ERROR_NO_MEMORY); 1703 PORT_SetError(SEC_ERROR_NO_MEMORY);
1687 goto finish; 1704 goto finish;
1688 } 1705 }
1689 1706
1690 pubk = PORT_ArenaZNew(arena, SECKEYPublicKey); 1707 pubk = PORT_ArenaZNew(arena, SECKEYPublicKey);
1691 if (pubk == NULL) { 1708 if (pubk == NULL) {
1692 goto finish; 1709 goto finish;
1693 } 1710 }
1694 pubk->arena = arena; 1711 pubk->arena = arena;
1695 1712
1696 rv = SECITEM_CopyItem(pubk->arena, &newDerKey, derKey); 1713 rv = SECITEM_CopyItem(pubk->arena, &newDerKey, derKey);
1697 if (SECSuccess != rv) { 1714 if (SECSuccess != rv) {
1698 goto finish; 1715 goto finish;
1699 } 1716 }
1700 1717
1701 pubk->pkcs11Slot = NULL; 1718 pubk->pkcs11Slot = NULL;
1702 pubk->pkcs11ID = CK_INVALID_HANDLE; 1719 pubk->pkcs11ID = CK_INVALID_HANDLE;
1703 1720
1704 switch( type ) { 1721 switch (type) {
1705 case CKK_RSA: 1722 case CKK_RSA:
1706 » prepare_rsa_pub_key_for_asn1(pubk); 1723 prepare_rsa_pub_key_for_asn1(pubk);
1707 rv = SEC_QuickDERDecodeItem(pubk->arena, pubk, SECKEY_RSAPublicKeyTempla te, &newDerKey); 1724 rv = SEC_QuickDERDecodeItem(pubk->arena, pubk, SECKEY_RSAPublicKeyTe mplate, &newDerKey);
1708 pubk->keyType = rsaKey; 1725 pubk->keyType = rsaKey;
1709 break; 1726 break;
1710 case CKK_DSA: 1727 case CKK_DSA:
1711 » prepare_dsa_pub_key_for_asn1(pubk); 1728 prepare_dsa_pub_key_for_asn1(pubk);
1712 rv = SEC_QuickDERDecodeItem(pubk->arena, pubk, SECKEY_DSAPublicKeyTempla te, &newDerKey); 1729 rv = SEC_QuickDERDecodeItem(pubk->arena, pubk, SECKEY_DSAPublicKeyTe mplate, &newDerKey);
1713 pubk->keyType = dsaKey; 1730 pubk->keyType = dsaKey;
1714 break; 1731 break;
1715 case CKK_DH: 1732 case CKK_DH:
1716 » prepare_dh_pub_key_for_asn1(pubk); 1733 prepare_dh_pub_key_for_asn1(pubk);
1717 rv = SEC_QuickDERDecodeItem(pubk->arena, pubk, SECKEY_DHPublicKeyTemplat e, &newDerKey); 1734 rv = SEC_QuickDERDecodeItem(pubk->arena, pubk, SECKEY_DHPublicKeyTem plate, &newDerKey);
1718 pubk->keyType = dhKey; 1735 pubk->keyType = dhKey;
1719 break; 1736 break;
1720 default: 1737 default:
1721 rv = SECFailure; 1738 rv = SECFailure;
1722 break; 1739 break;
1723 } 1740 }
1724 1741
1725 finish: 1742 finish:
1726 if (rv != SECSuccess) { 1743 if (rv != SECSuccess) {
1727 if (arena != NULL) { 1744 if (arena != NULL) {
1728 PORT_FreeArena(arena, PR_FALSE); 1745 PORT_FreeArena(arena, PR_FALSE);
1729 } 1746 }
1730 pubk = NULL; 1747 pubk = NULL;
1731 } 1748 }
1732 return pubk; 1749 return pubk;
1733 } 1750 }
1734 1751
1735 SECKEYPrivateKeyList* 1752 SECKEYPrivateKeyList *
1736 SECKEY_NewPrivateKeyList(void) 1753 SECKEY_NewPrivateKeyList(void)
1737 { 1754 {
1738 PLArenaPool *arena = NULL; 1755 PLArenaPool *arena = NULL;
1739 SECKEYPrivateKeyList *ret = NULL; 1756 SECKEYPrivateKeyList *ret = NULL;
1740 1757
1741 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1758 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1742 if ( arena == NULL ) { 1759 if (arena == NULL) {
1743 goto loser; 1760 goto loser;
1744 } 1761 }
1745 1762
1746 ret = (SECKEYPrivateKeyList *)PORT_ArenaZAlloc(arena, 1763 ret = (SECKEYPrivateKeyList *)PORT_ArenaZAlloc(arena,
1747 sizeof(SECKEYPrivateKeyList)); 1764 sizeof(SECKEYPrivateKeyList)) ;
1748 if ( ret == NULL ) { 1765 if (ret == NULL) {
1749 goto loser; 1766 goto loser;
1750 } 1767 }
1751 1768
1752 ret->arena = arena; 1769 ret->arena = arena;
1753 1770
1754 PR_INIT_CLIST(&ret->list); 1771 PR_INIT_CLIST(&ret->list);
1755 1772
1756 return(ret); 1773 return (ret);
1757 1774
1758 loser: 1775 loser:
1759 if ( arena != NULL ) { 1776 if (arena != NULL) {
1760 PORT_FreeArena(arena, PR_FALSE); 1777 PORT_FreeArena(arena, PR_FALSE);
1761 } 1778 }
1762 1779
1763 return(NULL); 1780 return (NULL);
1764 } 1781 }
1765 1782
1766 void 1783 void
1767 SECKEY_DestroyPrivateKeyList(SECKEYPrivateKeyList *keys) 1784 SECKEY_DestroyPrivateKeyList(SECKEYPrivateKeyList *keys)
1768 { 1785 {
1769 while( !PR_CLIST_IS_EMPTY(&keys->list) ) { 1786 while (!PR_CLIST_IS_EMPTY(&keys->list)) {
1770 SECKEY_RemovePrivateKeyListNode( 1787 SECKEY_RemovePrivateKeyListNode(
1771 (SECKEYPrivateKeyListNode*)(PR_LIST_HEAD(&keys->list)) ); 1788 (SECKEYPrivateKeyListNode *)(PR_LIST_HEAD(&keys->list)));
1772 } 1789 }
1773 1790
1774 PORT_FreeArena(keys->arena, PR_FALSE); 1791 PORT_FreeArena(keys->arena, PR_FALSE);
1775 1792
1776 return; 1793 return;
1777 } 1794 }
1778 1795
1779
1780 void 1796 void
1781 SECKEY_RemovePrivateKeyListNode(SECKEYPrivateKeyListNode *node) 1797 SECKEY_RemovePrivateKeyListNode(SECKEYPrivateKeyListNode *node)
1782 { 1798 {
1783 PR_ASSERT(node->key); 1799 PR_ASSERT(node->key);
1784 SECKEY_DestroyPrivateKey(node->key); 1800 SECKEY_DestroyPrivateKey(node->key);
1785 node->key = NULL; 1801 node->key = NULL;
1786 PR_REMOVE_LINK(&node->links); 1802 PR_REMOVE_LINK(&node->links);
1787 return; 1803 return;
1788
1789 } 1804 }
1790 1805
1791 SECStatus 1806 SECStatus
1792 SECKEY_AddPrivateKeyToListTail( SECKEYPrivateKeyList *list, 1807 SECKEY_AddPrivateKeyToListTail(SECKEYPrivateKeyList *list,
1793 SECKEYPrivateKey *key) 1808 SECKEYPrivateKey *key)
1794 { 1809 {
1795 SECKEYPrivateKeyListNode *node; 1810 SECKEYPrivateKeyListNode *node;
1796 1811
1797 node = (SECKEYPrivateKeyListNode *)PORT_ArenaZAlloc(list->arena, 1812 node = (SECKEYPrivateKeyListNode *)PORT_ArenaZAlloc(list->arena,
1798 sizeof(SECKEYPrivateKeyListNode)); 1813 sizeof(SECKEYPrivateKeyL istNode));
1799 if ( node == NULL ) { 1814 if (node == NULL) {
1800 goto loser; 1815 goto loser;
1801 } 1816 }
1802 1817
1803 PR_INSERT_BEFORE(&node->links, &list->list); 1818 PR_INSERT_BEFORE(&node->links, &list->list);
1804 node->key = key; 1819 node->key = key;
1805 return(SECSuccess); 1820 return (SECSuccess);
1806 1821
1807 loser: 1822 loser:
1808 return(SECFailure); 1823 return (SECFailure);
1809 } 1824 }
1810 1825
1811 1826 SECKEYPublicKeyList *
1812 SECKEYPublicKeyList*
1813 SECKEY_NewPublicKeyList(void) 1827 SECKEY_NewPublicKeyList(void)
1814 { 1828 {
1815 PLArenaPool *arena = NULL; 1829 PLArenaPool *arena = NULL;
1816 SECKEYPublicKeyList *ret = NULL; 1830 SECKEYPublicKeyList *ret = NULL;
1817 1831
1818 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE); 1832 arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
1819 if ( arena == NULL ) { 1833 if (arena == NULL) {
1820 goto loser; 1834 goto loser;
1821 } 1835 }
1822 1836
1823 ret = (SECKEYPublicKeyList *)PORT_ArenaZAlloc(arena, 1837 ret = (SECKEYPublicKeyList *)PORT_ArenaZAlloc(arena,
1824 sizeof(SECKEYPublicKeyList)); 1838 sizeof(SECKEYPublicKeyList));
1825 if ( ret == NULL ) { 1839 if (ret == NULL) {
1826 goto loser; 1840 goto loser;
1827 } 1841 }
1828 1842
1829 ret->arena = arena; 1843 ret->arena = arena;
1830 1844
1831 PR_INIT_CLIST(&ret->list); 1845 PR_INIT_CLIST(&ret->list);
1832 1846
1833 return(ret); 1847 return (ret);
1834 1848
1835 loser: 1849 loser:
1836 if ( arena != NULL ) { 1850 if (arena != NULL) {
1837 PORT_FreeArena(arena, PR_FALSE); 1851 PORT_FreeArena(arena, PR_FALSE);
1838 } 1852 }
1839 1853
1840 return(NULL); 1854 return (NULL);
1841 } 1855 }
1842 1856
1843 void 1857 void
1844 SECKEY_DestroyPublicKeyList(SECKEYPublicKeyList *keys) 1858 SECKEY_DestroyPublicKeyList(SECKEYPublicKeyList *keys)
1845 { 1859 {
1846 while( !PR_CLIST_IS_EMPTY(&keys->list) ) { 1860 while (!PR_CLIST_IS_EMPTY(&keys->list)) {
1847 SECKEY_RemovePublicKeyListNode( 1861 SECKEY_RemovePublicKeyListNode(
1848 (SECKEYPublicKeyListNode*)(PR_LIST_HEAD(&keys->list)) ); 1862 (SECKEYPublicKeyListNode *)(PR_LIST_HEAD(&keys->list)));
1849 } 1863 }
1850 1864
1851 PORT_FreeArena(keys->arena, PR_FALSE); 1865 PORT_FreeArena(keys->arena, PR_FALSE);
1852 1866
1853 return; 1867 return;
1854 } 1868 }
1855 1869
1856
1857 void 1870 void
1858 SECKEY_RemovePublicKeyListNode(SECKEYPublicKeyListNode *node) 1871 SECKEY_RemovePublicKeyListNode(SECKEYPublicKeyListNode *node)
1859 { 1872 {
1860 PR_ASSERT(node->key); 1873 PR_ASSERT(node->key);
1861 SECKEY_DestroyPublicKey(node->key); 1874 SECKEY_DestroyPublicKey(node->key);
1862 node->key = NULL; 1875 node->key = NULL;
1863 PR_REMOVE_LINK(&node->links); 1876 PR_REMOVE_LINK(&node->links);
1864 return; 1877 return;
1865
1866 } 1878 }
1867 1879
1868 SECStatus 1880 SECStatus
1869 SECKEY_AddPublicKeyToListTail( SECKEYPublicKeyList *list, 1881 SECKEY_AddPublicKeyToListTail(SECKEYPublicKeyList *list,
1870 SECKEYPublicKey *key) 1882 SECKEYPublicKey *key)
1871 { 1883 {
1872 SECKEYPublicKeyListNode *node; 1884 SECKEYPublicKeyListNode *node;
1873 1885
1874 node = (SECKEYPublicKeyListNode *)PORT_ArenaZAlloc(list->arena, 1886 node = (SECKEYPublicKeyListNode *)PORT_ArenaZAlloc(list->arena,
1875 sizeof(SECKEYPublicKeyListNode)); 1887 sizeof(SECKEYPublicKeyLis tNode));
1876 if ( node == NULL ) { 1888 if (node == NULL) {
1877 goto loser; 1889 goto loser;
1878 } 1890 }
1879 1891
1880 PR_INSERT_BEFORE(&node->links, &list->list); 1892 PR_INSERT_BEFORE(&node->links, &list->list);
1881 node->key = key; 1893 node->key = key;
1882 return(SECSuccess); 1894 return (SECSuccess);
1883 1895
1884 loser: 1896 loser:
1885 return(SECFailure); 1897 return (SECFailure);
1886 } 1898 }
1887 1899
1888 #define SECKEY_CacheAttribute(key, attribute) \ 1900 #define SECKEY_CacheAttribute(key, attribute) \
1889 if (CK_TRUE == PK11_HasAttributeSet(key->pkcs11Slot, key->pkcs11ID, attribut e, PR_FALSE)) { \ 1901 if (CK_TRUE == PK11_HasAttributeSet(key->pkcs11Slot, key->pkcs11ID, attribut e, PR_FALSE)) { \
1890 key->staticflags |= SECKEY_##attribute; \ 1902 key->staticflags |= SECKEY_##attribute; \
1891 } else { \ 1903 } else { \
1892 key->staticflags &= (~SECKEY_##attribute); \ 1904 key->staticflags &= (~SECKEY_##attribute); \
1893 } 1905 }
1894 1906
1895 SECStatus 1907 SECStatus
1896 SECKEY_CacheStaticFlags(SECKEYPrivateKey* key) 1908 SECKEY_CacheStaticFlags(SECKEYPrivateKey *key)
1897 { 1909 {
1898 SECStatus rv = SECFailure; 1910 SECStatus rv = SECFailure;
1899 if (key && key->pkcs11Slot && key->pkcs11ID) { 1911 if (key && key->pkcs11Slot && key->pkcs11ID) {
1900 key->staticflags |= SECKEY_Attributes_Cached; 1912 key->staticflags |= SECKEY_Attributes_Cached;
1901 SECKEY_CacheAttribute(key, CKA_PRIVATE); 1913 SECKEY_CacheAttribute(key, CKA_PRIVATE);
1902 SECKEY_CacheAttribute(key, CKA_ALWAYS_AUTHENTICATE); 1914 SECKEY_CacheAttribute(key, CKA_ALWAYS_AUTHENTICATE);
1903 rv = SECSuccess; 1915 rv = SECSuccess;
1904 } 1916 }
1905 return rv; 1917 return rv;
1906 } 1918 }
1907 1919
1908 SECOidTag 1920 SECOidTag
1909 SECKEY_GetECCOid(const SECKEYECParams * params) 1921 SECKEY_GetECCOid(const SECKEYECParams *params)
1910 { 1922 {
1911 SECItem oid = { siBuffer, NULL, 0}; 1923 SECItem oid = { siBuffer, NULL, 0 };
1912 SECOidData *oidData = NULL; 1924 SECOidData *oidData = NULL;
1913 1925
1914 /* 1926 /*
1915 * params->data needs to contain the ASN encoding of an object ID (OID) 1927 * params->data needs to contain the ASN encoding of an object ID (OID)
1916 * representing a named curve. Here, we strip away everything 1928 * representing a named curve. Here, we strip away everything
1917 * before the actual OID and use the OID to look up a named curve. 1929 * before the actual OID and use the OID to look up a named curve.
1918 */ 1930 */
1919 if (params->data[0] != SEC_ASN1_OBJECT_ID) return 0; 1931 if (params->data[0] != SEC_ASN1_OBJECT_ID)
1932 return 0;
1920 oid.len = params->len - 2; 1933 oid.len = params->len - 2;
1921 oid.data = params->data + 2; 1934 oid.data = params->data + 2;
1922 if ((oidData = SECOID_FindOID(&oid)) == NULL) return 0; 1935 if ((oidData = SECOID_FindOID(&oid)) == NULL)
1936 return 0;
1923 1937
1924 return oidData->offset; 1938 return oidData->offset;
1925 } 1939 }
OLDNEW
« no previous file with comments | « nss/lib/cryptohi/sechash.c ('k') | nss/lib/cryptohi/secsign.c » ('j') | nss/lib/util/secoid.c » ('J')

Powered by Google App Engine
This is Rietveld 408576698