aboutsummaryrefslogtreecommitdiff
path: root/epid/member/src/nrprove_commitment.c
diff options
context:
space:
mode:
Diffstat (limited to 'epid/member/src/nrprove_commitment.c')
-rw-r--r--epid/member/src/nrprove_commitment.c114
1 files changed, 114 insertions, 0 deletions
diff --git a/epid/member/src/nrprove_commitment.c b/epid/member/src/nrprove_commitment.c
new file mode 100644
index 0000000..176b992
--- /dev/null
+++ b/epid/member/src/nrprove_commitment.c
@@ -0,0 +1,114 @@
+/*############################################################################
+ # 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.
+ ############################################################################*/
+/// Host non-revoked proof helper implementation
+/*! \file */
+
+#include "epid/member/src/nrprove_commitment.h"
+
+#include <stdint.h>
+#include "epid/member/tpm/nrprove.h"
+#include "epid/common/math/finitefield.h"
+#include "epid/common/src/memory.h"
+
+/// Handle SDK Error with Break
+#define BREAK_ON_EPID_ERROR(ret) \
+ if (kEpidNoErr != (ret)) { \
+ break; \
+ }
+
+#pragma pack(1)
+/// Storage for values to create commitment in NrProve algorithm
+typedef struct NrProveCommitValues {
+ BigNumStr p; //!< A large prime (256-bit)
+ G1ElemStr g1; //!< Generator of G1 (512-bit)
+ G1ElemStr B; //!< (element of G1): part of basic signature Sigma0
+ G1ElemStr K; //!< (element of G1): part of basic signature Sigma0
+ G1ElemStr rlB; //!< (element of G1): one entry in SigRL
+ G1ElemStr rlK; //!< (element of G1): one entry in SigRL
+ NrProveCommitOutput commit_out; //!< output of NrProveCommit
+ uint8_t msg[1]; //!< message
+} NrProveCommitValues;
+#pragma pack()
+
+EpidStatus HashNrProveCommitment(FiniteField* Fp, HashAlg hash_alg,
+ G1ElemStr const* B_str, G1ElemStr const* K_str,
+ SigRlEntry const* sigrl_entry,
+ NrProveCommitOutput const* commit_out,
+ void const* msg, size_t msg_len,
+ FpElemStr* c_str) {
+ EpidStatus sts = kEpidErr;
+ FfElement* c = NULL;
+ NrProveCommitValues* commit_values = NULL;
+
+ if (!Fp || !B_str || !K_str || !sigrl_entry || !commit_out ||
+ (0 != msg_len && !msg) || !c_str) {
+ return kEpidBadArgErr;
+ }
+
+ if (msg_len >
+ ((SIZE_MAX - sizeof(*commit_values)) + sizeof(*commit_values->msg)))
+ return kEpidBadArgErr;
+
+ do {
+ size_t const commit_len =
+ sizeof(*commit_values) - sizeof(*commit_values->msg) + msg_len;
+ Epid2Params params = {
+#include "epid/common/src/epid2params_ate.inc"
+ };
+
+ commit_values = SAFE_ALLOC(commit_len);
+ if (!commit_values) {
+ sts = kEpidMemAllocErr;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+
+ commit_values->p = params.p;
+ commit_values->g1 = params.g1;
+ commit_values->B = *B_str;
+ commit_values->K = *K_str;
+ commit_values->rlB = sigrl_entry->b;
+ commit_values->rlK = sigrl_entry->k;
+ commit_values->commit_out = *commit_out;
+
+ // commit_values is allocated such that there are msg_len bytes available
+ // starting at commit_values->msg
+ if (msg) {
+ // Memory copy is used to copy a message of variable length
+ if (0 != memcpy_S(&commit_values->msg[0], msg_len, msg, msg_len)) {
+ sts = kEpidBadArgErr;
+ BREAK_ON_EPID_ERROR(sts);
+ }
+ }
+
+ sts = NewFfElement(Fp, &c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ // 7. The member computes c = Fp.hash(p || g1 || B || K || B' ||
+ // K' || T || R1 || R2 || m).
+ sts = FfHash(Fp, commit_values, commit_len, hash_alg, c);
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = WriteFfElement(Fp, c, c_str, sizeof(*c_str));
+ BREAK_ON_EPID_ERROR(sts);
+
+ sts = kEpidNoErr;
+ } while (0);
+
+ SAFE_FREE(commit_values);
+ DeleteFfElement(&c);
+
+ return sts;
+}