You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@milagro.apache.org by km...@apache.org on 2019/02/08 08:06:35 UTC
[incubator-milagro-crypto] 05/15: Added MPIN Full one pass test
This is an automated email from the ASF dual-hosted git repository.
kmccusker pushed a commit to branch update-code
in repository https://gitbox.apache.org/repos/asf/incubator-milagro-crypto.git
commit 0d656b55a3cbbc8daf5daed57fd04adced92f2c3
Author: Kealan McCusker <ke...@certivox.com>
AuthorDate: Wed Apr 27 18:23:14 2016 +0100
Added MPIN Full one pass test
---
c/tests/CMakeLists.txt | 14 --
c/tests/test_mpinfullSingle.c | 296 ++++++++++++++++++++++++++++++++++++++++++
2 files changed, 296 insertions(+), 14 deletions(-)
diff --git a/c/tests/CMakeLists.txt b/c/tests/CMakeLists.txt
index 6405c0b..bdafec1 100644
--- a/c/tests/CMakeLists.txt
+++ b/c/tests/CMakeLists.txt
@@ -52,20 +52,6 @@ if(BUILD_MPIN)
do_test (test_mpinfullSingle "SUCCESS")
do_test (test_mpinfull_random "Iteration ${MPIN_RANDOM_TESTS} SUCCESS")
endif(BUILD_MPIN)
-
-if(BUILD_SOK)
- add_executable (test_sok_gcm test_sok_gcm.c)
- add_executable (test_sok test_sok.c)
- add_executable (test_sok_tp test_sok_tp.c config.h)
- # Link the executable to the libraries
- target_link_libraries (test_sok_gcm sok)
- target_link_libraries (test_sok sok)
- target_link_libraries (test_sok_tp sok)
- # tests
- do_test (test_sok_gcm "SUCCESS")
- do_test (test_sok "SUCCESS")
- do_test (test_sok_tp "Iteration ${MPIN_RANDOM_TESTS} SUCCESS")
-endif(BUILD_SOK)
if(BUILD_WCC)
add_executable (test_wcc_gcm test_wcc_gcm.c)
diff --git a/c/tests/test_mpinfullSingle.c b/c/tests/test_mpinfullSingle.c
new file mode 100755
index 0000000..c2a657d
--- /dev/null
+++ b/c/tests/test_mpinfullSingle.c
@@ -0,0 +1,296 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements. See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership. The ASF licenses this file
+to you 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.
+*/
+
+/* Test M-Pin Full Single pass */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "mpin.h"
+
+int main()
+{
+ int i,PIN1,PIN2,rtn,err;
+
+ char id[256];
+ octet ID = {0,sizeof(id),id};
+
+ char x[PGS],y1[PGS],y2[PGS];
+ octet X={sizeof(x), sizeof(x),x};
+ octet Y1={sizeof(y1),sizeof(y1),y1};
+ octet Y2={sizeof(y2),sizeof(y2),y2};
+
+ /* Master secret shares */
+ char ms1[PGS], ms2[PGS];
+ octet MS1={sizeof(ms1),sizeof(ms1),ms1};
+ octet MS2={sizeof(ms2),sizeof(ms2),ms2};
+
+ /* Hash values of client ID */
+ char hcid[32];
+ octet HCID={sizeof(hcid),sizeof(hcid), hcid};
+
+ /* Hash values of messages */
+ char hm[HASH_BYTES];
+ octet HM={sizeof(hm),sizeof(hm), hm};
+
+ /* Client secret and shares */
+ char cs1[2*PFS+1], cs2[2*PFS+1], sec[2*PFS+1];
+ octet SEC={sizeof(sec),sizeof(sec),sec};
+ octet CS1={sizeof(cs1),sizeof(cs1), cs1};
+ octet CS2={sizeof(cs2),sizeof(cs2), cs2};
+
+ /* Server secret and shares */
+ char ss1[4*PFS], ss2[4*PFS], serverSecret[4*PFS];
+ octet ServerSecret={sizeof(serverSecret),sizeof(serverSecret),serverSecret};
+ octet SS1={sizeof(ss1),sizeof(ss1),ss1};
+ octet SS2={sizeof(ss2),sizeof(ss2),ss2};
+
+ /* Time Permit and shares */
+ char tp1[2*PFS+1], tp2[2*PFS+1], tp[2*PFS+1];
+ octet TP={sizeof(tp),sizeof(tp),tp};
+ octet TP1={sizeof(tp1),sizeof(tp1),tp1};
+ octet TP2={sizeof(tp2),sizeof(tp2),tp2};
+
+ /* Token stored on device */
+ char token[2*PFS+1];
+ octet TOKEN={sizeof(token),sizeof(token),token};
+
+ /* Precomputed values stored on device */
+ char g1[12*PFS],g2[12*PFS];
+ octet G1={0,sizeof(g1),g1};
+ octet G2={0,sizeof(g2),g2};
+
+ char ut[2*PFS+1],u[2*PFS+1];
+ octet UT={sizeof(ut),sizeof(ut),ut};
+ octet U={sizeof(u),sizeof(u),u};
+
+ char hid[2*PFS+1],htid[2*PFS+1];
+ octet HID={0,sizeof(hid),hid};
+ octet HTID={0,sizeof(htid),htid};
+
+ char e[12*PFS], f[12*PFS];
+ octet E={sizeof(e),sizeof(e),e};
+ octet F={sizeof(f),sizeof(f),f};
+
+ char r[PGS],z[2*PFS+1],w[PGS],t[2*PFS+1];
+ char ck[PAS],sk[PAS];
+ octet R={0,sizeof(r),r};
+ octet Z={0,sizeof(z),z};
+ octet W={0,sizeof(w),w};
+ octet T={0,sizeof(t),t};
+ octet SK={0,sizeof(sk),sk};
+ octet CK={0,sizeof(ck),ck};
+
+ int TimeValue = 0;
+
+ PIN1 = 1234;
+ PIN2 = 1234;
+
+ /* Assign the End-User an ID */
+ char* user = "testuser@miracl.com";
+ OCT_jstring(&ID,user);
+ printf("CLIENT: ID %s\n", user);
+
+ int date = 0;
+ char seed[100] = {0};
+ octet SEED = {0,sizeof(seed),seed};
+ csprng RNG;
+
+ /* unrandom seed value! */
+ SEED.len=100;
+ for (i=0;i<100;i++) SEED.val[i]=i+1;
+
+ /* initialise random number generator */
+ MPIN_CREATE_CSPRNG(&RNG,&SEED);
+
+ /* Hash ID */
+ MPIN_HASH_ID(&ID,&HCID);
+ OCT_output(&HCID);
+
+ /* When set only send hashed IDs to server */
+ octet *pID;
+#ifdef USE_ANONYMOUS
+ pID = &HCID;
+#else
+ pID = &ID;
+#endif
+
+ /* Generate Client master secret for MIRACL and Customer */
+ rtn = MPIN_RANDOM_GENERATE(&RNG,&MS1);
+ if (rtn != 0) {
+ printf("MPIN_RANDOM_GENERATE(&RNG,&MS1) Error %d\n", rtn);
+ return 1;
+ }
+ rtn = MPIN_RANDOM_GENERATE(&RNG,&MS2);
+ if (rtn != 0) {
+ printf("MPIN_RANDOM_GENERATE(&RNG,&MS2) Error %d\n", rtn);
+ return 1;
+ }
+ printf("MASTER SECRET MIRACL:= 0x");
+ OCT_output(&MS1);
+ printf("MASTER SECRET CUSTOMER:= 0x");
+ OCT_output(&MS2);
+
+ /* Generate server secret shares */
+ rtn = MPIN_GET_SERVER_SECRET(&MS1,&SS1);
+ if (rtn != 0) {
+ printf("MPIN_GET_SERVER_SECRET(&MS1,&SS1) Error %d\n", rtn);
+ return 1;
+ }
+ rtn = MPIN_GET_SERVER_SECRET(&MS2,&SS2);
+ if (rtn != 0) {
+ printf("MPIN_GET_SERVER_SECRET(&MS2,&SS2) Error %d\n", rtn);
+ return 1;
+ }
+ printf("SS1 = 0x");
+ OCT_output(&SS1);
+ printf("SS2 = 0x");
+ OCT_output(&SS2);
+
+ /* Combine server secret share */
+ rtn = MPIN_RECOMBINE_G2(&SS1, &SS2, &ServerSecret);
+ if (rtn != 0) {
+ printf("MPIN_RECOMBINE_G2(&SS1, &SS2, &ServerSecret) Error %d\n", rtn);
+ return 1;
+ }
+ printf("ServerSecret = 0x");
+ OCT_output(&ServerSecret);
+
+ /* Generate client secret shares */
+ rtn = MPIN_GET_CLIENT_SECRET(&MS1,&HCID,&CS1);
+ if (rtn != 0) {
+ printf("MPIN_GET_CLIENT_SECRET(&MS1,&HCID,&CS1) Error %d\n", rtn);
+ return 1;
+ }
+ rtn = MPIN_GET_CLIENT_SECRET(&MS2,&HCID,&CS2);
+ if (rtn != 0) {
+ printf("MPIN_GET_CLIENT_SECRET(&MS2,&HCID,&CS2) Error %d\n", rtn);
+ return 1;
+ }
+ printf("CS1 = 0x");
+ OCT_output(&CS1);
+ printf("CS2 = 0x");
+ OCT_output(&CS2);
+
+ /* Combine client secret shares : TOKEN is the full client secret */
+ rtn = MPIN_RECOMBINE_G1(&CS1, &CS2, &TOKEN);
+ if (rtn != 0) {
+ printf("MPIN_RECOMBINE_G1(&CS1, &CS2, &TOKEN) Error %d\n", rtn);
+ return 1;
+ }
+ printf("Client Secret = 0x");
+ OCT_output(&TOKEN);
+
+ /* Generate Time Permit shares */
+ date = MPIN_today();
+ printf("Date %d \n", date);
+ rtn = MPIN_GET_CLIENT_PERMIT(date,&MS1,&HCID,&TP1);
+ if (rtn != 0) {
+ printf("MPIN_GET_CLIENT_PERMIT(date,&MS1,&HCID,&TP1) Error %d\n", rtn);
+ return 1;
+ }
+ rtn = MPIN_GET_CLIENT_PERMIT(date,&MS2,&HCID,&TP2);
+ if (rtn != 0) {
+ printf("MPIN_GET_CLIENT_PERMIT(date,&MS2,&HCID,&TP2) Error %d\n", rtn);
+ return 1;
+ }
+ printf("TP1 = 0x");
+ OCT_output(&TP1);
+ printf("TP2 = 0x");
+ OCT_output(&TP2);
+
+ /* Combine Time Permit shares */
+ rtn = MPIN_RECOMBINE_G1(&TP1, &TP2, &TP);
+ if (rtn != 0) {
+ printf("MPIN_RECOMBINE_G1(&TP1, &TP2, &TP) Error %d\n", rtn);
+ return 1;
+ }
+ printf("Time Permit = 0x");
+ OCT_output(&TP);
+
+ /* This encoding makes Time permit look random */
+ if (MPIN_ENCODING(&RNG,&TP)!=0) printf("Encoding error\n");
+ printf("Encoded Time Permit= "); OCT_output(&TP);
+ if (MPIN_DECODING(&TP)!=0) printf("Decoding error\n");
+ printf("Decoded Time Permit= "); OCT_output(&TP);
+
+ /* Client extracts PIN1 from secret to create Token */
+ rtn = MPIN_EXTRACT_PIN(&ID, PIN1, &TOKEN);
+ if (rtn != 0) {
+ printf("MPIN_EXTRACT_PIN( &ID, PIN, &TOKEN) Error %d\n", rtn);
+ return 1;
+ }
+ printf("Token = 0x");
+ OCT_output(&TOKEN);
+
+ /* Client precomputation */
+ MPIN_PRECOMPUTE(&TOKEN,&HCID,&G1,&G2);
+
+ /* Client */
+ TimeValue = MPIN_GET_TIME();
+ printf("TimeValue %d \n", TimeValue);
+ rtn = MPIN_CLIENT(date,&ID,&RNG,&X,PIN2,&TOKEN,&SEC,NULL,&UT,&TP,NULL,TimeValue,&Y1);
+ if (rtn != 0) {
+ printf("MPIN_CLIENT ERROR %d\n", rtn);
+ return 1;
+ }
+ printf("Y1 = 0x");
+ OCT_output(&Y1);
+ printf("V = 0x");
+ OCT_output(&SEC);
+
+ /* Client sends Z=r.ID to Server */
+ MPIN_GET_G1_MULTIPLE(&RNG,1,&R,&HCID,&Z);
+
+ /* Server */
+ rtn = MPIN_SERVER(date,&HID,&HTID,&Y2,&ServerSecret,NULL,&UT,&SEC,&E,&F,pID,NULL,TimeValue);
+
+ printf("Y2 = 0x");
+ OCT_output(&Y2);
+ if (rtn != 0) {
+ printf("FAILURE Invalid Token Error Code %d\n", rtn);
+ return 1;
+ } else {
+ printf("SUCCESS Error Code %d\n", rtn);
+ }
+
+ /* Server sends T=w.ID to client */
+ MPIN_GET_G1_MULTIPLE(&RNG,0,&W,&HTID,&T);
+ printf("T = 0x");
+ OCT_output(&T);
+
+ MPIN_HASH_ALL(&HCID,NULL,&UT,&SEC,&Y1,&Z,&T,&HM);
+ MPIN_CLIENT_KEY(&G1,&G2,PIN2,&R,&X,&HM,&T,&CK);
+ printf("Client Key = ");
+ OCT_output(&CK);
+
+ MPIN_HASH_ALL(&HCID,NULL,&UT,&SEC,&Y2,&Z,&T,&HM);
+ MPIN_SERVER_KEY(&Z,&ServerSecret,&W,&HM,&HID,NULL,&UT,&SK);
+ printf("Server Key = ");
+ OCT_output(&SK);
+
+ if (!OCT_comp(&CK,&SK)) {
+ printf("FAILURE Keys are different\n");
+ return 1;
+ }
+
+ printf("SUCCESS\n");
+ return 0;
+}