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 + -
显示快捷键?