/** * @file test_mpin_random.c * @author Kealan McCusker * @brief Test good token and correct PIN with D-TA * * LICENSE * * 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 good token and correct PIN with D-TA */ #include #include #include #include #include "mpin.h" #include "randapi.h" static const int nRandomTests = 10; /**< MPin Random Tests */ // Define PIN range: #define MAX_RANGE 10000 static void rand_str(char *dest, size_t length,csprng *RNG) { BIG r; char charset[] = "0123456789@.*" "abcdefghijklmnopqrstuvwxyz" "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; while (length-- > 0) { BIG_random(r,RNG); size_t index = r[0] % (sizeof charset); *dest++ = charset[index]; } *dest = '\0'; } int test_mpin_random() { printf("test_mpin_random() started\n"); int PIN1,PIN2,rtn,err,iter; char x[PGS],y[PGS]; octet X= {0, sizeof(x),x}; octet Y= {0,sizeof(y),y}; /* Master secret shares */ char ms1[PGS], ms2[PGS]; octet MS1= {0,sizeof(ms1),ms1}; octet MS2= {0,sizeof(ms2),ms2}; /* Hash values of ID */ char hcid[PFS]; octet HCID= {0,sizeof(hcid), hcid}; /* Client secret and shares */ char cs1[2*PFS+1], cs2[2*PFS+1], sec[2*PFS+1]; octet SEC= {0,sizeof(sec),sec}; octet CS1= {0,sizeof(cs1), cs1}; octet CS2= {0,sizeof(cs2), cs2}; /* Server secret and shares */ char ss1[4*PFS], ss2[4*PFS], serverSecret[4*PFS]; octet ServerSecret= {0,sizeof(serverSecret),serverSecret}; octet SS1= {0,sizeof(ss1),ss1}; octet SS2= {0,sizeof(ss2),ss2}; /* Time Permit and shares */ char tp1[2*PFS+1], tp2[2*PFS+1], tp[2*PFS+1]; octet TP= {0,sizeof(tp),tp}; octet TP1= {0,sizeof(tp1),tp1}; octet TP2= {0,sizeof(tp2),tp2}; /* Token stored on computer */ char token[2*PFS+1]; octet TOKEN= {0,sizeof(token),token}; char ut[2*PFS+1],u[2*PFS+1]; octet UT= {0,sizeof(ut),ut}; octet U= {0,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= {0,sizeof(e),e}; octet F= {0,sizeof(f),f}; octet *pID; int date = 0; int byte_count = 32; char seed[32] = {0}; octet SEED = {sizeof(seed),sizeof(seed),seed}; csprng RNG; #ifdef __linux__ FILE *fp; fp = fopen("/dev/urandom", "r"); if (fread(&seed, 1, byte_count, fp)) {}; fclose(fp); #else /* non random seed value! */ int i; unsigned long ran; time((time_t *)&ran); SEED.val[0]=ran; SEED.val[1]=ran>>8; SEED.val[2]=ran>>16; SEED.val[3]=ran>>24; for (i=4; i