| /*############################################################################ |
| # 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. |
| ############################################################################*/ |
| |
| /* |
| // |
| // Purpose: |
| // Cryptography Primitive. |
| // EC over Prime Finite Field (EC Key Generation) |
| // |
| // Contents: |
| // ippsECCPSetKeyPair() |
| // |
| // |
| */ |
| |
| #include "owndefs.h" |
| #include "owncp.h" |
| #include "pcpeccp.h" |
| |
| |
| /*F* |
| // Name: ippsECCPSetKeyPair |
| // |
| // Purpose: Generate (private,public) Key Pair |
| // |
| // Returns: Reason: |
| // ippStsNullPtrErr NULL == pECC |
| // NULL == pPrivate |
| // NULL == pPublic |
| // |
| // ippStsContextMatchErr illegal pECC->idCtx |
| // illegal pPrivate->idCtx |
| // illegal pPublic->idCtx |
| // |
| // ippStsNoErr no errors |
| // |
| // Parameters: |
| // pPrivate pointer to the private key |
| // pPublic pointer to the public key |
| // regular flag regular/ephemeral keys |
| // pECC pointer to the ECCP context |
| // |
| *F*/ |
| IPPFUN(IppStatus, ippsECCPSetKeyPair, (const IppsBigNumState* pPrivate, const IppsECCPPointState* pPublic, |
| IppBool regular, |
| IppsECCPState* pEC)) |
| { |
| /* use aligned EC context */ |
| IPP_BAD_PTR1_RET(pEC); |
| pEC = (IppsGFpECState*)( IPP_ALIGNED_PTR(pEC, ECGFP_ALIGNMENT) ); |
| IPP_BADARG_RET(!ECP_TEST_ID(pEC), ippStsContextMatchErr); |
| |
| { |
| BNU_CHUNK_T* targetPrivate; |
| BNU_CHUNK_T* targetPublic; |
| |
| if(regular) { |
| targetPrivate = ECP_PRIVAT(pEC); |
| targetPublic = ECP_PUBLIC(pEC); |
| } |
| else { |
| targetPrivate = ECP_PRIVAT_E(pEC); |
| targetPublic = ECP_PUBLIC_E(pEC); |
| } |
| |
| /* set up private key request */ |
| if( pPrivate ) { |
| pPrivate = (IppsBigNumState*)( IPP_ALIGNED_PTR(pPrivate, ALIGN_VAL) ); |
| IPP_BADARG_RET(!BN_VALID_ID(pPrivate), ippStsContextMatchErr); |
| { |
| int privateLen = BITS_BNU_CHUNK(ECP_ORDBITSIZE(pEC)); |
| cpGFpElementCopyPadd(targetPrivate, privateLen, BN_NUMBER(pPrivate), BN_SIZE(pPrivate)); |
| } |
| } |
| |
| /* set up public key request */ |
| if( pPublic ) { |
| IPP_BADARG_RET( !ECP_POINT_TEST_ID(pPublic), ippStsContextMatchErr ); |
| { |
| BNU_CHUNK_T* targetPublicX = targetPublic; |
| BNU_CHUNK_T* targetPublicY = targetPublic+ECP_POINT_FELEN(pPublic); |
| gfec_GetPoint(targetPublicX, targetPublicY, pPublic, pEC); |
| gfec_SetPoint(targetPublic, targetPublicX, targetPublicY, pEC); |
| |
| //cpGFpElementCopy(targetPublic, ECP_POINT_DATA(pPublic), publicLen); |
| } |
| } |
| |
| return ippStsNoErr; |
| } |
| } |