Coverage Report

Created: 2026-02-22 06:11

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openssl/crypto/evp/e_aes.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
#include "crypto/evp.h"
11
12
#define BLOCK_CIPHER_generic(nid, keylen, blocksize, ivlen, nmode, mode, MODE, flags) \
13
    static const EVP_CIPHER aes_##keylen##_##mode = {                                 \
14
        nid##_##keylen##_##nmode,                                                     \
15
        blocksize,                                                                    \
16
        keylen / 8,                                                                   \
17
        ivlen,                                                                        \
18
        flags | EVP_CIPH_##MODE##_MODE,                                               \
19
        EVP_ORIG_GLOBAL,                                                              \
20
    };                                                                                \
21
    const EVP_CIPHER *EVP_aes_##keylen##_##mode(void)                                 \
22
63
    {                                                                                 \
23
63
        return &aes_##keylen##_##mode;                                                \
24
63
    }
EVP_aes_128_cbc
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_128_ecb
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_128_ofb
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_128_cfb128
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_128_cfb1
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_128_cfb8
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_128_ctr
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_192_cbc
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_192_ecb
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_192_ofb
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_192_cfb128
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_192_cfb1
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_192_cfb8
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_192_ctr
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_256_cbc
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_256_ecb
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_256_ofb
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_256_cfb128
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_256_cfb1
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_256_cfb8
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
EVP_aes_256_ctr
Line
Count
Source
22
3
    {                                                                                 \
23
3
        return &aes_##keylen##_##mode;                                                \
24
3
    }
25
26
#define BLOCK_CIPHER_custom(nid, keylen, blocksize, ivlen, mode, MODE, flags)                                              \
27
    static const EVP_CIPHER aes_##keylen##_##mode = {                                                                      \
28
        nid##_##keylen##_##mode,                                                                                           \
29
        blocksize,                                                                                                         \
30
        (EVP_CIPH_##MODE##_MODE == EVP_CIPH_XTS_MODE || EVP_CIPH_##MODE##_MODE == EVP_CIPH_SIV_MODE ? 2 : 1) * keylen / 8, \
31
        ivlen,                                                                                                             \
32
        flags | EVP_CIPH_##MODE##_MODE,                                                                                    \
33
        EVP_ORIG_GLOBAL,                                                                                                   \
34
    };                                                                                                                     \
35
    const EVP_CIPHER *EVP_aes_##keylen##_##mode(void)                                                                      \
36
33
    {                                                                                                                      \
37
33
        return &aes_##keylen##_##mode;                                                                                     \
38
33
    }
EVP_aes_128_gcm
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_192_gcm
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_256_gcm
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_128_xts
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_256_xts
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_128_ccm
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_192_ccm
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_256_ccm
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_128_ocb
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_192_ocb
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
EVP_aes_256_ocb
Line
Count
Source
36
3
    {                                                                                                                      \
37
3
        return &aes_##keylen##_##mode;                                                                                     \
38
3
    }
39
40
#define BLOCK_CIPHER_generic_pack(nid, keylen, flags)                                              \
41
    BLOCK_CIPHER_generic(nid, keylen, 16, 16, cbc, cbc, CBC, flags | EVP_CIPH_FLAG_DEFAULT_ASN1)   \
42
    BLOCK_CIPHER_generic(nid, keylen, 16, 0, ecb, ecb, ECB, flags | EVP_CIPH_FLAG_DEFAULT_ASN1)    \
43
    BLOCK_CIPHER_generic(nid, keylen, 1, 16, ofb128, ofb, OFB, flags | EVP_CIPH_FLAG_DEFAULT_ASN1) \
44
    BLOCK_CIPHER_generic(nid, keylen, 1, 16, cfb128, cfb, CFB, flags | EVP_CIPH_FLAG_DEFAULT_ASN1) \
45
    BLOCK_CIPHER_generic(nid, keylen, 1, 16, cfb1, cfb1, CFB, flags)                               \
46
    BLOCK_CIPHER_generic(nid, keylen, 1, 16, cfb8, cfb8, CFB, flags)                               \
47
    BLOCK_CIPHER_generic(nid, keylen, 1, 16, ctr, ctr, CTR, flags)
