Home | History | Annotate | Download | only in crypto
      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 
     12 namespace crypto {
     13 
     14 using p224::Point;
     15 
     16 // kBasePointExternal is the P224 base point in external representation.
     17 static 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.
     30 struct TestVector {
     31   uint8 scalar[28];
     32   uint8 affine[28*2];
     33 };
     34 
     35 static const int kNumNISTTestVectors = 52;
     36 
     37 // kNISTTestVectors are the NIST test vectors for P224.
     38 static 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 
    770 TEST(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 
    784 TEST(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 
    796 TEST(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 
    811 TEST(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