forked from skair39/milagro-crypto-c
-
Notifications
You must be signed in to change notification settings - Fork 0
/
test_wcc_gcm.c
111 lines (94 loc) · 2.97 KB
/
test_wcc_gcm.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
/**
* @file test_wcc_gcm.c
* @author Kealan McCusker
* @brief Test WCC protocol with GCM
*
* 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.
*/
#include <stdlib.h>
#include <string.h>
#include "amcl.h"
#include "wcc.h"
#include "utils.h"
int main()
{
char* KT="feffe9928665731c6d6a8f9467308308";
char* MT="d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39";
char* HT="feedfacedeadbeeffeedfacedeadbeefabaddad2";
char* NT="9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b";
// Tag should be 619cc5aefffe0bfa462af43c1699d050
int lenM=strlen(MT)/2;
int lenH=strlen(HT)/2;
int lenK=strlen(KT)/2;
int lenIV=strlen(NT)/2;
char t1[PTAG]; // Tag
char t2[PTAG]; // Tag
char k[PAS]; // AES Key
char h[64]; // Header - to be included in Authentication, but not encrypted
char iv[100]; // IV - Initialisation vector
char m[100]; // Plaintext to be encrypted/authenticated
char c[100]; // Ciphertext
char p[100]; // Recovered Plaintext
octet T1= {sizeof(t1),sizeof(t1),t1};
octet T2= {sizeof(t2),sizeof(t2),t2};
octet K= {0,sizeof(k),k};
octet H= {0,sizeof(h),h};
octet IV= {0,sizeof(iv),iv};
octet M= {0,sizeof(m),m};
octet C= {0,sizeof(c),c};
octet P= {0,sizeof(p),p};
M.len=lenM;
K.len=lenK;
H.len=lenH;
IV.len=lenIV;
OCT_fromHex(&M, MT);
OCT_fromHex(&H, HT);
OCT_fromHex(&IV, NT);
OCT_fromHex(&K, KT);
printf("Plaintext: ");
OCT_output(&M);
printf("\n");
WCC_AES_GCM_ENCRYPT(&K, &IV, &H, &M, &C, &T1);
printf("Ciphertext: ");
OCT_output(&C);
printf("\n");
printf("Encryption Tag: ");
OCT_output(&T1);
printf("\n");
WCC_AES_GCM_DECRYPT(&K, &IV, &H, &C, &P, &T2);
printf("Plaintext: ");
OCT_output(&P);
printf("\n");
printf("Decryption Tag: ");
OCT_output(&T2);
printf("\n");
if (!OCT_comp(&M,&P))
{
printf("FAILURE Decryption\n");
return 1;
}
if (!OCT_comp(&T1,&T2))
{
printf("FAILURE TAG mismatch\n");
return 1;
}
printf("SUCCESS\n");
return 0;
}