1// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <string.h>
6#include <stdio.h>
7
8#include "crypto/p224.h"
9
10#include "testing/gtest/include/gtest/gtest.h"
11
12namespace crypto {
13
14using p224::Point;
15
16// kBasePointExternal is the P224 base point in external representation.
17static const uint8 kBasePointExternal[56] = {
18  0xb7, 0x0e, 0x0c, 0xbd, 0x6b, 0xb4, 0xbf, 0x7f,
19  0x32, 0x13, 0x90, 0xb9, 0x4a, 0x03, 0xc1, 0xd3,
20  0x56, 0xc2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xd6,
21  0x11, 0x5c, 0x1d, 0x21, 0xbd, 0x37, 0x63, 0x88,
22  0xb5, 0xf7, 0x23, 0xfb, 0x4c, 0x22, 0xdf, 0xe6,
23  0xcd, 0x43, 0x75, 0xa0, 0x5a, 0x07, 0x47, 0x64,
24  0x44, 0xd5, 0x81, 0x99, 0x85, 0x00, 0x7e, 0x34,
25};
26
27// TestVector represents a test of scalar multiplication of the base point.
28// |scalar| is a big-endian scalar and |affine| is the external representation
29// of g*scalar.
30struct TestVector {
31  uint8 scalar[28];
32  uint8 affine[28*2];
33};
34
35static const int kNumNISTTestVectors = 52;
36
37// kNISTTestVectors are the NIST test vectors for P224.
38static const TestVector kNISTTestVectors[kNumNISTTestVectors] = {
39  {
40    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
41     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
42     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
43     0x00, 0x00, 0x00, 0x01},
44    {0xb7, 0x0e, 0x0c, 0xbd, 0x6b, 0xb4, 0xbf, 0x7f,
45     0x32, 0x13, 0x90, 0xb9, 0x4a, 0x03, 0xc1, 0xd3,
46     0x56, 0xc2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xd6,
47     0x11, 0x5c, 0x1d, 0x21, 0xbd, 0x37, 0x63, 0x88,
48     0xb5, 0xf7, 0x23, 0xfb, 0x4c, 0x22, 0xdf, 0xe6,
49     0xcd, 0x43, 0x75, 0xa0, 0x5a, 0x07, 0x47, 0x64,
50     0x44, 0xd5, 0x81, 0x99, 0x85, 0x00, 0x7e, 0x34
51    },
52  },
53  {
54    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
55     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
56     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
57     0x00, 0x00, 0x00, 0x02, },
58
59    {0x70, 0x6a, 0x46, 0xdc, 0x76, 0xdc, 0xb7, 0x67,
60     0x98, 0xe6, 0x0e, 0x6d, 0x89, 0x47, 0x47, 0x88,
61     0xd1, 0x6d, 0xc1, 0x80, 0x32, 0xd2, 0x68, 0xfd,
62     0x1a, 0x70, 0x4f, 0xa6, 0x1c, 0x2b, 0x76, 0xa7,
63     0xbc, 0x25, 0xe7, 0x70, 0x2a, 0x70, 0x4f, 0xa9,
64     0x86, 0x89, 0x28, 0x49, 0xfc, 0xa6, 0x29, 0x48,
65     0x7a, 0xcf, 0x37, 0x09, 0xd2, 0xe4, 0xe8, 0xbb,
66    },
67  },
68  {
69    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
70     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
71     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
72     0x00, 0x00, 0x00, 0x03, },
73    {0xdf, 0x1b, 0x1d, 0x66, 0xa5, 0x51, 0xd0, 0xd3,
74     0x1e, 0xff, 0x82, 0x25, 0x58, 0xb9, 0xd2, 0xcc,
75     0x75, 0xc2, 0x18, 0x02, 0x79, 0xfe, 0x0d, 0x08,
76     0xfd, 0x89, 0x6d, 0x04, 0xa3, 0xf7, 0xf0, 0x3c,
77     0xad, 0xd0, 0xbe, 0x44, 0x4c, 0x0a, 0xa5, 0x68,
78     0x30, 0x13, 0x0d, 0xdf, 0x77, 0xd3, 0x17, 0x34,
79     0x4e, 0x1a, 0xf3, 0x59, 0x19, 0x81, 0xa9, 0x25,
80    },
81  },
82  {
83    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
84     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
85     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
86     0x00, 0x00, 0x00, 0x04, },
87    {0xae, 0x99, 0xfe, 0xeb, 0xb5, 0xd2, 0x69, 0x45,
88     0xb5, 0x48, 0x92, 0x09, 0x2a, 0x8a, 0xee, 0x02,
89     0x91, 0x29, 0x30, 0xfa, 0x41, 0xcd, 0x11, 0x4e,
90     0x40, 0x44, 0x73, 0x01, 0x04, 0x82, 0x58, 0x0a,
91     0x0e, 0xc5, 0xbc, 0x47, 0xe8, 0x8b, 0xc8, 0xc3,
92     0x78, 0x63, 0x2c, 0xd1, 0x96, 0xcb, 0x3f, 0xa0,
93     0x58, 0xa7, 0x11, 0x4e, 0xb0, 0x30, 0x54, 0xc9,
94    },
95  },
96  {
97    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
98     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
99     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
100     0x00, 0x00, 0x00, 0x05, },
101    {0x31, 0xc4, 0x9a, 0xe7, 0x5b, 0xce, 0x78, 0x07,
102     0xcd, 0xff, 0x22, 0x05, 0x5d, 0x94, 0xee, 0x90,
103     0x21, 0xfe, 0xdb, 0xb5, 0xab, 0x51, 0xc5, 0x75,
104     0x26, 0xf0, 0x11, 0xaa, 0x27, 0xe8, 0xbf, 0xf1,
105     0x74, 0x56, 0x35, 0xec, 0x5b, 0xa0, 0xc9, 0xf1,
106     0xc2, 0xed, 0xe1, 0x54, 0x14, 0xc6, 0x50, 0x7d,
107     0x29, 0xff, 0xe3, 0x7e, 0x79, 0x0a, 0x07, 0x9b,
108    },
109  },
110  {
111    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114     0x00, 0x00, 0x00, 0x06, },
115    {0x1f, 0x24, 0x83, 0xf8, 0x25, 0x72, 0x25, 0x1f,
116     0xca, 0x97, 0x5f, 0xea, 0x40, 0xdb, 0x82, 0x1d,
117     0xf8, 0xad, 0x82, 0xa3, 0xc0, 0x02, 0xee, 0x6c,
118     0x57, 0x11, 0x24, 0x08, 0x89, 0xfa, 0xf0, 0xcc,
119     0xb7, 0x50, 0xd9, 0x9b, 0x55, 0x3c, 0x57, 0x4f,
120     0xad, 0x7e, 0xcf, 0xb0, 0x43, 0x85, 0x86, 0xeb,
121     0x39, 0x52, 0xaf, 0x5b, 0x4b, 0x15, 0x3c, 0x7e,
122    },
123  },
124  {
125    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
126     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
127     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128     0x00, 0x00, 0x00, 0x07, },
129    {0xdb, 0x2f, 0x6b, 0xe6, 0x30, 0xe2, 0x46, 0xa5,
130     0xcf, 0x7d, 0x99, 0xb8, 0x51, 0x94, 0xb1, 0x23,
131     0xd4, 0x87, 0xe2, 0xd4, 0x66, 0xb9, 0x4b, 0x24,
132     0xa0, 0x3c, 0x3e, 0x28, 0x0f, 0x3a, 0x30, 0x08,
133     0x54, 0x97, 0xf2, 0xf6, 0x11, 0xee, 0x25, 0x17,
134     0xb1, 0x63, 0xef, 0x8c, 0x53, 0xb7, 0x15, 0xd1,
135     0x8b, 0xb4, 0xe4, 0x80, 0x8d, 0x02, 0xb9, 0x63,
136    },
137  },
138  {
139    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
140     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
141     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
142     0x00, 0x00, 0x00, 0x08, },
143    {0x85, 0x8e, 0x6f, 0x9c, 0xc6, 0xc1, 0x2c, 0x31,
144     0xf5, 0xdf, 0x12, 0x4a, 0xa7, 0x77, 0x67, 0xb0,
145     0x5c, 0x8b, 0xc0, 0x21, 0xbd, 0x68, 0x3d, 0x2b,
146     0x55, 0x57, 0x15, 0x50, 0x04, 0x6d, 0xcd, 0x3e,
147     0xa5, 0xc4, 0x38, 0x98, 0xc5, 0xc5, 0xfc, 0x4f,
148     0xda, 0xc7, 0xdb, 0x39, 0xc2, 0xf0, 0x2e, 0xbe,
149     0xe4, 0xe3, 0x54, 0x1d, 0x1e, 0x78, 0x04, 0x7a,
150    },
151  },
152  {
153    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
154     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
155     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
156     0x00, 0x00, 0x00, 0x09, },
157    {0x2f, 0xdc, 0xcc, 0xfe, 0xe7, 0x20, 0xa7, 0x7e,
158     0xf6, 0xcb, 0x3b, 0xfb, 0xb4, 0x47, 0xf9, 0x38,
159     0x31, 0x17, 0xe3, 0xda, 0xa4, 0xa0, 0x7e, 0x36,
160     0xed, 0x15, 0xf7, 0x8d, 0x37, 0x17, 0x32, 0xe4,
161     0xf4, 0x1b, 0xf4, 0xf7, 0x88, 0x30, 0x35, 0xe6,
162     0xa7, 0x9f, 0xce, 0xdc, 0x0e, 0x19, 0x6e, 0xb0,
163     0x7b, 0x48, 0x17, 0x16, 0x97, 0x51, 0x74, 0x63,
164    },
165  },
166  {
167    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
168     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
169     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
170     0x00, 0x00, 0x00, 0x0a, },
171    {0xae, 0xa9, 0xe1, 0x7a, 0x30, 0x65, 0x17, 0xeb,
172     0x89, 0x15, 0x2a, 0xa7, 0x09, 0x6d, 0x2c, 0x38,
173     0x1e, 0xc8, 0x13, 0xc5, 0x1a, 0xa8, 0x80, 0xe7,
174     0xbe, 0xe2, 0xc0, 0xfd, 0x39, 0xbb, 0x30, 0xea,
175     0xb3, 0x37, 0xe0, 0xa5, 0x21, 0xb6, 0xcb, 0xa1,
176     0xab, 0xe4, 0xb2, 0xb3, 0xa3, 0xe5, 0x24, 0xc1,
177     0x4a, 0x3f, 0xe3, 0xeb, 0x11, 0x6b, 0x65, 0x5f,
178    },
179  },
180  {
181    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
182     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
183     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
184     0x00, 0x00, 0x00, 0x0b, },
185    {0xef, 0x53, 0xb6, 0x29, 0x4a, 0xca, 0x43, 0x1f,
186     0x0f, 0x3c, 0x22, 0xdc, 0x82, 0xeb, 0x90, 0x50,
187     0x32, 0x4f, 0x1d, 0x88, 0xd3, 0x77, 0xe7, 0x16,
188     0x44, 0x8e, 0x50, 0x7c, 0x20, 0xb5, 0x10, 0x00,
189     0x40, 0x92, 0xe9, 0x66, 0x36, 0xcf, 0xb7, 0xe3,
190     0x2e, 0xfd, 0xed, 0x82, 0x65, 0xc2, 0x66, 0xdf,
191     0xb7, 0x54, 0xfa, 0x6d, 0x64, 0x91, 0xa6, 0xda,
192    },
193  },
194  {
195    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
196     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
197     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
198     0x00, 0x00, 0x00, 0x0c, },
199    {0x6e, 0x31, 0xee, 0x1d, 0xc1, 0x37, 0xf8, 0x1b,
200     0x05, 0x67, 0x52, 0xe4, 0xde, 0xab, 0x14, 0x43,
201     0xa4, 0x81, 0x03, 0x3e, 0x9b, 0x4c, 0x93, 0xa3,
202     0x04, 0x4f, 0x4f, 0x7a, 0x20, 0x7d, 0xdd, 0xf0,
203     0x38, 0x5b, 0xfd, 0xea, 0xb6, 0xe9, 0xac, 0xda,
204     0x8d, 0xa0, 0x6b, 0x3b, 0xbe, 0xf2, 0x24, 0xa9,
205     0x3a, 0xb1, 0xe9, 0xe0, 0x36, 0x10, 0x9d, 0x13,
206    },
207  },
208  {
209    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
210     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
211     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
212     0x00, 0x00, 0x00, 0x0d, },
213    {0x34, 0xe8, 0xe1, 0x7a, 0x43, 0x0e, 0x43, 0x28,
214     0x97, 0x93, 0xc3, 0x83, 0xfa, 0xc9, 0x77, 0x42,
215     0x47, 0xb4, 0x0e, 0x9e, 0xbd, 0x33, 0x66, 0x98,
216     0x1f, 0xcf, 0xae, 0xca, 0x25, 0x28, 0x19, 0xf7,
217     0x1c, 0x7f, 0xb7, 0xfb, 0xcb, 0x15, 0x9b, 0xe3,
218     0x37, 0xd3, 0x7d, 0x33, 0x36, 0xd7, 0xfe, 0xb9,
219     0x63, 0x72, 0x4f, 0xdf, 0xb0, 0xec, 0xb7, 0x67,
220    },
221  },
222  {
223    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
224     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
225     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226     0x00, 0x00, 0x00, 0x0e, },
227    {0xa5, 0x36, 0x40, 0xc8, 0x3d, 0xc2, 0x08, 0x60,
228     0x3d, 0xed, 0x83, 0xe4, 0xec, 0xf7, 0x58, 0xf2,
229     0x4c, 0x35, 0x7d, 0x7c, 0xf4, 0x80, 0x88, 0xb2,
230     0xce, 0x01, 0xe9, 0xfa, 0xd5, 0x81, 0x4c, 0xd7,
231     0x24, 0x19, 0x9c, 0x4a, 0x5b, 0x97, 0x4a, 0x43,
232     0x68, 0x5f, 0xbf, 0x5b, 0x8b, 0xac, 0x69, 0x45,
233     0x9c, 0x94, 0x69, 0xbc, 0x8f, 0x23, 0xcc, 0xaf,
234    },
235  },
236  {
237    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
239     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
240     0x00, 0x00, 0x00, 0x0f, },
241    {0xba, 0xa4, 0xd8, 0x63, 0x55, 0x11, 0xa7, 0xd2,
242     0x88, 0xae, 0xbe, 0xed, 0xd1, 0x2c, 0xe5, 0x29,
243     0xff, 0x10, 0x2c, 0x91, 0xf9, 0x7f, 0x86, 0x7e,
244     0x21, 0x91, 0x6b, 0xf9, 0x97, 0x9a, 0x5f, 0x47,
245     0x59, 0xf8, 0x0f, 0x4f, 0xb4, 0xec, 0x2e, 0x34,
246     0xf5, 0x56, 0x6d, 0x59, 0x56, 0x80, 0xa1, 0x17,
247     0x35, 0xe7, 0xb6, 0x10, 0x46, 0x12, 0x79, 0x89,
248    },
249  },
250  {
251    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
252     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
253     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
254     0x00, 0x00, 0x00, 0x10, },
255    {0x0b, 0x6e, 0xc4, 0xfe, 0x17, 0x77, 0x38, 0x24,
256     0x04, 0xef, 0x67, 0x99, 0x97, 0xba, 0x8d, 0x1c,
257     0xc5, 0xcd, 0x8e, 0x85, 0x34, 0x92, 0x59, 0xf5,
258     0x90, 0xc4, 0xc6, 0x6d, 0x33, 0x99, 0xd4, 0x64,
259     0x34, 0x59, 0x06, 0xb1, 0x1b, 0x00, 0xe3, 0x63,
260     0xef, 0x42, 0x92, 0x21, 0xf2, 0xec, 0x72, 0x0d,
261     0x2f, 0x66, 0x5d, 0x7d, 0xea, 0xd5, 0xb4, 0x82,
262    },
263  },
264  {
265    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
266     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
267     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
268     0x00, 0x00, 0x00, 0x11, },
269    {0xb8, 0x35, 0x7c, 0x3a, 0x6c, 0xee, 0xf2, 0x88,
270     0x31, 0x0e, 0x17, 0xb8, 0xbf, 0xef, 0xf9, 0x20,
271     0x08, 0x46, 0xca, 0x8c, 0x19, 0x42, 0x49, 0x7c,
272     0x48, 0x44, 0x03, 0xbc, 0xff, 0x14, 0x9e, 0xfa,
273     0x66, 0x06, 0xa6, 0xbd, 0x20, 0xef, 0x7d, 0x1b,
274     0x06, 0xbd, 0x92, 0xf6, 0x90, 0x46, 0x39, 0xdc,
275     0xe5, 0x17, 0x4d, 0xb6, 0xcc, 0x55, 0x4a, 0x26,
276    },
277  },
278  {
279    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
280     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
281     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
282     0x00, 0x00, 0x00, 0x12, },
283    {0xc9, 0xff, 0x61, 0xb0, 0x40, 0x87, 0x4c, 0x05,
284     0x68, 0x47, 0x92, 0x16, 0x82, 0x4a, 0x15, 0xea,
285     0xb1, 0xa8, 0x38, 0xa7, 0x97, 0xd1, 0x89, 0x74,
286     0x62, 0x26, 0xe4, 0xcc, 0xea, 0x98, 0xd6, 0x0e,
287     0x5f, 0xfc, 0x9b, 0x8f, 0xcf, 0x99, 0x9f, 0xab,
288     0x1d, 0xf7, 0xe7, 0xef, 0x70, 0x84, 0xf2, 0x0d,
289     0xdb, 0x61, 0xbb, 0x04, 0x5a, 0x6c, 0xe0, 0x02,
290    },
291  },
292  {
293    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
294     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
295     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
296     0x00, 0x00, 0x00, 0x13, },
297    {0xa1, 0xe8, 0x1c, 0x04, 0xf3, 0x0c, 0xe2, 0x01,
298     0xc7, 0xc9, 0xac, 0xe7, 0x85, 0xed, 0x44, 0xcc,
299     0x33, 0xb4, 0x55, 0xa0, 0x22, 0xf2, 0xac, 0xdb,
300     0xc6, 0xca, 0xe8, 0x3c, 0xdc, 0xf1, 0xf6, 0xc3,
301     0xdb, 0x09, 0xc7, 0x0a, 0xcc, 0x25, 0x39, 0x1d,
302     0x49, 0x2f, 0xe2, 0x5b, 0x4a, 0x18, 0x0b, 0xab,
303     0xd6, 0xce, 0xa3, 0x56, 0xc0, 0x47, 0x19, 0xcd,
304    },
305  },
306  {
307    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
308     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
309     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
310     0x00, 0x00, 0x00, 0x14, },
311    {0xfc, 0xc7, 0xf2, 0xb4, 0x5d, 0xf1, 0xcd, 0x5a,
312     0x3c, 0x0c, 0x07, 0x31, 0xca, 0x47, 0xa8, 0xaf,
313     0x75, 0xcf, 0xb0, 0x34, 0x7e, 0x83, 0x54, 0xee,
314     0xfe, 0x78, 0x24, 0x55, 0x0d, 0x5d, 0x71, 0x10,
315     0x27, 0x4c, 0xba, 0x7c, 0xde, 0xe9, 0x0e, 0x1a,
316     0x8b, 0x0d, 0x39, 0x4c, 0x37, 0x6a, 0x55, 0x73,
317     0xdb, 0x6b, 0xe0, 0xbf, 0x27, 0x47, 0xf5, 0x30,
318    },
319  },
320  {
321    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
322     0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
323     0x00, 0x00, 0x00, 0x00, 0x01, 0x8e, 0xbb, 0xb9,
324     0x5e, 0xed, 0x0e, 0x13, },
325    {0x61, 0xf0, 0x77, 0xc6, 0xf6, 0x2e, 0xd8, 0x02,
326     0xda, 0xd7, 0xc2, 0xf3, 0x8f, 0x5c, 0x67, 0xf2,
327     0xcc, 0x45, 0x36, 0x01, 0xe6, 0x1b, 0xd0, 0x76,
328     0xbb, 0x46, 0x17, 0x9e, 0x22, 0x72, 0xf9, 0xe9,
329     0xf5, 0x93, 0x3e, 0x70, 0x38, 0x8e, 0xe6, 0x52,
330     0x51, 0x34, 0x43, 0xb5, 0xe2, 0x89, 0xdd, 0x13,
331     0x5d, 0xcc, 0x0d, 0x02, 0x99, 0xb2, 0x25, 0xe4,
332    },
333  },
334  {
335    {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
336     0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x9d, 0x89,
337     0x3d, 0x4c, 0xdd, 0x74, 0x72, 0x46, 0xcd, 0xca,
338     0x43, 0x59, 0x0e, 0x13, },
339    {0x02, 0x98, 0x95, 0xf0, 0xaf, 0x49, 0x6b, 0xfc,
340     0x62, 0xb6, 0xef, 0x8d, 0x8a, 0x65, 0xc8, 0x8c,
341     0x61, 0x39, 0x49, 0xb0, 0x36, 0x68, 0xaa, 0xb4,
342     0xf0, 0x42, 0x9e, 0x35, 0x3e, 0xa6, 0xe5, 0x3f,
343     0x9a, 0x84, 0x1f, 0x20, 0x19, 0xec, 0x24, 0xbd,
344     0xe1, 0xa7, 0x56, 0x77, 0xaa, 0x9b, 0x59, 0x02,
345     0xe6, 0x10, 0x81, 0xc0, 0x10, 0x64, 0xde, 0x93,
346    },
347  },
348  {
349    {0x41, 0xff, 0xc1, 0xff, 0xff, 0xfe, 0x01, 0xff,
350     0xfc, 0x00, 0x03, 0xff, 0xfe, 0x00, 0x07, 0xc0,
351     0x01, 0xff, 0xf0, 0x00, 0x03, 0xff, 0xf0, 0x7f,
352     0xfe, 0x00, 0x07, 0xc0, },
353    {0xab, 0x68, 0x99, 0x30, 0xbc, 0xae, 0x4a, 0x4a,
354     0xa5, 0xf5, 0xcb, 0x08, 0x5e, 0x82, 0x3e, 0x8a,
355     0xe3, 0x0f, 0xd3, 0x65, 0xeb, 0x1d, 0xa4, 0xab,
356     0xa9, 0xcf, 0x03, 0x79, 0x33, 0x45, 0xa1, 0x21,
357     0xbb, 0xd2, 0x33, 0x54, 0x8a, 0xf0, 0xd2, 0x10,
358     0x65, 0x4e, 0xb4, 0x0b, 0xab, 0x78, 0x8a, 0x03,
359     0x66, 0x64, 0x19, 0xbe, 0x6f, 0xbd, 0x34, 0xe7,
360    },
361  },
362  {
363    {0x7f, 0xff, 0xff, 0xc0, 0x3f, 0xff, 0xc0, 0x03,
364     0xff, 0xff, 0xfc, 0x00, 0x7f, 0xff, 0x00, 0x00,
365     0x00, 0x00, 0x07, 0x00, 0x00, 0x10, 0x00, 0x00,
366     0x00, 0x0e, 0x00, 0xff, },
367    {0xbd, 0xb6, 0xa8, 0x81, 0x7c, 0x1f, 0x89, 0xda,
368     0x1c, 0x2f, 0x3d, 0xd8, 0xe9, 0x7f, 0xeb, 0x44,
369     0x94, 0xf2, 0xed, 0x30, 0x2a, 0x4c, 0xe2, 0xbc,
370     0x7f, 0x5f, 0x40, 0x25, 0x4c, 0x70, 0x20, 0xd5,
371     0x7c, 0x00, 0x41, 0x18, 0x89, 0x46, 0x2d, 0x77,
372     0xa5, 0x43, 0x8b, 0xb4, 0xe9, 0x7d, 0x17, 0x77,
373     0x00, 0xbf, 0x72, 0x43, 0xa0, 0x7f, 0x16, 0x80,
374    },
375  },
376  {
377    {0x7f, 0xff, 0xff, 0x04, 0x00, 0x00, 0x00, 0x00,
378     0xff, 0xff, 0xf0, 0x1f, 0xff, 0xf8, 0xff, 0xff,
379     0xc0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xc0, 0x00,
380     0x00, 0x0f, 0xff, 0xff, },
381    {0xd5, 0x8b, 0x61, 0xaa, 0x41, 0xc3, 0x2d, 0xd5,
382     0xeb, 0xa4, 0x62, 0x64, 0x7d, 0xba, 0x75, 0xc5,
383     0xd6, 0x7c, 0x83, 0x60, 0x6c, 0x0a, 0xf2, 0xbd,
384     0x92, 0x84, 0x46, 0xa9, 0xd2, 0x4b, 0xa6, 0xa8,
385     0x37, 0xbe, 0x04, 0x60, 0xdd, 0x10, 0x7a, 0xe7,
386     0x77, 0x25, 0x69, 0x6d, 0x21, 0x14, 0x46, 0xc5,
387     0x60, 0x9b, 0x45, 0x95, 0x97, 0x6b, 0x16, 0xbd,
388    },
389  },
390  {
391    {0x7f, 0xff, 0xff, 0xc0, 0x00, 0xff, 0xfe, 0x3f,
392     0xff, 0xfc, 0x10, 0x00, 0x00, 0x20, 0x00, 0x3f,
393     0xff, 0xff, 0x00, 0x00, 0x00, 0xfc, 0x00, 0x00,
394     0x3f, 0xff, 0xff, 0xff, },
395    {0xdc, 0x9f, 0xa7, 0x79, 0x78, 0xa0, 0x05, 0x51,
396     0x09, 0x80, 0xe9, 0x29, 0xa1, 0x48, 0x5f, 0x63,
397     0x71, 0x6d, 0xf6, 0x95, 0xd7, 0xa0, 0xc1, 0x8b,
398     0xb5, 0x18, 0xdf, 0x03, 0xed, 0xe2, 0xb0, 0x16,
399     0xf2, 0xdd, 0xff, 0xc2, 0xa8, 0xc0, 0x15, 0xb1,
400     0x34, 0x92, 0x82, 0x75, 0xce, 0x09, 0xe5, 0x66,
401     0x1b, 0x7a, 0xb1, 0x4c, 0xe0, 0xd1, 0xd4, 0x03,
402    },
403  },
404  {
405    {0x70, 0x01, 0xf0, 0x00, 0x1c, 0x00, 0x01, 0xc0,
406     0x00, 0x00, 0x1f, 0xff, 0xff, 0xfc, 0x00, 0x00,
407     0x1f, 0xff, 0xff, 0xf8, 0x00, 0x0f, 0xc0, 0x00,
408     0x00, 0x01, 0xfc, 0x00, },
409    {0x49, 0x9d, 0x8b, 0x28, 0x29, 0xcf, 0xb8, 0x79,
410     0xc9, 0x01, 0xf7, 0xd8, 0x5d, 0x35, 0x70, 0x45,
411     0xed, 0xab, 0x55, 0x02, 0x88, 0x24, 0xd0, 0xf0,
412     0x5b, 0xa2, 0x79, 0xba, 0xbf, 0x92, 0x95, 0x37,
413     0xb0, 0x6e, 0x40, 0x15, 0x91, 0x96, 0x39, 0xd9,
414     0x4f, 0x57, 0x83, 0x8f, 0xa3, 0x3f, 0xc3, 0xd9,
415     0x52, 0x59, 0x8d, 0xcd, 0xbb, 0x44, 0xd6, 0x38,
416    },
417  },
418  {
419    {0x00, 0x00, 0x00, 0x00, 0x1f, 0xfc, 0x00, 0x00,
420     0x00, 0xff, 0xf0, 0x30, 0x00, 0x1f, 0x00, 0x00,
421     0xff, 0xff, 0xf0, 0x00, 0x00, 0x38, 0x00, 0x00,
422     0x00, 0x00, 0x00, 0x02, },
423    {0x82, 0x46, 0xc9, 0x99, 0x13, 0x71, 0x86, 0x63,
424     0x2c, 0x5f, 0x9e, 0xdd, 0xf3, 0xb1, 0xb0, 0xe1,
425     0x76, 0x4c, 0x5e, 0x8b, 0xd0, 0xe0, 0xd8, 0xa5,
426     0x54, 0xb9, 0xcb, 0x77, 0xe8, 0x0e, 0xd8, 0x66,
427     0x0b, 0xc1, 0xcb, 0x17, 0xac, 0x7d, 0x84, 0x5b,
428     0xe4, 0x0a, 0x7a, 0x02, 0x2d, 0x33, 0x06, 0xf1,
429     0x16, 0xae, 0x9f, 0x81, 0xfe, 0xa6, 0x59, 0x47,
430    },
431  },
432  {
433    {0x7f, 0xff, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
434     0x07, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
435     0x00, 0x00, 0xff, 0xfe, 0x08, 0x00, 0x00, 0x1f,
436     0xf0, 0x00, 0x1f, 0xff, },
437    {0x66, 0x70, 0xc2, 0x0a, 0xfc, 0xce, 0xae, 0xa6,
438     0x72, 0xc9, 0x7f, 0x75, 0xe2, 0xe9, 0xdd, 0x5c,
439     0x84, 0x60, 0xe5, 0x4b, 0xb3, 0x85, 0x38, 0xeb,
440     0xb4, 0xbd, 0x30, 0xeb, 0xf2, 0x80, 0xd8, 0x00,
441     0x8d, 0x07, 0xa4, 0xca, 0xf5, 0x42, 0x71, 0xf9,
442     0x93, 0x52, 0x7d, 0x46, 0xff, 0x3f, 0xf4, 0x6f,
443     0xd1, 0x19, 0x0a, 0x3f, 0x1f, 0xaa, 0x4f, 0x74,
444    },
445  },
446  {
447    {0x00, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff,
448     0xff, 0xc0, 0x00, 0x07, 0xff, 0xff, 0xe0, 0xff,
449     0xff, 0xff, 0xff, 0xff, 0xff, 0xf8, 0x00, 0xff,
450     0xff, 0xff, 0xff, 0xff, },
451    {0x00, 0x0e, 0xca, 0x93, 0x42, 0x47, 0x42, 0x5c,
452     0xfd, 0x94, 0x9b, 0x79, 0x5c, 0xb5, 0xce, 0x1e,
453     0xff, 0x40, 0x15, 0x50, 0x38, 0x6e, 0x28, 0xd1,
454     0xa4, 0xc5, 0xa8, 0xeb, 0xd4, 0xc0, 0x10, 0x40,
455     0xdb, 0xa1, 0x96, 0x28, 0x93, 0x1b, 0xc8, 0x85,
456     0x53, 0x70, 0x31, 0x7c, 0x72, 0x2c, 0xbd, 0x9c,
457     0xa6, 0x15, 0x69, 0x85, 0xf1, 0xc2, 0xe9, 0xce,
458    },
459  },
460  {
461    {0x7f, 0xff, 0xfc, 0x03, 0xff, 0x80, 0x7f, 0xff,
462     0xe0, 0x00, 0x1f, 0xff, 0xff, 0x80, 0x0f, 0xff,
463     0x80, 0x00, 0x01, 0xff, 0xff, 0x00, 0x01, 0xff,
464     0xff, 0xfe, 0x00, 0x1f, },
465    {0xef, 0x35, 0x3b, 0xf5, 0xc7, 0x3c, 0xd5, 0x51,
466     0xb9, 0x6d, 0x59, 0x6f, 0xbc, 0x9a, 0x67, 0xf1,
467     0x6d, 0x61, 0xdd, 0x9f, 0xe5, 0x6a, 0xf1, 0x9d,
468     0xe1, 0xfb, 0xa9, 0xcd, 0x21, 0x77, 0x1b, 0x9c,
469     0xdc, 0xe3, 0xe8, 0x43, 0x0c, 0x09, 0xb3, 0x83,
470     0x8b, 0xe7, 0x0b, 0x48, 0xc2, 0x1e, 0x15, 0xbc,
471     0x09, 0xee, 0x1f, 0x2d, 0x79, 0x45, 0xb9, 0x1f,
472    },
473  },
474  {
475    {0x00, 0x00, 0x00, 0x07, 0xff, 0xc0, 0x7f, 0xff,
476     0xff, 0xff, 0x01, 0xff, 0xfe, 0x03, 0xff, 0xfe,
477     0x40, 0x00, 0x38, 0x00, 0x07, 0xe0, 0x00, 0x3f,
478     0xfe, 0x00, 0x00, 0x00, },
479    {0x40, 0x36, 0x05, 0x2a, 0x30, 0x91, 0xeb, 0x48,
480     0x10, 0x46, 0xad, 0x32, 0x89, 0xc9, 0x5d, 0x3a,
481     0xc9, 0x05, 0xca, 0x00, 0x23, 0xde, 0x2c, 0x03,
482     0xec, 0xd4, 0x51, 0xcf, 0xd7, 0x68, 0x16, 0x5a,
483     0x38, 0xa2, 0xb9, 0x6f, 0x81, 0x25, 0x86, 0xa9,
484     0xd5, 0x9d, 0x41, 0x36, 0x03, 0x5d, 0x9c, 0x85,
485     0x3a, 0x5b, 0xf2, 0xe1, 0xc8, 0x6a, 0x49, 0x93,
486    },
487  },
488  {
489    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
490     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
491     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
492     0x5c, 0x5c, 0x2a, 0x29, },
493    {0xfc, 0xc7, 0xf2, 0xb4, 0x5d, 0xf1, 0xcd, 0x5a,
494     0x3c, 0x0c, 0x07, 0x31, 0xca, 0x47, 0xa8, 0xaf,
495     0x75, 0xcf, 0xb0, 0x34, 0x7e, 0x83, 0x54, 0xee,
496     0xfe, 0x78, 0x24, 0x55, 0xf2, 0xa2, 0x8e, 0xef,
497     0xd8, 0xb3, 0x45, 0x83, 0x21, 0x16, 0xf1, 0xe5,
498     0x74, 0xf2, 0xc6, 0xb2, 0xc8, 0x95, 0xaa, 0x8c,
499     0x24, 0x94, 0x1f, 0x40, 0xd8, 0xb8, 0x0a, 0xd1,
500    },
501  },
502  {
503    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
504     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
505     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
506     0x5c, 0x5c, 0x2a, 0x2a, },
507    {0xa1, 0xe8, 0x1c, 0x04, 0xf3, 0x0c, 0xe2, 0x01,
508     0xc7, 0xc9, 0xac, 0xe7, 0x85, 0xed, 0x44, 0xcc,
509     0x33, 0xb4, 0x55, 0xa0, 0x22, 0xf2, 0xac, 0xdb,
510     0xc6, 0xca, 0xe8, 0x3c, 0x23, 0x0e, 0x09, 0x3c,
511     0x24, 0xf6, 0x38, 0xf5, 0x33, 0xda, 0xc6, 0xe2,
512     0xb6, 0xd0, 0x1d, 0xa3, 0xb5, 0xe7, 0xf4, 0x54,
513     0x29, 0x31, 0x5c, 0xa9, 0x3f, 0xb8, 0xe6, 0x34,
514    },
515  },
516  {
517    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
518     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
519     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
520     0x5c, 0x5c, 0x2a, 0x2b, },
521    {0xc9, 0xff, 0x61, 0xb0, 0x40, 0x87, 0x4c, 0x05,
522     0x68, 0x47, 0x92, 0x16, 0x82, 0x4a, 0x15, 0xea,
523     0xb1, 0xa8, 0x38, 0xa7, 0x97, 0xd1, 0x89, 0x74,
524     0x62, 0x26, 0xe4, 0xcc, 0x15, 0x67, 0x29, 0xf1,
525     0xa0, 0x03, 0x64, 0x70, 0x30, 0x66, 0x60, 0x54,
526     0xe2, 0x08, 0x18, 0x0f, 0x8f, 0x7b, 0x0d, 0xf2,
527     0x24, 0x9e, 0x44, 0xfb, 0xa5, 0x93, 0x1f, 0xff,
528    },
529  },
530  {
531    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
532     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
533     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
534     0x5c, 0x5c, 0x2a, 0x2c, },
535    {0xb8, 0x35, 0x7c, 0x3a, 0x6c, 0xee, 0xf2, 0x88,
536     0x31, 0x0e, 0x17, 0xb8, 0xbf, 0xef, 0xf9, 0x20,
537     0x08, 0x46, 0xca, 0x8c, 0x19, 0x42, 0x49, 0x7c,
538     0x48, 0x44, 0x03, 0xbc, 0x00, 0xeb, 0x61, 0x05,
539     0x99, 0xf9, 0x59, 0x42, 0xdf, 0x10, 0x82, 0xe4,
540     0xf9, 0x42, 0x6d, 0x08, 0x6f, 0xb9, 0xc6, 0x23,
541     0x1a, 0xe8, 0xb2, 0x49, 0x33, 0xaa, 0xb5, 0xdb,
542    },
543  },
544  {
545    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
546     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
547     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
548     0x5c, 0x5c, 0x2a, 0x2d, },
549    {0x0b, 0x6e, 0xc4, 0xfe, 0x17, 0x77, 0x38, 0x24,
550     0x04, 0xef, 0x67, 0x99, 0x97, 0xba, 0x8d, 0x1c,
551     0xc5, 0xcd, 0x8e, 0x85, 0x34, 0x92, 0x59, 0xf5,
552     0x90, 0xc4, 0xc6, 0x6d, 0xcc, 0x66, 0x2b, 0x9b,
553     0xcb, 0xa6, 0xf9, 0x4e, 0xe4, 0xff, 0x1c, 0x9c,
554     0x10, 0xbd, 0x6d, 0xdd, 0x0d, 0x13, 0x8d, 0xf2,
555     0xd0, 0x99, 0xa2, 0x82, 0x15, 0x2a, 0x4b, 0x7f,
556    },
557  },
558  {
559    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
560     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
561     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
562     0x5c, 0x5c, 0x2a, 0x2e, },
563    {0xba, 0xa4, 0xd8, 0x63, 0x55, 0x11, 0xa7, 0xd2,
564     0x88, 0xae, 0xbe, 0xed, 0xd1, 0x2c, 0xe5, 0x29,
565     0xff, 0x10, 0x2c, 0x91, 0xf9, 0x7f, 0x86, 0x7e,
566     0x21, 0x91, 0x6b, 0xf9, 0x68, 0x65, 0xa0, 0xb8,
567     0xa6, 0x07, 0xf0, 0xb0, 0x4b, 0x13, 0xd1, 0xcb,
568     0x0a, 0xa9, 0x92, 0xa5, 0xa9, 0x7f, 0x5e, 0xe8,
569     0xca, 0x18, 0x49, 0xef, 0xb9, 0xed, 0x86, 0x78,
570    },
571  },
572  {
573    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
574     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
575     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
576     0x5c, 0x5c, 0x2a, 0x2f, },
577    {0xa5, 0x36, 0x40, 0xc8, 0x3d, 0xc2, 0x08, 0x60,
578     0x3d, 0xed, 0x83, 0xe4, 0xec, 0xf7, 0x58, 0xf2,
579     0x4c, 0x35, 0x7d, 0x7c, 0xf4, 0x80, 0x88, 0xb2,
580     0xce, 0x01, 0xe9, 0xfa, 0x2a, 0x7e, 0xb3, 0x28,
581     0xdb, 0xe6, 0x63, 0xb5, 0xa4, 0x68, 0xb5, 0xbc,
582     0x97, 0xa0, 0x40, 0xa3, 0x74, 0x53, 0x96, 0xba,
583     0x63, 0x6b, 0x96, 0x43, 0x70, 0xdc, 0x33, 0x52,
584    },
585  },
586  {
587    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
588     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
589     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
590     0x5c, 0x5c, 0x2a, 0x30, },
591    {0x34, 0xe8, 0xe1, 0x7a, 0x43, 0x0e, 0x43, 0x28,
592     0x97, 0x93, 0xc3, 0x83, 0xfa, 0xc9, 0x77, 0x42,
593     0x47, 0xb4, 0x0e, 0x9e, 0xbd, 0x33, 0x66, 0x98,
594     0x1f, 0xcf, 0xae, 0xca, 0xda, 0xd7, 0xe6, 0x08,
595     0xe3, 0x80, 0x48, 0x04, 0x34, 0xea, 0x64, 0x1c,
596     0xc8, 0x2c, 0x82, 0xcb, 0xc9, 0x28, 0x01, 0x46,
597     0x9c, 0x8d, 0xb0, 0x20, 0x4f, 0x13, 0x48, 0x9a,
598    },
599  },
600  {
601    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
602     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
603     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
604     0x5c, 0x5c, 0x2a, 0x31, },
605    {0x6e, 0x31, 0xee, 0x1d, 0xc1, 0x37, 0xf8, 0x1b,
606     0x05, 0x67, 0x52, 0xe4, 0xde, 0xab, 0x14, 0x43,
607     0xa4, 0x81, 0x03, 0x3e, 0x9b, 0x4c, 0x93, 0xa3,
608     0x04, 0x4f, 0x4f, 0x7a, 0xdf, 0x82, 0x22, 0x0f,
609     0xc7, 0xa4, 0x02, 0x15, 0x49, 0x16, 0x53, 0x25,
610     0x72, 0x5f, 0x94, 0xc3, 0x41, 0x0d, 0xdb, 0x56,
611     0xc5, 0x4e, 0x16, 0x1f, 0xc9, 0xef, 0x62, 0xee,
612    },
613  },
614  {
615    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
616     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
617     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
618     0x5c, 0x5c, 0x2a, 0x32, },
619    {0xef, 0x53, 0xb6, 0x29, 0x4a, 0xca, 0x43, 0x1f,
620     0x0f, 0x3c, 0x22, 0xdc, 0x82, 0xeb, 0x90, 0x50,
621     0x32, 0x4f, 0x1d, 0x88, 0xd3, 0x77, 0xe7, 0x16,
622     0x44, 0x8e, 0x50, 0x7c, 0xdf, 0x4a, 0xef, 0xff,
623     0xbf, 0x6d, 0x16, 0x99, 0xc9, 0x30, 0x48, 0x1c,
624     0xd1, 0x02, 0x12, 0x7c, 0x9a, 0x3d, 0x99, 0x20,
625     0x48, 0xab, 0x05, 0x92, 0x9b, 0x6e, 0x59, 0x27,
626    },
627  },
628  {
629    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
630     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
631     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
632     0x5c, 0x5c, 0x2a, 0x33, },
633    {0xae, 0xa9, 0xe1, 0x7a, 0x30, 0x65, 0x17, 0xeb,
634     0x89, 0x15, 0x2a, 0xa7, 0x09, 0x6d, 0x2c, 0x38,
635     0x1e, 0xc8, 0x13, 0xc5, 0x1a, 0xa8, 0x80, 0xe7,
636     0xbe, 0xe2, 0xc0, 0xfd, 0xc6, 0x44, 0xcf, 0x15,
637     0x4c, 0xc8, 0x1f, 0x5a, 0xde, 0x49, 0x34, 0x5e,
638     0x54, 0x1b, 0x4d, 0x4b, 0x5c, 0x1a, 0xdb, 0x3e,
639     0xb5, 0xc0, 0x1c, 0x14, 0xee, 0x94, 0x9a, 0xa2,
640    },
641  },
642  {
643    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
644     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
645     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
646     0x5c, 0x5c, 0x2a, 0x34, },
647    {0x2f, 0xdc, 0xcc, 0xfe, 0xe7, 0x20, 0xa7, 0x7e,
648     0xf6, 0xcb, 0x3b, 0xfb, 0xb4, 0x47, 0xf9, 0x38,
649     0x31, 0x17, 0xe3, 0xda, 0xa4, 0xa0, 0x7e, 0x36,
650     0xed, 0x15, 0xf7, 0x8d, 0xc8, 0xe8, 0xcd, 0x1b,
651     0x0b, 0xe4, 0x0b, 0x08, 0x77, 0xcf, 0xca, 0x19,
652     0x58, 0x60, 0x31, 0x22, 0xf1, 0xe6, 0x91, 0x4f,
653     0x84, 0xb7, 0xe8, 0xe9, 0x68, 0xae, 0x8b, 0x9e,
654    },
655  },
656  {
657    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
658     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
659     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
660     0x5c, 0x5c, 0x2a, 0x35, },
661    {0x85, 0x8e, 0x6f, 0x9c, 0xc6, 0xc1, 0x2c, 0x31,
662     0xf5, 0xdf, 0x12, 0x4a, 0xa7, 0x77, 0x67, 0xb0,
663     0x5c, 0x8b, 0xc0, 0x21, 0xbd, 0x68, 0x3d, 0x2b,
664     0x55, 0x57, 0x15, 0x50, 0xfb, 0x92, 0x32, 0xc1,
665     0x5a, 0x3b, 0xc7, 0x67, 0x3a, 0x3a, 0x03, 0xb0,
666     0x25, 0x38, 0x24, 0xc5, 0x3d, 0x0f, 0xd1, 0x41,
667     0x1b, 0x1c, 0xab, 0xe2, 0xe1, 0x87, 0xfb, 0x87,
668    },
669  },
670  {
671    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
672     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
673     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
674     0x5c, 0x5c, 0x2a, 0x36, },
675    {0xdb, 0x2f, 0x6b, 0xe6, 0x30, 0xe2, 0x46, 0xa5,
676     0xcf, 0x7d, 0x99, 0xb8, 0x51, 0x94, 0xb1, 0x23,
677     0xd4, 0x87, 0xe2, 0xd4, 0x66, 0xb9, 0x4b, 0x24,
678     0xa0, 0x3c, 0x3e, 0x28, 0xf0, 0xc5, 0xcf, 0xf7,
679     0xab, 0x68, 0x0d, 0x09, 0xee, 0x11, 0xda, 0xe8,
680     0x4e, 0x9c, 0x10, 0x72, 0xac, 0x48, 0xea, 0x2e,
681     0x74, 0x4b, 0x1b, 0x7f, 0x72, 0xfd, 0x46, 0x9e,
682    },
683  },
684  {
685    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
686     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
687     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
688     0x5c, 0x5c, 0x2a, 0x37, },
689    {0x1f, 0x24, 0x83, 0xf8, 0x25, 0x72, 0x25, 0x1f,
690     0xca, 0x97, 0x5f, 0xea, 0x40, 0xdb, 0x82, 0x1d,
691     0xf8, 0xad, 0x82, 0xa3, 0xc0, 0x02, 0xee, 0x6c,
692     0x57, 0x11, 0x24, 0x08, 0x76, 0x05, 0x0f, 0x33,
693     0x48, 0xaf, 0x26, 0x64, 0xaa, 0xc3, 0xa8, 0xb0,
694     0x52, 0x81, 0x30, 0x4e, 0xbc, 0x7a, 0x79, 0x14,
695     0xc6, 0xad, 0x50, 0xa4, 0xb4, 0xea, 0xc3, 0x83,
696    },
697  },
698  {
699    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
700     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
701     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
702     0x5c, 0x5c, 0x2a, 0x38, },
703    {0x31, 0xc4, 0x9a, 0xe7, 0x5b, 0xce, 0x78, 0x07,
704     0xcd, 0xff, 0x22, 0x05, 0x5d, 0x94, 0xee, 0x90,
705     0x21, 0xfe, 0xdb, 0xb5, 0xab, 0x51, 0xc5, 0x75,
706     0x26, 0xf0, 0x11, 0xaa, 0xd8, 0x17, 0x40, 0x0e,
707     0x8b, 0xa9, 0xca, 0x13, 0xa4, 0x5f, 0x36, 0x0e,
708     0x3d, 0x12, 0x1e, 0xaa, 0xeb, 0x39, 0xaf, 0x82,
709     0xd6, 0x00, 0x1c, 0x81, 0x86, 0xf5, 0xf8, 0x66,
710    },
711  },
712  {
713    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
714     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
715     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
716     0x5c, 0x5c, 0x2a, 0x39, },
717    {0xae, 0x99, 0xfe, 0xeb, 0xb5, 0xd2, 0x69, 0x45,
718     0xb5, 0x48, 0x92, 0x09, 0x2a, 0x8a, 0xee, 0x02,
719     0x91, 0x29, 0x30, 0xfa, 0x41, 0xcd, 0x11, 0x4e,
720     0x40, 0x44, 0x73, 0x01, 0xfb, 0x7d, 0xa7, 0xf5,
721     0xf1, 0x3a, 0x43, 0xb8, 0x17, 0x74, 0x37, 0x3c,
722     0x87, 0x9c, 0xd3, 0x2d, 0x69, 0x34, 0xc0, 0x5f,
723     0xa7, 0x58, 0xee, 0xb1, 0x4f, 0xcf, 0xab, 0x38,
724    },
725  },
726  {
727    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
728     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
729     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
730     0x5c, 0x5c, 0x2a, 0x3a, },
731    {0xdf, 0x1b, 0x1d, 0x66, 0xa5, 0x51, 0xd0, 0xd3,
732     0x1e, 0xff, 0x82, 0x25, 0x58, 0xb9, 0xd2, 0xcc,
733     0x75, 0xc2, 0x18, 0x02, 0x79, 0xfe, 0x0d, 0x08,
734     0xfd, 0x89, 0x6d, 0x04, 0x5c, 0x08, 0x0f, 0xc3,
735     0x52, 0x2f, 0x41, 0xbb, 0xb3, 0xf5, 0x5a, 0x97,
736     0xcf, 0xec, 0xf2, 0x1f, 0x88, 0x2c, 0xe8, 0xcb,
737     0xb1, 0xe5, 0x0c, 0xa6, 0xe6, 0x7e, 0x56, 0xdc,
738    },
739  },
740  {
741    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
742     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
743     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
744     0x5c, 0x5c, 0x2a, 0x3b, },
745    {0x70, 0x6a, 0x46, 0xdc, 0x76, 0xdc, 0xb7, 0x67,
746     0x98, 0xe6, 0x0e, 0x6d, 0x89, 0x47, 0x47, 0x88,
747     0xd1, 0x6d, 0xc1, 0x80, 0x32, 0xd2, 0x68, 0xfd,
748     0x1a, 0x70, 0x4f, 0xa6, 0xe3, 0xd4, 0x89, 0x58,
749     0x43, 0xda, 0x18, 0x8f, 0xd5, 0x8f, 0xb0, 0x56,
750     0x79, 0x76, 0xd7, 0xb5, 0x03, 0x59, 0xd6, 0xb7,
751     0x85, 0x30, 0xc8, 0xf6, 0x2d, 0x1b, 0x17, 0x46,
752    },
753  },
754  {
755    {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
756     0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x16, 0xa2,
757     0xe0, 0xb8, 0xf0, 0x3e, 0x13, 0xdd, 0x29, 0x45,
758     0x5c, 0x5c, 0x2a, 0x3c, },
759    {0xb7, 0x0e, 0x0c, 0xbd, 0x6b, 0xb4, 0xbf, 0x7f,
760     0x32, 0x13, 0x90, 0xb9, 0x4a, 0x03, 0xc1, 0xd3,
761     0x56, 0xc2, 0x11, 0x22, 0x34, 0x32, 0x80, 0xd6,
762     0x11, 0x5c, 0x1d, 0x21, 0x42, 0xc8, 0x9c, 0x77,
763     0x4a, 0x08, 0xdc, 0x04, 0xb3, 0xdd, 0x20, 0x19,
764     0x32, 0xbc, 0x8a, 0x5e, 0xa5, 0xf8, 0xb8, 0x9b,
765     0xbb, 0x2a, 0x7e, 0x66, 0x7a, 0xff, 0x81, 0xcd,
766    },
767  },
768};
769
770TEST(P224, ExternalToInternalAndBack) {
771  Point point;
772
773  EXPECT_TRUE(point.SetFromString(base::StringPiece(
774      reinterpret_cast<const char *>(kBasePointExternal),
775      sizeof(kBasePointExternal))));
776
777  const std::string external = point.ToString();
778
779  ASSERT_EQ(external.size(), 56u);
780  EXPECT_TRUE(memcmp(external.data(), kBasePointExternal,
781                     sizeof(kBasePointExternal)) == 0);
782}
783
784TEST(P224, ScalarBaseMult) {
785  Point point;
786
787  for (size_t i = 0; i < arraysize(kNISTTestVectors); i++) {
788    p224::ScalarBaseMult(kNISTTestVectors[i].scalar, &point);
789    const std::string external = point.ToString();
790    ASSERT_EQ(external.size(), 56u);
791    EXPECT_TRUE(memcmp(external.data(), kNISTTestVectors[i].affine,
792                       external.size()) == 0);
793  }
794}
795
796TEST(P224, Addition) {
797  Point a, b, minus_b, sum, a_again;
798
799  ASSERT_TRUE(a.SetFromString(base::StringPiece(
800      reinterpret_cast<const char *>(kNISTTestVectors[10].affine), 56)));
801  ASSERT_TRUE(b.SetFromString(base::StringPiece(
802      reinterpret_cast<const char *>(kNISTTestVectors[11].affine), 56)));
803
804  p224::Negate(b, &minus_b);
805  p224::Add(a, b, &sum);
806  EXPECT_TRUE(memcmp(&sum, &a, sizeof(sum)) != 0);
807  p224::Add(minus_b, sum, &a_again);
808  EXPECT_TRUE(a_again.ToString() == a.ToString());
809}
810
811TEST(P224, Infinity) {
812  char zeros[56];
813  memset(zeros, 0, sizeof(zeros));
814
815  // Test that x^0 = ∞.
816  Point a;
817  p224::ScalarBaseMult(reinterpret_cast<const uint8*>(zeros), &a);
818  EXPECT_TRUE(memcmp(zeros, a.ToString().data(), sizeof(zeros)) == 0);
819
820  // We shouldn't allow ∞ to be imported.
821  EXPECT_FALSE(a.SetFromString(std::string(zeros, sizeof(zeros))));
822}
823
824}  // namespace crypto
825