| /*############################################################################ |
| # Copyright 1999-2018 Intel Corporation |
| # |
| # Licensed under the Apache License, Version 2.0 (the "License"); |
| # you may not use this file except in compliance with the License. |
| # You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| ############################################################################*/ |
| |
| /* |
| // Intel(R) Performance Primitives. Cryptography Primitives. |
| // GF(p) methods |
| // |
| */ |
| #include "owndefs.h" |
| #include "owncp.h" |
| |
| #include "pcpbnumisc.h" |
| #include "pcpgfpstuff.h" |
| #include "pcpgfpmethod.h" |
| #include "pcpecprime.h" |
| |
| #if(_IPP32E >= _IPP32E_M7) |
| |
| /* arithmetic over arbitrary 256r-bit modulus */ |
| BNU_CHUNK_T* gf256_add(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pModulus); |
| BNU_CHUNK_T* gf256_sub(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pModulus); |
| BNU_CHUNK_T* gf256_neg(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pModulus); |
| BNU_CHUNK_T* gf256_mulm(BNU_CHUNK_T* pR,const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, const BNU_CHUNK_T* pModulus, BNU_CHUNK_T m0); |
| BNU_CHUNK_T* gf256_sqrm(BNU_CHUNK_T* pR,const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pModulus, BNU_CHUNK_T m0); |
| BNU_CHUNK_T* gf256_div2(BNU_CHUNK_T* pR,const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pModulus); |
| |
| #define OPERAND_BITSIZE (256) |
| #define LEN_P256 (BITS_BNU_CHUNK(OPERAND_BITSIZE)) |
| |
| static BNU_CHUNK_T* p256_add(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE) |
| { |
| return gf256_add(pR, pA, pB, GFP_MODULUS(pGFE)); |
| } |
| |
| static BNU_CHUNK_T* p256_sub(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE) |
| { |
| return gf256_sub(pR, pA, pB, GFP_MODULUS(pGFE)); |
| } |
| |
| static BNU_CHUNK_T* p256_neg(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE) |
| { |
| return gf256_neg(pR, pA, GFP_MODULUS(pGFE)); |
| } |
| |
| static BNU_CHUNK_T* p256_div_by_2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE) |
| { |
| return gf256_div2(pR, pA, GFP_MODULUS(pGFE)); |
| } |
| |
| static BNU_CHUNK_T* p256_mul_by_2(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE) |
| { |
| return gf256_add(pR, pA, pA, GFP_MODULUS(pGFE)); |
| } |
| |
| static BNU_CHUNK_T* p256_mul_by_3(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE) |
| { |
| BNU_CHUNK_T tmp[LEN_P256]; |
| gf256_add(tmp, pA, pA, GFP_MODULUS(pGFE)); |
| return gf256_add(pR, tmp, pA, GFP_MODULUS(pGFE)); |
| } |
| |
| static BNU_CHUNK_T* p256_mul_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, const BNU_CHUNK_T* pB, gsEngine* pGFE) |
| { |
| return gf256_mulm(pR, pA, pB, GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE)); |
| } |
| |
| static BNU_CHUNK_T* p256_sqr_montl(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE) |
| { |
| return gf256_sqrm(pR, pA, GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE)); |
| } |
| |
| |
| static BNU_CHUNK_T* p256_to_mont(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE) |
| { |
| return gf256_mulm(pR, pA, GFP_MNT_RR(pGFE), GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE)); |
| } |
| |
| static BNU_CHUNK_T one[] = {1,0,0,0}; |
| |
| static BNU_CHUNK_T* p256_mont_back(BNU_CHUNK_T* pR, const BNU_CHUNK_T* pA, gsEngine* pGFE) |
| { |
| return gf256_mulm(pR, pA, one, GFP_MODULUS(pGFE), GFP_MNT_FACTOR(pGFE)); |
| } |
| |
| /* return specific gf p256 arith methods */ |
| static gsModMethod* gsArithGF_p256(void) |
| { |
| static gsModMethod m = { |
| p256_to_mont, |
| p256_mont_back, |
| p256_mul_montl, |
| p256_sqr_montl, |
| NULL, |
| p256_add, |
| p256_sub, |
| p256_neg, |
| p256_div_by_2, |
| p256_mul_by_2, |
| p256_mul_by_3, |
| }; |
| return &m; |
| } |
| #endif /* _IPP32E >= _IPP32E_M7 */ |
| |
| |
| IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p256, (void) ) |
| { |
| static IppsGFpMethod method = { |
| cpID_Prime, |
| 256, |
| NULL, |
| NULL |
| }; |
| |
| #if(_IPP32E >= _IPP32E_M7) |
| method.arith = gsArithGF_p256(); |
| #else |
| method.arith = gsArithGFp(); |
| #endif |
| return &method; |
| } |
| |
| IPPFUN( const IppsGFpMethod*, ippsGFpMethod_p256bn, (void) ) |
| { |
| static IppsGFpMethod method = { |
| cpID_Prime, |
| 256, |
| tpmBN_p256p_p, |
| NULL |
| }; |
| |
| #if(_IPP32E >= _IPP32E_M7) |
| method.arith = gsArithGF_p256(); |
| #else |
| method.arith = gsArithGFp(); |
| #endif |
| return &method; |
| } |
| |
| #undef LEN_P256 |
| #undef OPERAND_BITSIZE |