| /* |
| ** Copyright 2009, The Android Open Source Project |
| ** |
| ** Licensed under the Apache License, Version 2.0 (the "License"); |
| ** you may not use this file except in compliance with the License. |
| ** You may obtain a copy of the License at |
| ** |
| ** http://www.apache.org/licenses/LICENSE-2.0 |
| ** |
| ** Unless required by applicable law or agreed to in writing, software |
| ** distributed under the License is distributed on an "AS IS" BASIS, |
| ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| ** See the License for the specific language governing permissions and |
| ** limitations under the License. |
| */ |
| |
| #ifndef __KEYMGMT_H__ |
| #define __KEYMGMT_H__ |
| |
| #define MASTER_KEY_TAG "master_key" |
| #define MASTER_KEY ".keymaster" |
| #define MAX_PATH_LEN 128 |
| #define SALT "Android Keystore 0.1" |
| #define NAME_DELIMITER "_" |
| #define KEYFILE_NAME "%s"NAME_DELIMITER"%s" |
| #define KEYGEN_ITER 1024 |
| #define AES_KEY_LEN 128 |
| #define USER_KEY_LEN (AES_KEY_LEN/8) |
| #define IV_LEN USER_KEY_LEN |
| #define MAX_RETRY_COUNT 6 |
| #define MIN_PASSWD_LENGTH 8 |
| |
| #define gen_key(passwd, key, len) \ |
| PKCS5_PBKDF2_HMAC_SHA1(passwd, strlen(passwd), \ |
| (unsigned char*)SALT, \ |
| strlen(SALT), KEYGEN_ITER, \ |
| len, key) |
| |
| #define KEYFILE_LEN MAX_NAMESPACE_LENGTH + MAX_KEY_NAME_LENGTH + 6 |
| |
| #define get_blob_size(blob) \ |
| (((blob->value_size + sizeof(uint32_t) + MAX_KEY_NAME_LENGTH \ |
| + USER_KEY_LEN - 1) / USER_KEY_LEN) * USER_KEY_LEN) |
| |
| #define MAX_BLOB_LEN ((MAX_KEY_VALUE_LENGTH + MAX_KEY_NAME_LENGTH + \ |
| sizeof(uint32_t) + USER_KEY_LEN - 1) / USER_KEY_LEN)\ |
| * USER_KEY_LEN |
| |
| #define data_blob_size(blob) USER_KEY_LEN + sizeof(uint32_t) + blob->blob_size |
| |
| typedef struct { |
| unsigned char iv[USER_KEY_LEN]; |
| uint32_t blob_size; |
| union { |
| unsigned char blob[1]; |
| struct { |
| uint32_t value_size; |
| char keyname[MAX_KEY_NAME_LENGTH]; |
| unsigned char value[MAX_KEY_VALUE_LENGTH]; |
| } __attribute__((packed)); |
| }; |
| } DATA_BLOB; |
| |
| typedef struct { |
| char tag[USER_KEY_LEN]; |
| unsigned char master_key[USER_KEY_LEN]; |
| } MASTER_BLOB; |
| |
| int put_key(const char *namespace, const char *keyname, |
| unsigned char *data, int size); |
| int get_key(const char *namespace, const char *keyname, |
| unsigned char *data, int *size); |
| int remove_key(const char *namespace, const char *keyname); |
| int list_keys(const char *namespace, char reply[BUFFER_MAX]); |
| int new_passwd(char *password); |
| int change_passwd(char *old_pass, char *new_pass); |
| int lock(); |
| int unlock(char *passwd); |
| KEYSTORE_STATE get_state(); |
| int reset_keystore(); |
| int init_keystore(const char *dir); |
| |
| #endif |