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