xref: /aosp_15_r20/system/keymaster/km_openssl/aes_operation.cpp (revision 789431f29546679ab5188a97751fb38e3018d44d)
1*789431f2SAndroid Build Coastguard Worker /*
2*789431f2SAndroid Build Coastguard Worker  * Copyright 2014 The Android Open Source Project
3*789431f2SAndroid Build Coastguard Worker  *
4*789431f2SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*789431f2SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*789431f2SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*789431f2SAndroid Build Coastguard Worker  *
8*789431f2SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*789431f2SAndroid Build Coastguard Worker  *
10*789431f2SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*789431f2SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*789431f2SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*789431f2SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*789431f2SAndroid Build Coastguard Worker  * limitations under the License.
15*789431f2SAndroid Build Coastguard Worker  */
16*789431f2SAndroid Build Coastguard Worker 
17*789431f2SAndroid Build Coastguard Worker #include "aes_operation.h"
18*789431f2SAndroid Build Coastguard Worker 
19*789431f2SAndroid Build Coastguard Worker namespace keymaster {
20*789431f2SAndroid Build Coastguard Worker 
21*789431f2SAndroid Build Coastguard Worker static const keymaster_block_mode_t supported_block_modes[] = {KM_MODE_ECB, KM_MODE_CBC,
22*789431f2SAndroid Build Coastguard Worker                                                                KM_MODE_CTR, KM_MODE_GCM};
23*789431f2SAndroid Build Coastguard Worker 
24*789431f2SAndroid Build Coastguard Worker const keymaster_block_mode_t*
SupportedBlockModes(size_t * block_mode_count) const25*789431f2SAndroid Build Coastguard Worker AesEvpCipherDescription::SupportedBlockModes(size_t* block_mode_count) const {
26*789431f2SAndroid Build Coastguard Worker     *block_mode_count = array_length(supported_block_modes);
27*789431f2SAndroid Build Coastguard Worker     return supported_block_modes;
28*789431f2SAndroid Build Coastguard Worker }
29*789431f2SAndroid Build Coastguard Worker 
GetCipherInstance(size_t key_size,keymaster_block_mode_t block_mode,keymaster_error_t * error) const30*789431f2SAndroid Build Coastguard Worker const EVP_CIPHER* AesEvpCipherDescription::GetCipherInstance(size_t key_size,
31*789431f2SAndroid Build Coastguard Worker                                                              keymaster_block_mode_t block_mode,
32*789431f2SAndroid Build Coastguard Worker                                                              keymaster_error_t* error) const {
33*789431f2SAndroid Build Coastguard Worker     *error = KM_ERROR_OK;
34*789431f2SAndroid Build Coastguard Worker 
35*789431f2SAndroid Build Coastguard Worker     switch (block_mode) {
36*789431f2SAndroid Build Coastguard Worker     case KM_MODE_ECB:
37*789431f2SAndroid Build Coastguard Worker         switch (key_size) {
38*789431f2SAndroid Build Coastguard Worker         case 16:
39*789431f2SAndroid Build Coastguard Worker             return EVP_aes_128_ecb();
40*789431f2SAndroid Build Coastguard Worker         case 24:
41*789431f2SAndroid Build Coastguard Worker             return EVP_aes_192_ecb();
42*789431f2SAndroid Build Coastguard Worker         case 32:
43*789431f2SAndroid Build Coastguard Worker             return EVP_aes_256_ecb();
44*789431f2SAndroid Build Coastguard Worker         };
45*789431f2SAndroid Build Coastguard Worker         *error = KM_ERROR_UNSUPPORTED_KEY_SIZE;
46*789431f2SAndroid Build Coastguard Worker         break;
47*789431f2SAndroid Build Coastguard Worker 
48*789431f2SAndroid Build Coastguard Worker     case KM_MODE_CBC:
49*789431f2SAndroid Build Coastguard Worker         switch (key_size) {
50*789431f2SAndroid Build Coastguard Worker         case 16:
51*789431f2SAndroid Build Coastguard Worker             return EVP_aes_128_cbc();
52*789431f2SAndroid Build Coastguard Worker         case 24:
53*789431f2SAndroid Build Coastguard Worker             return EVP_aes_192_cbc();
54*789431f2SAndroid Build Coastguard Worker         case 32:
55*789431f2SAndroid Build Coastguard Worker             return EVP_aes_256_cbc();
56*789431f2SAndroid Build Coastguard Worker         };
57*789431f2SAndroid Build Coastguard Worker         *error = KM_ERROR_UNSUPPORTED_KEY_SIZE;
58*789431f2SAndroid Build Coastguard Worker         break;
59*789431f2SAndroid Build Coastguard Worker 
60*789431f2SAndroid Build Coastguard Worker     case KM_MODE_CTR:
61*789431f2SAndroid Build Coastguard Worker         switch (key_size) {
62*789431f2SAndroid Build Coastguard Worker         case 16:
63*789431f2SAndroid Build Coastguard Worker             return EVP_aes_128_ctr();
64*789431f2SAndroid Build Coastguard Worker         case 24:
65*789431f2SAndroid Build Coastguard Worker             return EVP_aes_192_ctr();
66*789431f2SAndroid Build Coastguard Worker         case 32:
67*789431f2SAndroid Build Coastguard Worker             return EVP_aes_256_ctr();
68*789431f2SAndroid Build Coastguard Worker         }
69*789431f2SAndroid Build Coastguard Worker         *error = KM_ERROR_UNSUPPORTED_KEY_SIZE;
70*789431f2SAndroid Build Coastguard Worker         break;
71*789431f2SAndroid Build Coastguard Worker 
72*789431f2SAndroid Build Coastguard Worker     case KM_MODE_GCM:
73*789431f2SAndroid Build Coastguard Worker         switch (key_size) {
74*789431f2SAndroid Build Coastguard Worker         case 16:
75*789431f2SAndroid Build Coastguard Worker             return EVP_aes_128_gcm();
76*789431f2SAndroid Build Coastguard Worker         case 24:
77*789431f2SAndroid Build Coastguard Worker             return EVP_aes_192_gcm();
78*789431f2SAndroid Build Coastguard Worker         case 32:
79*789431f2SAndroid Build Coastguard Worker             return EVP_aes_256_gcm();
80*789431f2SAndroid Build Coastguard Worker         }
81*789431f2SAndroid Build Coastguard Worker         *error = KM_ERROR_UNSUPPORTED_KEY_SIZE;
82*789431f2SAndroid Build Coastguard Worker         break;
83*789431f2SAndroid Build Coastguard Worker 
84*789431f2SAndroid Build Coastguard Worker     default:
85*789431f2SAndroid Build Coastguard Worker         *error = KM_ERROR_UNSUPPORTED_BLOCK_MODE;
86*789431f2SAndroid Build Coastguard Worker         break;
87*789431f2SAndroid Build Coastguard Worker     }
88*789431f2SAndroid Build Coastguard Worker 
89*789431f2SAndroid Build Coastguard Worker     assert(*error != KM_ERROR_OK);
90*789431f2SAndroid Build Coastguard Worker     return nullptr;
91*789431f2SAndroid Build Coastguard Worker }
92*789431f2SAndroid Build Coastguard Worker 
93*789431f2SAndroid Build Coastguard Worker static AesEvpCipherDescription description;
GetCipherDescription() const94*789431f2SAndroid Build Coastguard Worker const EvpCipherDescription& AesOperationFactory::GetCipherDescription() const {
95*789431f2SAndroid Build Coastguard Worker     return description;
96*789431f2SAndroid Build Coastguard Worker }
97*789431f2SAndroid Build Coastguard Worker 
98*789431f2SAndroid Build Coastguard Worker }  // namespace keymaster
99