Coverage Report

Created: 2025-12-10 06:24

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