48
49
BLOCK_CIPHER_generic_pack(NID_aes, 128, 0)
50
BLOCK_CIPHER_generic_pack(NID_aes, 192, 0)
51
BLOCK_CIPHER_generic_pack(NID_aes, 256, 0)
52
53
#define CUSTOM_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1       \
54
    | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
55
    | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT   \
56
    | EVP_CIPH_CUSTOM_COPY | EVP_CIPH_CUSTOM_IV_LENGTH)
57
58
BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, gcm, GCM,
59
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
60
BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, gcm, GCM,
61
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
62
BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, gcm, GCM,
63
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
64
65
#define XTS_FLAGS (EVP_CIPH_FLAG_DEFAULT_ASN1 | EVP_CIPH_CUSTOM_IV \
66
    | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_CTRL_INIT               \
67
    | EVP_CIPH_CUSTOM_COPY)
68
69
BLOCK_CIPHER_custom(NID_aes, 128, 1, 16, xts, XTS, XTS_FLAGS)
70
BLOCK_CIPHER_custom(NID_aes, 256, 1, 16, xts, XTS, XTS_FLAGS)
71
72
BLOCK_CIPHER_custom(NID_aes, 128, 1, 12, ccm, CCM,
73
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
74
BLOCK_CIPHER_custom(NID_aes, 192, 1, 12, ccm, CCM,
75
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
76
BLOCK_CIPHER_custom(NID_aes, 256, 1, 12, ccm, CCM,
77
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
78
79
#define WRAP_FLAGS (EVP_CIPH_WRAP_MODE                 \
80
    | EVP_CIPH_CUSTOM_IV | EVP_CIPH_FLAG_CUSTOM_CIPHER \
81
    | EVP_CIPH_ALWAYS_CALL_INIT | EVP_CIPH_FLAG_DEFAULT_ASN1)
82
83
static const EVP_CIPHER aes_128_wrap = {
84
    NID_id_aes128_wrap,
85
    8, 16, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL
86
};
87
88
const EVP_CIPHER *EVP_aes_128_wrap(void)
89
3
{
90
3
    return &aes_128_wrap;
91
3
}
92
93
static const EVP_CIPHER aes_192_wrap = {
94
    NID_id_aes192_wrap,
95
    8, 24, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL
96
};
97
98
const EVP_CIPHER *EVP_aes_192_wrap(void)
99
3
{
100
3
    return &aes_192_wrap;
101
3
}
102
103
static const EVP_CIPHER aes_256_wrap = {
104
    NID_id_aes256_wrap,
105
    8, 32, 8, WRAP_FLAGS, EVP_ORIG_GLOBAL
106
};
107
108
const EVP_CIPHER *EVP_aes_256_wrap(void)
109
3
{
110
3
    return &aes_256_wrap;
111
3
}
112
113
static const EVP_CIPHER aes_128_wrap_pad = {
114
    NID_id_aes128_wrap_pad,
115
    8, 16, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL
116
};
117
118
const EVP_CIPHER *EVP_aes_128_wrap_pad(void)
119
3
{
120
3
    return &aes_128_wrap_pad;
121
3
}
122
123
static const EVP_CIPHER aes_192_wrap_pad = {
124
    NID_id_aes192_wrap_pad,
125
    8, 24, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL
126
};
127
128
const EVP_CIPHER *EVP_aes_192_wrap_pad(void)
129
3
{
130
3
    return &aes_192_wrap_pad;
131
3
}
132
133
static const EVP_CIPHER aes_256_wrap_pad = {
134
    NID_id_aes256_wrap_pad,
135
    8, 32, 4, WRAP_FLAGS, EVP_ORIG_GLOBAL
136
};
137
138
const EVP_CIPHER *EVP_aes_256_wrap_pad(void)
139
3
{
140
3
    return &aes_256_wrap_pad;
141
3
}
142
143
#ifndef OPENSSL_NO_OCB
144
BLOCK_CIPHER_custom(NID_aes, 128, 16, 12, ocb, OCB,
145
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
146
BLOCK_CIPHER_custom(NID_aes, 192, 16, 12, ocb, OCB,
147
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
148
BLOCK_CIPHER_custom(NID_aes, 256, 16, 12, ocb, OCB,
149
    EVP_CIPH_FLAG_AEAD_CIPHER | CUSTOM_FLAGS)
150
#endif /* OPENSSL_NO_OCB */