📄 e_4758cca.c
字号:
long returnCode; long reasonCode; long exitDataLength = 0; long ruleArrayLength = 0; unsigned char exitData[8]; unsigned char ruleArray[8]; unsigned char keyLabel[64]; unsigned long keyLabelLength = strlen(key_id); unsigned char modulus[512]; long modulusFieldLength = sizeof(modulus); long modulusLength = 0; unsigned char exponent[512]; long exponentLength = sizeof(exponent); if (keyLabelLength > sizeof(keyLabel)) { CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY, CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL); return NULL; } memset(keyLabel,' ', sizeof(keyLabel)); memcpy(keyLabel, key_id, keyLabelLength); keyToken = OPENSSL_malloc(MAX_CCA_PKA_TOKEN_SIZE + sizeof(long)); if (!keyToken) { CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY, ERR_R_MALLOC_FAILURE); goto err; } keyRecordRead(&returnCode, &reasonCode, &exitDataLength, exitData, &ruleArrayLength, ruleArray, keyLabel, &keyTokenLength, keyToken+sizeof(long)); if (returnCode) { CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY, ERR_R_MALLOC_FAILURE); goto err; } if (!getModulusAndExponent(keyToken+sizeof(long), &exponentLength, exponent, &modulusLength, &modulusFieldLength, modulus)) { CCA4758err(CCA4758_F_IBM_4758_LOAD_PUBKEY, CCA4758_R_FAILED_LOADING_PUBLIC_KEY); goto err; } (*(long*)keyToken) = keyTokenLength; rtmp = RSA_new_method(e); RSA_set_ex_data(rtmp, hndidx, (char *)keyToken); rtmp->e = BN_bin2bn(exponent, exponentLength, NULL); rtmp->n = BN_bin2bn(modulus, modulusFieldLength, NULL); rtmp->flags |= RSA_FLAG_EXT_PKEY; res = EVP_PKEY_new(); EVP_PKEY_assign_RSA(res, rtmp); return res;err: if (keyToken) OPENSSL_free(keyToken); if (res) EVP_PKEY_free(res); if (rtmp) RSA_free(rtmp); return NULL; }static int cca_rsa_pub_enc(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,int padding) { long returnCode; long reasonCode; long lflen = flen; long exitDataLength = 0; unsigned char exitData[8]; long ruleArrayLength = 1; unsigned char ruleArray[8] = "PKCS-1.2"; long dataStructureLength = 0; unsigned char dataStructure[8]; long outputLength = RSA_size(rsa); long keyTokenLength; unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx); keyTokenLength = *(long*)keyToken; keyToken+=sizeof(long); pkaEncrypt(&returnCode, &reasonCode, &exitDataLength, exitData, &ruleArrayLength, ruleArray, &lflen, (unsigned char*)from, &dataStructureLength, dataStructure, &keyTokenLength, keyToken, &outputLength, to); if (returnCode || reasonCode) return -(returnCode << 16 | reasonCode); return outputLength; }static int cca_rsa_priv_dec(int flen, const unsigned char *from, unsigned char *to, RSA *rsa,int padding) { long returnCode; long reasonCode; long lflen = flen; long exitDataLength = 0; unsigned char exitData[8]; long ruleArrayLength = 1; unsigned char ruleArray[8] = "PKCS-1.2"; long dataStructureLength = 0; unsigned char dataStructure[8]; long outputLength = RSA_size(rsa); long keyTokenLength; unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx); keyTokenLength = *(long*)keyToken; keyToken+=sizeof(long); pkaDecrypt(&returnCode, &reasonCode, &exitDataLength, exitData, &ruleArrayLength, ruleArray, &lflen, (unsigned char*)from, &dataStructureLength, dataStructure, &keyTokenLength, keyToken, &outputLength, to); return (returnCode | reasonCode) ? 0 : 1; }#define SSL_SIG_LEN 36static int cca_rsa_verify(int type, const unsigned char *m, unsigned int m_len, unsigned char *sigbuf, unsigned int siglen, const RSA *rsa) { long returnCode; long reasonCode; long lsiglen = siglen; long exitDataLength = 0; unsigned char exitData[8]; long ruleArrayLength = 1; unsigned char ruleArray[8] = "PKCS-1.1"; long keyTokenLength; unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx); long length = SSL_SIG_LEN; long keyLength ; unsigned char *hashBuffer = NULL; X509_SIG sig; ASN1_TYPE parameter; X509_ALGOR algorithm; ASN1_OCTET_STRING digest; keyTokenLength = *(long*)keyToken; keyToken+=sizeof(long); if (type == NID_md5 || type == NID_sha1) { sig.algor = &algorithm; algorithm.algorithm = OBJ_nid2obj(type); if (!algorithm.algorithm) { CCA4758err(CCA4758_F_CCA_RSA_VERIFY, CCA4758_R_UNKNOWN_ALGORITHM_TYPE); return 0; } if (!algorithm.algorithm->length) { CCA4758err(CCA4758_F_CCA_RSA_VERIFY, CCA4758_R_ASN1_OID_UNKNOWN_FOR_MD); return 0; } parameter.type = V_ASN1_NULL; parameter.value.ptr = NULL; algorithm.parameter = ¶meter; sig.digest = &digest; sig.digest->data = (unsigned char*)m; sig.digest->length = m_len; length = i2d_X509_SIG(&sig, NULL); } keyLength = RSA_size(rsa); if (length - RSA_PKCS1_PADDING > keyLength) { CCA4758err(CCA4758_F_CCA_RSA_VERIFY, CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL); return 0; } switch (type) { case NID_md5_sha1 : if (m_len != SSL_SIG_LEN) { CCA4758err(CCA4758_F_CCA_RSA_VERIFY, CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL); return 0; } hashBuffer = (unsigned char *)m; length = m_len; break; case NID_md5 : { unsigned char *ptr; ptr = hashBuffer = OPENSSL_malloc( (unsigned int)keyLength+1); if (!hashBuffer) { CCA4758err(CCA4758_F_CCA_RSA_VERIFY, ERR_R_MALLOC_FAILURE); return 0; } i2d_X509_SIG(&sig, &ptr); } break; case NID_sha1 : { unsigned char *ptr; ptr = hashBuffer = OPENSSL_malloc( (unsigned int)keyLength+1); if (!hashBuffer) { CCA4758err(CCA4758_F_CCA_RSA_VERIFY, ERR_R_MALLOC_FAILURE); return 0; } i2d_X509_SIG(&sig, &ptr); } break; default: return 0; } digitalSignatureVerify(&returnCode, &reasonCode, &exitDataLength, exitData, &ruleArrayLength, ruleArray, &keyTokenLength, keyToken, &length, hashBuffer, &lsiglen, sigbuf); if (type == NID_sha1 || type == NID_md5) { OPENSSL_cleanse(hashBuffer, keyLength+1); OPENSSL_free(hashBuffer); } return ((returnCode || reasonCode) ? 0 : 1); }#define SSL_SIG_LEN 36static int cca_rsa_sign(int type, const unsigned char *m, unsigned int m_len, unsigned char *sigret, unsigned int *siglen, const RSA *rsa) { long returnCode; long reasonCode; long exitDataLength = 0; unsigned char exitData[8]; long ruleArrayLength = 1; unsigned char ruleArray[8] = "PKCS-1.1"; long outputLength=256; long outputBitLength; long keyTokenLength; unsigned char *hashBuffer = NULL; unsigned char* keyToken = (unsigned char*)RSA_get_ex_data(rsa, hndidx); long length = SSL_SIG_LEN; long keyLength ; X509_SIG sig; ASN1_TYPE parameter; X509_ALGOR algorithm; ASN1_OCTET_STRING digest; keyTokenLength = *(long*)keyToken; keyToken+=sizeof(long); if (type == NID_md5 || type == NID_sha1) { sig.algor = &algorithm; algorithm.algorithm = OBJ_nid2obj(type); if (!algorithm.algorithm) { CCA4758err(CCA4758_F_CCA_RSA_SIGN, CCA4758_R_UNKNOWN_ALGORITHM_TYPE); return 0; } if (!algorithm.algorithm->length) { CCA4758err(CCA4758_F_CCA_RSA_SIGN, CCA4758_R_ASN1_OID_UNKNOWN_FOR_MD); return 0; } parameter.type = V_ASN1_NULL; parameter.value.ptr = NULL; algorithm.parameter = ¶meter; sig.digest = &digest; sig.digest->data = (unsigned char*)m; sig.digest->length = m_len; length = i2d_X509_SIG(&sig, NULL); } keyLength = RSA_size(rsa); if (length - RSA_PKCS1_PADDING > keyLength) { CCA4758err(CCA4758_F_CCA_RSA_SIGN, CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL); return 0; } switch (type) { case NID_md5_sha1 : if (m_len != SSL_SIG_LEN) { CCA4758err(CCA4758_F_CCA_RSA_SIGN, CCA4758_R_SIZE_TOO_LARGE_OR_TOO_SMALL); return 0; } hashBuffer = (unsigned char*)m; length = m_len; break; case NID_md5 : { unsigned char *ptr; ptr = hashBuffer = OPENSSL_malloc( (unsigned int)keyLength+1); if (!hashBuffer) { CCA4758err(CCA4758_F_CCA_RSA_SIGN, ERR_R_MALLOC_FAILURE); return 0; } i2d_X509_SIG(&sig, &ptr); } break; case NID_sha1 : { unsigned char *ptr; ptr = hashBuffer = OPENSSL_malloc( (unsigned int)keyLength+1); if (!hashBuffer) { CCA4758err(CCA4758_F_CCA_RSA_SIGN, ERR_R_MALLOC_FAILURE); return 0; } i2d_X509_SIG(&sig, &ptr); } break; default: return 0; } digitalSignatureGenerate(&returnCode, &reasonCode, &exitDataLength, exitData, &ruleArrayLength, ruleArray, &keyTokenLength, keyToken, &length, hashBuffer, &outputLength, &outputBitLength, sigret); if (type == NID_sha1 || type == NID_md5) { OPENSSL_cleanse(hashBuffer, keyLength+1); OPENSSL_free(hashBuffer); } *siglen = outputLength; return ((returnCode || reasonCode) ? 0 : 1); }static int getModulusAndExponent(const unsigned char*token, long *exponentLength, unsigned char *exponent, long *modulusLength, long *modulusFieldLength, unsigned char *modulus) { unsigned long len; if (*token++ != (char)0x1E) /* internal PKA token? */ return 0; if (*token++) /* token version must be zero */ return 0; len = *token++; len = len << 8; len |= (unsigned char)*token++; token += 4; /* skip reserved bytes */ if (*token++ == (char)0x04) { if (*token++) /* token version must be zero */ return 0; len = *token++; len = len << 8; len |= (unsigned char)*token++; token+=2; /* skip reserved section */ len = *token++; len = len << 8; len |= (unsigned char)*token++; *exponentLength = len; len = *token++; len = len << 8; len |= (unsigned char)*token++; *modulusLength = len; len = *token++; len = len << 8; len |= (unsigned char)*token++; *modulusFieldLength = len; memcpy(exponent, token, *exponentLength); token+= *exponentLength; memcpy(modulus, token, *modulusFieldLength); return 1; } return 0; }#endif /* OPENSSL_NO_RSA */static int cca_random_status(void) { return 1; }static int cca_get_random_bytes(unsigned char* buf, int num) { long ret_code; long reason_code; long exit_data_length; unsigned char exit_data[4]; unsigned char form[] = "RANDOM "; unsigned char rand_buf[8]; while(num >= (int)sizeof(rand_buf)) { randomNumberGenerate(&ret_code, &reason_code, &exit_data_length, exit_data, form, rand_buf); if (ret_code) return 0; num -= sizeof(rand_buf); memcpy(buf, rand_buf, sizeof(rand_buf)); buf += sizeof(rand_buf); } if (num) { randomNumberGenerate(&ret_code, &reason_code, NULL, NULL, form, rand_buf); if (ret_code) return 0; memcpy(buf, rand_buf, num); } return 1; }#ifndef OPENSSL_NO_RSAstatic void cca_ex_free(void *obj, void *item, CRYPTO_EX_DATA *ad, int idx, long argl, void *argp) { if (item) OPENSSL_free(item); }#endif/* Goo to handle building as a dynamic engine */#ifndef OPENSSL_NO_DYNAMIC_ENGINE static int bind_fn(ENGINE *e, const char *id) { if(id && (strcmp(id, engine_4758_cca_id) != 0) && (strcmp(id, engine_4758_cca_id_alt) != 0)) return 0; if(!bind_helper(e)) return 0; return 1; } IMPLEMENT_DYNAMIC_CHECK_FN()IMPLEMENT_DYNAMIC_BIND_FN(bind_fn)#endif /* OPENSSL_NO_DYNAMIC_ENGINE */#endif /* !OPENSSL_NO_HW_4758_CCA */#endif /* !OPENSSL_NO_HW */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -