Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/openssl/providers/implementations/ciphers/cipher_aes_ocb_hw.c
108638 views
1
/*
2
* Copyright 2019-2024 The OpenSSL Project Authors. All Rights Reserved.
3
*
4
* Licensed under the Apache License 2.0 (the "License"). You may not use
5
* this file except in compliance with the License. You can obtain a copy
6
* in the file LICENSE in the source distribution or at
7
* https://www.openssl.org/source/license.html
8
*/
9
10
/*
11
* This file uses the low level AES functions (which are deprecated for
12
* non-internal use) in order to implement provider AES ciphers.
13
*/
14
#include "internal/deprecated.h"
15
16
#include "cipher_aes_ocb.h"
17
18
#define OCB_SET_KEY_FN(fn_set_enc_key, fn_set_dec_key, \
19
fn_block_enc, fn_block_dec, \
20
fn_stream_enc, fn_stream_dec) \
21
CRYPTO_ocb128_cleanup(&ctx->ocb); \
22
fn_set_enc_key(key, keylen * 8, &ctx->ksenc.ks); \
23
fn_set_dec_key(key, keylen * 8, &ctx->ksdec.ks); \
24
if (!CRYPTO_ocb128_init(&ctx->ocb, &ctx->ksenc.ks, &ctx->ksdec.ks, \
25
(block128_f)fn_block_enc, (block128_f)fn_block_dec, \
26
ctx->base.enc ? (ocb128_f)fn_stream_enc : (ocb128_f)fn_stream_dec)) \
27
return 0; \
28
ctx->key_set = 1
29
30
static int cipher_hw_aes_ocb_generic_initkey(PROV_CIPHER_CTX *vctx,
31
const unsigned char *key,
32
size_t keylen)
33
{
34
PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
35
36
/*
37
* We set both the encrypt and decrypt key here because decrypt
38
* needs both. (i.e- AAD uses encrypt).
39
*/
40
#ifdef HWAES_CAPABLE
41
if (HWAES_CAPABLE) {
42
OCB_SET_KEY_FN(HWAES_set_encrypt_key, HWAES_set_decrypt_key,
43
HWAES_encrypt, HWAES_decrypt,
44
HWAES_ocb_encrypt, HWAES_ocb_decrypt);
45
} else
46
#endif
47
#ifdef VPAES_CAPABLE
48
if (VPAES_CAPABLE) {
49
OCB_SET_KEY_FN(vpaes_set_encrypt_key, vpaes_set_decrypt_key,
50
vpaes_encrypt, vpaes_decrypt, NULL, NULL);
51
} else
52
#endif
53
{
54
OCB_SET_KEY_FN(AES_set_encrypt_key, AES_set_decrypt_key,
55
AES_encrypt, AES_decrypt, NULL, NULL);
56
}
57
return 1;
58
}
59
60
#if defined(AESNI_CAPABLE)
61
62
static int cipher_hw_aes_ocb_aesni_initkey(PROV_CIPHER_CTX *vctx,
63
const unsigned char *key,
64
size_t keylen)
65
{
66
PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
67
68
OCB_SET_KEY_FN(aesni_set_encrypt_key, aesni_set_decrypt_key,
69
aesni_encrypt, aesni_decrypt,
70
aesni_ocb_encrypt, aesni_ocb_decrypt);
71
return 1;
72
}
73
74
#define PROV_CIPHER_HW_declare() \
75
static const PROV_CIPHER_HW aesni_ocb = { \
76
cipher_hw_aes_ocb_aesni_initkey, \
77
NULL \
78
};
79
#define PROV_CIPHER_HW_select() \
80
if (AESNI_CAPABLE) \
81
return &aesni_ocb;
82
83
#elif defined(SPARC_AES_CAPABLE)
84
85
static int cipher_hw_aes_ocb_t4_initkey(PROV_CIPHER_CTX *vctx,
86
const unsigned char *key,
87
size_t keylen)
88
{
89
PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
90
91
OCB_SET_KEY_FN(aes_t4_set_encrypt_key, aes_t4_set_decrypt_key,
92
aes_t4_encrypt, aes_t4_decrypt, NULL, NULL);
93
return 1;
94
}
95
96
#define PROV_CIPHER_HW_declare() \
97
static const PROV_CIPHER_HW aes_t4_ocb = { \
98
cipher_hw_aes_ocb_t4_initkey, \
99
NULL \
100
};
101
#define PROV_CIPHER_HW_select() \
102
if (SPARC_AES_CAPABLE) \
103
return &aes_t4_ocb;
104
105
#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 64
106
107
static int cipher_hw_aes_ocb_rv64i_zknd_zkne_initkey(PROV_CIPHER_CTX *vctx,
108
const unsigned char *key,
109
size_t keylen)
110
{
111
PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
112
113
OCB_SET_KEY_FN(rv64i_zkne_set_encrypt_key, rv64i_zknd_set_decrypt_key,
114
rv64i_zkne_encrypt, rv64i_zknd_decrypt, NULL, NULL);
115
return 1;
116
}
117
118
static int cipher_hw_aes_ocb_rv64i_zvkned_initkey(PROV_CIPHER_CTX *vctx,
119
const unsigned char *key,
120
size_t keylen)
121
{
122
PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
123
124
/* Zvkned only supports 128 and 256 bit keys. */
125
if (keylen * 8 == 128 || keylen * 8 == 256) {
126
OCB_SET_KEY_FN(rv64i_zvkned_set_encrypt_key,
127
rv64i_zvkned_set_decrypt_key,
128
rv64i_zvkned_encrypt, rv64i_zvkned_decrypt,
129
NULL, NULL);
130
} else {
131
OCB_SET_KEY_FN(AES_set_encrypt_key, AES_set_encrypt_key,
132
rv64i_zvkned_encrypt, rv64i_zvkned_decrypt,
133
NULL, NULL);
134
}
135
return 1;
136
}
137
138
#define PROV_CIPHER_HW_declare() \
139
static const PROV_CIPHER_HW aes_rv64i_zknd_zkne_ocb = { \
140
cipher_hw_aes_ocb_rv64i_zknd_zkne_initkey, \
141
NULL \
142
}; \
143
static const PROV_CIPHER_HW aes_rv64i_zvkned_ocb = { \
144
cipher_hw_aes_ocb_rv64i_zvkned_initkey, \
145
NULL \
146
};
147
#define PROV_CIPHER_HW_select() \
148
if (RISCV_HAS_ZVKNED() && riscv_vlen() >= 128) \
149
return &aes_rv64i_zvkned_ocb; \
150
else if (RISCV_HAS_ZKND_AND_ZKNE()) \
151
return &aes_rv64i_zknd_zkne_ocb;
152
153
#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 32
154
155
static int cipher_hw_aes_ocb_rv32i_zknd_zkne_initkey(PROV_CIPHER_CTX *vctx,
156
const unsigned char *key,
157
size_t keylen)
158
{
159
PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
160
161
OCB_SET_KEY_FN(rv32i_zkne_set_encrypt_key, rv32i_zknd_zkne_set_decrypt_key,
162
rv32i_zkne_encrypt, rv32i_zknd_decrypt, NULL, NULL);
163
return 1;
164
}
165
166
static int cipher_hw_aes_ocb_rv32i_zbkb_zknd_zkne_initkey(PROV_CIPHER_CTX *vctx,
167
const unsigned char *key,
168
size_t keylen)
169
{
170
PROV_AES_OCB_CTX *ctx = (PROV_AES_OCB_CTX *)vctx;
171
172
OCB_SET_KEY_FN(rv32i_zbkb_zkne_set_encrypt_key, rv32i_zbkb_zknd_zkne_set_decrypt_key,
173
rv32i_zkne_encrypt, rv32i_zknd_decrypt, NULL, NULL);
174
return 1;
175
}
176
177
#define PROV_CIPHER_HW_declare() \
178
static const PROV_CIPHER_HW aes_rv32i_zknd_zkne_ocb = { \
179
cipher_hw_aes_ocb_rv32i_zknd_zkne_initkey, \
180
NULL \
181
}; \
182
static const PROV_CIPHER_HW aes_rv32i_zbkb_zknd_zkne_ocb = { \
183
cipher_hw_aes_ocb_rv32i_zbkb_zknd_zkne_initkey, \
184
NULL \
185
};
186
#define PROV_CIPHER_HW_select() \
187
if (RISCV_HAS_ZBKB_AND_ZKND_AND_ZKNE()) \
188
return &aes_rv32i_zbkb_zknd_zkne_ocb; \
189
if (RISCV_HAS_ZKND_AND_ZKNE()) \
190
return &aes_rv32i_zknd_zkne_ocb;
191
#else
192
#define PROV_CIPHER_HW_declare()
193
#define PROV_CIPHER_HW_select()
194
#endif
195
196
static const PROV_CIPHER_HW aes_generic_ocb = {
197
cipher_hw_aes_ocb_generic_initkey,
198
NULL
199
};
200
PROV_CIPHER_HW_declare()
201
const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_ocb(size_t keybits)
202
{
203
PROV_CIPHER_HW_select() return &aes_generic_ocb;
204
}
205
206