Coverage Report

Created: 2025-06-13 06:58

/src/openssl/providers/implementations/ciphers/cipher_aes_hw.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Copyright 2001-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 <openssl/proverr.h>
17
#include "cipher_aes.h"
18
19
static int cipher_hw_aes_initkey(PROV_CIPHER_CTX *dat,
20
                                 const unsigned char *key, size_t keylen)
21
0
{
22
0
    int ret;
23
0
    PROV_AES_CTX *adat = (PROV_AES_CTX *)dat;
24
0
    AES_KEY *ks = &adat->ks.ks;
25
26
0
    dat->ks = ks;
27
28
0
    if ((dat->mode == EVP_CIPH_ECB_MODE || dat->mode == EVP_CIPH_CBC_MODE)
29
0
        && !dat->enc) {
30
#ifdef HWAES_CAPABLE
31
        if (HWAES_CAPABLE) {
32
            ret = HWAES_set_decrypt_key(key, keylen * 8, ks);
33
            dat->block = (block128_f)HWAES_decrypt;
34
            dat->stream.cbc = NULL;
35
# ifdef HWAES_cbc_encrypt
36
            if (dat->mode == EVP_CIPH_CBC_MODE)
37
                dat->stream.cbc = (cbc128_f)HWAES_cbc_encrypt;
38
# endif
39
# ifdef HWAES_ecb_encrypt
40
            if (dat->mode == EVP_CIPH_ECB_MODE)
41
                dat->stream.ecb = (ecb128_f)HWAES_ecb_encrypt;
42
# endif
43
        } else
44
#endif
45
0
#ifdef BSAES_CAPABLE
46
0
        if (BSAES_CAPABLE && dat->mode == EVP_CIPH_CBC_MODE) {
47
0
            ret = AES_set_decrypt_key(key, keylen * 8, ks);
48
0
            dat->block = (block128_f)AES_decrypt;
49
0
            dat->stream.cbc = (cbc128_f)ossl_bsaes_cbc_encrypt;
50
0
        } else
51
0
#endif
52
0
#ifdef VPAES_CAPABLE
53
0
        if (VPAES_CAPABLE) {
54
0
            ret = vpaes_set_decrypt_key(key, keylen * 8, ks);
55
0
            dat->block = (block128_f)vpaes_decrypt;
56
0
            dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE)
57
0
                              ?(cbc128_f)vpaes_cbc_encrypt : NULL;
58
0
        } else
59
0
#endif
60
0
        {
61
0
            ret = AES_set_decrypt_key(key, keylen * 8, ks);
62
0
            dat->block = (block128_f)AES_decrypt;
63
0
            dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE)
64
0
                              ? (cbc128_f)AES_cbc_encrypt : NULL;
65
0
        }
66
0
    } else
67
#ifdef HWAES_CAPABLE
68
    if (HWAES_CAPABLE) {
69
        ret = HWAES_set_encrypt_key(key, keylen * 8, ks);
70
        dat->block = (block128_f)HWAES_encrypt;
71
        dat->stream.cbc = NULL;
72
# ifdef HWAES_cbc_encrypt
73
        if (dat->mode == EVP_CIPH_CBC_MODE)
74
            dat->stream.cbc = (cbc128_f)HWAES_cbc_encrypt;
75
        else
76
# endif
77
# ifdef HWAES_ecb_encrypt
78
        if (dat->mode == EVP_CIPH_ECB_MODE)
79
            dat->stream.ecb = (ecb128_f)HWAES_ecb_encrypt;
80
        else
81
# endif
82
# ifdef HWAES_ctr32_encrypt_blocks
83
        if (dat->mode == EVP_CIPH_CTR_MODE)
84
            dat->stream.ctr = (ctr128_f)HWAES_ctr32_encrypt_blocks;
85
        else
86
# endif
87
            (void)0;            /* terminate potentially open 'else' */
88
    } else
89
#endif
90
0
#ifdef BSAES_CAPABLE
91
0
    if (BSAES_CAPABLE && dat->mode == EVP_CIPH_CTR_MODE) {
92
0
        ret = AES_set_encrypt_key(key, keylen * 8, ks);
93
0
        dat->block = (block128_f)AES_encrypt;
94
0
        dat->stream.ctr = (ctr128_f)ossl_bsaes_ctr32_encrypt_blocks;
95
0
    } else
96
0
#endif
97
0
#ifdef VPAES_CAPABLE
98
0
    if (VPAES_CAPABLE) {
99
0
        ret = vpaes_set_encrypt_key(key, keylen * 8, ks);
100
0
        dat->block = (block128_f)vpaes_encrypt;
101
0
        dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE)
