/ src / ec / ec_all_m15.c
ec_all_m15.c
  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  };