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
bn_add(BN_ULONG * r,int r_len,const BN_ULONG * a,int a_len,const BN_ULONG * b,int b_len)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
bn_add_words(BN_ULONG * rd,const BN_ULONG * ad,const BN_ULONG * bd,int n)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
bn_sub(BN_ULONG * r,int r_len,const BN_ULONG * a,int a_len,const BN_ULONG * b,int b_len)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
bn_sub_words(BN_ULONG * rd,const BN_ULONG * ad,const BN_ULONG * bd,int n)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
bn_mul_add_words(BN_ULONG * rd,const BN_ULONG * ad,int num,BN_ULONG w)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
bn_mul_words(BN_ULONG * rd,const BN_ULONG * ad,int num,BN_ULONG w)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
bn_mul_comba4(BN_ULONG * rd,BN_ULONG * ad,BN_ULONG * bd)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
bn_mul_comba8(BN_ULONG * rd,BN_ULONG * ad,BN_ULONG * bd)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
bn_sqr(BIGNUM * r,const BIGNUM * a,int r_len,BN_CTX * ctx)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
bn_sqr_comba4(BN_ULONG * rd,const BN_ULONG * ad)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
bn_sqr_comba8(BN_ULONG * rd,const BN_ULONG * ad)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
bn_word_clz(BN_ULONG w)127 bn_word_clz(BN_ULONG w)
128 {
129 return word_clz(w);
130 }
131 #endif
132