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