static int GenerateSing(const Ipp8u* pMsg, int msgLen, /* message representation */ const Ipp8u* pSalt, int saltLen, /* fied string */ Ipp8u* pSign, const IppsRSAPrivateKeyState* pPrvKey, const IppsRSAPublicKeyState* pPubKey, Ipp8u* pBuffer) { /* size of RSA modulus in bytes and chunks */ cpSize rsaBits = RSA_PRV_KEY_BITSIZE_N(pPrvKey); cpSize k = BITS2WORD8_SIZE(rsaBits); cpSize nsN = BITS_BNU_CHUNK(rsaBits); /* EMSA-PKCS-v1_5 encoding */ int result = EMSA_PKCSv15(pMsg,msgLen, pSalt,saltLen, pSign, k); if(result) { /* align buffer */ BNU_CHUNK_T* pScratchBuffer = (BNU_CHUNK_T*)(IPP_ALIGNED_PTR(pBuffer, (int)sizeof(BNU_CHUNK_T)) ); /* temporary BNs */ __ALIGN8 IppsBigNumState bnC; __ALIGN8 IppsBigNumState bnP; /* make BNs */ BN_Make(pScratchBuffer, pScratchBuffer+nsN+1, nsN, &bnC); pScratchBuffer += (nsN+1)*2; BN_Make(pScratchBuffer, pScratchBuffer+nsN+1, nsN, &bnP); pScratchBuffer += (nsN+1)*2; /* // private-key operation */ ippsSetOctString_BN(pSign, k, &bnC); if(RSA_PRV_KEY1_VALID_ID(pPrvKey)) gsRSAprv_cipher(&bnP, &bnC, pPrvKey, pScratchBuffer); else gsRSAprv_cipher_crt(&bnP, &bnC, pPrvKey, pScratchBuffer); ippsGetOctString_BN(pSign, k, &bnP); /* check the result before send it out (fault attack mitigatioin) */ if(pPubKey) { gsRSApub_cipher(&bnP, &bnP, pPubKey, pScratchBuffer); /* check signature before send it out (fault attack mitigatioin) */ if(0!=cpBN_cmp(&bnP, &bnC)) { PaddBlock(0, pSign, k); result = 0; } } } return result; }
// *F*/ IPPFUN(IppStatus, ippsECCPPublicKey, (const IppsBigNumState* pPrivate, IppsECCPPointState* pPublic, IppsECCPState* pECC)) { /* test pECC */ IPP_BAD_PTR1_RET(pECC); /* use aligned EC context */ pECC = (IppsECCPState*)( IPP_ALIGNED_PTR(pECC, ALIGN_VAL) ); /* test ID */ IPP_BADARG_RET(!ECP_VALID_ID(pECC), ippStsContextMatchErr); /* test public key */ IPP_BAD_PTR1_RET(pPublic); pPublic = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pPublic, ALIGN_VAL) ); IPP_BADARG_RET(!ECP_POINT_VALID_ID(pPublic), ippStsContextMatchErr); /* test private keys */ IPP_BAD_PTR1_RET(pPrivate); pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, ALIGN_VAL) ); IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr); IPP_BADARG_RET(!((0<cpBN_tst(pPrivate)) && (0>cpBN_cmp(pPrivate, ECP_ORDER(pECC))) ), ippStsIvalidPrivateKey); /* calculates public key */ //ECP_METHOD(pECC)->MulPoint(ECP_GENC(pECC), pPrivate, pPublic, pECC, ECP_BNCTX(pECC)); ECP_METHOD(pECC)->MulBasePoint(pPrivate, pPublic, pECC, ECP_BNCTX(pECC)); return ippStsNoErr; }