1 /*
2  * Copyright (C) 2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *    http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #ifndef RSA_COMMON_PARAN_SPEC_H
17 #define RSA_COMMON_PARAN_SPEC_H
18 
19 #include "securec.h"
20 
21 #include "asy_key_generator.h"
22 #include "asy_key_generator_spi.h"
23 #include "blob.h"
24 #include "detailed_rsa_key_params.h"
25 
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29 
30 static constexpr uint32_t RSA_512_N_BYTE_SIZE = 64;
31 static constexpr uint32_t RSA_512_D_BYTE_SIZE = 64;
32 static constexpr uint32_t RSA_512_E_BYTE_SIZE = 3;
33 
34 static constexpr uint32_t RSA_768_N_BYTE_SIZE = 96;
35 static constexpr uint32_t RSA_768_D_BYTE_SIZE = 96;
36 static constexpr uint32_t RSA_768_E_BYTE_SIZE = 3;
37 
38 static constexpr uint32_t RSA_1024_N_BYTE_SIZE = 128;
39 static constexpr uint32_t RSA_1024_D_BYTE_SIZE = 128;
40 static constexpr uint32_t RSA_1024_E_BYTE_SIZE = 3;
41 
42 static constexpr uint32_t RSA_2048_N_BYTE_SIZE = 256;
43 static constexpr uint32_t RSA_2048_D_BYTE_SIZE = 256;
44 static constexpr uint32_t RSA_2048_E_BYTE_SIZE = 3;
45 
46 static constexpr uint32_t RSA_3072_N_BYTE_SIZE = 384;
47 static constexpr uint32_t RSA_3072_D_BYTE_SIZE = 384;
48 static constexpr uint32_t RSA_3072_E_BYTE_SIZE = 3;
49 
50 static constexpr uint32_t RSA_4096_N_BYTE_SIZE = 512;
51 static constexpr uint32_t RSA_4096_D_BYTE_SIZE = 512;
52 static constexpr uint32_t RSA_4096_E_BYTE_SIZE = 3;
53 
54 static constexpr uint32_t RSA_8192_N_BYTE_SIZE = 1024;
55 static constexpr uint32_t RSA_8192_D_BYTE_SIZE = 1024;
56 static constexpr uint32_t RSA_8192_E_BYTE_SIZE = 3;
57 
58 static constexpr unsigned char CORRECT_512_N[] = {
59     0x9f, 0x25, 0x5d, 0x8b, 0xf9, 0xe1, 0x5c, 0xa8, 0x6f, 0xa3, 0xf1, 0x62, 0x0c, 0x4b,
60     0x78, 0xc4, 0x44, 0x66, 0xe6, 0xe1, 0xe1, 0xf7, 0x29, 0x9c, 0x0f, 0xd7, 0xd1, 0x40,
61     0x57, 0x46, 0x15, 0x1a, 0x1b, 0x93, 0xea, 0xf2, 0x8d, 0x13, 0xb6, 0x22, 0x3e, 0xc6,
62     0x98, 0x2e, 0xf5, 0x47, 0xd2, 0x83, 0x97, 0x6a, 0x2e, 0x60, 0x43, 0xb2, 0xfe, 0x8b,
63     0x7e, 0xf7, 0x36, 0x32, 0xce, 0x27, 0x49, 0xb5
64 };
65 
66 static constexpr unsigned char CORRECT_512_D[] = {
67     0x73, 0xf2, 0xc1, 0x49, 0x2e, 0x71, 0x67, 0x14, 0xc0, 0xe1, 0xed, 0x07, 0xc6, 0x75, 0x66,
68     0x33, 0x78, 0xb2, 0x90, 0x1c, 0x9a, 0x89, 0x7d, 0x23, 0x5a, 0xd7, 0x9e, 0x79, 0x06, 0x1c,
69     0xe5, 0x59, 0xcd, 0xf7, 0xf4, 0x16, 0xf0, 0xc2, 0xd8, 0xb3, 0x3e, 0x3e, 0x14, 0xd3, 0x6e,
70     0xc6, 0x8a, 0x6a, 0x22, 0xb4, 0x84, 0x01, 0x66, 0xf2, 0x61, 0x49, 0xe6, 0x43, 0x9f, 0x8c,
71     0x54, 0x0d, 0xdc, 0x01
72 };
73 
74 static constexpr unsigned char CORRECT_768_N[] = {
75     0xa0, 0x65, 0x4e, 0x6c, 0x75, 0x3b, 0x3b, 0x50, 0x13, 0xbe, 0xf5, 0xc4, 0x1d, 0x22, 0xca,
76     0x4f, 0x39, 0xb0, 0xa0, 0xf4, 0xf2, 0x78, 0x12, 0xea, 0x2e, 0x03, 0x2b, 0xec, 0x84, 0x05,
77     0xcc, 0xa9, 0x3e, 0xc3, 0x77, 0xf7, 0x26, 0x14, 0x75, 0x3e, 0xda, 0x87, 0x7e, 0xb4, 0xf4,
78     0x51, 0xbd, 0x08, 0x10, 0x71, 0x61, 0xf6, 0xc2, 0x34, 0xd1, 0xb3, 0xa6, 0x0d, 0xe7, 0x52,
79     0x82, 0xb9, 0xb1, 0x85, 0x0f, 0xad, 0x09, 0x1c, 0x37, 0x25, 0xb4, 0x70, 0x75, 0xfa, 0xb8,
80     0x17, 0xe9, 0x97, 0x99, 0x1b, 0xa6, 0xb4, 0x03, 0x0e, 0x54, 0x4d, 0x0d, 0x41, 0xfd, 0xbe,
81     0x96, 0xe2, 0xb8, 0xa4, 0xb1, 0x8b
82 };
83 
84 static constexpr unsigned char CORRECT_768_D[] = {
85     0x47, 0x26, 0xa9, 0x73, 0x53, 0x4d, 0xc3, 0x31, 0xf2, 0x90, 0x73, 0x55, 0x5b, 0xd7, 0x63,
86     0x07, 0x62, 0x00, 0x08, 0x66, 0xa0, 0x68, 0xc3, 0x7b, 0x3e, 0x8e, 0x09, 0x9e, 0x11, 0xb2,
87     0xc0, 0xe7, 0x13, 0x00, 0x82, 0xe7, 0x0f, 0xed, 0x63, 0x55, 0x4e, 0x7b, 0x6c, 0xa9, 0xb8,
88     0xf7, 0xc9, 0x72, 0x66, 0x51, 0xb8, 0x72, 0x53, 0x0a, 0x77, 0xcd, 0x84, 0xdc, 0xb0, 0x4b,
89     0xb0, 0x07, 0x92, 0x81, 0x77, 0xaf, 0x22, 0x1a, 0x08, 0x17, 0x6b, 0xf2, 0xd3, 0xf9, 0xd3,
90     0x0e, 0x62, 0x01, 0xdd, 0x1e, 0xc5, 0xa6, 0xa8, 0xb0, 0x75, 0xb1, 0x69, 0x45, 0x9c, 0xde,
91     0xe3, 0xc2, 0x39, 0x09, 0x32, 0x01
92 };
93 
94 static constexpr unsigned char CORRECT_1024_N[] = {
95     0xce, 0x2c, 0xc7, 0xeb, 0xb4, 0xf0, 0xe8, 0x49, 0xec, 0xc8, 0xa3, 0x4f, 0x01, 0xd1, 0x43,
96     0x30, 0xa8, 0xe8, 0x30, 0x1a, 0x1f, 0x2f, 0xe8, 0x17, 0x98, 0x5b, 0x30, 0x15, 0x98, 0x1b,
97     0xc1, 0x84, 0xde, 0x10, 0x36, 0xaf, 0x90, 0x8d, 0x34, 0x98, 0x5c, 0x15, 0x0c, 0x2e, 0xe9,
98     0x07, 0x35, 0x5b, 0x29, 0x12, 0x6d, 0xdf, 0xc7, 0x5b, 0x3a, 0x2f, 0xae, 0x2e, 0xe4, 0x7d,
99     0x14, 0xd6, 0xa9, 0x41, 0x73, 0x08, 0x17, 0xc1, 0x77, 0x87, 0x9e, 0x69, 0x47, 0xb3, 0xf8,
100     0xf4, 0x1c, 0xc1, 0x13, 0x9b, 0xeb, 0x34, 0x84, 0xca, 0x28, 0x6e, 0x63, 0x4e, 0x28, 0x7a,
101     0x22, 0x32, 0xef, 0xd6, 0xde, 0xe5, 0x46, 0x6e, 0xbe, 0x8d, 0x31, 0x56, 0x45, 0x24, 0xc9,
102     0x99, 0xb9, 0xad, 0x45, 0xdd, 0x22, 0x49, 0xd3, 0xde, 0xf7, 0x1f, 0x38, 0x44, 0x42, 0x7e,
103     0xff, 0xdc, 0xd3, 0x6f, 0x93, 0xbb, 0x1c, 0x3d
104 };
105 static constexpr unsigned char CORRECT_1024_D[] = {
106     0x27, 0x52, 0xfb, 0x3e, 0xc5, 0xe0, 0x3d, 0x2d, 0xfc, 0x6f, 0xb8, 0x56, 0x55, 0x6e, 0x68,
107     0x76, 0x5b, 0x81, 0x0d, 0xcb, 0xad, 0xaf, 0x21, 0x81, 0x7e, 0x99, 0xc5, 0xee, 0x18, 0x79,
108     0x12, 0xcc, 0x18, 0xde, 0xd6, 0xcf, 0x5d, 0xae, 0xd1, 0x1d, 0x4e, 0x52, 0xe5, 0x63, 0xfd,
109     0x26, 0x56, 0xd2, 0xf0, 0x5e, 0x87, 0x7e, 0x6b, 0x33, 0xc7, 0x41, 0x58, 0xe3, 0xb0, 0xc8,
110     0xfa, 0xb4, 0x86, 0xcb, 0x90, 0xd5, 0x85, 0xb9, 0xa0, 0x35, 0x32, 0xb9, 0xe2, 0xf5, 0x3c,
111     0x46, 0xe5, 0xb2, 0xd8, 0x5e, 0x27, 0x2e, 0x80, 0x8b, 0xfc, 0x6a, 0xd5, 0x88, 0xe1, 0xcb,
112     0x02, 0xf7, 0xde, 0x6b, 0x26, 0x5b, 0x63, 0xd4, 0xfd, 0x26, 0x23, 0x4f, 0x28, 0x71, 0xc0,
113     0xc0, 0x56, 0x80, 0x38, 0xcc, 0xbe, 0x7e, 0xe4, 0x76, 0xd2, 0x2d, 0x31, 0x1a, 0xeb, 0xa4,
114     0x6d, 0x45, 0x64, 0x34, 0xbe, 0xd2, 0x3b, 0x01
115 };
116 
117 static constexpr unsigned char CORRECT_2048_N[] =
118     "\x92\x60\xd0\x75\x0a\xe1\x17\xee\xe5\x5c\x3f\x3d\xea\xba\x74\x91"
119     "\x75\x21\xa2\x62\xee\x76\x00\x7c\xdf\x8a\x56\x75\x5a\xd7\x3a\x15"
120     "\x98\xa1\x40\x84\x10\xa0\x14\x34\xc3\xf5\xbc\x54\xa8\x8b\x57\xfa"
121     "\x19\xfc\x43\x28\xda\xea\x07\x50\xa4\xc4\x4e\x88\xcf\xf3\xb2\x38"
122     "\x26\x21\xb8\x0f\x67\x04\x64\x43\x3e\x43\x36\xe6\xd0\x03\xe8\xcd"
123     "\x65\xbf\xf2\x11\xda\x14\x4b\x88\x29\x1c\x22\x59\xa0\x0a\x72\xb7"
124     "\x11\xc1\x16\xef\x76\x86\xe8\xfe\xe3\x4e\x4d\x93\x3c\x86\x81\x87"
125     "\xbd\xc2\x6f\x7b\xe0\x71\x49\x3c\x86\xf7\xa5\x94\x1c\x35\x10\x80"
126     "\x6a\xd6\x7b\x0f\x94\xd8\x8f\x5c\xf5\xc0\x2a\x09\x28\x21\xd8\x62"
127     "\x6e\x89\x32\xb6\x5c\x5b\xd8\xc9\x20\x49\xc2\x10\x93\x2b\x7a\xfa"
128     "\x7a\xc5\x9c\x0e\x88\x6a\xe5\xc1\xed\xb0\x0d\x8c\xe2\xc5\x76\x33"
129     "\xdb\x26\xbd\x66\x39\xbf\xf7\x3c\xee\x82\xbe\x92\x75\xc4\x02\xb4"
130     "\xcf\x2a\x43\x88\xda\x8c\xf8\xc6\x4e\xef\xe1\xc5\xa0\xf5\xab\x80"
131     "\x57\xc3\x9f\xa5\xc0\x58\x9c\x3e\x25\x3f\x09\x60\x33\x23\x00\xf9"
132     "\x4b\xea\x44\x87\x7b\x58\x8e\x1e\xdb\xde\x97\xcf\x23\x60\x72\x7a"
133     "\x09\xb7\x75\x26\x2d\x7e\xe5\x52\xb3\x31\x9b\x92\x66\xf0\x5a\x25";
134 
135 static constexpr unsigned char CORRECT_E[] = "\x01\x00\x01";
136 
137 static constexpr unsigned char CORRECT_2048_D[] =
138     "\x6a\x7d\xf2\xca\x63\xea\xd4\xdd\xa1\x91\xd6\x14\xb6\xb3\x85\xe0"
139     "\xd9\x05\x6a\x3d\x6d\x5c\xfe\x07\xdb\x1d\xaa\xbe\xe0\x22\xdb\x08"
140     "\x21\x2d\x97\x61\x3d\x33\x28\xe0\x26\x7c\x9d\xd2\x3d\x78\x7a\xbd"
141     "\xe2\xaf\xcb\x30\x6a\xeb\x7d\xfc\xe6\x92\x46\xcc\x73\xf5\xc8\x7f"
142     "\xdf\x06\x03\x01\x79\xa2\x11\x4b\x76\x7d\xb1\xf0\x83\xff\x84\x1c"
143     "\x02\x5d\x7d\xc0\x0c\xd8\x24\x35\xb9\xa9\x0f\x69\x53\x69\xe9\x4d"
144     "\xf2\x3d\x2c\xe4\x58\xbc\x3b\x32\x83\xad\x8b\xba\x2b\x8f\xa1\xba"
145     "\x62\xe2\xdc\xe9\xac\xcf\xf3\x79\x9a\xae\x7c\x84\x00\x16\xf3\xba"
146     "\x8e\x00\x48\xc0\xb6\xcc\x43\x39\xaf\x71\x61\x00\x3a\x5b\xeb\x86"
147     "\x4a\x01\x64\xb2\xc1\xc9\x23\x7b\x64\xbc\x87\x55\x69\x94\x35\x1b"
148     "\x27\x50\x6c\x33\xd4\xbc\xdf\xce\x0f\x9c\x49\x1a\x7d\x6b\x06\x28"
149     "\xc7\xc8\x52\xbe\x4f\x0a\x9c\x31\x32\xb2\xed\x3a\x2c\x88\x81\xe9"
150     "\xaa\xb0\x7e\x20\xe1\x7d\xeb\x07\x46\x91\xbe\x67\x77\x76\xa7\x8b"
151     "\x5c\x50\x2e\x05\xd9\xbd\xde\x72\x12\x6b\x37\x38\x69\x5e\x2d\xd1"
152     "\xa0\xa9\x8a\x14\x24\x7c\x65\xd8\xa7\xee\x79\x43\x2a\x09\x2c\xb0"
153     "\x72\x1a\x12\xdf\x79\x8e\x44\xf7\xcf\xce\x0c\x49\x81\x47\xa9\xb1";
154 
155 static constexpr unsigned char CORRECT_3072_N[] = {
156     0xf9, 0xb0, 0xc2, 0x4b, 0xe4, 0x8f, 0x50, 0x2c, 0xb9, 0xb3, 0xa5, 0x14, 0x4b, 0xeb, 0x21,
157     0xa4, 0xa0, 0x2a, 0xc2, 0x0a, 0x89, 0xcb, 0x58, 0x40, 0xf3, 0x94, 0x1b, 0x6d, 0xc6, 0x38,
158     0xd3, 0x87, 0x58, 0x8f, 0x52, 0x8e, 0x47, 0x32, 0xf3, 0xa5, 0x5a, 0xcd, 0x75, 0x43, 0xce,
159     0x74, 0x7e, 0x9f, 0x41, 0xad, 0xad, 0x24, 0xe0, 0x0d, 0xb3, 0xaa, 0xe7, 0x58, 0xe1, 0xa3,
160     0x5f, 0x38, 0xbc, 0x1c, 0xa8, 0xe5, 0xba, 0x1f, 0xb4, 0x05, 0x7f, 0xa8, 0xc4, 0x40, 0x95,
161     0x20, 0xd4, 0xbf, 0x8f, 0x03, 0xac, 0x0f, 0x7f, 0x7a, 0x8a, 0xba, 0x13, 0x11, 0x76, 0x49,
162     0x48, 0xc8, 0x67, 0x24, 0xda, 0x3e, 0xeb, 0x29, 0x24, 0xb2, 0x6d, 0x61, 0xa0, 0x5f, 0x7e,
163     0xe1, 0x5b, 0x87, 0xca, 0xc8, 0x5b, 0x06, 0xed, 0x7d, 0xb2, 0x6e, 0xd4, 0x17, 0xde, 0x24,
164     0xcb, 0x65, 0xbc, 0x8d, 0xe4, 0x5d, 0x00, 0x73, 0x21, 0xc0, 0x05, 0x3a, 0x00, 0xe3, 0xa6,
165     0x92, 0x17, 0x25, 0x47, 0x49, 0xbe, 0x56, 0x08, 0x74, 0x23, 0x3a, 0x18, 0x1f, 0xd7, 0x8e,
166     0xa7, 0xc5, 0xec, 0x7c, 0x05, 0x75, 0xd0, 0x83, 0x7a, 0xc4, 0xd7, 0x8a, 0x7f, 0xbf, 0xc6,
167     0xe9, 0x43, 0x29, 0xe9, 0x67, 0xe5, 0x04, 0x48, 0xe1, 0x81, 0x53, 0x54, 0xbb, 0x8e, 0xa1,
168     0x3a, 0x95, 0xd1, 0x6b, 0x93, 0xb4, 0xb2, 0xc3, 0x6e, 0x28, 0x05, 0x45, 0xdf, 0x6e, 0xe8,
169     0x74, 0x49, 0x01, 0xb3, 0x26, 0xef, 0xa1, 0x78, 0xba, 0x4d, 0x11, 0xf1, 0x42, 0xfd, 0x91,
170     0x0d, 0x0f, 0x23, 0xfa, 0x0f, 0x9d, 0xe9, 0xa5, 0x57, 0xdc, 0xd1, 0x7e, 0xce, 0x83, 0x42,
171     0xa4, 0x7f, 0xa6, 0x96, 0xe1, 0x66, 0xc3, 0xa6, 0x65, 0x7a, 0xa3, 0xa8, 0x7a, 0x6d, 0x3d,
172     0xf4, 0x97, 0x84, 0xae, 0x96, 0xce, 0x2d, 0x45, 0x69, 0xe0, 0x13, 0xbd, 0xd9, 0xec, 0x23,
173     0x2a, 0xad, 0xa0, 0x8c, 0xfc, 0xd3, 0x08, 0xc9, 0x27, 0x28, 0xca, 0xd5, 0x4d, 0x29, 0x3e,
174     0x4c, 0xf9, 0x49, 0xd3, 0x09, 0xce, 0xe7, 0x9f, 0xda, 0x83, 0xe6, 0x7e, 0xe4, 0x34, 0xf9,
175     0x52, 0xc1, 0x63, 0x6b, 0xd5, 0x53, 0x7b, 0x99, 0x8c, 0x1b, 0xb5, 0x65, 0xca, 0x4b, 0x0d,
176     0xd3, 0xd4, 0x74, 0x6e, 0x8f, 0x25, 0x99, 0x68, 0x9d, 0x00, 0x89, 0x8c, 0x09, 0x30, 0x8f,
177     0x22, 0x13, 0x77, 0x5d, 0xf8, 0xb2, 0xc1, 0x0f, 0x01, 0x17, 0x91, 0x0c, 0x1b, 0x8b, 0xa2,
178     0xe5, 0x24, 0xd6, 0xef, 0x34, 0xc8, 0x21, 0xc8, 0x32, 0x1d, 0x89, 0x48, 0x73, 0x43, 0x25,
179     0x70, 0xdc, 0x08, 0x2d, 0x49, 0x8a, 0x9d, 0x73, 0xe4, 0xd8, 0x56, 0x86, 0xc4, 0x0d, 0x85,
180     0x65, 0x88, 0x57, 0x3f, 0xe0, 0x83, 0x0a, 0x9c, 0x51, 0x35, 0x82, 0xf2, 0x89, 0x48, 0x4e,
181     0x8e, 0x70, 0x7f, 0xd5, 0xa8, 0x04, 0xae, 0xe3, 0x87
182 };
183 static constexpr unsigned char CORRECT_3072_D[] = {
184     0x2f, 0xba, 0x10, 0xb9, 0x8e, 0xfb, 0xb1, 0xd8, 0x8a, 0xba, 0x82, 0xf0, 0x69, 0x3e, 0x8d,
185     0x94, 0xb9, 0x24, 0xd3, 0x28, 0x4e, 0x84, 0x76, 0xdf, 0x1b, 0x70, 0x10, 0xfa, 0x1f, 0xac,
186     0x97, 0x0a, 0x44, 0xec, 0x48, 0x5c, 0x77, 0xd1, 0x8e, 0x6e, 0xe9, 0xf7, 0x61, 0xd5, 0xcf,
187     0x2d, 0xc7, 0x52, 0x4b, 0xac, 0x95, 0xee, 0xf9, 0x80, 0xc4, 0xfa, 0x02, 0xf4, 0xa3, 0x54,
188     0xa6, 0x0b, 0xe3, 0x31, 0x1b, 0x3b, 0xa6, 0x23, 0x0f, 0x37, 0x09, 0xda, 0xc9, 0x80, 0x8a,
189     0xc0, 0xd6, 0xc9, 0xb2, 0xdd, 0x81, 0xd3, 0x08, 0x8b, 0xf4, 0xde, 0x72, 0x6c, 0xa1, 0x0e,
190     0x8b, 0x01, 0xfb, 0x6d, 0x38, 0xe6, 0x53, 0xee, 0xee, 0x5b, 0xc8, 0xba, 0xa3, 0x7b, 0xfd,
191     0x75, 0xb8, 0x18, 0x31, 0xb3, 0xb0, 0x6a, 0x97, 0x94, 0xb2, 0x39, 0xab, 0x02, 0xd0, 0xec,
192     0x79, 0x90, 0x7d, 0xc5, 0x25, 0x84, 0x7d, 0x64, 0x84, 0x6b, 0xfe, 0xd3, 0xc2, 0x7d, 0xc1,
193     0x46, 0x25, 0x74, 0x73, 0xb6, 0xed, 0xd1, 0xe6, 0x15, 0xc4, 0xf2, 0x02, 0xd0, 0x7b, 0x54,
194     0x82, 0x4f, 0x3b, 0xcf, 0xcc, 0xff, 0x63, 0x16, 0xee, 0xad, 0x97, 0x81, 0x9a, 0xbf, 0x9e,
195     0x96, 0xd1, 0xc6, 0xbe, 0x1d, 0xa4, 0xd1, 0xf7, 0xd8, 0x5a, 0xef, 0x01, 0xc0, 0x44, 0x18,
196     0x1f, 0x69, 0xa9, 0xb9, 0x05, 0x67, 0xc1, 0xcf, 0xc7, 0x4b, 0x91, 0x0e, 0x14, 0x6a, 0x6b,
197     0x92, 0xad, 0x33, 0x3d, 0xbf, 0x09, 0xbb, 0xaf, 0x36, 0xcd, 0x7d, 0xaf, 0x33, 0xcf, 0xbe,
198     0x2f, 0x6e, 0x60, 0xf6, 0x51, 0xb9, 0x7b, 0x7a, 0x1d, 0x95, 0x0c, 0x39, 0xec, 0xe0, 0xbe,
199     0xfe, 0x5a, 0x2c, 0x68, 0xfe, 0x06, 0x04, 0xbc, 0xdb, 0xe6, 0xfd, 0x7f, 0x19, 0xc5, 0x15,
200     0xad, 0x0c, 0x82, 0x91, 0x04, 0x1c, 0xf4, 0x98, 0x40, 0xf3, 0xca, 0xcc, 0xf7, 0xf9, 0xd0,
201     0xac, 0xd8, 0xee, 0x1c, 0x8f, 0x69, 0x72, 0x3a, 0xa9, 0xd1, 0xaf, 0x90, 0x00, 0x55, 0x1d,
202     0x9a, 0x72, 0x9d, 0xd3, 0x3d, 0x02, 0xe9, 0x79, 0xa2, 0x95, 0x13, 0xa9, 0x6f, 0x8e, 0xaf,
203     0xa3, 0x39, 0xe8, 0x3b, 0x01, 0x31, 0x51, 0xc5, 0x46, 0x77, 0xbb, 0xe5, 0x5f, 0xd6, 0x4d,
204     0x19, 0x54, 0xff, 0xd2, 0x40, 0x40, 0x1e, 0x9f, 0x54, 0x69, 0x99, 0xad, 0x12, 0xfe, 0xb5,
205     0xa8, 0xbb, 0x19, 0x9b, 0xcc, 0x63, 0xf7, 0x6d, 0x77, 0xa2, 0x9c, 0x55, 0x33, 0x6c, 0x08,
206     0x95, 0x27, 0x5f, 0x84, 0xb5, 0x9e, 0x2d, 0xa7, 0x96, 0x46, 0x38, 0xf7, 0x29, 0x66, 0xd7,
207     0x01, 0x19, 0x7c, 0xfd, 0x45, 0x87, 0x81, 0xb0, 0xdd, 0xcd, 0x04, 0x73, 0x6a, 0x79, 0xbc,
208     0x77, 0xd7, 0x1d, 0x29, 0x9b, 0xd4, 0x66, 0xec, 0x6d, 0x4f, 0x84, 0xb9, 0xad, 0xcd, 0x6d,
209     0x40, 0x2f, 0xf5, 0x75, 0x1d, 0x3a, 0xbf, 0x01, 0xa9
210 };
211 
212 
213 static constexpr unsigned char CORRECT_4096_N[] = {
214     0xc4, 0x68, 0xa2, 0x94, 0x23, 0xd8, 0xf4, 0x02, 0xf2, 0x0a, 0x0c, 0x50, 0xc8, 0xc2, 0xd5, 0xe5,
215     0x57, 0xfe, 0xf7, 0x3a, 0x51, 0x4e, 0xad, 0x2c, 0x91, 0x58, 0x58, 0x0d, 0xdb, 0x4d, 0x0c, 0x58,
216     0x92, 0x42, 0x07, 0x60, 0x1a, 0xb1, 0x07, 0x97, 0xb9, 0x63, 0xeb, 0x51, 0xef, 0x75, 0x69, 0xe5,
217     0x9a, 0xc7, 0xef, 0xee, 0x20, 0x2f, 0xf2, 0x39, 0x61, 0x7b, 0x0e, 0x6b, 0xf6, 0x07, 0x30, 0xbf,
218     0x30, 0xb4, 0x88, 0x64, 0xf0, 0xde, 0xcc, 0x47, 0xd5, 0xad, 0x7d, 0xfb, 0x81, 0x4d, 0x81, 0xde,
219     0xa7, 0x0b, 0xb1, 0xff, 0xfd, 0x40, 0xca, 0xf8, 0xed, 0xfb, 0x62, 0x2d, 0x83, 0xa8, 0xcc, 0xdc,
220     0x7a, 0x96, 0xea, 0x75, 0x39, 0x8f, 0xc5, 0x50, 0x86, 0x51, 0x04, 0x7d, 0x13, 0x94, 0x17, 0xed,
221     0x1a, 0x90, 0xd8, 0x0f, 0xa3, 0xd7, 0x96, 0x87, 0x49, 0xa8, 0x6c, 0x51, 0x25, 0x2c, 0x0c, 0xf4,
222     0x50, 0x5d, 0xfe, 0xf9, 0x4c, 0x94, 0x83, 0x40, 0xf5, 0x46, 0xa9, 0xcd, 0x42, 0x61, 0x89, 0x8c,
223     0x52, 0x6f, 0xdc, 0x72, 0x5f, 0xfb, 0x11, 0x87, 0x37, 0x00, 0xb1, 0x46, 0x12, 0x93, 0xb9, 0x60,
224     0x94, 0x00, 0x7c, 0x81, 0xc1, 0x48, 0xd7, 0xd3, 0x51, 0xe9, 0x3a, 0x0f, 0x59, 0xad, 0xd3, 0x9f,
225     0x7c, 0x8d, 0x22, 0x61, 0x45, 0xeb, 0x5e, 0x1f, 0x7c, 0xa0, 0x15, 0xb9, 0x8e, 0x4e, 0xe3, 0xca,
226     0xc5, 0x2c, 0x0d, 0x1e, 0x20, 0x76, 0x12, 0xa6, 0x9d, 0xf4, 0x95, 0x6b, 0xa2, 0x9b, 0x92, 0xf3,
227     0xc9, 0x28, 0x2e, 0x97, 0x81, 0xac, 0xd6, 0x2f, 0x98, 0x43, 0xa7, 0xf5, 0x80, 0x8f, 0xc7, 0xfd,
228     0x9c, 0x04, 0xad, 0x5e, 0xcd, 0x61, 0x9d, 0xd0, 0xde, 0xfd, 0x45, 0x42, 0x7e, 0xcf, 0x7e, 0xaf,
229     0xf8, 0x9c, 0xe5, 0xc8, 0xb2, 0x67, 0xfe, 0x68, 0x2d, 0xed, 0xbb, 0x55, 0xdf, 0xba, 0xb2, 0xdf,
230     0x57, 0x73, 0xa6, 0xa4, 0x02, 0x80, 0x33, 0xaf, 0x45, 0xb3, 0x72, 0x2a, 0xca, 0xd0, 0xc2, 0x37,
231     0xbe, 0x11, 0xd8, 0x8e, 0xd7, 0xaa, 0x1f, 0xca, 0xd6, 0x3d, 0xc4, 0x14, 0x27, 0x17, 0x23, 0xda,
232     0xec, 0x29, 0x8a, 0x98, 0x91, 0xf9, 0x8e, 0xdd, 0x5b, 0x69, 0xf2, 0x0a, 0x35, 0xe3, 0x4d, 0x5a,
233     0x35, 0x7d, 0xe5, 0x67, 0xd2, 0x4d, 0x0b, 0xf4, 0x01, 0x28, 0xe8, 0x4f, 0xbf, 0x7d, 0x8d, 0xc0,
234     0x28, 0x8d, 0x6b, 0x3a, 0x2b, 0x98, 0x5d, 0x93, 0x9e, 0x52, 0x85, 0xe9, 0xee, 0xed, 0xc6, 0x1d,
235     0x24, 0x36, 0x0a, 0x91, 0x6c, 0xc7, 0xfa, 0xe5, 0x32, 0x9e, 0xa4, 0x58, 0xc8, 0xa4, 0xe9, 0xc5,
236     0x15, 0x66, 0x4d, 0xfa, 0x77, 0xa0, 0x04, 0xab, 0xc5, 0xe5, 0x3b, 0xe5, 0x58, 0x1b, 0xb7, 0x2e,
237     0x94, 0x2e, 0xdc, 0x65, 0x2f, 0x96, 0x85, 0x96, 0x0e, 0x3d, 0x91, 0x2a, 0x3b, 0xf7, 0x4e, 0xf8,
238     0xef, 0x4a, 0x6e, 0x73, 0xb0, 0x4b, 0xd1, 0xd7, 0xa0, 0xbe, 0x03, 0x22, 0x30, 0x10, 0x06, 0x07,
239     0xcb, 0x0c, 0x64, 0xb5, 0x0f, 0xa1, 0x89, 0x2a, 0x7a, 0xe6, 0x39, 0xc1, 0x66, 0x94, 0xe5, 0x88,
240     0x2a, 0x6e, 0xea, 0x3f, 0x30, 0xe4, 0x1f, 0x93, 0x38, 0xa6, 0x04, 0x64, 0x23, 0x4e, 0x1b, 0x65,
241     0xa0, 0x50, 0x86, 0x27, 0x6c, 0xab, 0xf5, 0xfb, 0x38, 0x31, 0x40, 0x78, 0x1b, 0xc1, 0xf8, 0xe3,
242     0x9c, 0x65, 0xd8, 0x1a, 0x6b, 0x14, 0x7e, 0x4e, 0x30, 0x39, 0x58, 0x21, 0xba, 0x85, 0xe2, 0x40,
243     0xc2, 0xb8, 0xb3, 0x7a, 0xd8, 0xd6, 0x54, 0xfa, 0xcd, 0x99, 0xb4, 0xb0, 0x3a, 0x62, 0xb7, 0x70,
244     0x23, 0x0f, 0xec, 0x8c, 0xf0, 0x4c, 0x84, 0xeb, 0x68, 0xa8, 0x92, 0xd5, 0x65, 0x17, 0x25, 0x77,
245     0xaa, 0x9c, 0x54, 0x57, 0x9e, 0xe6, 0xc6, 0x35, 0x85, 0xb1, 0x19, 0x77, 0xb0, 0xe6, 0xe7, 0xeb
246 };
247 static constexpr unsigned char CORRECT_4096_D[] = {
248     0x71, 0xb9, 0x50, 0x61, 0xcc, 0x7b, 0xe3, 0x96, 0x0d, 0x05, 0x8a, 0x6a, 0x00, 0x44, 0xe8, 0x4a,
249     0xfa, 0x6f, 0xb4, 0x40, 0xfd, 0x31, 0x3c, 0x0e, 0x71, 0x3e, 0x21, 0x06, 0x2c, 0xf3, 0xe8, 0xf1,
250     0x24, 0x06, 0xbd, 0x74, 0x85, 0x1f, 0xfa, 0x10, 0x7d, 0x15, 0x00, 0xfd, 0x99, 0x54, 0x77, 0xf3,
251     0xad, 0x72, 0x95, 0x57, 0x61, 0x25, 0xc1, 0xf0, 0x3d, 0xa4, 0x5e, 0x0e, 0x5f, 0x0f, 0x7c, 0xc7,
252     0x47, 0x71, 0x51, 0x04, 0x79, 0x7f, 0xd7, 0xf2, 0xc4, 0x23, 0xc7, 0xad, 0xa8, 0x09, 0xf3, 0xe7,
253     0xb2, 0xfb, 0x8f, 0x9e, 0x74, 0xca, 0x5e, 0x7c, 0x52, 0x77, 0xdb, 0x3a, 0x15, 0x60, 0xd8, 0xf5,
254     0xd4, 0xb9, 0xab, 0x9a, 0x22, 0xb1, 0x3f, 0x83, 0xc7, 0xb2, 0x03, 0x92, 0x54, 0x92, 0xcc, 0x63,
255     0xca, 0x9d, 0x11, 0xad, 0xc4, 0xa5, 0xa1, 0x10, 0x46, 0xb3, 0x11, 0xbc, 0xce, 0x74, 0x3a, 0x30,
256     0x00, 0x94, 0xdc, 0x7d, 0x07, 0x3d, 0x7a, 0xde, 0x52, 0xe7, 0x0e, 0x8c, 0xbe, 0x21, 0xf1, 0xdd,
257     0xe1, 0x21, 0xca, 0x18, 0x23, 0xc1, 0x21, 0x3e, 0x14, 0xb7, 0xfe, 0xed, 0x5e, 0xf6, 0x50, 0x41,
258     0x3e, 0x91, 0x25, 0x86, 0x90, 0x1f, 0x18, 0x70, 0xd0, 0x9d, 0xe5, 0xb3, 0x5b, 0xae, 0xcd, 0xb9,
259     0x2c, 0x0a, 0x20, 0x5d, 0x08, 0x7a, 0x27, 0x2e, 0xbe, 0x1f, 0x87, 0x54, 0xc0, 0xb4, 0xa7, 0x2b,
260     0x12, 0x8d, 0xd6, 0x2e, 0x9a, 0x87, 0x23, 0x77, 0x7c, 0x40, 0x51, 0x80, 0x58, 0x50, 0x12, 0x7f,
261     0xbb, 0xfa, 0xdb, 0x37, 0x78, 0xab, 0x55, 0xfd, 0x8b, 0x01, 0xa9, 0xaf, 0xfa, 0x37, 0xc6, 0x89,
262     0xef, 0x1b, 0xba, 0x33, 0x09, 0x62, 0xbb, 0x59, 0x64, 0xb4, 0x6b, 0xb4, 0xfb, 0xee, 0x33, 0x21,
263     0xbb, 0x27, 0x45, 0xd9, 0xb6, 0x8b, 0x86, 0x80, 0x56, 0x0f, 0xb0, 0x08, 0x22, 0x1a, 0x5d, 0x54,
264     0xf6, 0x96, 0xc4, 0x47, 0x77, 0x85, 0xec, 0x3c, 0x86, 0x91, 0xc4, 0x03, 0x0e, 0xc3, 0x9f, 0x99,
265     0xc4, 0x7e, 0xef, 0x78, 0x2e, 0x7b, 0x60, 0xb0, 0x9e, 0x49, 0x53, 0xa7, 0x9f, 0x1b, 0x74, 0x32,
266     0xf4, 0x31, 0x3f, 0x5b, 0x75, 0xd3, 0xc0, 0x59, 0xa2, 0x47, 0xd7, 0xe8, 0x69, 0x82, 0x3c, 0x6c,
267     0xfd, 0xfa, 0x24, 0xb6, 0xa7, 0x3c, 0xaa, 0x29, 0x94, 0xa1, 0x68, 0x67, 0x09, 0xd4, 0x93, 0xc3,
268     0x0e, 0x76, 0xa1, 0xbd, 0x9b, 0xfb, 0xca, 0x2a, 0x05, 0x07, 0xfc, 0xdc, 0x14, 0xb0, 0x9c, 0x44,
269     0x30, 0xde, 0x02, 0x26, 0x21, 0x5f, 0x86, 0xb8, 0x6a, 0x81, 0xf2, 0xf0, 0xe1, 0xc1, 0x3d, 0x16,
270     0xfe, 0xca, 0x80, 0xc7, 0xe3, 0xdb, 0x8b, 0xd2, 0xbd, 0x3d, 0xaa, 0x51, 0xac, 0xcd, 0x95, 0x0d,
271     0x1c, 0x5b, 0x1e, 0x63, 0xb1, 0xf7, 0x85, 0xe2, 0xba, 0x65, 0xef, 0x68, 0xab, 0x55, 0xea, 0xc6,
272     0xd8, 0x93, 0x82, 0x50, 0x33, 0x58, 0x90, 0x00, 0x47, 0x19, 0x50, 0x79, 0x9f, 0x8d, 0xe4, 0xb0,
273     0x64, 0xca, 0xb1, 0xdd, 0xae, 0x47, 0x44, 0x3f, 0x81, 0x31, 0xd6, 0x90, 0x36, 0x93, 0x07, 0x21,
274     0xb8, 0x44, 0x38, 0xbb, 0xd6, 0xdc, 0x00, 0x58, 0x87, 0xcc, 0xe9, 0x75, 0x5a, 0x82, 0x84, 0x38,
275     0x5d, 0x63, 0x6d, 0x6b, 0x58, 0x4d, 0x9d, 0x97, 0xfc, 0xa7, 0xea, 0x18, 0x61, 0xdc, 0xed, 0xd7,
276     0x16, 0xce, 0x81, 0xf5, 0x5b, 0x36, 0xda, 0xe0, 0x68, 0xba, 0xf6, 0x1f, 0x1b, 0xa5, 0xe3, 0x04,
277     0xb5, 0xbe, 0xba, 0x49, 0x67, 0x76, 0x65, 0x90, 0xb2, 0x6d, 0x8f, 0x79, 0xad, 0xe9, 0x3c, 0x54,
278     0x84, 0xfb, 0x73, 0x9b, 0x68, 0x3b, 0xbe, 0x4c, 0x1a, 0xfc, 0xe5, 0xa3, 0x9d, 0x0c, 0x94, 0xbb,
279     0x47, 0xe2, 0xa8, 0x10, 0x1e, 0xf1, 0xb7, 0xdb, 0x3e, 0x50, 0x1f, 0x1d, 0x09, 0x39, 0x48, 0xa1
280 };
281 
282 static constexpr unsigned char CORRECT_8192_N[] = {
283     0xbe, 0xb0, 0x16, 0xc4, 0x00, 0xfe, 0x62, 0x75, 0x53, 0x5e, 0x2f, 0x0d, 0x36, 0xbe, 0x94, 0x7b,
284     0x8e, 0x58, 0xb4, 0x98, 0xaa, 0xa7, 0xdf, 0x81, 0x74, 0xc7, 0xda, 0x8c, 0x35, 0x37, 0xd0, 0x21,
285     0xf0, 0x36, 0x27, 0xdb, 0x25, 0xbb, 0xd2, 0x05, 0xb9, 0xf1, 0xce, 0x15, 0xec, 0x65, 0x2f, 0x9c,
286     0x89, 0x01, 0xf6, 0x6a, 0x92, 0x42, 0x39, 0xa4, 0xad, 0xc5, 0x3c, 0x60, 0x0e, 0x48, 0x3b, 0x3b,
287     0x1a, 0xe6, 0xce, 0xdd, 0x61, 0xe2, 0xda, 0x08, 0x1d, 0x3b, 0x18, 0xfa, 0x12, 0x4f, 0x53, 0x70,
288     0x56, 0xdc, 0xc6, 0xc6, 0xbe, 0x19, 0xc7, 0x8f, 0x4d, 0x25, 0x5c, 0xf5, 0x58, 0x44, 0xd0, 0x64,
289     0xfd, 0xd6, 0xb3, 0x55, 0xca, 0xd9, 0x06, 0x4e, 0x69, 0xdf, 0x4e, 0x76, 0x64, 0x41, 0xbb, 0xd7,
290     0x5a, 0x26, 0xe1, 0x5e, 0x62, 0x54, 0x30, 0xf6, 0x79, 0x15, 0x5b, 0x9a, 0x88, 0x73, 0xb1, 0xbe,
291     0x0a, 0xfe, 0x54, 0x04, 0x13, 0x99, 0x3b, 0xfa, 0xfc, 0x8f, 0x9a, 0x93, 0xd4, 0x14, 0xde, 0x09,
292     0x98, 0x78, 0x98, 0x10, 0x39, 0xdf, 0x9f, 0x58, 0xae, 0x10, 0xb1, 0xab, 0xe6, 0xae, 0x39, 0x85,
293     0xe1, 0x83, 0x74, 0xf8, 0x05, 0x2a, 0xf8, 0xb3, 0xca, 0x4a, 0xee, 0x17, 0xce, 0xcf, 0x6b, 0x25,
294     0x8c, 0xba, 0x89, 0x92, 0x3c, 0xc9, 0x0a, 0xe6, 0x93, 0x84, 0x3e, 0x81, 0xc6, 0x8c, 0x85, 0x6c,
295     0x1a, 0xa6, 0xe9, 0x8e, 0x58, 0xe6, 0x94, 0x3c, 0xeb, 0xaf, 0x98, 0x55, 0xab, 0x6c, 0x8c, 0x66,
296     0xe8, 0x45, 0x99, 0x2e, 0xd3, 0xad, 0xd8, 0xac, 0x9e, 0x78, 0x15, 0x78, 0x86, 0x5e, 0x97, 0x83,
297     0x53, 0x34, 0xab, 0xec, 0xa5, 0x54, 0xf7, 0x82, 0xf1, 0x17, 0x01, 0x91, 0x96, 0x24, 0x6d, 0x7c,
298     0x22, 0x4d, 0x67, 0xca, 0xa5, 0x67, 0x34, 0x59, 0xe8, 0x79, 0x71, 0x8d, 0xe5, 0xba, 0x31, 0x65,
299     0x82, 0xfa, 0xa8, 0x8c, 0x1f, 0xe6, 0x1b, 0x7f, 0x03, 0xec, 0x60, 0x6e, 0xcd, 0xac, 0x75, 0xfd,
300     0xaa, 0x9b, 0xf9, 0x6c, 0xe0, 0x83, 0x5a, 0x37, 0x32, 0xc7, 0x5c, 0x5c, 0x85, 0xb2, 0xd0, 0xe7,
301     0x6e, 0x90, 0xa7, 0x24, 0x5a, 0x34, 0x6a, 0x09, 0xfd, 0x51, 0x12, 0xf3, 0xd1, 0xe5, 0x5d, 0xee,
302     0x9f, 0x6d, 0xc8, 0xc8, 0x14, 0x43, 0x55, 0x26, 0x26, 0xb3, 0xe3, 0x47, 0x18, 0xdf, 0xcf, 0x34,
303     0xc7, 0xda, 0xa6, 0x62, 0x59, 0xab, 0xa1, 0xe7, 0x87, 0x35, 0x34, 0x7b, 0x75, 0x68, 0x0a, 0x84,
304     0xc4, 0x3b, 0xb3, 0x7c, 0xe8, 0xda, 0x42, 0x77, 0x04, 0xf4, 0x5e, 0x75, 0xaf, 0xa1, 0x02, 0x58,
305     0xc7, 0x84, 0x51, 0x57, 0xc4, 0xc1, 0xad, 0xbf, 0x49, 0x71, 0xb2, 0x55, 0x99, 0xae, 0xec, 0xf1,
306     0x20, 0xe0, 0x92, 0x6e, 0x95, 0xa3, 0x74, 0x65, 0xbe, 0x1b, 0xeb, 0xd5, 0xf3, 0x2c, 0xe8, 0xcb,
307     0xc2, 0xfc, 0x20, 0x60, 0x39, 0xbf, 0xb0, 0xbe, 0xac, 0xc0, 0x15, 0x59, 0x56, 0x64, 0x13, 0xa8,
308     0xb4, 0x0b, 0xfe, 0xf3, 0x2e, 0xc6, 0xbe, 0x8c, 0x58, 0x7a, 0x98, 0x0f, 0x46, 0x60, 0x59, 0xcd,
309     0xfb, 0xd0, 0x5f, 0x37, 0x16, 0x9d, 0xb4, 0xfe, 0x5f, 0x30, 0x2a, 0x96, 0x7c, 0x07, 0x22, 0x46,
310     0x9b, 0xe7, 0x22, 0x10, 0xd2, 0x1e, 0xca, 0xc4, 0xab, 0xd4, 0x23, 0x9a, 0x65, 0x5d, 0xa9, 0xc2,
311     0x50, 0x2d, 0xf3, 0x44, 0x5a, 0x8b, 0x4e, 0x11, 0x18, 0x41, 0xcb, 0xca, 0xa3, 0x5a, 0x1e, 0xf9,
312     0xec, 0xbe, 0xc7, 0x8b, 0xd4, 0x90, 0xa4, 0x79, 0x03, 0x9c, 0xf2, 0x97, 0xfc, 0x33, 0xc1, 0x30,
313     0x58, 0x7b, 0x4e, 0xce, 0xb5, 0x0d, 0x0e, 0x11, 0x1a, 0x29, 0x39, 0x1c, 0xe2, 0x88, 0x67, 0xa1,
314     0x2f, 0xb8, 0x42, 0x30, 0x72, 0x03, 0x90, 0x01, 0xe1, 0x20, 0x0b, 0xad, 0x11, 0x63, 0xaa, 0xa3,
315     0x55, 0x52, 0xf8, 0xb8, 0xe6, 0xe3, 0x2e, 0xc5, 0xf3, 0x1a, 0xfd, 0x72, 0x2b, 0xb7, 0xef, 0x4c,
316     0x4b, 0xf8, 0x36, 0x58, 0x34, 0x15, 0xe4, 0x3b, 0xdd, 0xd0, 0x77, 0xf8, 0x46, 0xa1, 0x8f, 0x98,
317     0xdb, 0x44, 0xc6, 0xc2, 0x30, 0xe5, 0x25, 0x3c, 0x39, 0x5c, 0xe4, 0x36, 0xc6, 0x74, 0xed, 0xd1,
318     0x20, 0x81, 0xea, 0xd9, 0x72, 0x4a, 0xad, 0xfa, 0x19, 0x22, 0xc0, 0x69, 0x33, 0xd7, 0x46, 0xb5,
319     0x32, 0xfd, 0xa6, 0x30, 0xf9, 0x0f, 0xd9, 0x19, 0xac, 0x71, 0xb2, 0x43, 0x8d, 0x5a, 0xda, 0x55,
320     0xdd, 0x70, 0xdc, 0x1c, 0xf2, 0xdb, 0x93, 0x93, 0xc9, 0xaa, 0xee, 0x38, 0x7a, 0x22, 0xe6, 0x64,
321     0xa3, 0xbf, 0x65, 0x28, 0xa3, 0x34, 0x36, 0x91, 0xff, 0xe8, 0x73, 0x90, 0x35, 0x64, 0xad, 0x0a,
322     0xcf, 0xa3, 0xac, 0x04, 0x96, 0x83, 0xf4, 0x55, 0x07, 0x8e, 0xf7, 0x90, 0x1d, 0xa3, 0x22, 0xf5,
323     0x4d, 0x7a, 0xb0, 0xf6, 0x7e, 0xfc, 0xe6, 0x0b, 0x59, 0xab, 0xd5, 0x38, 0xa3, 0xa7, 0x45, 0x5d,
324     0x88, 0x9c, 0x7f, 0xc0, 0x7d, 0x99, 0xce, 0x6d, 0x45, 0xce, 0x70, 0xea, 0x4f, 0x85, 0x86, 0x90,
325     0xdb, 0xf6, 0xaf, 0xbe, 0x79, 0x7a, 0xcc, 0x94, 0x47, 0x2c, 0x28, 0x7a, 0xcc, 0xdc, 0x8c, 0x52,
326     0xc1, 0x6b, 0x87, 0xf6, 0x98, 0x79, 0x03, 0x39, 0xcd, 0x51, 0xc9, 0x41, 0x0e, 0x9b, 0x84, 0xaa,
327     0x8e, 0x16, 0x2d, 0xaf, 0xb6, 0x50, 0xbd, 0xc1, 0xbb, 0xf4, 0xea, 0x02, 0x2a, 0xe8, 0x10, 0x41,
328     0xe8, 0x39, 0xc5, 0xce, 0x6d, 0x03, 0x9e, 0x2f, 0xc7, 0x35, 0x58, 0x76, 0x06, 0xfa, 0xf5, 0x67,
329     0x99, 0x8f, 0x40, 0xfe, 0xd7, 0x2d, 0x0f, 0xe0, 0xae, 0x5f, 0x0e, 0x47, 0xe5, 0x9f, 0xb3, 0x19,
330     0xa0, 0x7d, 0xe9, 0xd4, 0xa0, 0x08, 0xed, 0xcb, 0x84, 0xc3, 0x2a, 0xc5, 0xb9, 0x66, 0xf7, 0x55,
331     0x4f, 0x6b, 0x26, 0xc7, 0xca, 0x4f, 0xf4, 0xc0, 0x80, 0xe9, 0xcb, 0x5a, 0x0a, 0x02, 0xe1, 0x15,
332     0xd7, 0x5d, 0xb8, 0x47, 0x71, 0xec, 0xa3, 0x20, 0xfb, 0x73, 0xfb, 0x65, 0x4b, 0x7d, 0x25, 0xe8,
333     0x9d, 0x38, 0x81, 0x56, 0x31, 0x39, 0x95, 0xfe, 0x30, 0x13, 0xf6, 0x83, 0x28, 0x97, 0xe5, 0xa2,
334     0xf4, 0xf7, 0x0e, 0x7d, 0x6b, 0xc2, 0xfa, 0x81, 0xbb, 0xe7, 0x4a, 0x3b, 0x4c, 0x53, 0x04, 0xe1,
335     0x51, 0x50, 0xea, 0xf2, 0x4c, 0xc7, 0x9d, 0xe7, 0x5e, 0x5b, 0x06, 0x19, 0x88, 0x9a, 0xc2, 0x89,
336     0x9c, 0xf2, 0xab, 0xeb, 0xf6, 0xf3, 0xeb, 0xb5, 0xd0, 0x20, 0x3d, 0xce, 0x3d, 0xea, 0xea, 0x04,
337     0xf1, 0x83, 0x87, 0xc8, 0x0c, 0x90, 0x61, 0x81, 0x33, 0x14, 0x40, 0x1d, 0x9e, 0x3c, 0xcf, 0xba,
338     0x54, 0x41, 0x5f, 0xb2, 0x77, 0x7c, 0xad, 0x52, 0xe0, 0x5d, 0x30, 0xcc, 0xca, 0x25, 0x07, 0x23,
339     0xcf, 0xa5, 0xca, 0x12, 0x1b, 0x9c, 0x8b, 0x0c, 0xd3, 0x72, 0xda, 0x1c, 0x5d, 0xf1, 0x5a, 0x02,
340     0x32, 0x40, 0x58, 0x8f, 0x13, 0x37, 0xf7, 0x9d, 0x16, 0x46, 0xd2, 0x62, 0xc9, 0x93, 0x7e, 0x35,
341     0x29, 0x40, 0x98, 0x78, 0xe9, 0x3c, 0xb5, 0x99, 0x39, 0xcf, 0xa3, 0xcc, 0xcc, 0x4f, 0xf5, 0xa9,
342     0x82, 0x35, 0xf8, 0x61, 0xee, 0x41, 0xec, 0xfa, 0x9b, 0x70, 0x53, 0x1d, 0xcf, 0x72, 0xc1, 0xef,
343     0xdc, 0xc8, 0xd8, 0x73, 0x09, 0x04, 0x91, 0x0e, 0xc1, 0xfc, 0xc4, 0x78, 0xf8, 0xd7, 0x09, 0x68,
344     0xc6, 0x75, 0x58, 0xe3, 0x79, 0x8d, 0xe6, 0xfd, 0xdd, 0x03, 0x1b, 0x00, 0x85, 0x89, 0xbf, 0xe0,
345     0xf9, 0x09, 0x8d, 0x5b, 0xe3, 0xab, 0xe7, 0x17, 0xab, 0x4a, 0x35, 0xdf, 0xe6, 0xf8, 0x7d, 0xc5,
346     0x6d, 0xfd, 0x1f, 0x5e, 0x85, 0xbe, 0xa8, 0x56, 0x18, 0xa2, 0x10, 0xcc, 0x4d, 0x4f, 0xac, 0x69
347 };
348 static constexpr unsigned char CORRECT_8192_D[] = {
349     0x9e, 0x4c, 0x46, 0x09, 0xde, 0x9d, 0x4f, 0x15, 0x00, 0xe9, 0x4d, 0xfc, 0x15, 0x37, 0x2e, 0xc2,
350     0x47, 0x50, 0x22, 0x54, 0x1e, 0x4f, 0x8f, 0xfe, 0xc2, 0xf8, 0x69, 0xd8, 0x3d, 0x11, 0xa1, 0x49,
351     0x9b, 0x45, 0x09, 0xdf, 0x26, 0x3a, 0xfe, 0x45, 0xdc, 0xaf, 0xfc, 0x9a, 0x3c, 0x8d, 0x5f, 0x71,
352     0xfe, 0x56, 0xcf, 0xbe, 0x76, 0xbe, 0x5d, 0x65, 0xf5, 0x0f, 0xa8, 0x68, 0x41, 0x52, 0xfb, 0x40,
353     0xbc, 0xbb, 0x60, 0x7d, 0x6d, 0x96, 0x49, 0xd3, 0xb4, 0x98, 0x6b, 0xca, 0xa5, 0x4a, 0x8f, 0x04,
354     0xd2, 0x47, 0x23, 0x08, 0xb7, 0xa5, 0x65, 0x01, 0xf4, 0x54, 0x11, 0x10, 0x67, 0x7f, 0x70, 0xd4,
355     0x75, 0xd9, 0x37, 0x35, 0x00, 0x59, 0x1b, 0xa0, 0x1a, 0xc9, 0xd3, 0x33, 0xfb, 0x54, 0x8a, 0x60,
356     0x63, 0x29, 0xa5, 0xab, 0x99, 0xcb, 0x34, 0x7e, 0x57, 0xd4, 0x40, 0x20, 0x50, 0x28, 0x63, 0x24,
357     0x55, 0xb1, 0xfe, 0x03, 0x08, 0x56, 0x0b, 0xf1, 0xf6, 0x9a, 0x2c, 0x03, 0x8e, 0x6a, 0xe8, 0x4c,
358     0x64, 0xf3, 0xaf, 0xa0, 0xc0, 0xba, 0x80, 0x68, 0xb8, 0xcf, 0x88, 0xff, 0x20, 0x57, 0xff, 0xce,
359     0xc1, 0x80, 0x44, 0xa8, 0xe4, 0x79, 0x60, 0xce, 0xb8, 0x1f, 0x6d, 0xf9, 0xfb, 0xa8, 0x3a, 0xd5,
360     0x88, 0x37, 0x0e, 0x9f, 0x84, 0xb0, 0x8c, 0xc9, 0x0f, 0x2b, 0x18, 0x4c, 0xd9, 0x8b, 0xab, 0xf3,
361     0x2b, 0x48, 0xe6, 0xd8, 0x51, 0xba, 0xd0, 0xd2, 0xa6, 0x01, 0x36, 0x5f, 0xe0, 0x18, 0x13, 0x92,
362     0x16, 0x3e, 0x38, 0xc5, 0x23, 0xda, 0xcc, 0xe5, 0xb8, 0x04, 0x0e, 0x26, 0xe8, 0xbd, 0x3b, 0xe0,
363     0x3c, 0x41, 0x9c, 0x7b, 0xae, 0x60, 0x93, 0xbc, 0x72, 0xf1, 0xdb, 0x4e, 0x85, 0xaa, 0xa5, 0xed,
364     0x07, 0xf8, 0xe4, 0x31, 0xd9, 0x0f, 0x8c, 0xe9, 0x1a, 0x51, 0x3e, 0xd0, 0x42, 0x26, 0x48, 0x7d,
365     0x71, 0xb7, 0x2e, 0x16, 0x6d, 0x20, 0xb4, 0x30, 0xc4, 0x0c, 0x05, 0x9d, 0xd6, 0x45, 0xd6, 0x09,
366     0x88, 0x09, 0x45, 0x8d, 0x79, 0xef, 0xf1, 0x03, 0xa3, 0xb6, 0xd6, 0x58, 0xc4, 0x70, 0xc6, 0x75,
367     0x69, 0x56, 0xd2, 0x3a, 0x1e, 0x5c, 0x26, 0xaf, 0x36, 0x48, 0x88, 0x88, 0x39, 0xf5, 0xc3, 0xfd,
368     0xa5, 0x02, 0x19, 0x4c, 0xe7, 0x6d, 0x62, 0x11, 0x72, 0xcd, 0xa0, 0xde, 0x53, 0xaa, 0xf0, 0x33,
369     0x6b, 0xb9, 0x7a, 0xa8, 0x68, 0xb2, 0x4f, 0x8c, 0x89, 0xb4, 0xc4, 0x65, 0xbc, 0xf8, 0x6a, 0xca,
370     0xfe, 0xb0, 0x64, 0xf7, 0x4b, 0xc2, 0x6c, 0xac, 0xab, 0x43, 0x45, 0xeb, 0x42, 0xaa, 0x51, 0xed,
371     0x6b, 0x6b, 0xcf, 0xaf, 0x21, 0xda, 0x7a, 0xa7, 0x32, 0x8c, 0x1d, 0x34, 0x6c, 0x89, 0x47, 0x8f,
372     0x80, 0xf0, 0x8c, 0xff, 0x1a, 0x5f, 0xff, 0xef, 0xba, 0x5b, 0x29, 0x73, 0x8a, 0x14, 0xfd, 0x08,
373     0xb2, 0x4c, 0x65, 0x80, 0x1c, 0x50, 0xa2, 0xa4, 0x17, 0x7a, 0xb9, 0xfe, 0x58, 0xf6, 0x69, 0x4f,
374     0x82, 0x6f, 0xf6, 0xec, 0xe0, 0x27, 0x02, 0xe6, 0x35, 0x49, 0x48, 0x54, 0x5d, 0xe2, 0xfc, 0x8a,
375     0x40, 0x02, 0x22, 0x18, 0xf4, 0x40, 0x65, 0x91, 0x49, 0x6a, 0x0d, 0xe0, 0xb1, 0x03, 0xa7, 0x13,
376     0xa0, 0xb6, 0xc6, 0x93, 0xda, 0x2a, 0xcf, 0xbf, 0x66, 0xb9, 0x8b, 0xf8, 0xcf, 0x2f, 0x6b, 0x0e,
377     0xb1, 0x4b, 0x04, 0x08, 0xf9, 0x75, 0x6d, 0x90, 0x49, 0x67, 0xcd, 0x8a, 0xe2, 0x02, 0x9d, 0x76,
378     0x72, 0x6f, 0x89, 0xed, 0xed, 0xbf, 0x49, 0x9a, 0x60, 0x42, 0x79, 0x2d, 0x6c, 0xa3, 0x76, 0x3b,
379     0xf1, 0x28, 0x24, 0x2a, 0xfb, 0x27, 0xe4, 0x46, 0x94, 0x46, 0x26, 0x70, 0x71, 0x2a, 0x35, 0x85,
380     0x1c, 0xbd, 0x44, 0xcd, 0x3c, 0xc8, 0xf2, 0x52, 0x6d, 0x16, 0x12, 0x3b, 0x51, 0x15, 0x41, 0x00,
381     0x39, 0xa2, 0x53, 0x1e, 0x41, 0x98, 0x34, 0x69, 0xc8, 0x42, 0x3d, 0xdd, 0x5b, 0x92, 0xc4, 0xdf,
382     0xa7, 0x22, 0xc5, 0xc1, 0x6f, 0x07, 0x60, 0xcd, 0x9b, 0x80, 0xcf, 0x4e, 0x88, 0xad, 0xe6, 0xc3,
383     0x0a, 0x3e, 0x02, 0xba, 0x52, 0x29, 0x30, 0xe2, 0xdc, 0xe1, 0x67, 0x1d, 0x3e, 0x69, 0x0d, 0x8b,
384     0x18, 0x93, 0xad, 0xd4, 0x21, 0xc5, 0x4d, 0x38, 0xc8, 0x1f, 0xec, 0xf1, 0xdb, 0xa3, 0xa2, 0xf5,
385     0x75, 0x42, 0xf1, 0x87, 0xe5, 0xa1, 0xdf, 0x44, 0x6c, 0xa4, 0xa3, 0x05, 0x37, 0x99, 0x74, 0x2f,
386     0x81, 0x93, 0xcb, 0xeb, 0x21, 0xae, 0xa7, 0x05, 0x44, 0xb3, 0x4a, 0x15, 0xed, 0x7c, 0x25, 0xe0,
387     0xb4, 0x46, 0xf7, 0x56, 0xfe, 0x80, 0xb6, 0x9f, 0x1c, 0xb8, 0xf8, 0x36, 0xc9, 0x1a, 0x1f, 0x5d,
388     0x38, 0xe3, 0x24, 0x62, 0x31, 0x95, 0xf8, 0x67, 0x5a, 0xdb, 0xe4, 0x24, 0x30, 0x8f, 0x8b, 0xb6,
389     0xa5, 0xb2, 0xa5, 0x4d, 0x1d, 0x10, 0x1a, 0xa8, 0x68, 0x01, 0xd0, 0x9e, 0xc3, 0x2f, 0xaf, 0x2a,
390     0x05, 0xcc, 0xac, 0xb1, 0x5b, 0xbe, 0x72, 0x72, 0x0e, 0xf1, 0xb3, 0x51, 0x0e, 0x7a, 0x18, 0x93,
391     0x3f, 0x57, 0xc2, 0x6b, 0x13, 0xae, 0x2b, 0xcf, 0xa5, 0x6b, 0x30, 0x49, 0xe5, 0x8f, 0xbb, 0xf2,
392     0x6c, 0xe3, 0x87, 0xdf, 0x21, 0x34, 0x3e, 0x25, 0xee, 0x7d, 0x6e, 0x56, 0x01, 0xbe, 0x03, 0xd0,
393     0x3c, 0xce, 0x09, 0x6b, 0x6e, 0x6a, 0x1c, 0x04, 0xb7, 0x4a, 0xc6, 0xc0, 0x40, 0xad, 0xdc, 0x3d,
394     0x1d, 0xb2, 0x44, 0x84, 0x3e, 0x25, 0x2c, 0x63, 0x87, 0x26, 0x0d, 0x80, 0x33, 0xe8, 0xc5, 0xf6,
395     0x7d, 0x54, 0x0a, 0xad, 0xe9, 0x92, 0x49, 0xdf, 0xe2, 0x43, 0x03, 0x87, 0x45, 0xd3, 0x76, 0xac,
396     0x3c, 0x61, 0x5a, 0x66, 0xc5, 0x22, 0x27, 0xff, 0x22, 0xe3, 0x2d, 0x46, 0x9e, 0xaf, 0x21, 0x3f,
397     0xc0, 0x91, 0x97, 0x1a, 0xcd, 0x8d, 0x0d, 0xb2, 0x0c, 0xfc, 0x91, 0xc4, 0x9a, 0x73, 0xb4, 0x01,
398     0x18, 0xd6, 0xec, 0xa5, 0xad, 0x13, 0xb5, 0x7e, 0xae, 0xab, 0xaa, 0xf7, 0xce, 0xdf, 0x52, 0x2e,
399     0xf3, 0x5f, 0x38, 0xef, 0x90, 0x68, 0xd6, 0xe9, 0x5a, 0x89, 0x70, 0xe8, 0x0f, 0x42, 0xe6, 0x89,
400     0xb9, 0x79, 0xf9, 0xb8, 0x46, 0xbc, 0x0d, 0x8e, 0x9d, 0x22, 0x77, 0x07, 0x57, 0xcb, 0x5e, 0x46,
401     0x9a, 0x9b, 0x4f, 0x44, 0x65, 0x1f, 0x7e, 0x8f, 0xfd, 0xce, 0x7a, 0x32, 0xb4, 0x50, 0x6b, 0x27,
402     0xd3, 0xc7, 0x3c, 0xd9, 0x9d, 0xce, 0x4b, 0x25, 0xac, 0x43, 0x9d, 0x2c, 0x97, 0x20, 0xa8, 0x6f,
403     0x11, 0x5a, 0xc4, 0x31, 0x4f, 0x2b, 0x65, 0x0b, 0x4a, 0xcf, 0x06, 0x2d, 0xe8, 0x40, 0x87, 0x87,
404     0xf8, 0xd7, 0xff, 0x29, 0xa5, 0xf7, 0x61, 0xc0, 0x8a, 0x2f, 0x69, 0x4a, 0x55, 0x05, 0xb1, 0xaf,
405     0x8a, 0x9a, 0xbf, 0xae, 0xe7, 0x40, 0x08, 0xa9, 0x89, 0xe1, 0x9c, 0xc0, 0x35, 0x17, 0xa6, 0x61,
406     0x23, 0x70, 0xe0, 0x90, 0x51, 0x32, 0x0d, 0x5e, 0x8b, 0x2b, 0xb5, 0xab, 0xec, 0xa9, 0xbf, 0x22,
407     0x98, 0x4b, 0xdb, 0x14, 0x81, 0x97, 0x38, 0x95, 0xf0, 0x1c, 0x2e, 0xe5, 0x74, 0x74, 0x21, 0x5a,
408     0x69, 0xb6, 0xfd, 0x96, 0x53, 0x62, 0x91, 0x30, 0x2f, 0x95, 0xf8, 0x91, 0xac, 0xff, 0x11, 0x9f,
409     0x02, 0x15, 0xf7, 0x0b, 0xf3, 0xf0, 0xf2, 0x2d, 0xa1, 0x83, 0xa5, 0x15, 0x34, 0xee, 0xfa, 0x61,
410     0x32, 0xfd, 0xb7, 0x29, 0x3e, 0xbe, 0x95, 0x2c, 0xe2, 0x95, 0x16, 0x27, 0x73, 0xd9, 0x74, 0xce,
411     0x1b, 0x07, 0xf8, 0x5f, 0x25, 0x77, 0x7a, 0xf2, 0xbe, 0x22, 0x60, 0x7f, 0x58, 0x2b, 0x6c, 0x95,
412     0x22, 0x92, 0x33, 0xba, 0xa3, 0xd8, 0x87, 0x58, 0x29, 0xa0, 0x69, 0x01, 0xd9, 0x51, 0x87, 0x01
413 };
414 
415 static const char *g_asyKeyGeneratorBySpecClass = "HcfAsyKeyGeneratorBySpec";
416 
417 static const char *g_rsaAlgName = "RSA";
418 
419 void RemoveLastChar(const unsigned char *str, unsigned char *dest, uint32_t destLen);
420 void EndianSwap(unsigned char *pData, int startIndex, int length);
421 
422 // 512 defined the length of byte array
423 void GenerateRsa512CorrectCommonKeySpec(unsigned char *dataN, HcfRsaCommParamsSpec *returnSpec);
424 void GenerateRsa512CorrectPubKeySpec(unsigned char *dataN, unsigned char *dataE,
425     HcfRsaPubKeyParamsSpec *returnPubSpec);
426 void GenerateRsa512CorrectKeyPairSpec(unsigned char *dataN, unsigned char *dataE, unsigned char *dataD,
427     HcfRsaKeyPairParamsSpec *returnPairSpec);
428 
429 // 768 defined the length of byte array
430 void GenerateRsa768CorrectCommonKeySpec(unsigned char *dataN, HcfRsaCommParamsSpec *returnSpec);
431 void GenerateRsa768CorrectPubKeySpec(unsigned char *dataN, unsigned char *dataE,
432     HcfRsaPubKeyParamsSpec *returnPubSpec);
433 void GenerateRsa768CorrectKeyPairSpec(unsigned char *dataN, unsigned char *dataE, unsigned char *dataD,
434     HcfRsaKeyPairParamsSpec *returnPairSpec);
435 
436 // 1024 defined the length of byte array
437 void GenerateRsa1024CorrectCommonKeySpec(unsigned char *dataN, HcfRsaCommParamsSpec *returnSpec);
438 void GenerateRsa1024CorrectPubKeySpec(unsigned char *dataN, unsigned char *dataE,
439     HcfRsaPubKeyParamsSpec *returnPubSpec);
440 void GenerateRsa1024CorrectKeyPairSpec(unsigned char *dataN, unsigned char *dataE, unsigned char *dataD,
441     HcfRsaKeyPairParamsSpec *returnPairSpec);
442 
443 // 2048 defined the length of byte array
444 void GenerateRsa2048CorrectCommonKeySpec(unsigned char *dataN, HcfRsaCommParamsSpec *returnSpec);
445 void GenerateRsa2048CorrectPubKeySpec(unsigned char *dataN, unsigned char *dataE,
446     HcfRsaPubKeyParamsSpec *returnPubSpec);
447 void GenerateRsa2048CorrectKeyPairSpec(unsigned char *dataN, unsigned char *dataE, unsigned char *dataD,
448     HcfRsaKeyPairParamsSpec *returnPairSpec);
449 
450 // 3072 defined the length of byte array
451 void GenerateRsa3072CorrectCommonKeySpec(unsigned char *dataN, HcfRsaCommParamsSpec *returnSpec);
452 void GenerateRsa3072CorrectPubKeySpec(unsigned char *dataN, unsigned char *dataE,
453     HcfRsaPubKeyParamsSpec *returnPubSpec);
454 void GenerateRsa3072CorrectKeyPairSpec(unsigned char *dataN, unsigned char *dataE, unsigned char *dataD,
455     HcfRsaKeyPairParamsSpec *returnPairSpec);
456 
457 // 4096 defined the length of byte array
458 void GenerateRsa4096CorrectCommonKeySpec(unsigned char *dataN, HcfRsaCommParamsSpec *returnSpec);
459 void GenerateRsa4096CorrectPubKeySpec(unsigned char *dataN, unsigned char *dataE,
460     HcfRsaPubKeyParamsSpec *returnPubSpec);
461 void GenerateRsa4096CorrectKeyPairSpec(unsigned char *dataN, unsigned char *dataE, unsigned char *dataD,
462     HcfRsaKeyPairParamsSpec *returnPairSpec);
463 
464 // 8192 defined the length of byte array
465 void GenerateRsa8192CorrectCommonKeySpec(unsigned char *dataN, HcfRsaCommParamsSpec *returnSpec);
466 void GenerateRsa8192CorrectPubKeySpec(unsigned char *dataN, unsigned char *dataE,
467     HcfRsaPubKeyParamsSpec *returnPubSpec);
468 void GenerateRsa8192CorrectKeyPairSpec(unsigned char *dataN, unsigned char *dataE, unsigned char *dataD,
469     HcfRsaKeyPairParamsSpec *returnPairSpec);
470 
471 bool CheckGeneratorBySpecKeyFunc(HcfAsyKeyGeneratorBySpec *generator);
472 
473 #ifdef __cplusplus
474 }
475 #endif
476 #endif
477