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;
+}