Add debug test files
[gnuk/gnuk.git] / misc / debug-bn.c
1 /*
2  * debug-bn.c - Debug Bignum
3  * Copyright (C) 2014 Free Software Initiative of Japan
4  * Author: NIIBE Yutaka <gniibe@fsij.org>
5  *
6  */
7
8 #include <stdio.h>
9 #include <stdint.h>
10 #include <string.h>
11 #include <stdlib.h>
12 #include <ctype.h>
13
14 #include "bn.h"
15
16 void
17 print_le_bn256 (const bn256 *X)
18 {
19   int i;
20   const uint8_t *p = (const uint8_t *)X;
21
22   for (i = 0; i < 32; i++)
23     printf ("%02x", p[i]);
24   puts ("");
25 }
26
27 void
28 print_be_bn256 (const bn256 *X)
29 {
30   int i;
31
32   for (i = 7; i >= 0; i--)
33     printf ("%08x", X->word[i]);
34   puts ("");
35 }
36
37 #define MAXLINE 4096
38
39 static int lineno;
40 static int test_no;
41 static bn256 sk[1];
42 static bn256 pk[1];
43 static unsigned char msg[MAXLINE];
44 static size_t msglen;
45 static bn512 sig[1];
46
47 const char *
48 skip_white_space (const char *l)
49 {
50   while (*l != '\n' && isspace (*l))
51     l++;
52
53   return l;
54 }
55
56
57 static int
58 read_hex_4bit (char c)
59 {
60   int r;
61
62   if (c >= '0' && c <= '9')
63     r = c - '0';
64   else if (c >= 'a' && c <= 'f')
65     r = c - 'a' + 10;
66   else if (c >= 'A' && c <= 'F')
67     r = c - 'A' + 10;
68   else
69     r = -1;
70   return r;
71 }
72
73 static int
74 read_hex_8bit (const char **l_p)
75 {
76   const char *l = *l_p;
77   int r, v;
78
79   r = read_hex_4bit (*l++);
80   if (r < 0)
81     return -1;
82   v = r*16;
83   r = read_hex_4bit (*l++);
84   if (r < 0)
85     return -1;
86   v += r;
87
88   *l_p = l;
89   return v;
90 }
91
92 static int
93 read_msg (unsigned char *msg, const char *l, int len)
94 {
95   int i, r;
96
97   for (i = 0; i < len; i++)
98     {
99       r = read_hex_8bit (&l);
100       if (r < 0)
101         return -1;
102       msg[i] = r;
103     }
104
105   return 0;
106 }
107
108
109 static int
110 read_le_bn256 (bn256 *sk, const char *l)
111 {
112   int i;
113   uint8_t *p = (uint8_t *)sk;
114
115   for (i = 0; i < sizeof (bn256); i++)
116     {
117       int r;
118
119       if (*l == '\n')
120         {
121           /* should support small input??? */
122           return -1;
123         }
124
125       r = read_hex_8bit (&l);
126       if (r < 0)
127         return -1;
128
129       p[i] = r;
130     }
131
132   return 0;
133 }
134
135 static int
136 read_be_bn256 (bn256 *sk, const char *l)
137 {
138   int i;
139   uint8_t *p = (uint8_t *)sk;
140
141   for (i = 0; i < sizeof (bn256); i++)
142     {
143       int r;
144
145       if (*l == '\n')
146         {
147           /* should support small input??? */
148           return -1;
149         }
150
151       r = read_hex_8bit (&l);
152       if (r < 0)
153         return -1;
154
155       p[31 - i] = r;
156     }
157
158   return 0;
159 }
160
161
162 static int
163 read_pk (bn256 *pk, const char *l, int len)
164 {
165   int r;
166
167   if (len == 64)                /* 64 chars == 32-byte */
168     {                           /* compressed form */
169       r = read_le_bn256 (pk, l);
170       if (r < 0)
171         return -1;
172       return 0;
173     }
174   else
175     {
176       bn256 x[1];
177
178       r = read_hex_8bit (&l);
179       if (r < 0)
180         return -1;
181       if (r != 4)
182         return -1;
183
184       r = read_be_bn256 (x, l);
185       if (r < 0)
186         return -1;
187       r = read_be_bn256 (pk, l+64);
188       if (r < 0)
189         return -1;
190
191       pk->word[7] ^= (x->word[0] & 1) * 0x80000000;
192       return 0;
193     }
194 }
195
196 static int
197 read_le_bn512 (bn512 *sig, const char *l)
198 {
199   int i;
200   uint8_t *p = (uint8_t *)sig;
201
202   for (i = 0; i < sizeof (bn512); i++)
203     {
204       int r;
205
206       if (*l == '\n')
207         {
208           /* should support small input??? */
209           return -1;
210         }
211
212       r = read_hex_8bit (&l);
213       if (r < 0)
214         return -1;
215
216       p[i] = r;
217     }
218
219   return 0;
220 }