102
0
                          ? (cbc128_f)vpaes_cbc_encrypt : NULL;
103
0
    } else
104
0
#endif
105
0
    {
106
0
        ret = AES_set_encrypt_key(key, keylen * 8, ks);
107
0
        dat->block = (block128_f)AES_encrypt;
108
0
        dat->stream.cbc = (dat->mode == EVP_CIPH_CBC_MODE)
109
0
                          ? (cbc128_f)AES_cbc_encrypt : NULL;
110
#ifdef AES_CTR_ASM
111
        if (dat->mode == EVP_CIPH_CTR_MODE)
112
            dat->stream.ctr = (ctr128_f)AES_ctr32_encrypt;
113
#endif
114
0
    }
115
116
0
    if (ret < 0) {
117
0
        ERR_raise(ERR_LIB_PROV, PROV_R_KEY_SETUP_FAILED);
118
0
        return 0;
119
0
    }
120
121
0
    return 1;
122
0
}
123
124
IMPLEMENT_CIPHER_HW_COPYCTX(cipher_hw_aes_copyctx, PROV_AES_CTX)
125
126
#define PROV_CIPHER_HW_aes_mode(mode)                                          \
127
static const PROV_CIPHER_HW aes_##mode = {                                     \
128
    cipher_hw_aes_initkey,                                                     \
129
    ossl_cipher_hw_generic_##mode,                                             \
130
    cipher_hw_aes_copyctx                                                      \
131
};                                                                             \
132
PROV_CIPHER_HW_declare(mode)                                                   \
133
91.2k
const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits)           \
134
91.2k
{                                                                              \
135
91.2k
    PROV_CIPHER_HW_select(mode)                                                \
136
91.2k
    return &aes_##mode;                                                        \
137
91.2k
}
ossl_prov_cipher_hw_aes_cbc
Line
Count
Source
133
2.20k
const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits)           \
134
2.20k
{                                                                              \
135
2.20k
    PROV_CIPHER_HW_select(mode)                                                \
136
2.20k
    return &aes_##mode;                                                        \
137
2.20k
}
ossl_prov_cipher_hw_aes_ecb
Line
Count
Source
133
89.0k
const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits)           \
134
89.0k
{                                                                              \
135
89.0k
    PROV_CIPHER_HW_select(mode)                                                \
136
89.0k
    return &aes_##mode;                                                        \
137
89.0k
}
Unexecuted instantiation: ossl_prov_cipher_hw_aes_ofb128
Unexecuted instantiation: ossl_prov_cipher_hw_aes_cfb128
Unexecuted instantiation: ossl_prov_cipher_hw_aes_cfb1
Unexecuted instantiation: ossl_prov_cipher_hw_aes_cfb8
ossl_prov_cipher_hw_aes_ctr
Line
Count
Source
133
17
const PROV_CIPHER_HW *ossl_prov_cipher_hw_aes_##mode(size_t keybits)           \
134
17
{                                                                              \
135
17
    PROV_CIPHER_HW_select(mode)                                                \
136
17
    return &aes_##mode;                                                        \
137
17
}
138
139
#if defined(AESNI_CAPABLE)
140
# include "cipher_aes_hw_aesni.inc"
141
#elif defined(SPARC_AES_CAPABLE)
142
# include "cipher_aes_hw_t4.inc"
143
#elif defined(S390X_aes_128_CAPABLE)
144
# include "cipher_aes_hw_s390x.inc"
145
#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 64
146
# include "cipher_aes_hw_rv64i.inc"
147
#elif defined(OPENSSL_CPUID_OBJ) && defined(__riscv) && __riscv_xlen == 32
148
# include "cipher_aes_hw_rv32i.inc"
149
#elif defined (ARMv8_HWAES_CAPABLE)
150
# include "cipher_aes_hw_armv8.inc"
151
#else
152
/* The generic case */
153
# define PROV_CIPHER_HW_declare(mode)
154
# define PROV_CIPHER_HW_select(mode)
155
#endif
156
157
PROV_CIPHER_HW_aes_mode(cbc)
158
PROV_CIPHER_HW_aes_mode(ecb)
159
PROV_CIPHER_HW_aes_mode(ofb128)
160
PROV_CIPHER_HW_aes_mode(cfb128)
161
PROV_CIPHER_HW_aes_mode(cfb1)
162
PROV_CIPHER_HW_aes_mode(cfb8)
163
PROV_CIPHER_HW_aes_mode(ctr)