1 #include <libecc/lib_ecc_config.h> 2 #ifdef WITH_CURVE_SECP224K1 3 4 #ifndef __EC_PARAMS_SECP224K1_H__ 5 #define __EC_PARAMS_SECP224K1_H__ 6 #include <libecc/curves/known/ec_params_external.h> 7 static const u8 secp224k1_p[] = { 8 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 9 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 10 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 11 0xff, 0xff, 0xe5, 0x6d, 12 }; 13 14 TO_EC_STR_PARAM(secp224k1_p); 15 16 #define CURVE_SECP224K1_P_BITLEN 224 17 static const u8 secp224k1_p_bitlen[] = { 18 0xe0, 19 }; 20 21 TO_EC_STR_PARAM(secp224k1_p_bitlen); 22 23 #if (WORD_BYTES == 8) /* 64-bit words */ 24 static const u8 secp224k1_r[] = { 25 0x01, 0x00, 0x00, 0x1a, 0x93, 0x00, 0x00, 0x00, 26 0x00, 27 }; 28 29 TO_EC_STR_PARAM(secp224k1_r); 30 31 static const u8 secp224k1_r_square[] = { 32 0x01, 0x00, 0x00, 0x35, 0x26, 0x02, 0xc2, 0x30, 33 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 34 0x00, 35 }; 36 37 TO_EC_STR_PARAM(secp224k1_r_square); 38 39 static const u8 secp224k1_mpinv[] = { 40 0x5a, 0x92, 0xa0, 0x0a, 0x19, 0x8d, 0x13, 0x9b, 41 }; 42 43 TO_EC_STR_PARAM(secp224k1_mpinv); 44 45 static const u8 secp224k1_p_shift[] = { 46 0x20, 47 }; 48 49 TO_EC_STR_PARAM(secp224k1_p_shift); 50 51 static const u8 secp224k1_p_normalized[] = { 52 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 53 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 54 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 55 0xff, 0xff, 0xe5, 0x6d, 0x00, 0x00, 0x00, 0x00, 56 }; 57 58 TO_EC_STR_PARAM(secp224k1_p_normalized); 59 60 static const u8 secp224k1_p_reciprocal[] = { 61 0x00, 62 }; 63 64 TO_EC_STR_PARAM(secp224k1_p_reciprocal); 65 66 #elif (WORD_BYTES == 4) /* 32-bit words */ 67 static const u8 secp224k1_r[] = { 68 0x01, 0x00, 0x00, 0x1a, 0x93, 69 }; 70 71 TO_EC_STR_PARAM(secp224k1_r); 72 73 static const u8 secp224k1_r_square[] = { 74 0x01, 0x00, 0x00, 0x35, 0x26, 0x02, 0xc2, 0x30, 75 0x69, 76 }; 77 78 TO_EC_STR_PARAM(secp224k1_r_square); 79 80 static const u8 secp224k1_mpinv[] = { 81 0x19, 0x8d, 0x13, 0x9b, 82 }; 83 84 TO_EC_STR_PARAM(secp224k1_mpinv); 85 86 static const u8 secp224k1_p_shift[] = { 87 0x00, 88 }; 89 90 TO_EC_STR_PARAM(secp224k1_p_shift); 91 92 static const u8 secp224k1_p_normalized[] = { 93 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 94 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 95 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 96 0xff, 0xff, 0xe5, 0x6d, 97 }; 98 99 TO_EC_STR_PARAM(secp224k1_p_normalized); 100 101 static const u8 secp224k1_p_reciprocal[] = { 102 0x00, 103 }; 104 105 TO_EC_STR_PARAM(secp224k1_p_reciprocal); 106 107 #elif (WORD_BYTES == 2) /* 16-bit words */ 108 static const u8 secp224k1_r[] = { 109 0x01, 0x00, 0x00, 0x1a, 0x93, 110 }; 111 112 TO_EC_STR_PARAM(secp224k1_r); 113 114 static const u8 secp224k1_r_square[] = { 115 0x01, 0x00, 0x00, 0x35, 0x26, 0x02, 0xc2, 0x30, 116 0x69, 117 }; 118 119 TO_EC_STR_PARAM(secp224k1_r_square); 120 121 static const u8 secp224k1_mpinv[] = { 122 0x13, 0x9b, 123 }; 124 125 TO_EC_STR_PARAM(secp224k1_mpinv); 126 127 static const u8 secp224k1_p_shift[] = { 128 0x00, 129 }; 130 131 TO_EC_STR_PARAM(secp224k1_p_shift); 132 133 static const u8 secp224k1_p_normalized[] = { 134 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 135 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 136 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 137 0xff, 0xff, 0xe5, 0x6d, 138 }; 139 140 TO_EC_STR_PARAM(secp224k1_p_normalized); 141 142 static const u8 secp224k1_p_reciprocal[] = { 143 0x00, 144 }; 145 146 TO_EC_STR_PARAM(secp224k1_p_reciprocal); 147 148 #else /* unknown word size */ 149 #error "Unsupported word size" 150 #endif 151 152 static const u8 secp224k1_a[] = { 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, 0x00, 157 }; 158 159 TO_EC_STR_PARAM(secp224k1_a); 160 161 static const u8 secp224k1_b[] = { 162 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 163 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 164 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 165 0x00, 0x00, 0x00, 0x05, 166 }; 167 168 TO_EC_STR_PARAM(secp224k1_b); 169 170 #define CURVE_SECP224K1_CURVE_ORDER_BITLEN 225 171 static const u8 secp224k1_curve_order[] = { 172 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 173 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdc, 174 0xe8, 0xd2, 0xec, 0x61, 0x84, 0xca, 0xf0, 0xa9, 175 0x71, 0x76, 0x9f, 0xb1, 0xf7, 176 }; 177 178 TO_EC_STR_PARAM(secp224k1_curve_order); 179 180 static const u8 secp224k1_gx[] = { 181 0xa1, 0x45, 0x5b, 0x33, 0x4d, 0xf0, 0x99, 0xdf, 182 0x30, 0xfc, 0x28, 0xa1, 0x69, 0xa4, 0x67, 0xe9, 183 0xe4, 0x70, 0x75, 0xa9, 0x0f, 0x7e, 0x65, 0x0e, 184 0xb6, 0xb7, 0xa4, 0x5c, 185 }; 186 187 TO_EC_STR_PARAM(secp224k1_gx); 188 189 static const u8 secp224k1_gy[] = { 190 0x7e, 0x08, 0x9f, 0xed, 0x7f, 0xba, 0x34, 0x42, 191 0x82, 0xca, 0xfb, 0xd6, 0xf7, 0xe3, 0x19, 0xf7, 192 0xc0, 0xb0, 0xbd, 0x59, 0xe2, 0xca, 0x4b, 0xdb, 193 0x55, 0x6d, 0x61, 0xa5, 194 }; 195 196 TO_EC_STR_PARAM(secp224k1_gy); 197 198 static const u8 secp224k1_gz[] = { 199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 202 0x00, 0x00, 0x00, 0x01, 203 }; 204 205 TO_EC_STR_PARAM(secp224k1_gz); 206 207 static const u8 secp224k1_gen_order[] = { 208 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xdc, 210 0xe8, 0xd2, 0xec, 0x61, 0x84, 0xca, 0xf0, 0xa9, 211 0x71, 0x76, 0x9f, 0xb1, 0xf7, 212 }; 213 214 TO_EC_STR_PARAM(secp224k1_gen_order); 215 216 #define CURVE_SECP224K1_Q_BITLEN 225 217 static const u8 secp224k1_gen_order_bitlen[] = { 218 0xe1, 219 }; 220 221 TO_EC_STR_PARAM(secp224k1_gen_order_bitlen); 222 223 static const u8 secp224k1_cofactor[] = { 224 0x01, 225 }; 226 227 TO_EC_STR_PARAM(secp224k1_cofactor); 228 229 static const u8 secp224k1_alpha_montgomery[] = { 230 0x00, 231 }; 232 TO_EC_STR_PARAM_FIXED_SIZE(secp224k1_alpha_montgomery, 0); 233 234 static const u8 secp224k1_gamma_montgomery[] = { 235 0x00, 236 }; 237 TO_EC_STR_PARAM_FIXED_SIZE(secp224k1_gamma_montgomery, 0); 238 239 static const u8 secp224k1_alpha_edwards[] = { 240 0x00, 241 }; 242 TO_EC_STR_PARAM_FIXED_SIZE(secp224k1_alpha_edwards, 0); 243 244 static const u8 secp224k1_name[] = "SECP224K1"; 245 TO_EC_STR_PARAM(secp224k1_name); 246 247 static const u8 secp224k1_oid[] = "1.3.132.0.32"; 248 TO_EC_STR_PARAM(secp224k1_oid); 249 250 static const ec_str_params secp224k1_str_params = { 251 .p = &secp224k1_p_str_param, 252 .p_bitlen = &secp224k1_p_bitlen_str_param, 253 .r = &secp224k1_r_str_param, 254 .r_square = &secp224k1_r_square_str_param, 255 .mpinv = &secp224k1_mpinv_str_param, 256 .p_shift = &secp224k1_p_shift_str_param, 257 .p_normalized = &secp224k1_p_normalized_str_param, 258 .p_reciprocal = &secp224k1_p_reciprocal_str_param, 259 .a = &secp224k1_a_str_param, 260 .b = &secp224k1_b_str_param, 261 .curve_order = &secp224k1_curve_order_str_param, 262 .gx = &secp224k1_gx_str_param, 263 .gy = &secp224k1_gy_str_param, 264 .gz = &secp224k1_gz_str_param, 265 .gen_order = &secp224k1_gen_order_str_param, 266 .gen_order_bitlen = &secp224k1_gen_order_bitlen_str_param, 267 .cofactor = &secp224k1_cofactor_str_param, 268 .alpha_montgomery = &secp224k1_alpha_montgomery_str_param, 269 .gamma_montgomery = &secp224k1_gamma_montgomery_str_param, 270 .alpha_edwards = &secp224k1_alpha_edwards_str_param, 271 .oid = &secp224k1_oid_str_param, 272 .name = &secp224k1_name_str_param, 273 }; 274 275 /* 276 * Compute max bit length of all curves for p and q 277 */ 278 #ifndef CURVES_MAX_P_BIT_LEN 279 #define CURVES_MAX_P_BIT_LEN 0 280 #endif 281 #if (CURVES_MAX_P_BIT_LEN < CURVE_SECP224K1_P_BITLEN) 282 #undef CURVES_MAX_P_BIT_LEN 283 #define CURVES_MAX_P_BIT_LEN CURVE_SECP224K1_P_BITLEN 284 #endif 285 #ifndef CURVES_MAX_Q_BIT_LEN 286 #define CURVES_MAX_Q_BIT_LEN 0 287 #endif 288 #if (CURVES_MAX_Q_BIT_LEN < CURVE_SECP224K1_Q_BITLEN) 289 #undef CURVES_MAX_Q_BIT_LEN 290 #define CURVES_MAX_Q_BIT_LEN CURVE_SECP224K1_Q_BITLEN 291 #endif 292 #ifndef CURVES_MAX_CURVE_ORDER_BIT_LEN 293 #define CURVES_MAX_CURVE_ORDER_BIT_LEN 0 294 #endif 295 #if (CURVES_MAX_CURVE_ORDER_BIT_LEN < CURVE_SECP224K1_CURVE_ORDER_BITLEN) 296 #undef CURVES_MAX_CURVE_ORDER_BIT_LEN 297 #define CURVES_MAX_CURVE_ORDER_BIT_LEN CURVE_SECP224K1_CURVE_ORDER_BITLEN 298 #endif 299 300 /* 301 * Compute and adapt max name and oid length 302 */ 303 #ifndef MAX_CURVE_OID_LEN 304 #define MAX_CURVE_OID_LEN 0 305 #endif 306 #ifndef MAX_CURVE_NAME_LEN 307 #define MAX_CURVE_NAME_LEN 0 308 #endif 309 #if (MAX_CURVE_OID_LEN < 1) 310 #undef MAX_CURVE_OID_LEN 311 #define MAX_CURVE_OID_LEN 1 312 #endif 313 #if (MAX_CURVE_NAME_LEN < 23) 314 #undef MAX_CURVE_NAME_LEN 315 #define MAX_CURVE_NAME_LEN 23 316 #endif 317 318 #endif /* __EC_PARAMS_SECP224K1_H__ */ 319 320 #endif /* WITH_CURVE_SECP224K1 */ 321