1 /* $OpenBSD: bn_arch.c,v 1.7 2023/06/24 16:01:44 jsing Exp $ */ 2 /* 3 * Copyright (c) 2023 Joel Sing <jsing@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18 #include <openssl/bn.h> 19 20 #include "bn_arch.h" 21 #include "bn_local.h" 22 #include "s2n_bignum.h" 23 24 #ifdef HAVE_BN_ADD 25 BN_ULONG 26 bn_add(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, const BN_ULONG *b, 27 int b_len) 28 { 29 return bignum_add(r_len, (uint64_t *)r, a_len, (uint64_t *)a, 30 b_len, (uint64_t *)b); 31 } 32 #endif 33 34 35 #ifdef HAVE_BN_ADD_WORDS 36 BN_ULONG 37 bn_add_words(BN_ULONG *rd, const BN_ULONG *ad, const BN_ULONG *bd, int n) 38 { 39 return bignum_add(n, (uint64_t *)rd, n, (uint64_t *)ad, n, 40 (uint64_t *)bd); 41 } 42 #endif 43 44 #ifdef HAVE_BN_SUB 45 BN_ULONG 46 bn_sub(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, const BN_ULONG *b, 47 int b_len) 48 { 49 return bignum_sub(r_len, (uint64_t *)r, a_len, (uint64_t *)a, 50 b_len, (uint64_t *)b); 51 } 52 #endif 53 54 #ifdef HAVE_BN_SUB_WORDS 55 BN_ULONG 56 bn_sub_words(BN_ULONG *rd, const BN_ULONG *ad, const BN_ULONG *bd, int n) 57 { 58 return bignum_sub(n, (uint64_t *)rd, n, (uint64_t *)ad, n, 59 (uint64_t *)bd); 60 } 61 #endif 62 63 #ifdef HAVE_BN_MUL_ADD_WORDS 64 BN_ULONG 65 bn_mul_add_words(BN_ULONG *rd, const BN_ULONG *ad, int num, BN_ULONG w) 66 { 67 return bignum_cmadd(num, (uint64_t *)rd, w, num, (uint64_t *)ad); 68 } 69 #endif 70 71 #ifdef HAVE_BN_MUL_WORDS 72 BN_ULONG 73 bn_mul_words(BN_ULONG *rd, const BN_ULONG *ad, int num, BN_ULONG w) 74 { 75 return bignum_cmul(num, (uint64_t *)rd, w, num, (uint64_t *)ad); 76 } 77 #endif 78 79 #ifdef HAVE_BN_MUL_COMBA4 80 void 81 bn_mul_comba4(BN_ULONG *rd, BN_ULONG *ad, BN_ULONG *bd) 82 { 83 /* XXX - consider using non-alt on CPUs that have the ADX extension. */ 84 bignum_mul_4_8_alt((uint64_t *)rd, (uint64_t *)ad, (uint64_t *)bd); 85 } 86 #endif 87 88 #ifdef HAVE_BN_MUL_COMBA8 89 void 90 bn_mul_comba8(BN_ULONG *rd, BN_ULONG *ad, BN_ULONG *bd) 91 { 92 /* XXX - consider using non-alt on CPUs that have the ADX extension. */ 93 bignum_mul_8_16_alt((uint64_t *)rd, (uint64_t *)ad, (uint64_t *)bd); 94 } 95 #endif 96 97 #ifdef HAVE_BN_SQR 98 int 99 bn_sqr(BIGNUM *r, const BIGNUM *a, int r_len, BN_CTX *ctx) 100 { 101 bignum_sqr(r_len, (uint64_t *)r->d, a->top, (uint64_t *)a->d); 102 103 return 1; 104 } 105 #endif 106 107 #ifdef HAVE_BN_SQR_COMBA4 108 void 109 bn_sqr_comba4(BN_ULONG *rd, const BN_ULONG *ad) 110 { 111 /* XXX - consider using non-alt on CPUs that have the ADX extension. */ 112 bignum_sqr_4_8_alt((uint64_t *)rd, (uint64_t *)ad); 113 } 114 #endif 115 116 #ifdef HAVE_BN_SQR_COMBA8 117 void 118 bn_sqr_comba8(BN_ULONG *rd, const BN_ULONG *ad) 119 { 120 /* XXX - consider using non-alt on CPUs that have the ADX extension. */ 121 bignum_sqr_8_16_alt((uint64_t *)rd, (uint64_t *)ad); 122 } 123 #endif 124 125 #ifdef HAVE_BN_WORD_CLZ 126 int 127 bn_word_clz(BN_ULONG w) 128 { 129 return word_clz(w); 130 } 131 #endif 132