1*89b63e67Sjsing /* $OpenBSD: bn_arch.c,v 1.7 2023/06/24 16:01:44 jsing Exp $ */
208a9f633Sjsing /*
308a9f633Sjsing * Copyright (c) 2023 Joel Sing <jsing@openbsd.org>
408a9f633Sjsing *
508a9f633Sjsing * Permission to use, copy, modify, and distribute this software for any
608a9f633Sjsing * purpose with or without fee is hereby granted, provided that the above
708a9f633Sjsing * copyright notice and this permission notice appear in all copies.
808a9f633Sjsing *
908a9f633Sjsing * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1008a9f633Sjsing * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1108a9f633Sjsing * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1208a9f633Sjsing * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1308a9f633Sjsing * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1408a9f633Sjsing * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1508a9f633Sjsing * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1608a9f633Sjsing */
1708a9f633Sjsing
1808a9f633Sjsing #include <openssl/bn.h>
1908a9f633Sjsing
2008a9f633Sjsing #include "bn_arch.h"
2108a9f633Sjsing #include "bn_local.h"
2208a9f633Sjsing #include "s2n_bignum.h"
2308a9f633Sjsing
2437c49545Sjsing #ifdef HAVE_BN_ADD
2537c49545Sjsing BN_ULONG
bn_add(BN_ULONG * r,int r_len,const BN_ULONG * a,int a_len,const BN_ULONG * b,int b_len)26e7144bbbSjsing bn_add(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, const BN_ULONG *b,
27e7144bbbSjsing int b_len)
2837c49545Sjsing {
29e7144bbbSjsing return bignum_add(r_len, (uint64_t *)r, a_len, (uint64_t *)a,
30e7144bbbSjsing b_len, (uint64_t *)b);
3137c49545Sjsing }
3237c49545Sjsing #endif
3337c49545Sjsing
34e7144bbbSjsing
35588b959bSjsing #ifdef HAVE_BN_ADD_WORDS
36588b959bSjsing BN_ULONG
bn_add_words(BN_ULONG * rd,const BN_ULONG * ad,const BN_ULONG * bd,int n)37588b959bSjsing bn_add_words(BN_ULONG *rd, const BN_ULONG *ad, const BN_ULONG *bd, int n)
38588b959bSjsing {
39588b959bSjsing return bignum_add(n, (uint64_t *)rd, n, (uint64_t *)ad, n,
40588b959bSjsing (uint64_t *)bd);
41588b959bSjsing }
42588b959bSjsing #endif
43588b959bSjsing
4437c49545Sjsing #ifdef HAVE_BN_SUB
4537c49545Sjsing BN_ULONG
bn_sub(BN_ULONG * r,int r_len,const BN_ULONG * a,int a_len,const BN_ULONG * b,int b_len)46e7144bbbSjsing bn_sub(BN_ULONG *r, int r_len, const BN_ULONG *a, int a_len, const BN_ULONG *b,
47e7144bbbSjsing int b_len)
4837c49545Sjsing {
49e7144bbbSjsing return bignum_sub(r_len, (uint64_t *)r, a_len, (uint64_t *)a,
50e7144bbbSjsing b_len, (uint64_t *)b);
5137c49545Sjsing }
5237c49545Sjsing #endif
5337c49545Sjsing
54588b959bSjsing #ifdef HAVE_BN_SUB_WORDS
55588b959bSjsing BN_ULONG
bn_sub_words(BN_ULONG * rd,const BN_ULONG * ad,const BN_ULONG * bd,int n)56588b959bSjsing bn_sub_words(BN_ULONG *rd, const BN_ULONG *ad, const BN_ULONG *bd, int n)
57588b959bSjsing {
58588b959bSjsing return bignum_sub(n, (uint64_t *)rd, n, (uint64_t *)ad, n,
59588b959bSjsing (uint64_t *)bd);
60588b959bSjsing }
61588b959bSjsing #endif
62588b959bSjsing
63588b959bSjsing #ifdef HAVE_BN_MUL_ADD_WORDS
64588b959bSjsing BN_ULONG
bn_mul_add_words(BN_ULONG * rd,const BN_ULONG * ad,int num,BN_ULONG w)65588b959bSjsing bn_mul_add_words(BN_ULONG *rd, const BN_ULONG *ad, int num, BN_ULONG w)
66588b959bSjsing {
67588b959bSjsing return bignum_cmadd(num, (uint64_t *)rd, w, num, (uint64_t *)ad);
68588b959bSjsing }
69588b959bSjsing #endif
70588b959bSjsing
71588b959bSjsing #ifdef HAVE_BN_MUL_WORDS
72588b959bSjsing BN_ULONG
bn_mul_words(BN_ULONG * rd,const BN_ULONG * ad,int num,BN_ULONG w)73588b959bSjsing bn_mul_words(BN_ULONG *rd, const BN_ULONG *ad, int num, BN_ULONG w)
74588b959bSjsing {
75588b959bSjsing return bignum_cmul(num, (uint64_t *)rd, w, num, (uint64_t *)ad);
76588b959bSjsing }
77588b959bSjsing #endif
78588b959bSjsing
79588b959bSjsing #ifdef HAVE_BN_MUL_COMBA4
80588b959bSjsing void
bn_mul_comba4(BN_ULONG * rd,BN_ULONG * ad,BN_ULONG * bd)81588b959bSjsing bn_mul_comba4(BN_ULONG *rd, BN_ULONG *ad, BN_ULONG *bd)
82588b959bSjsing {
83588b959bSjsing /* XXX - consider using non-alt on CPUs that have the ADX extension. */
84588b959bSjsing bignum_mul_4_8_alt((uint64_t *)rd, (uint64_t *)ad, (uint64_t *)bd);
85588b959bSjsing }
86588b959bSjsing #endif
87588b959bSjsing
88588b959bSjsing #ifdef HAVE_BN_MUL_COMBA8
89588b959bSjsing void
bn_mul_comba8(BN_ULONG * rd,BN_ULONG * ad,BN_ULONG * bd)90588b959bSjsing bn_mul_comba8(BN_ULONG *rd, BN_ULONG *ad, BN_ULONG *bd)
91588b959bSjsing {
92588b959bSjsing /* XXX - consider using non-alt on CPUs that have the ADX extension. */
93588b959bSjsing bignum_mul_8_16_alt((uint64_t *)rd, (uint64_t *)ad, (uint64_t *)bd);
94588b959bSjsing }
95588b959bSjsing #endif
96588b959bSjsing
9708a9f633Sjsing #ifdef HAVE_BN_SQR
9808a9f633Sjsing int
bn_sqr(BIGNUM * r,const BIGNUM * a,int r_len,BN_CTX * ctx)99*89b63e67Sjsing bn_sqr(BIGNUM *r, const BIGNUM *a, int r_len, BN_CTX *ctx)
10008a9f633Sjsing {
101*89b63e67Sjsing bignum_sqr(r_len, (uint64_t *)r->d, a->top, (uint64_t *)a->d);
10208a9f633Sjsing
10308a9f633Sjsing return 1;
10408a9f633Sjsing }
10508a9f633Sjsing #endif
106588b959bSjsing
107588b959bSjsing #ifdef HAVE_BN_SQR_COMBA4
108588b959bSjsing void
bn_sqr_comba4(BN_ULONG * rd,const BN_ULONG * ad)109588b959bSjsing bn_sqr_comba4(BN_ULONG *rd, const BN_ULONG *ad)
110588b959bSjsing {
111588b959bSjsing /* XXX - consider using non-alt on CPUs that have the ADX extension. */
112588b959bSjsing bignum_sqr_4_8_alt((uint64_t *)rd, (uint64_t *)ad);
113588b959bSjsing }
114588b959bSjsing #endif
115588b959bSjsing
116588b959bSjsing #ifdef HAVE_BN_SQR_COMBA8
117588b959bSjsing void
bn_sqr_comba8(BN_ULONG * rd,const BN_ULONG * ad)118588b959bSjsing bn_sqr_comba8(BN_ULONG *rd, const BN_ULONG *ad)
119588b959bSjsing {
120588b959bSjsing /* XXX - consider using non-alt on CPUs that have the ADX extension. */
121588b959bSjsing bignum_sqr_8_16_alt((uint64_t *)rd, (uint64_t *)ad);
122588b959bSjsing }
123588b959bSjsing #endif
124e9b52428Sjsing
125e9b52428Sjsing #ifdef HAVE_BN_WORD_CLZ
126e9b52428Sjsing int
bn_word_clz(BN_ULONG w)127e9b52428Sjsing bn_word_clz(BN_ULONG w)
128e9b52428Sjsing {
129e9b52428Sjsing return word_clz(w);
130e9b52428Sjsing }
131e9b52428Sjsing #endif
132