/*############################################################################ # Copyright 2017 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 Member C++ wrapper implementation. */ #include "epid/common-testhelper/member_wrapper-testhelper.h" #include #include #include #include #include #include #include extern "C" { #include "epid/common/types.h" } #include "epid/common-testhelper/mem_params-testhelper.h" /// Handle SDK Error with Break #define BREAK_ON_EPID_ERROR(ret) \ if (kEpidNoErr != (ret)) { \ break; \ } MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key, BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { EpidStatus sts = kEpidErr; MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, &priv_key.f, ¶ms); ctx_ = CreateMember(¶ms); sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, nullptr); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionKey()"); } sts = EpidMemberStartup(ctx_); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberStartup()"); } } MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, MembershipCredential const& cred, BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { EpidStatus sts = kEpidErr; MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, nullptr, ¶ms); ctx_ = CreateMember(¶ms); sts = EpidProvisionCredential(ctx_, &pub_key, &cred, nullptr); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionKey()"); } sts = EpidMemberStartup(ctx_); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberStartup()"); } } MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key, HashAlg hash_alg, BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { EpidStatus sts = kEpidErr; MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, &priv_key.f, ¶ms); ctx_ = CreateMember(¶ms); sts = EpidMemberSetHashAlg(ctx_, hash_alg); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberSetHashAlg()"); } sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, nullptr); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionKey()"); } sts = EpidMemberStartup(ctx_); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberStartup()"); } } MemberCtxObj::MemberCtxObj(BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, nullptr, ¶ms); ctx_ = CreateMember(¶ms); } MemberCtxObj::MemberCtxObj(MemberParams const* params) : ctx_(nullptr) { ctx_ = CreateMember(params); } MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key, MemberPrecomp const& precomp, BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { EpidStatus sts = kEpidErr; MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, &priv_key.f, ¶ms); ctx_ = CreateMember(¶ms); sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, &precomp); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionKey()"); } sts = EpidMemberStartup(ctx_); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberStartup()"); } } MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, PrivKey const& priv_key, HashAlg hash_alg, MemberPrecomp const& precomp, BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { EpidStatus sts = kEpidErr; MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, &priv_key.f, ¶ms); ctx_ = CreateMember(¶ms); sts = EpidMemberSetHashAlg(ctx_, hash_alg); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionKey()"); } sts = EpidProvisionKey(ctx_, &pub_key, &priv_key, &precomp); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionKey()"); } sts = EpidMemberStartup(ctx_); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberStartup()"); } } MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, MembershipCredential const& cred, MemberPrecomp const& precomp, BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { EpidStatus sts = kEpidErr; MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, nullptr, ¶ms); ctx_ = CreateMember(¶ms); sts = EpidProvisionCredential(ctx_, &pub_key, &cred, &precomp); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionCredential()"); } sts = EpidMemberStartup(ctx_); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberStartup()"); } } MemberCtxObj::MemberCtxObj(GroupPubKey const& pub_key, MembershipCredential const& cred, HashAlg hash_alg, BitSupplier rnd_func, void* rnd_param) : ctx_(nullptr) { EpidStatus sts = kEpidErr; MemberParams params = {0}; SetMemberParams(rnd_func, rnd_param, nullptr, ¶ms); ctx_ = CreateMember(¶ms); sts = EpidMemberSetHashAlg(ctx_, hash_alg); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionKey()"); } sts = EpidProvisionCredential(ctx_, &pub_key, &cred, nullptr); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidProvisionCredential()"); } sts = EpidMemberStartup(ctx_); if (kEpidNoErr != sts) { DeleteMember(&ctx_); printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberStartup()"); } } MemberCtxObj::~MemberCtxObj() { DeleteMember(&ctx_); } MemberCtx* MemberCtxObj::ctx() const { return ctx_; } MemberCtxObj::operator MemberCtx*() const { return ctx_; } MemberCtxObj::operator const MemberCtx*() const { return ctx_; } MemberCtx* MemberCtxObj::CreateMember(MemberParams const* params) const { size_t context_size = 0; EpidStatus sts = kEpidErr; MemberCtx* member_ctx = NULL; sts = EpidMemberGetSize(params, &context_size); if (kEpidNoErr != sts) { printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberGetSize()"); } // allocate and zero initialize, no throw on failure member_ctx = (MemberCtx*)new (std::nothrow) uint8_t[context_size](); if (!member_ctx) { printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); std::ostringstream err; err << "Failed to allocate " << context_size << "bytes after EpidMemberGetSize()"; throw std::logic_error(err.str()); } sts = EpidMemberInit(params, member_ctx); if (kEpidNoErr != sts) { delete[](uint8_t*) member_ctx; printf("%s(%d): %s\n", __FILE__, __LINE__, "test defect:"); throw std::logic_error(std::string("Failed to call: ") + "EpidMemberInit()"); } return member_ctx; } void MemberCtxObj::DeleteMember(MemberCtx** ctx) const { if (ctx) { EpidMemberDeinit(*ctx); delete[](uint8_t*)(*ctx); *ctx = NULL; } }