| OLD | NEW |
| 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 /* | 4 /* |
| 5 * This file contains functions to manage asymetric keys, (public and | 5 * This file contains functions to manage asymetric keys, (public and |
| 6 * private keys). | 6 * private keys). |
| 7 */ | 7 */ |
| 8 #include "seccomon.h" | 8 #include "seccomon.h" |
| 9 #include "secmod.h" | 9 #include "secmod.h" |
| 10 #include "secmodi.h" | 10 #include "secmodi.h" |
| 11 #include "secmodti.h" | 11 #include "secmodti.h" |
| 12 #include "pkcs11.h" | 12 #include "pkcs11.h" |
| 13 #include "pkcs11t.h" | 13 #include "pkcs11t.h" |
| 14 #include "pk11func.h" | 14 #include "pk11func.h" |
| 15 #include "cert.h" | 15 #include "cert.h" |
| 16 #include "key.h" | 16 #include "key.h" |
| 17 #include "secitem.h" | 17 #include "secitem.h" |
| 18 #include "secasn1.h" | 18 #include "secasn1.h" |
| 19 #include "secoid.h" | 19 #include "secoid.h" |
| 20 #include "secerr.h" | 20 #include "secerr.h" |
| 21 #include "sslerr.h" | |
| 22 #include "sechash.h" | 21 #include "sechash.h" |
| 23 | 22 |
| 24 #include "secpkcs5.h" | 23 #include "secpkcs5.h" |
| 25 #include "blapit.h" | 24 #include "blapit.h" |
| 26 | 25 |
| 27 static SECItem * | 26 static SECItem * |
| 28 pk11_MakeIDFromPublicKey(SECKEYPublicKey *pubKey) | 27 pk11_MakeIDFromPublicKey(SECKEYPublicKey *pubKey) |
| 29 { | 28 { |
| 30 /* set the ID to the public key so we can find it again */ | 29 /* set the ID to the public key so we can find it again */ |
| 31 SECItem *pubKeyIndex = NULL; | 30 SECItem *pubKeyIndex = NULL; |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 67 CK_BBOOL ckfalse = CK_FALSE; | 66 CK_BBOOL ckfalse = CK_FALSE; |
| 68 CK_OBJECT_CLASS keyClass = CKO_PUBLIC_KEY; | 67 CK_OBJECT_CLASS keyClass = CKO_PUBLIC_KEY; |
| 69 CK_KEY_TYPE keyType = CKK_GENERIC_SECRET; | 68 CK_KEY_TYPE keyType = CKK_GENERIC_SECRET; |
| 70 CK_OBJECT_HANDLE objectID; | 69 CK_OBJECT_HANDLE objectID; |
| 71 CK_ATTRIBUTE theTemplate[11]; | 70 CK_ATTRIBUTE theTemplate[11]; |
| 72 CK_ATTRIBUTE *signedattr = NULL; | 71 CK_ATTRIBUTE *signedattr = NULL; |
| 73 CK_ATTRIBUTE *attrs = theTemplate; | 72 CK_ATTRIBUTE *attrs = theTemplate; |
| 74 SECItem *ckaId = NULL; | 73 SECItem *ckaId = NULL; |
| 75 SECItem *pubValue = NULL; | 74 SECItem *pubValue = NULL; |
| 76 int signedcount = 0; | 75 int signedcount = 0; |
| 77 int templateCount = 0; | 76 unsigned int templateCount = 0; |
| 78 SECStatus rv; | 77 SECStatus rv; |
| 79 | 78 |
| 80 /* if we already have an object in the desired slot, use it */ | 79 /* if we already have an object in the desired slot, use it */ |
| 81 if (!isToken && pubKey->pkcs11Slot == slot) { | 80 if (!isToken && pubKey->pkcs11Slot == slot) { |
| 82 return pubKey->pkcs11ID; | 81 return pubKey->pkcs11ID; |
| 83 } | 82 } |
| 84 | 83 |
| 85 /* free the existing key */ | 84 /* free the existing key */ |
| 86 if (pubKey->pkcs11Slot != NULL) { | 85 if (pubKey->pkcs11Slot != NULL) { |
| 87 PK11SlotInfo *oSlot = pubKey->pkcs11Slot; | 86 PK11SlotInfo *oSlot = pubKey->pkcs11Slot; |
| (...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 386 */ | 385 */ |
| 387 keyLen = pk11_get_EC_PointLenInBytes(arena, ecParams); | 386 keyLen = pk11_get_EC_PointLenInBytes(arena, ecParams); |
| 388 if (keyLen < 0) { | 387 if (keyLen < 0) { |
| 389 return CKR_ATTRIBUTE_VALUE_INVALID; | 388 return CKR_ATTRIBUTE_VALUE_INVALID; |
| 390 } | 389 } |
| 391 | 390 |
| 392 | 391 |
| 393 /* If the point is uncompressed and the lengths match, it | 392 /* If the point is uncompressed and the lengths match, it |
| 394 * must be an unencoded point */ | 393 * must be an unencoded point */ |
| 395 if ((*((char *)ecPoint->pValue) == EC_POINT_FORM_UNCOMPRESSED) | 394 if ((*((char *)ecPoint->pValue) == EC_POINT_FORM_UNCOMPRESSED) |
| 396 » && (ecPoint->ulValueLen == keyLen)) { | 395 » && (ecPoint->ulValueLen == (unsigned int)keyLen)) { |
| 397 return pk11_Attr2SecItem(arena, ecPoint, publicKeyValue); | 396 return pk11_Attr2SecItem(arena, ecPoint, publicKeyValue); |
| 398 } | 397 } |
| 399 | 398 |
| 400 /* now assume the key passed to us was encoded and decode it */ | 399 /* now assume the key passed to us was encoded and decode it */ |
| 401 if (*((char *)ecPoint->pValue) == SEC_ASN1_OCTET_STRING) { | 400 if (*((char *)ecPoint->pValue) == SEC_ASN1_OCTET_STRING) { |
| 402 /* OK, now let's try to decode it and see if it's valid */ | 401 /* OK, now let's try to decode it and see if it's valid */ |
| 403 encodedPublicValue.data = ecPoint->pValue; | 402 encodedPublicValue.data = ecPoint->pValue; |
| 404 encodedPublicValue.len = ecPoint->ulValueLen; | 403 encodedPublicValue.len = ecPoint->ulValueLen; |
| 405 rv = SEC_QuickDERDecodeItem(arena, publicKeyValue, | 404 rv = SEC_QuickDERDecodeItem(arena, publicKeyValue, |
| 406 SEC_ASN1_GET(SEC_OctetStringTemplate), &encodedPublicValue); | 405 SEC_ASN1_GET(SEC_OctetStringTemplate), &encodedPublicValue); |
| 407 | 406 |
| 408 /* it coded correctly & we know the key length (and they match) | 407 /* it coded correctly & we know the key length (and they match) |
| 409 * then we are done, return the results. */ | 408 * then we are done, return the results. */ |
| 410 if (keyLen && rv == SECSuccess && publicKeyValue->len == keyLen) { | 409 if (keyLen && rv == SECSuccess && publicKeyValue->len == (unsigned int)k
eyLen) { |
| 411 return CKR_OK; | 410 return CKR_OK; |
| 412 } | 411 } |
| 413 | 412 |
| 414 /* if we know the key length, one of the above tests should have | 413 /* if we know the key length, one of the above tests should have |
| 415 * succeded. If it doesn't the module gave us bad data */ | 414 * succeded. If it doesn't the module gave us bad data */ |
| 416 if (keyLen) { | 415 if (keyLen) { |
| 417 return CKR_ATTRIBUTE_VALUE_INVALID; | 416 return CKR_ATTRIBUTE_VALUE_INVALID; |
| 418 } | 417 } |
| 419 | 418 |
| 420 | 419 |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 532 /* | 531 /* |
| 533 * extract a public key from a slot and id | 532 * extract a public key from a slot and id |
| 534 */ | 533 */ |
| 535 SECKEYPublicKey * | 534 SECKEYPublicKey * |
| 536 PK11_ExtractPublicKey(PK11SlotInfo *slot,KeyType keyType,CK_OBJECT_HANDLE id) | 535 PK11_ExtractPublicKey(PK11SlotInfo *slot,KeyType keyType,CK_OBJECT_HANDLE id) |
| 537 { | 536 { |
| 538 CK_OBJECT_CLASS keyClass = CKO_PUBLIC_KEY; | 537 CK_OBJECT_CLASS keyClass = CKO_PUBLIC_KEY; |
| 539 PLArenaPool *arena; | 538 PLArenaPool *arena; |
| 540 PLArenaPool *tmp_arena; | 539 PLArenaPool *tmp_arena; |
| 541 SECKEYPublicKey *pubKey; | 540 SECKEYPublicKey *pubKey; |
| 542 int templateCount = 0; | 541 unsigned int templateCount = 0; |
| 543 CK_KEY_TYPE pk11KeyType; | 542 CK_KEY_TYPE pk11KeyType; |
| 544 CK_RV crv; | 543 CK_RV crv; |
| 545 CK_ATTRIBUTE template[8]; | 544 CK_ATTRIBUTE template[8]; |
| 546 CK_ATTRIBUTE *attrs= template; | 545 CK_ATTRIBUTE *attrs= template; |
| 547 CK_ATTRIBUTE *modulus,*exponent,*base,*prime,*subprime,*value; | 546 CK_ATTRIBUTE *modulus,*exponent,*base,*prime,*subprime,*value; |
| 548 CK_ATTRIBUTE *ecparams; | 547 CK_ATTRIBUTE *ecparams; |
| 549 | 548 |
| 550 /* if we didn't know the key type, get it */ | 549 /* if we didn't know the key type, get it */ |
| 551 if (keyType== nullKey) { | 550 if (keyType== nullKey) { |
| 552 | 551 |
| (...skipping 946 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1499 SECKEYPublicKey * | 1498 SECKEYPublicKey * |
| 1500 PK11_MakeKEAPubKey(unsigned char *keyData,int length) | 1499 PK11_MakeKEAPubKey(unsigned char *keyData,int length) |
| 1501 { | 1500 { |
| 1502 SECKEYPublicKey *pubk; | 1501 SECKEYPublicKey *pubk; |
| 1503 SECItem pkData; | 1502 SECItem pkData; |
| 1504 SECStatus rv; | 1503 SECStatus rv; |
| 1505 PLArenaPool *arena; | 1504 PLArenaPool *arena; |
| 1506 | 1505 |
| 1507 pkData.data = keyData; | 1506 pkData.data = keyData; |
| 1508 pkData.len = length; | 1507 pkData.len = length; |
| 1508 pkData.type = siBuffer; |
| 1509 | 1509 |
| 1510 arena = PORT_NewArena (DER_DEFAULT_CHUNKSIZE); | 1510 arena = PORT_NewArena (DER_DEFAULT_CHUNKSIZE); |
| 1511 if (arena == NULL) | 1511 if (arena == NULL) |
| 1512 return NULL; | 1512 return NULL; |
| 1513 | 1513 |
| 1514 pubk = (SECKEYPublicKey *) PORT_ArenaZAlloc(arena, sizeof(SECKEYPublicKey)); | 1514 pubk = (SECKEYPublicKey *) PORT_ArenaZAlloc(arena, sizeof(SECKEYPublicKey)); |
| 1515 if (pubk == NULL) { | 1515 if (pubk == NULL) { |
| 1516 PORT_FreeArena (arena, PR_FALSE); | 1516 PORT_FreeArena (arena, PR_FALSE); |
| 1517 return NULL; | 1517 return NULL; |
| 1518 } | 1518 } |
| (...skipping 772 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2291 return keys; | 2291 return keys; |
| 2292 } | 2292 } |
| 2293 | 2293 |
| 2294 SECKEYPublicKeyList* | 2294 SECKEYPublicKeyList* |
| 2295 PK11_ListPublicKeysInSlot(PK11SlotInfo *slot, char *nickname) | 2295 PK11_ListPublicKeysInSlot(PK11SlotInfo *slot, char *nickname) |
| 2296 { | 2296 { |
| 2297 CK_ATTRIBUTE findTemp[4]; | 2297 CK_ATTRIBUTE findTemp[4]; |
| 2298 CK_ATTRIBUTE *attrs; | 2298 CK_ATTRIBUTE *attrs; |
| 2299 CK_BBOOL ckTrue = CK_TRUE; | 2299 CK_BBOOL ckTrue = CK_TRUE; |
| 2300 CK_OBJECT_CLASS keyclass = CKO_PUBLIC_KEY; | 2300 CK_OBJECT_CLASS keyclass = CKO_PUBLIC_KEY; |
| 2301 int tsize = 0; | 2301 unsigned int tsize = 0; |
| 2302 int objCount = 0; | 2302 int objCount = 0; |
| 2303 CK_OBJECT_HANDLE *key_ids; | 2303 CK_OBJECT_HANDLE *key_ids; |
| 2304 SECKEYPublicKeyList *keys; | 2304 SECKEYPublicKeyList *keys; |
| 2305 int i,len; | 2305 int i,len; |
| 2306 | 2306 |
| 2307 | 2307 |
| 2308 attrs = findTemp; | 2308 attrs = findTemp; |
| 2309 PK11_SETATTRS(attrs, CKA_CLASS, &keyclass, sizeof(keyclass)); attrs++; | 2309 PK11_SETATTRS(attrs, CKA_CLASS, &keyclass, sizeof(keyclass)); attrs++; |
| 2310 PK11_SETATTRS(attrs, CKA_TOKEN, &ckTrue, sizeof(ckTrue)); attrs++; | 2310 PK11_SETATTRS(attrs, CKA_TOKEN, &ckTrue, sizeof(ckTrue)); attrs++; |
| 2311 if (nickname) { | 2311 if (nickname) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 2337 return keys; | 2337 return keys; |
| 2338 } | 2338 } |
| 2339 | 2339 |
| 2340 SECKEYPrivateKeyList* | 2340 SECKEYPrivateKeyList* |
| 2341 PK11_ListPrivKeysInSlot(PK11SlotInfo *slot, char *nickname, void *wincx) | 2341 PK11_ListPrivKeysInSlot(PK11SlotInfo *slot, char *nickname, void *wincx) |
| 2342 { | 2342 { |
| 2343 CK_ATTRIBUTE findTemp[4]; | 2343 CK_ATTRIBUTE findTemp[4]; |
| 2344 CK_ATTRIBUTE *attrs; | 2344 CK_ATTRIBUTE *attrs; |
| 2345 CK_BBOOL ckTrue = CK_TRUE; | 2345 CK_BBOOL ckTrue = CK_TRUE; |
| 2346 CK_OBJECT_CLASS keyclass = CKO_PRIVATE_KEY; | 2346 CK_OBJECT_CLASS keyclass = CKO_PRIVATE_KEY; |
| 2347 int tsize = 0; | 2347 unsigned int tsize = 0; |
| 2348 int objCount = 0; | 2348 int objCount = 0; |
| 2349 CK_OBJECT_HANDLE *key_ids; | 2349 CK_OBJECT_HANDLE *key_ids; |
| 2350 SECKEYPrivateKeyList *keys; | 2350 SECKEYPrivateKeyList *keys; |
| 2351 int i,len; | 2351 int i,len; |
| 2352 | 2352 |
| 2353 | 2353 |
| 2354 attrs = findTemp; | 2354 attrs = findTemp; |
| 2355 PK11_SETATTRS(attrs, CKA_CLASS, &keyclass, sizeof(keyclass)); attrs++; | 2355 PK11_SETATTRS(attrs, CKA_CLASS, &keyclass, sizeof(keyclass)); attrs++; |
| 2356 PK11_SETATTRS(attrs, CKA_TOKEN, &ckTrue, sizeof(ckTrue)); attrs++; | 2356 PK11_SETATTRS(attrs, CKA_TOKEN, &ckTrue, sizeof(ckTrue)); attrs++; |
| 2357 if (nickname) { | 2357 if (nickname) { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 2374 for (i=0; i < objCount ; i++) { | 2374 for (i=0; i < objCount ; i++) { |
| 2375 SECKEYPrivateKey *privKey = | 2375 SECKEYPrivateKey *privKey = |
| 2376 PK11_MakePrivKey(slot,nullKey,PR_TRUE,key_ids[i],wincx); | 2376 PK11_MakePrivKey(slot,nullKey,PR_TRUE,key_ids[i],wincx); |
| 2377 SECKEY_AddPrivateKeyToListTail(keys, privKey); | 2377 SECKEY_AddPrivateKeyToListTail(keys, privKey); |
| 2378 } | 2378 } |
| 2379 | 2379 |
| 2380 PORT_Free(key_ids); | 2380 PORT_Free(key_ids); |
| 2381 return keys; | 2381 return keys; |
| 2382 } | 2382 } |
| 2383 | 2383 |
| OLD | NEW |