1 /* 2 * Copyright (c) 2017 Thomas Pornin <pornin@bolet.org> 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining 5 * a copy of this software and associated documentation files (the 6 * "Software"), to deal in the Software without restriction, including 7 * without limitation the rights to use, copy, modify, merge, publish, 8 * distribute, sublicense, and/or sell copies of the Software, and to 9 * permit persons to whom the Software is furnished to do so, subject to 10 * the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be 13 * included in all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 16 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 17 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 18 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 19 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 20 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 * SOFTWARE. 23 */ 24 25 #include "inner.h" 26 27 static const unsigned char * 28 api_generator(int curve, size_t *len) 29 { 30 switch (curve) { 31 case BR_EC_secp256r1: 32 return br_ec_p256_m15.generator(curve, len); 33 case BR_EC_curve25519: 34 return br_ec_c25519_m15.generator(curve, len); 35 default: 36 return br_ec_prime_i15.generator(curve, len); 37 } 38 } 39 40 static const unsigned char * 41 api_order(int curve, size_t *len) 42 { 43 switch (curve) { 44 case BR_EC_secp256r1: 45 return br_ec_p256_m15.order(curve, len); 46 case BR_EC_curve25519: 47 return br_ec_c25519_m15.order(curve, len); 48 default: 49 return br_ec_prime_i15.order(curve, len); 50 } 51 } 52 53 static size_t 54 api_xoff(int curve, size_t *len) 55 { 56 switch (curve) { 57 case BR_EC_secp256r1: 58 return br_ec_p256_m15.xoff(curve, len); 59 case BR_EC_curve25519: 60 return br_ec_c25519_m15.xoff(curve, len); 61 default: 62 return br_ec_prime_i15.xoff(curve, len); 63 } 64 } 65 66 static uint32_t 67 api_mul(unsigned char *G, size_t Glen, 68 const unsigned char *kb, size_t kblen, int curve) 69 { 70 switch (curve) { 71 case BR_EC_secp256r1: 72 return br_ec_p256_m15.mul(G, Glen, kb, kblen, curve); 73 case BR_EC_curve25519: 74 return br_ec_c25519_m15.mul(G, Glen, kb, kblen, curve); 75 default: 76 return br_ec_prime_i15.mul(G, Glen, kb, kblen, curve); 77 } 78 } 79 80 static size_t 81 api_mulgen(unsigned char *R, 82 const unsigned char *x, size_t xlen, int curve) 83 { 84 switch (curve) { 85 case BR_EC_secp256r1: 86 return br_ec_p256_m15.mulgen(R, x, xlen, curve); 87 case BR_EC_curve25519: 88 return br_ec_c25519_m15.mulgen(R, x, xlen, curve); 89 default: 90 return br_ec_prime_i15.mulgen(R, x, xlen, curve); 91 } 92 } 93 94 static uint32_t 95 api_muladd(unsigned char *A, const unsigned char *B, size_t len, 96 const unsigned char *x, size_t xlen, 97 const unsigned char *y, size_t ylen, int curve) 98 { 99 switch (curve) { 100 case BR_EC_secp256r1: 101 return br_ec_p256_m15.muladd(A, B, len, 102 x, xlen, y, ylen, curve); 103 case BR_EC_curve25519: 104 return br_ec_c25519_m15.muladd(A, B, len, 105 x, xlen, y, ylen, curve); 106 default: 107 return br_ec_prime_i15.muladd(A, B, len, 108 x, xlen, y, ylen, curve); 109 } 110 } 111 112 /* see bearssl_ec.h */ 113 const br_ec_impl br_ec_all_m15 = { 114 (uint32_t)0x23800000, 115 &api_generator, 116 &api_order, 117 &api_xoff, 118 &api_mul, 119 &api_mulgen, 120 &api_muladd 121 }; 122