| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Platform specific crypto wrappers | 2 * Platform specific crypto wrappers |
| 3 * | 3 * |
| 4 * ***** BEGIN LICENSE BLOCK ***** | 4 * ***** BEGIN LICENSE BLOCK ***** |
| 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 | 5 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 |
| 6 * | 6 * |
| 7 * The contents of this file are subject to the Mozilla Public License Version | 7 * The contents of this file are subject to the Mozilla Public License Version |
| 8 * 1.1 (the "License"); you may not use this file except in compliance with | 8 * 1.1 (the "License"); you may not use this file except in compliance with |
| 9 * the License. You may obtain a copy of the License at | 9 * the License. You may obtain a copy of the License at |
| 10 * http://www.mozilla.org/MPL/ | 10 * http://www.mozilla.org/MPL/ |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 103 { | 103 { |
| 104 if (key) { | 104 if (key) { |
| 105 if (key->dwKeySpec != CERT_NCRYPT_KEY_SPEC) | 105 if (key->dwKeySpec != CERT_NCRYPT_KEY_SPEC) |
| 106 CryptReleaseContext(key->hCryptProv, 0); | 106 CryptReleaseContext(key->hCryptProv, 0); |
| 107 /* FIXME(rsleevi): Close CNG keys. */ | 107 /* FIXME(rsleevi): Close CNG keys. */ |
| 108 PORT_Free(key); | 108 PORT_Free(key); |
| 109 } | 109 } |
| 110 } | 110 } |
| 111 | 111 |
| 112 SECStatus | 112 SECStatus |
| 113 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf, | 113 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf, |
| 114 PRBool isTLS, KeyType keyType) | 114 PRBool isTLS, KeyType keyType) |
| 115 { | 115 { |
| 116 SECStatus rv = SECFailure; | 116 SECStatus rv = SECFailure; |
| 117 PRBool doDerEncode = PR_FALSE; | 117 PRBool doDerEncode = PR_FALSE; |
| 118 SECItem hashItem; | 118 SECItem hashItem; |
| 119 DWORD argLen = 0; | 119 DWORD argLen = 0; |
| 120 DWORD signatureLen = 0; | 120 DWORD signatureLen = 0; |
| 121 ALG_ID hashAlg = 0; | 121 ALG_ID hashAlg = 0; |
| 122 HCRYPTHASH hHash = 0; | 122 HCRYPTHASH hHash = 0; |
| 123 DWORD hashLen = 0; | 123 DWORD hashLen = 0; |
| (...skipping 19 matching lines...) Expand all Loading... |
| 143 hashItem.len = sizeof(hash->sha); | 143 hashItem.len = sizeof(hash->sha); |
| 144 break; | 144 break; |
| 145 default: | 145 default: |
| 146 PORT_SetError(SEC_ERROR_INVALID_KEY); | 146 PORT_SetError(SEC_ERROR_INVALID_KEY); |
| 147 goto done; | 147 goto done; |
| 148 } | 148 } |
| 149 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); | 149 PRINT_BUF(60, (NULL, "hash(es) to be signed", hashItem.data, hashItem.len)); |
| 150 | 150 |
| 151 if (!CryptCreateHash(key->hCryptProv, hashAlg, 0, 0, &hHash)) { | 151 if (!CryptCreateHash(key->hCryptProv, hashAlg, 0, 0, &hHash)) { |
| 152 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); | 152 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); |
| 153 goto done; | 153 goto done; |
| 154 } | 154 } |
| 155 argLen = sizeof(hashLen); | 155 argLen = sizeof(hashLen); |
| 156 if (!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&hashLen, &argLen, 0)) { | 156 if (!CryptGetHashParam(hHash, HP_HASHSIZE, (BYTE*)&hashLen, &argLen, 0)) { |
| 157 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); | 157 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); |
| 158 goto done; | 158 goto done; |
| 159 } | 159 } |
| 160 if (hashLen != hashItem.len) { | 160 if (hashLen != hashItem.len) { |
| 161 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); | 161 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); |
| 162 goto done; | 162 goto done; |
| 163 } | 163 } |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 216 #elif defined(XP_MACOSX) | 216 #elif defined(XP_MACOSX) |
| 217 #include <Security/cssm.h> | 217 #include <Security/cssm.h> |
| 218 | 218 |
| 219 void | 219 void |
| 220 ssl_FreePlatformKey(PlatformKey key) | 220 ssl_FreePlatformKey(PlatformKey key) |
| 221 { | 221 { |
| 222 CFRelease(key); | 222 CFRelease(key); |
| 223 } | 223 } |
| 224 | 224 |
| 225 SECStatus | 225 SECStatus |
| 226 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf, | 226 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf, |
| 227 PRBool isTLS, KeyType keyType) | 227 PRBool isTLS, KeyType keyType) |
| 228 { | 228 { |
| 229 SECStatus rv = SECFailure; | 229 SECStatus rv = SECFailure; |
| 230 PRBool doDerEncode = PR_FALSE; | 230 PRBool doDerEncode = PR_FALSE; |
| 231 unsigned int signatureLen; | 231 unsigned int signatureLen; |
| 232 OSStatus status = noErr; | 232 OSStatus status = noErr; |
| 233 CSSM_CSP_HANDLE cspHandle = 0; | 233 CSSM_CSP_HANDLE cspHandle = 0; |
| 234 const CSSM_KEY *cssmKey = NULL; | 234 const CSSM_KEY *cssmKey = NULL; |
| 235 CSSM_ALGORITHMS sigAlg; | 235 CSSM_ALGORITHMS sigAlg; |
| 236 const CSSM_ACCESS_CREDENTIALS * cssmCreds = NULL; | 236 const CSSM_ACCESS_CREDENTIALS * cssmCreds = NULL; |
| (...skipping 13 matching lines...) Expand all Loading... |
| 250 status = SecKeyGetCSSMKey(key, &cssmKey); | 250 status = SecKeyGetCSSMKey(key, &cssmKey); |
| 251 if (status != noErr || !cssmKey) { | 251 if (status != noErr || !cssmKey) { |
| 252 PORT_SetError(SEC_ERROR_NO_KEY); | 252 PORT_SetError(SEC_ERROR_NO_KEY); |
| 253 goto done; | 253 goto done; |
| 254 } | 254 } |
| 255 | 255 |
| 256 /* SecKeyGetBlockSize wasn't addeded until OS X 10.6 - but the | 256 /* SecKeyGetBlockSize wasn't addeded until OS X 10.6 - but the |
| 257 * needed information is readily available on the key itself. | 257 * needed information is readily available on the key itself. |
| 258 */ | 258 */ |
| 259 signatureLen = (cssmKey->KeyHeader.LogicalKeySizeInBits + 7) / 8; | 259 signatureLen = (cssmKey->KeyHeader.LogicalKeySizeInBits + 7) / 8; |
| 260 | 260 |
| 261 if (signatureLen == 0) { | 261 if (signatureLen == 0) { |
| 262 PORT_SetError(SEC_ERROR_INVALID_KEY); | 262 PORT_SetError(SEC_ERROR_INVALID_KEY); |
| 263 goto done; | 263 goto done; |
| 264 } | 264 } |
| 265 | 265 |
| 266 buf->data = (unsigned char *)PORT_Alloc(signatureLen); | 266 buf->data = (unsigned char *)PORT_Alloc(signatureLen); |
| 267 if (!buf->data) | 267 if (!buf->data) |
| 268 goto done; /* error code was set. */ | 268 goto done; /* error code was set. */ |
| 269 | 269 |
| 270 sigAlg = cssmKey->KeyHeader.AlgorithmId; | 270 sigAlg = cssmKey->KeyHeader.AlgorithmId; |
| (...skipping 27 matching lines...) Expand all Loading... |
| 298 */ | 298 */ |
| 299 status = SecKeyGetCredentials(key, CSSM_ACL_AUTHORIZATION_SIGN, | 299 status = SecKeyGetCredentials(key, CSSM_ACL_AUTHORIZATION_SIGN, |
| 300 kSecCredentialTypeDefault, &cssmCreds); | 300 kSecCredentialTypeDefault, &cssmCreds); |
| 301 if (status != noErr) { | 301 if (status != noErr) { |
| 302 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); | 302 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); |
| 303 goto done; | 303 goto done; |
| 304 } | 304 } |
| 305 | 305 |
| 306 signatureData.Length = signatureLen; | 306 signatureData.Length = signatureLen; |
| 307 signatureData.Data = (uint8*)buf->data; | 307 signatureData.Data = (uint8*)buf->data; |
| 308 | 308 |
| 309 cssmRv = CSSM_CSP_CreateSignatureContext(cspHandle, sigAlg, cssmCreds, | 309 cssmRv = CSSM_CSP_CreateSignatureContext(cspHandle, sigAlg, cssmCreds, |
| 310 cssmKey, &cssmSignature); | 310 cssmKey, &cssmSignature); |
| 311 if (cssmRv) { | 311 if (cssmRv) { |
| 312 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); | 312 PORT_SetError(SSL_ERROR_SIGN_HASHES_FAILURE); |
| 313 goto done; | 313 goto done; |
| 314 } | 314 } |
| 315 | 315 |
| 316 /* See "Apple Cryptographic Service Provider Functional Specification" */ | 316 /* See "Apple Cryptographic Service Provider Functional Specification" */ |
| 317 if (cssmKey->KeyHeader.AlgorithmId == CSSM_ALGID_RSA) { | 317 if (cssmKey->KeyHeader.AlgorithmId == CSSM_ALGID_RSA) { |
| 318 /* To set RSA blinding for RSA keys */ | 318 /* To set RSA blinding for RSA keys */ |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 374 SECStatus | 374 SECStatus |
| 375 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf, | 375 ssl3_PlatformSignHashes(SSL3Hashes *hash, PlatformKey key, SECItem *buf, |
| 376 PRBool isTLS, KeyType keyType) | 376 PRBool isTLS, KeyType keyType) |
| 377 { | 377 { |
| 378 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); | 378 PORT_SetError(PR_NOT_IMPLEMENTED_ERROR); |
| 379 return SECFailure; | 379 return SECFailure; |
| 380 } | 380 } |
| 381 #endif | 381 #endif |
| 382 | 382 |
| 383 #endif /* NSS_PLATFORM_CLIENT_AUTH */ | 383 #endif /* NSS_PLATFORM_CLIENT_AUTH */ |
| OLD | NEW |