1 /* 2 * Copyright (C) 2017 - This file is part of libecc project 3 * 4 * Authors: 5 * Ryad BENADJILA <ryadbenadjila@gmail.com> 6 * Arnaud EBALARD <arnaud.ebalard@ssi.gouv.fr> 7 * Jean-Pierre FLORI <jean-pierre.flori@ssi.gouv.fr> 8 * 9 * Contributors: 10 * Nicolas VIVET <nicolas.vivet@ssi.gouv.fr> 11 * Karim KHALFALLAH <karim.khalfallah@ssi.gouv.fr> 12 * 13 * This software is licensed under a dual BSD and GPL v2 license. 14 * See LICENSE file at the root folder of the project. 15 */ 16 #include <libecc/lib_ecc_config.h> 17 #ifdef WITH_CURVE_FRP256V1 18 19 #ifndef __EC_PARAMS_FRP256V1_H__ 20 #define __EC_PARAMS_FRP256V1_H__ 21 #include "ec_params_external.h" 22 23 static const u8 frp256v1_p[] = { 24 0xf1, 0xfd, 0x17, 0x8c, 0x0b, 0x3a, 0xd5, 0x8f, 25 0x10, 0x12, 0x6d, 0xe8, 0xce, 0x42, 0x43, 0x5b, 26 0x39, 0x61, 0xad, 0xbc, 0xab, 0xc8, 0xca, 0x6d, 27 0xe8, 0xfc, 0xf3, 0x53, 0xd8, 0x6e, 0x9c, 0x03 28 }; 29 30 TO_EC_STR_PARAM(frp256v1_p); 31 32 #define CURVE_FRP256V1_P_BITLEN 256 33 static const u8 frp256v1_p_bitlen[] = { 0x01, 0x00 }; 34 35 TO_EC_STR_PARAM(frp256v1_p_bitlen); 36 37 static const u8 frp256v1_r[] = { 38 0x0e, 0x02, 0xe8, 0x73, 0xf4, 0xc5, 0x2a, 0x70, 39 0xef, 0xed, 0x92, 0x17, 0x31, 0xbd, 0xbc, 0xa4, 40 0xc6, 0x9e, 0x52, 0x43, 0x54, 0x37, 0x35, 0x92, 41 0x17, 0x03, 0x0c, 0xac, 0x27, 0x91, 0x63, 0xfd 42 }; 43 44 TO_EC_STR_PARAM(frp256v1_r); 45 46 static const u8 frp256v1_r_square[] = { 47 0xb0, 0x2c, 0x8f, 0x9f, 0x88, 0xeb, 0x98, 0xac, 48 0x62, 0xb7, 0x01, 0x2f, 0xce, 0x13, 0x7e, 0xee, 49 0x84, 0x6f, 0x80, 0x83, 0x0c, 0x96, 0x0f, 0x92, 50 0xb0, 0xc2, 0x4e, 0x77, 0xc9, 0x9f, 0x15, 0x13 51 }; 52 53 TO_EC_STR_PARAM(frp256v1_r_square); 54 55 static const u8 frp256v1_mpinv[] = { 56 0xc7, 0x97, 0x48, 0x3a, 0x16, 0x4e, 0x11, 0x55 57 }; 58 59 TO_EC_STR_PARAM(frp256v1_mpinv); 60 61 static const u8 frp256v1_p_shift[] = { 62 0x00 63 }; 64 65 TO_EC_STR_PARAM(frp256v1_p_shift); 66 67 #if (WORD_BYTES == 8) /* 64-bit words */ 68 static const u8 frp256v1_p_reciprocal[] = { 69 0x0e, 0xd2, 0x97, 0xdc, 0xc7, 0xd2, 0xb0, 0x40 70 }; 71 #elif (WORD_BYTES == 4) /* 32-bit words */ 72 static const u8 frp256v1_p_reciprocal[] = { 73 0x0e, 0xd2, 0x97, 0xdc 74 }; 75 #elif (WORD_BYTES == 2) /* 16-bit words */ 76 static const u8 frp256v1_p_reciprocal[] = { 77 0x0e, 0xd2 78 }; 79 #else /* unknown word size */ 80 #error "Unsupported word size" 81 #endif 82 TO_EC_STR_PARAM(frp256v1_p_reciprocal); 83 84 static const u8 frp256v1_a[] = { 85 0xf1, 0xfd, 0x17, 0x8c, 0x0b, 0x3a, 0xd5, 0x8f, 86 0x10, 0x12, 0x6d, 0xe8, 0xce, 0x42, 0x43, 0x5b, 87 0x39, 0x61, 0xad, 0xbc, 0xab, 0xc8, 0xca, 0x6d, 88 0xe8, 0xfc, 0xf3, 0x53, 0xd8, 0x6e, 0x9c, 0x00 89 }; 90 91 TO_EC_STR_PARAM(frp256v1_a); 92 93 static const u8 frp256v1_b[] = { 94 0xee, 0x35, 0x3f, 0xca, 0x54, 0x28, 0xa9, 0x30, 95 0x0d, 0x4a, 0xba, 0x75, 0x4a, 0x44, 0xc0, 0x0f, 96 0xdf, 0xec, 0x0c, 0x9a, 0xe4, 0xb1, 0xa1, 0x80, 97 0x30, 0x75, 0xed, 0x96, 0x7b, 0x7b, 0xb7, 0x3f 98 }; 99 100 TO_EC_STR_PARAM(frp256v1_b); 101 102 #define CURVE_FRP256V1_CURVE_ORDER_BITLEN 256 103 static const u8 frp256v1_curve_order[] = { 104 0xf1, 0xfd, 0x17, 0x8c, 0x0b, 0x3a, 0xd5, 0x8f, 105 0x10, 0x12, 0x6d, 0xe8, 0xce, 0x42, 0x43, 0x5b, 106 0x53, 0xdc, 0x67, 0xe1, 0x40, 0xd2, 0xbf, 0x94, 107 0x1f, 0xfd, 0xd4, 0x59, 0xc6, 0xd6, 0x55, 0xe1 108 }; 109 110 TO_EC_STR_PARAM(frp256v1_curve_order); 111 112 static const u8 frp256v1_gx[] = { 113 0xb6, 0xb3, 0xd4, 0xc3, 0x56, 0xc1, 0x39, 0xeb, 114 0x31, 0x18, 0x3d, 0x47, 0x49, 0xd4, 0x23, 0x95, 115 0x8c, 0x27, 0xd2, 0xdc, 0xaf, 0x98, 0xb7, 0x01, 116 0x64, 0xc9, 0x7a, 0x2d, 0xd9, 0x8f, 0x5c, 0xff 117 }; 118 119 TO_EC_STR_PARAM(frp256v1_gx); 120 121 static const u8 frp256v1_gy[] = { 122 0x61, 0x42, 0xe0, 0xf7, 0xc8, 0xb2, 0x04, 0x91, 123 0x1f, 0x92, 0x71, 0xf0, 0xf3, 0xec, 0xef, 0x8c, 124 0x27, 0x01, 0xc3, 0x07, 0xe8, 0xe4, 0xc9, 0xe1, 125 0x83, 0x11, 0x5a, 0x15, 0x54, 0x06, 0x2c, 0xfb 126 }; 127 128 TO_EC_STR_PARAM(frp256v1_gy); 129 130 static const u8 frp256v1_gz[] = { 131 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 132 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 133 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 134 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 135 }; 136 137 TO_EC_STR_PARAM(frp256v1_gz); 138 139 static const u8 frp256v1_gen_order[] = { 140 0xf1, 0xfd, 0x17, 0x8c, 0x0b, 0x3a, 0xd5, 0x8f, 141 0x10, 0x12, 0x6d, 0xe8, 0xce, 0x42, 0x43, 0x5b, 142 0x53, 0xdc, 0x67, 0xe1, 0x40, 0xd2, 0xbf, 0x94, 143 0x1f, 0xfd, 0xd4, 0x59, 0xc6, 0xd6, 0x55, 0xe1 144 }; 145 146 TO_EC_STR_PARAM(frp256v1_gen_order); 147 148 #define CURVE_FRP256V1_Q_BITLEN 256 149 static const u8 frp256v1_gen_order_bitlen[] = { 0x01, 0x00 }; 150 151 TO_EC_STR_PARAM(frp256v1_gen_order_bitlen); 152 153 static const u8 frp256v1_cofactor[] = { 0x01 }; 154 155 TO_EC_STR_PARAM(frp256v1_cofactor); 156 157 static const u8 frp256v1_alpha_montgomery[] = { 158 0x00, 159 }; 160 161 TO_EC_STR_PARAM_FIXED_SIZE(frp256v1_alpha_montgomery, 0); 162 163 static const u8 frp256v1_gamma_montgomery[] = { 164 0x00, 165 }; 166 167 TO_EC_STR_PARAM_FIXED_SIZE(frp256v1_gamma_montgomery, 0); 168 169 static const u8 frp256v1_alpha_edwards[] = { 170 0x00, 171 }; 172 173 TO_EC_STR_PARAM_FIXED_SIZE(frp256v1_alpha_edwards, 0); 174 175 static const u8 frp256v1_oid[] = "1.2.250.1.223.101.256.1"; 176 TO_EC_STR_PARAM(frp256v1_oid); 177 178 static const u8 frp256v1_name[] = "FRP256V1"; 179 TO_EC_STR_PARAM(frp256v1_name); 180 181 static const ec_str_params frp256v1_str_params = { 182 .p = &frp256v1_p_str_param, 183 .p_bitlen = &frp256v1_p_bitlen_str_param, 184 .r = &frp256v1_r_str_param, 185 .r_square = &frp256v1_r_square_str_param, 186 .mpinv = &frp256v1_mpinv_str_param, 187 .p_shift = &frp256v1_p_shift_str_param, 188 .p_normalized = &frp256v1_p_str_param, 189 .p_reciprocal = &frp256v1_p_reciprocal_str_param, 190 .a = &frp256v1_a_str_param, 191 .b = &frp256v1_b_str_param, 192 .curve_order = &frp256v1_curve_order_str_param, 193 .gx = &frp256v1_gx_str_param, 194 .gy = &frp256v1_gy_str_param, 195 .gz = &frp256v1_gz_str_param, 196 .gen_order = &frp256v1_gen_order_str_param, 197 .gen_order_bitlen = &frp256v1_gen_order_bitlen_str_param, 198 .cofactor = &frp256v1_cofactor_str_param, 199 .alpha_montgomery = &frp256v1_alpha_montgomery_str_param, 200 .gamma_montgomery = &frp256v1_gamma_montgomery_str_param, 201 .alpha_edwards = &frp256v1_alpha_edwards_str_param, 202 .oid = &frp256v1_oid_str_param, 203 .name = &frp256v1_name_str_param, 204 }; 205 206 /* 207 * Compute max bit length of all curves for p and q 208 */ 209 #ifndef CURVES_MAX_P_BIT_LEN 210 #define CURVES_MAX_P_BIT_LEN 0 211 #endif 212 #if (CURVES_MAX_P_BIT_LEN < CURVE_FRP256V1_P_BITLEN) 213 #undef CURVES_MAX_P_BIT_LEN 214 #define CURVES_MAX_P_BIT_LEN CURVE_FRP256V1_P_BITLEN 215 #endif 216 #ifndef CURVES_MAX_Q_BIT_LEN 217 #define CURVES_MAX_Q_BIT_LEN 0 218 #endif 219 #if (CURVES_MAX_Q_BIT_LEN < CURVE_FRP256V1_Q_BITLEN) 220 #undef CURVES_MAX_Q_BIT_LEN 221 #define CURVES_MAX_Q_BIT_LEN CURVE_FRP256V1_Q_BITLEN 222 #endif 223 #ifndef CURVES_MAX_CURVE_ORDER_BIT_LEN 224 #define CURVES_MAX_CURVE_ORDER_BIT_LEN 0 225 #endif 226 #if (CURVES_MAX_CURVE_ORDER_BIT_LEN < CURVE_FRP256V1_CURVE_ORDER_BITLEN) 227 #undef CURVES_MAX_CURVE_ORDER_BIT_LEN 228 #define CURVES_MAX_CURVE_ORDER_BIT_LEN CURVE_FRP256V1_CURVE_ORDER_BITLEN 229 #endif 230 231 #endif /* __EC_PARAMS_FRP256V1_H__ */ 232 233 #endif /* WITH_CURVE_FRP256V1 */ 234