rsawrapr.c
来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 1,050 行 · 第 1/2 页
C
1,050 行
dp++; len = modulusLen - (dp - data); if ((padLen < RSA_BLOCK_MIN_PAD_LEN) || (expectedLen && (expectedLen != len))) { PORT_SetError (SEC_ERROR_BAD_DATA); return NULL; } res = (unsigned char *) PORT_Alloc(len); if (res == NULL) { return NULL; } PORT_Memcpy (res, dp, len); break; case RSA_BlockOAEP: { unsigned char *salt, *tmp_res; SECStatus rv; len = modulusLen - 2 - OAEP_SALT_LEN; /* * dp points to: * Modified2(Salt) || Modified1(PaddedData) * To recover Salt we need to XOR it with the low-order hash * of Modified1. */ salt = (unsigned char *) PORT_Alloc(OAEP_SALT_LEN); if (salt == NULL) { return NULL; } PORT_Memcpy (salt, dp, OAEP_SALT_LEN); dp += OAEP_SALT_LEN; rv = oaep_xor_with_h2 (salt, OAEP_SALT_LEN, dp, len); if (rv != SECSuccess) { PORT_Free (salt); return NULL; } if (expectedLen) { PORT_Assert (expectedLen <= len); len = expectedLen; } tmp_res = (unsigned char *) PORT_Alloc(len); if (tmp_res == NULL) { PORT_Free (salt); return NULL; } PORT_Memcpy (tmp_res, dp, len); rv = oaep_xor_with_h1 (tmp_res, len, salt, OAEP_SALT_LEN); PORT_Free (salt); if (rv != SECSuccess) { return NULL; } for (i = 0; i < OAEP_PAD_LEN; i++) { if (tmp_res[i] != OAEP_PAD_OCTET) { PORT_SetError (SEC_ERROR_BAD_DATA); PORT_Free (tmp_res); return NULL; } } len -= OAEP_PAD_LEN; res = (unsigned char *) PORT_Alloc(len); if (res == NULL) { PORT_Free (tmp_res); return NULL; } PORT_Memcpy (res, tmp_res + OAEP_PAD_LEN, len); PORT_Free (tmp_res); } break; default: PORT_SetError (SEC_ERROR_BAD_DATA); return NULL; } PORT_Assert (res != NULL); *pResultLen = len; *pResultType = blockType; return res;}/* XXX Doesn't set error code */SECStatusRSA_Sign(SECKEYLowPrivateKey *key, unsigned char * output, unsigned int * output_len, unsigned int maxOutputLen, unsigned char * input, unsigned int input_len){ SECStatus rv = SECSuccess; unsigned int modulus_len = SECKEY_LowPrivateModulusLen(key); SECItem formatted; SECItem unformatted; if (maxOutputLen < modulus_len) return SECFailure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) return SECFailure; unformatted.len = input_len; unformatted.data = input; formatted.data = NULL; rv = RSA_FormatBlock(&formatted, modulus_len, RSA_BlockPrivate, &unformatted); if (rv != SECSuccess) goto done; rv = RSA_PrivateKeyOp(&key->u.rsa, output, formatted.data); *output_len = modulus_len; goto done;done: if (formatted.data != NULL) PORT_ZFree(formatted.data, modulus_len); return rv;}/* XXX Doesn't set error code */SECStatusRSA_CheckSign(SECKEYLowPublicKey *key, unsigned char * sign, unsigned int sign_len, unsigned char * hash, unsigned int hash_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPublicModulusLen(key); unsigned int i; unsigned char * buffer; modulus_len = SECKEY_LowPublicModulusLen(key); if (sign_len != modulus_len) goto failure; if (hash_len > modulus_len - 8) goto failure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; buffer = (unsigned char *)PORT_Alloc(modulus_len + 1); if (!buffer) goto failure; rv = RSA_PublicKeyOp(&key->u.rsa, buffer, sign); if (rv != SECSuccess) goto loser; /* * check the padding that was used */ if (buffer[0] != 0 || buffer[1] != 1) goto loser; for (i = 2; i < modulus_len - hash_len - 1; i++) { if (buffer[i] == 0) break; if (buffer[i] != 0xff) goto loser; } /* * make sure we get the same results */ if (PORT_Memcmp(buffer + modulus_len - hash_len, hash, hash_len) != 0) goto loser; PORT_Free(buffer); return SECSuccess;loser: PORT_Free(buffer);failure: return SECFailure;}/* XXX Doesn't set error code */SECStatusRSA_CheckSignRecover(SECKEYLowPublicKey *key, unsigned char * data, unsigned int * data_len, unsigned int max_output_len, unsigned char * sign, unsigned int sign_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPublicModulusLen(key); unsigned int i; unsigned char * buffer; if (sign_len != modulus_len) goto failure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; buffer = (unsigned char *)PORT_Alloc(modulus_len + 1); if (!buffer) goto failure; rv = RSA_PublicKeyOp(&key->u.rsa, buffer, sign); if (rv != SECSuccess) goto loser; *data_len = 0; /* * check the padding that was used */ if (buffer[0] != 0 || buffer[1] != 1) goto loser; for (i = 2; i < modulus_len; i++) { if (buffer[i] == 0) { *data_len = modulus_len - i - 1; break; } if (buffer[i] != 0xff) goto loser; } if (*data_len == 0) goto loser; if (*data_len > max_output_len) goto loser; /* * make sure we get the same results */ PORT_Memcpy(data,buffer + modulus_len - *data_len, *data_len); PORT_Free(buffer); return SECSuccess;loser: PORT_Free(buffer);failure: return SECFailure;}/* XXX Doesn't set error code */SECStatusRSA_EncryptBlock(SECKEYLowPublicKey *key, unsigned char * output, unsigned int * output_len, unsigned int max_output_len, unsigned char * input, unsigned int input_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPublicModulusLen(key); SECItem formatted; SECItem unformatted; formatted.data = NULL; if (max_output_len < modulus_len) goto failure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; unformatted.len = input_len; unformatted.data = input; formatted.data = NULL; rv = RSA_FormatBlock(&formatted, modulus_len, RSA_BlockPublic, &unformatted); if (rv != SECSuccess) goto failure; rv = RSA_PublicKeyOp(&key->u.rsa, output, formatted.data); if (rv != SECSuccess) goto failure; PORT_ZFree(formatted.data, modulus_len); *output_len = modulus_len; return SECSuccess;failure: if (formatted.data != NULL) PORT_ZFree(formatted.data, modulus_len); return SECFailure;}/* XXX Doesn't set error code */SECStatusRSA_DecryptBlock(SECKEYLowPrivateKey *key, unsigned char * output, unsigned int * output_len, unsigned int max_output_len, unsigned char * input, unsigned int input_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPrivateModulusLen(key); unsigned int i; unsigned char * buffer; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; if (input_len != modulus_len) goto failure; buffer = (unsigned char *)PORT_Alloc(modulus_len + 1); if (!buffer) goto failure; rv = RSA_PrivateKeyOp(&key->u.rsa, buffer, input); if (rv != SECSuccess) goto loser; if (buffer[0] != 0 || buffer[1] != 2) goto loser; *output_len = 0; for (i = 2; i < modulus_len; i++) { if (buffer[i] == 0) { *output_len = modulus_len - i - 1; break; } } if (*output_len == 0) goto loser; if (*output_len > max_output_len) goto loser; PORT_Memcpy(output, buffer + modulus_len - *output_len, *output_len); PORT_Free(buffer); return SECSuccess;loser: PORT_Free(buffer);failure: return SECFailure;}/* XXX Doesn't set error code *//* * added to make pkcs #11 happy * RAW is RSA_X_509 */SECStatusRSA_SignRaw(SECKEYLowPrivateKey *key, unsigned char * output, unsigned int * output_len, unsigned int maxOutputLen, unsigned char * input, unsigned int input_len){ SECStatus rv = SECSuccess; unsigned int modulus_len = SECKEY_LowPrivateModulusLen(key); SECItem formatted; SECItem unformatted; if (maxOutputLen < modulus_len) return SECFailure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) return SECFailure; unformatted.len = input_len; unformatted.data = input; formatted.data = NULL; rv = RSA_FormatBlock(&formatted, modulus_len, RSA_BlockRaw, &unformatted); if (rv != SECSuccess) goto done; rv = RSA_PrivateKeyOp(&key->u.rsa, output, formatted.data); *output_len = modulus_len;done: if (formatted.data != NULL) PORT_ZFree(formatted.data, modulus_len); return rv;}/* XXX Doesn't set error code */SECStatusRSA_CheckSignRaw(SECKEYLowPublicKey *key, unsigned char * sign, unsigned int sign_len, unsigned char * hash, unsigned int hash_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPublicModulusLen(key); unsigned char * buffer; if (sign_len != modulus_len) goto failure; if (hash_len > modulus_len) goto failure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; buffer = (unsigned char *)PORT_Alloc(modulus_len + 1); if (!buffer) goto failure; rv = RSA_PublicKeyOp(&key->u.rsa, buffer, sign); if (rv != SECSuccess) goto loser; /* * make sure we get the same results */ /* NOTE: should we verify the leading zeros? */ if (PORT_Memcmp(buffer + (modulus_len-hash_len), hash, hash_len) != 0) goto loser; PORT_Free(buffer); return SECSuccess;loser: PORT_Free(buffer);failure: return SECFailure;}/* XXX Doesn't set error code */SECStatusRSA_CheckSignRecoverRaw(SECKEYLowPublicKey *key, unsigned char * data, unsigned int * data_len, unsigned int max_output_len, unsigned char * sign, unsigned int sign_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPublicModulusLen(key); if (sign_len != modulus_len) goto failure; if (max_output_len < modulus_len) goto failure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; rv = RSA_PublicKeyOp(&key->u.rsa, data, sign); if (rv != SECSuccess) goto failure; *data_len = modulus_len; return SECSuccess;failure: return SECFailure;}/* XXX Doesn't set error code */SECStatusRSA_EncryptRaw(SECKEYLowPublicKey *key, unsigned char * output, unsigned int * output_len, unsigned int max_output_len, unsigned char * input, unsigned int input_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPublicModulusLen(key); SECItem formatted; SECItem unformatted; formatted.data = NULL; if (max_output_len < modulus_len) goto failure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; unformatted.len = input_len; unformatted.data = input; formatted.data = NULL; rv = RSA_FormatBlock(&formatted, modulus_len, RSA_BlockRaw, &unformatted); if (rv != SECSuccess) goto failure; rv = RSA_PublicKeyOp(&key->u.rsa, output, formatted.data); if (rv != SECSuccess) goto failure; PORT_ZFree(formatted.data, modulus_len); *output_len = modulus_len; return SECSuccess;failure: if (formatted.data != NULL) PORT_ZFree(formatted.data, modulus_len); return SECFailure;}/* XXX Doesn't set error code */SECStatusRSA_DecryptRaw(SECKEYLowPrivateKey *key, unsigned char * output, unsigned int * output_len, unsigned int max_output_len, unsigned char * input, unsigned int input_len){ SECStatus rv; unsigned int modulus_len = SECKEY_LowPrivateModulusLen(key); if (modulus_len <= 0) goto failure; if (modulus_len > max_output_len) goto failure; PORT_Assert(key->keyType == rsaKey); if (key->keyType != rsaKey) goto failure; if (input_len != modulus_len) goto failure; rv = RSA_PrivateKeyOp(&key->u.rsa, output, input); if (rv != SECSuccess) goto failure; *output_len = modulus_len; return SECSuccess;failure: return SECFailure;}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?