xref: /openbsd/lib/libcrypto/bn/arch/amd64/bn_arch.c (revision d415bd75)
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