123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476 |
- /*
- * Copyright (C) 2016 Intel Corporation. All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- *
- * * Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * * Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in
- * the documentation and/or other materials provided with the
- * distribution.
- * * Neither the name of Intel Corporation nor the names of its
- * contributors may be used to endorse or promote products derived
- * from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
- #include "owndefs.h"
- #include "owncp.h"
- #include "pcpeccppoint.h"
- #include "pcpeccpmethod.h"
- #include "pcpeccpmethodcom.h"
- /*F*
- // Name: ippsECCPSetPoint
- //
- // Purpose: Converts regular affine coordinates EC point (pX,pY)
- // into internal presentation - montgomery projective.
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pPoint
- // NULL == pX
- // NULL == pY
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pX->idCtx
- // illegal pY->idCtx
- // illegal pPoint->idCtx
- //
- // ippStsOutOfECErr point out-of EC
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pX pointer to the regular affine coordinate X
- // pY pointer to the regular affine coordinate Y
- // pPoint pointer to the EC Point context
- // pECC pointer to the ECCP context
- //
- // Note:
- // if B==0 and (x,y)=(0,y) then point at Infinity will be set up
- // if B!=0 and (x,y)=(0,0) then point at Infinity will be set up
- // else point with requested coordinates (x,y) wil be set up
- // There are no check validation inside!
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPSetPoint,(const IppsBigNumState* pX,
- const IppsBigNumState* pY,
- IppsECCPPointState* pPoint,
- 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 pX and pY */
- IPP_BAD_PTR2_RET(pX,pY);
- pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, ALIGN_VAL) );
- pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, ALIGN_VAL) );
- IPP_BADARG_RET(!BN_VALID_ID(pX), ippStsContextMatchErr);
- IPP_BADARG_RET(!BN_VALID_ID(pY), ippStsContextMatchErr);
- /* test pPoint */
- IPP_BAD_PTR1_RET(pPoint);
- pPoint = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pPoint, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pPoint), ippStsContextMatchErr);
- /* set affine coordinates at Infinity */
- if( ( IsZero_BN(ECP_BENC(pECC)) && ECCP_IsPointAtAffineInfinity1(pX,pY)) ||
- (!IsZero_BN(ECP_BENC(pECC)) && ECCP_IsPointAtAffineInfinity0(pX,pY)) )
- ECCP_SetPointToInfinity(pPoint);
- /* set point */
- else {
- ECP_METHOD(pECC)->SetPointProjective(pX, pY, BN_ONE_REF(), pPoint, pECC);
- }
- return ippStsNoErr;
- }
- /*F*
- // Name: ippsECCPSetPointAtInfinity
- //
- // Purpose: Set point at Infinity
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pPoint
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pPoint->idCtx
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pPoint pointer to the EC Point context
- // pECC pointer to the ECCP context
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPSetPointAtInfinity,(IppsECCPPointState* pPoint,
- 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 pPoint */
- IPP_BAD_PTR1_RET(pPoint);
- pPoint = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pPoint, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pPoint), ippStsContextMatchErr);
- ECCP_SetPointToInfinity(pPoint);
- return ippStsNoErr;
- }
- /*F*
- // Name: ippsECCPGetPoint
- //
- // Purpose: Converts internal presentation EC point - montgomery projective
- // into regular affine coordinates EC point (pX,pY)
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pPoint
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pPoint->idCtx
- // NULL != pX, illegal pX->idCtx
- // NULL != pY, illegal pY->idCtx
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pX pointer to the regular affine coordinate X
- // pY pointer to the regular affine coordinate Y
- // pLength pointer to the length of coordinates
- // pPoint pointer to the EC Point context
- // pECC pointer to the ECCP context
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPGetPoint,(IppsBigNumState* pX,
- IppsBigNumState* pY,
- const IppsECCPPointState* pPoint,
- 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 source point */
- IPP_BAD_PTR1_RET(pPoint);
- pPoint = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pPoint, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pPoint), ippStsContextMatchErr);
- /* test pX and pY */
- if(pX) {
- pX = (IppsBigNumState*)( IPP_ALIGNED_PTR(pX, ALIGN_VAL) );
- IPP_BADARG_RET(!BN_VALID_ID(pX), ippStsContextMatchErr);
- }
- if(pY) {
- pY = (IppsBigNumState*)( IPP_ALIGNED_PTR(pY, ALIGN_VAL) );
- IPP_BADARG_RET(!BN_VALID_ID(pY), ippStsContextMatchErr);
- }
- if( ECCP_IsPointAtInfinity(pPoint) ) {
- if( IsZero_BN(ECP_BENC(pECC)) )
- ECCP_SetPointToAffineInfinity1(pX, pY);
- else
- ECCP_SetPointToAffineInfinity0(pX, pY);
- }
- else
- ECP_METHOD(pECC)->GetPointAffine(pX, pY, pPoint, pECC, ECP_BNCTX(pECC));
- return ippStsNoErr;
- }
- /*F*
- // Name: ippsECCPCheckPoint
- //
- // Purpose: Check EC point:
- // - is point lie on EC
- // - is point at infinity
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pP
- // NULL == pResult
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pP->idCtx
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pPoint pointer to the EC Point context
- // pECC pointer to the ECCP context
- // pResult pointer to the result:
- // ippECValid
- // ippECPointIsNotValid
- // ippECPointIsAtInfinite
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPCheckPoint,(const IppsECCPPointState* pP,
- IppECResult* pResult,
- 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 point */
- IPP_BAD_PTR1_RET(pP);
- pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
- /* test pResult */
- IPP_BAD_PTR1_RET(pResult);
- if( ECCP_IsPointAtInfinity(pP) )
- *pResult = ippECPointIsAtInfinite;
- else if( ECP_METHOD(pECC)->IsPointOnCurve(pP, pECC, ECP_BNCTX(pECC)) )
- *pResult = ippECValid;
- else
- *pResult = ippECPointIsNotValid;
- return ippStsNoErr;
- }
- /*F*
- // Name: ippsECCPComparePoint
- //
- // Purpose: Compare two EC points
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pP
- // NULL == pQ
- // NULL == pResult
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pP->idCtx
- // illegal pQ->idCtx
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pP pointer to the EC Point context
- // pQ pointer to the EC Point context
- // pECC pointer to the ECCP context
- // pResult pointer to the result:
- // ippECPointIsEqual
- // ippECPointIsNotEqual
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPComparePoint,(const IppsECCPPointState* pP,
- const IppsECCPPointState* pQ,
- IppECResult* pResult,
- 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 points */
- IPP_BAD_PTR2_RET(pP,pQ);
- pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
- pQ = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pQ, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pQ), ippStsContextMatchErr);
- /* test pResult */
- IPP_BAD_PTR1_RET(pResult);
- *pResult = ECP_METHOD(pECC)->ComparePoint(pP, pQ, pECC, ECP_BNCTX(pECC))? ippECPointIsNotEqual : ippECPointIsEqual;
- return ippStsNoErr;
- }
- /*F*
- // Name: ippsECCPNegativePoint
- //
- // Purpose: Perforn EC point operation: R = -P
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pP
- // NULL == pR
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pP->idCtx
- // illegal pR->idCtx
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pP pointer to the source EC Point context
- // pR pointer to the resultant EC Point context
- // pECC pointer to the ECCP context
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPNegativePoint, (const IppsECCPPointState* pP,
- IppsECCPPointState* pR,
- 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 points */
- IPP_BAD_PTR2_RET(pP,pR);
- pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
- pR = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pR, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pR), ippStsContextMatchErr);
- ECP_METHOD(pECC)->NegPoint(pP, pR, pECC);
- return ippStsNoErr;
- }
- /*F*
- // Name: ippsECCPAddPoint
- //
- // Purpose: Perforn EC point operation: R = P+Q
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pP
- // NULL == pQ
- // NULL == pR
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pP->idCtx
- // illegal pQ->idCtx
- // illegal pR->idCtx
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pP pointer to the source EC Point context
- // pQ pointer to the source EC Point context
- // pR pointer to the resultant EC Point context
- // pECC pointer to the ECCP context
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPAddPoint,(const IppsECCPPointState* pP,
- const IppsECCPPointState* pQ,
- IppsECCPPointState* pR,
- 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 points */
- IPP_BAD_PTR3_RET(pP,pQ,pR);
- pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
- pQ = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pQ, ALIGN_VAL) );
- pR = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pR, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pQ), ippStsContextMatchErr);
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pR), ippStsContextMatchErr);
- if(pP==pQ)
- ECP_METHOD(pECC)->DblPoint(pP, pR, pECC, ECP_BNCTX(pECC));
- else
- ECP_METHOD(pECC)->AddPoint(pP, pQ, pR, pECC, ECP_BNCTX(pECC));
- return ippStsNoErr;
- }
- /*F*
- // Name: ippsECCPMulPointScalar
- //
- // Purpose: Perforn EC point operation: R = k*P
- //
- // Returns: Reason:
- // ippStsNullPtrErr NULL == pECC
- // NULL == pP
- // NULL == pK
- // NULL == pR
- //
- // ippStsContextMatchErr illegal pECC->idCtx
- // illegal pP->idCtx
- // illegal pK->idCtx
- // illegal pR->idCtx
- //
- // ippStsNoErr no errors
- //
- // Parameters:
- // pP pointer to the source EC Point context
- // pK pointer to the source BigNum multiplier context
- // pR pointer to the resultant EC Point context
- // pECC pointer to the ECCP context
- //
- *F*/
- IPPFUN(IppStatus, ippsECCPMulPointScalar,(const IppsECCPPointState* pP,
- const IppsBigNumState* pK,
- IppsECCPPointState* pR,
- 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 points */
- IPP_BAD_PTR2_RET(pP,pR);
- pP = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pP, ALIGN_VAL) );
- pR = (IppsECCPPointState*)( IPP_ALIGNED_PTR(pR, ALIGN_VAL) );
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pP), ippStsContextMatchErr);
- IPP_BADARG_RET(!ECP_POINT_VALID_ID(pR), ippStsContextMatchErr);
- /* test scalar */
- IPP_BAD_PTR1_RET(pK);
- pK = (IppsBigNumState*)( IPP_ALIGNED_PTR(pK, ALIGN_VAL) );
- IPP_BADARG_RET(!BN_VALID_ID(pK), ippStsContextMatchErr);
- ECP_METHOD(pECC)->MulPoint(pP, pK, pR, pECC, ECP_BNCTX(pECC));
- return ippStsNoErr;
- }
|