123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 |
- /*############################################################################
- # Copyright 2016 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.
- ############################################################################*/
- /*!
- * \file
- * \brief OctString handling utility implementation.
- */
- #include "epid/common-testhelper/octstr-testhelper.h"
- extern "C" {
- #include "epid/common/src/memory.h"
- }
- #include "ext/ipp/include/ippcp.h"
- /// Internal function to delete BigNum
- void delete_BigNum(IppsBigNumState** bn) {
- if (*bn) {
- SAFE_FREE(*bn);
- }
- }
- /// Internal function to create BigNum from an OctStr256
- EpidStatus create_BigNum(IppsBigNumState** bn, const OctStr256* str) {
- EpidStatus result = kEpidErr;
- IppsBigNumState* ipp_bn_ctx = nullptr;
- do {
- IppStatus sts = ippStsNoErr;
- unsigned int byte_size = sizeof(OctStr256);
- unsigned int word_size =
- (unsigned int)((byte_size + sizeof(Ipp32u) - 1) / sizeof(Ipp32u));
- int bignum_ctx_size = 0;
- if (!bn || !str) {
- return kEpidBadArgErr;
- }
- sts = ippsBigNumGetSize(word_size, &bignum_ctx_size);
- if (ippStsNoErr != sts) {
- if (ippStsLengthErr == sts) {
- result = kEpidBadArgErr;
- } else {
- result = kEpidMathErr;
- }
- break;
- }
- // Allocate space for ipp bignum context
- ipp_bn_ctx = (IppsBigNumState*)SAFE_ALLOC(bignum_ctx_size);
- if (!ipp_bn_ctx) {
- result = kEpidMemAllocErr;
- break;
- }
- // Initialize ipp bignum context
- sts = ippsBigNumInit(word_size, ipp_bn_ctx);
- if (sts != ippStsNoErr) {
- if (sts == ippStsLengthErr) {
- result = kEpidBadArgErr;
- } else {
- result = kEpidMathErr;
- }
- break;
- }
- sts = ippsSetOctString_BN((Ipp8u*)str, byte_size, ipp_bn_ctx);
- if (sts != ippStsNoErr) {
- if (sts == ippStsLengthErr) {
- result = kEpidBadArgErr;
- } else {
- result = kEpidMathErr;
- }
- break;
- }
- *bn = ipp_bn_ctx;
- result = kEpidNoErr;
- } while (0);
- if (result != kEpidNoErr) {
- SAFE_FREE(ipp_bn_ctx);
- }
- return result;
- }
- EpidStatus Cmp_OctStr256(const OctStr256* pA, const OctStr256* pB,
- unsigned int* pResult) {
- EpidStatus result = kEpidErr;
- IppsBigNumState* ipp_a_ctx = nullptr;
- IppsBigNumState* ipp_b_ctx = nullptr;
- do {
- IppStatus sts = ippStsNoErr;
- if (!pA || !pB || !pResult) {
- return kEpidBadArgErr;
- }
- result = create_BigNum(&ipp_a_ctx, pA);
- if (kEpidNoErr != result) {
- break;
- }
- result = create_BigNum(&ipp_b_ctx, pB);
- if (kEpidNoErr != result) {
- break;
- }
- sts = ippsCmp_BN(ipp_a_ctx, ipp_b_ctx, pResult);
- if (ippStsNoErr != sts) {
- if (ippStsContextMatchErr == sts || ippStsRangeErr == sts ||
- ippStsLengthErr == sts || ippStsOutOfRangeErr == sts) {
- result = kEpidBadArgErr;
- } else {
- result = kEpidMathErr;
- }
- }
- } while (0);
- delete_BigNum(&ipp_a_ctx);
- delete_BigNum(&ipp_b_ctx);
- return result;
- }
|