blapi_bsf.c

来自「支持SSL v2/v3, TLS, PKCS #5, PKCS #7, PKCS」· C语言 代码 · 共 2,087 行 · 第 1/5 页

C
2,087
字号
	}	if ((status = B_CreateAlgorithmObject(&keypairGenerator)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = B_CreateKeyObject(&publicKeyObj)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = B_CreateKeyObject(&privateKeyObj)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if (publicExponent == NULL) publicExponent = &defaultPublicExponent;	keygenParams.modulusBits = keySizeInBits;	keygenParams.publicExponent.data = publicExponent->data;	keygenParams.publicExponent.len = publicExponent->len;	if ((status = B_SetAlgorithmInfo(keypairGenerator, AI_RSAKeyGen,	                                 (POINTER)&keygenParams)) != 0) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		goto loser;	}	if ((status = B_GenerateInit(keypairGenerator, rsa_alg_chooser,	                             (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	if ((status = B_GenerateKeypair(keypairGenerator, publicKeyObj,	                                privateKeyObj, randomAlgorithm,	                                (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		goto loser;	}	if ((status = B_GetKeyInfo((POINTER *)&privateKeyInfo, privateKeyObj,	                           KI_PKCS_RSAPrivate)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	/*  Convert the BSAFE key info to an RSAPrivateKey.  */	if ((status = rsaConvertKeyInfoToBLKey(privateKeyInfo, privateKey)) != 0) {		goto loser;	}	B_DestroyAlgorithmObject(&publicKeyObj);	B_DestroyKeyObject(&publicKeyObj);	B_DestroyKeyObject(&privateKeyObj);	rsaZFreePrivateKeyInfo(privateKeyInfo);	B_DestroyAlgorithmObject(&randomAlgorithm);	return privateKey;loser:	if (keypairGenerator != NULL_PTR)		B_DestroyAlgorithmObject(&keypairGenerator);	if (publicKeyObj != NULL_PTR)		B_DestroyKeyObject(&publicKeyObj);	if (privateKeyObj != NULL_PTR)		B_DestroyKeyObject(&privateKeyObj);	if (privateKeyInfo != (A_PKCS_RSA_PRIVATE_KEY *)NULL_PTR)		rsaZFreePrivateKeyInfo(privateKeyInfo);	if (randomAlgorithm != NULL_PTR)		B_DestroyAlgorithmObject(&randomAlgorithm);	PORT_FreeArena(arena, PR_TRUE);	return NULL;}static unsigned intrsa_modulusLen(SECItem *modulus){	unsigned char byteZero = modulus->data[0];	unsigned int modLen = modulus->len - !byteZero;	return modLen;}SECStatus RSA_PublicKeyOp(RSAPublicKey *   key,                unsigned char *  output,                unsigned char *  input){	B_ALGORITHM_OBJ rsaPubKeyAlg = (B_ALGORITHM_OBJ)NULL_PTR;	B_KEY_OBJ       publicKeyObj = (B_KEY_OBJ)NULL_PTR;	A_RSA_KEY       pubKeyInfo;	unsigned int outputLenUpdate;	unsigned int modulusLen;	int status;	PORT_Assert(key != NULL);	if (key == NULL) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		return SECFailure;	}	if ((status = B_CreateAlgorithmObject(&rsaPubKeyAlg)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = B_CreateKeyObject(&publicKeyObj)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = B_SetAlgorithmInfo(rsaPubKeyAlg, AI_RSAPublic,	                                 NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	modulusLen = rsa_modulusLen(&key->modulus);	pubKeyInfo.modulus.len = key->modulus.len;	pubKeyInfo.modulus.data = key->modulus.data;	pubKeyInfo.exponent.len = key->publicExponent.len;	pubKeyInfo.exponent.data = key->publicExponent.data;	if ((status = B_SetKeyInfo(publicKeyObj, KI_RSAPublic, 	                           (POINTER)&pubKeyInfo)) != 0) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		goto loser;	}	if ((status = B_EncryptInit(rsaPubKeyAlg, publicKeyObj, rsa_alg_chooser,	                            (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	if ((status = B_EncryptUpdate(rsaPubKeyAlg,	                              output, 	                              &outputLenUpdate,	                              modulusLen, 	                              input, 	                              modulusLen,	                              (B_ALGORITHM_OBJ)NULL_PTR,	                              (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_BAD_DATA);		goto loser;	}	if ((status = B_EncryptFinal(rsaPubKeyAlg,	                             output + outputLenUpdate,	                             &outputLenUpdate, 	                             modulusLen - outputLenUpdate,	                             (B_ALGORITHM_OBJ)NULL_PTR,	                             (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_BAD_DATA);		goto loser;	}	B_DestroyAlgorithmObject(&rsaPubKeyAlg);	B_DestroyAlgorithmObject(&publicKeyObj);	/*  Don't delete pubKeyInfo data -- it was a shallow copy.  */	return SECSuccess;loser:	if (rsaPubKeyAlg != NULL_PTR)		B_DestroyAlgorithmObject(&rsaPubKeyAlg);	if (publicKeyObj != NULL_PTR)		B_DestroyAlgorithmObject(&publicKeyObj);	return SECFailure;}SECStatus RSA_PrivateKeyOp(RSAPrivateKey *  key,                 unsigned char *  output,                 unsigned char *  input){	A_PKCS_RSA_PRIVATE_KEY privKeyInfo;	B_ALGORITHM_OBJ        rsaPrivKeyAlg = (B_ALGORITHM_OBJ)NULL_PTR;	B_KEY_OBJ              privateKeyObj = (B_KEY_OBJ)NULL_PTR;	unsigned int outputLenUpdate;	unsigned int modulusLen;	int status;	if ((status = B_CreateAlgorithmObject(&rsaPrivKeyAlg)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = B_CreateKeyObject(&privateKeyObj)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = B_SetAlgorithmInfo(rsaPrivKeyAlg, AI_RSAPrivate,	                                 NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	if ((status = rsaConvertBLKeyToKeyInfo(key, &privKeyInfo)) != 0) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		goto loser;	}	if ((status = B_SetKeyInfo(privateKeyObj, KI_PKCS_RSAPrivate,	                           (POINTER)&privKeyInfo)) != 0) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		goto loser;	}	modulusLen = rsa_modulusLen(&key->modulus);	if ((status = B_DecryptInit(rsaPrivKeyAlg, privateKeyObj, rsa_alg_chooser,	                            (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	if ((status = B_DecryptUpdate(rsaPrivKeyAlg,	                              output, 	                              &outputLenUpdate,	                              modulusLen, 	                              input, 	                              modulusLen,	                              (B_ALGORITHM_OBJ)NULL_PTR,	                              (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_BAD_DATA);		goto loser;	}	if ((status = B_DecryptFinal(rsaPrivKeyAlg,	                             output + outputLenUpdate,	                             &outputLenUpdate, 	                             modulusLen - outputLenUpdate,	                             (B_ALGORITHM_OBJ)NULL_PTR,	                             (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_BAD_DATA);		goto loser;	}	B_DestroyAlgorithmObject(&rsaPrivKeyAlg);	B_DestroyAlgorithmObject(&privateKeyObj);	/*  Don't delete privKeyInfo data -- it was a shallow copy.  */	return SECSuccess;loser:	if (rsaPrivKeyAlg != NULL_PTR)		B_DestroyAlgorithmObject(&rsaPrivKeyAlg);	if (privateKeyObj != NULL_PTR)		B_DestroyAlgorithmObject(&privateKeyObj);	return SECFailure;}/******************************************************************************* BLAPI implementation of DSA******************************************************************************/static const B_ALGORITHM_METHOD *dsa_pk_gen_chooser[] = {	&AM_SHA_RANDOM,	&AM_DSA_PARAM_GEN,	&AM_DSA_KEY_GEN,	(B_ALGORITHM_METHOD *)NULL_PTR};static SECStatusdsaConvertKeyInfoToBLKey(A_DSA_PRIVATE_KEY *privateKeyInfo,                          A_DSA_PUBLIC_KEY *publicKeyInfo,                          DSAPrivateKey *privateKey){	PRArenaPool *arena;	SECItem tmp;	arena = privateKey->params.arena;	SECITEMFROMITEM(arena, privateKey->params.prime, 	                       privateKeyInfo->params.prime);	SECITEMFROMITEM(arena, privateKey->params.subPrime, 	                       privateKeyInfo->params.subPrime);	SECITEMFROMITEM(arena, privateKey->params.base, 	                       privateKeyInfo->params.base);	SECITEMFROMITEM(arena, privateKey->privateValue,	                       privateKeyInfo->x);	SECITEMFROMITEM(arena, privateKey->publicValue,	                       publicKeyInfo->y);	return SECSuccess;loser:	PORT_SetError(PR_OUT_OF_MEMORY_ERROR);	return SECFailure;}static SECStatusdsaConvertBLKeyToPrKeyInfo(DSAPrivateKey *privateKey,                           A_DSA_PRIVATE_KEY *privateKeyInfo){	ITEMFROMSECITEM(privateKeyInfo->params.prime, privateKey->params.prime)	ITEMFROMSECITEM(privateKeyInfo->params.subPrime,	                privateKey->params.subPrime);	ITEMFROMSECITEM(privateKeyInfo->params.base, privateKey->params.base);	ITEMFROMSECITEM(privateKeyInfo->x, privateKey->privateValue);	return SECSuccess;}static SECStatusdsaConvertBLKeyToPubKeyInfo(DSAPublicKey *publicKey,                            A_DSA_PUBLIC_KEY *publicKeyInfo){	ITEMFROMSECITEM(publicKeyInfo->params.prime, publicKey->params.prime)	ITEMFROMSECITEM(publicKeyInfo->params.subPrime,	                publicKey->params.subPrime);	ITEMFROMSECITEM(publicKeyInfo->params.base, publicKey->params.base);	ITEMFROMSECITEM(publicKeyInfo->y, publicKey->publicValue);	return SECSuccess;}static SECStatusdsaZFreeKeyInfoParams(A_DSA_PARAMS *params){	PORT_ZFree(params->prime.data, 	           params->prime.len);	PORT_ZFree(params->subPrime.data, 	           params->subPrime.len);	PORT_ZFree(params->base.data, 	           params->base.len);	return SECSuccess;}static SECStatusdsaZFreePrivateKeyInfo(A_DSA_PRIVATE_KEY *privateKeyInfo){	dsaZFreeKeyInfoParams(&privateKeyInfo->params);	PORT_ZFree(privateKeyInfo->x.data,	           privateKeyInfo->x.len);	return SECSuccess;}static SECStatusdsaZFreePublicKeyInfo(A_DSA_PUBLIC_KEY *publicKeyInfo){	dsaZFreeKeyInfoParams(&publicKeyInfo->params);	PORT_ZFree(publicKeyInfo->y.data,	           publicKeyInfo->y.len);	return SECSuccess;}SECStatus DSA_NewKey(PQGParams *           params,            DSAPrivateKey **      privKey){	return DSA_NewKeyFromSeed(params, NULL, privKey);}SECStatus DSA_SignDigest(DSAPrivateKey *   key,               SECItem *         signature,               SECItem *         digest){	return DSA_SignDigestWithSeed(key, signature, digest, NULL);}SECStatus DSA_VerifyDigest(DSAPublicKey *  key,                 SECItem *       signature,                 SECItem *       digest){	B_ALGORITHM_OBJ           dsaVerifier = (B_ALGORITHM_OBJ)NULL_PTR;	B_KEY_OBJ                 publicKeyObj = (B_KEY_OBJ)NULL_PTR;	A_DSA_PUBLIC_KEY          publicKeyInfo;	const B_ALGORITHM_METHOD *dsa_verify_chooser[] = {	                            &AM_DSA_VERIFY,	                            (B_ALGORITHM_METHOD *)NULL_PTR	};	int status;	if ((status = B_CreateAlgorithmObject(&dsaVerifier)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = B_CreateKeyObject(&publicKeyObj)) != 0) {		PORT_SetError(PR_OUT_OF_MEMORY_ERROR);		goto loser;	}	if ((status = dsaConvertBLKeyToPubKeyInfo(key, &publicKeyInfo)) != 0) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		goto loser;	}	if ((status = B_SetKeyInfo(publicKeyObj, KI_DSAPublic, 	                           (POINTER)&publicKeyInfo)) != 0) {		PORT_SetError(SEC_ERROR_INVALID_ARGS);		goto loser;	}	if ((status = B_SetAlgorithmInfo(dsaVerifier, AI_DSA, NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	if ((status = B_VerifyInit(dsaVerifier, publicKeyObj, dsa_verify_chooser,	                           (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_LIBRARY_FAILURE);		goto loser;	}	if ((status = B_VerifyUpdate(dsaVerifier, digest->data, digest->len,	                             (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		PORT_SetError(SEC_ERROR_BAD_DATA);		goto loser;	}	if ((status = B_VerifyFinal(dsaVerifier, signature->data, signature->len,	                            (B_ALGORITHM_OBJ)NULL_PTR,	                            (A_SURRENDER_CTX *)NULL_PTR)) != 0) {		if (status == BE_SIGNATURE) {			PORT_SetError(SEC_ERROR_BAD_SIGNATURE);		} else {			PORT_SetError(SEC_ERROR_BAD_DATA);			goto loser;		}	}	B_DestroyAlgorithmObject(&dsaVerifier);

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?