1c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden/* 2c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * Copyright (C) 2016 The Android Open Source Project 3c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * 4c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 5c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * you may not use this file except in compliance with the License. 6c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * You may obtain a copy of the License at 7c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * 8c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * http://www.apache.org/licenses/LICENSE-2.0 9c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * 10c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * Unless required by applicable law or agreed to in writing, software 11c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 12c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * See the License for the specific language governing permissions and 14c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden * limitations under the License. 15c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden */ 16c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 17c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#define LOG_TAG "keystore" 18c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 19c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include "keystore_utils.h" 20c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 21c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <errno.h> 22c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <string.h> 23c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <unistd.h> 24c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 25c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <cutils/log.h> 26c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <private/android_filesystem_config.h> 27c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 28c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden#include <keymaster/android_keymaster_utils.h> 29c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 30c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willdensize_t readFully(int fd, uint8_t* data, size_t size) { 31c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden size_t remaining = size; 32c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden while (remaining > 0) { 33c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden ssize_t n = TEMP_FAILURE_RETRY(read(fd, data, remaining)); 34c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden if (n <= 0) { 35c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return size - remaining; 36c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden } 37c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden data += n; 38c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden remaining -= n; 39c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden } 40c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return size; 41c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 42c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 43c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willdensize_t writeFully(int fd, uint8_t* data, size_t size) { 44c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden size_t remaining = size; 45c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden while (remaining > 0) { 46c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden ssize_t n = TEMP_FAILURE_RETRY(write(fd, data, remaining)); 47c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden if (n < 0) { 48c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden ALOGW("write failed: %s", strerror(errno)); 49c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return size - remaining; 50c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden } 51c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden data += n; 52c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden remaining -= n; 53c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden } 54c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return size; 55c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 56c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 57c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willdenvoid add_legacy_key_authorizations(int keyType, std::vector<keymaster_key_param_t>* params) { 58c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PURPOSE, KM_PURPOSE_SIGN)); 59c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PURPOSE, KM_PURPOSE_VERIFY)); 60c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PURPOSE, KM_PURPOSE_ENCRYPT)); 61c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PURPOSE, KM_PURPOSE_DECRYPT)); 62c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PADDING, KM_PAD_NONE)); 63c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden if (keyType == EVP_PKEY_RSA) { 64c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_SIGN)); 65c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PADDING, KM_PAD_RSA_PKCS1_1_5_ENCRYPT)); 66c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PADDING, KM_PAD_RSA_PSS)); 67c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_PADDING, KM_PAD_RSA_OAEP)); 68c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden } 69c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_NONE)); 70c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_MD5)); 71c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA1)); 72c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA_2_224)); 73c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA_2_256)); 74c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA_2_384)); 75c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_enum(KM_TAG_DIGEST, KM_DIGEST_SHA_2_512)); 76c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_bool(KM_TAG_ALL_USERS)); 77c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_bool(KM_TAG_NO_AUTH_REQUIRED)); 78c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_date(KM_TAG_ORIGINATION_EXPIRE_DATETIME, LLONG_MAX)); 79c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_date(KM_TAG_USAGE_EXPIRE_DATETIME, LLONG_MAX)); 80c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden params->push_back(keymaster_param_date(KM_TAG_ACTIVE_DATETIME, 0)); 81c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 82c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 83c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willdenuid_t get_app_id(uid_t uid) { 84c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return uid % AID_USER; 85c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 86c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden 87c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willdenuid_t get_user_id(uid_t uid) { 88c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden return uid / AID_USER; 89c1d1feee514e6138e1ed8ff924f5453ba8e1408aShawn Willden} 90