1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef __KEYSTORE_H__
18#define __KEYSTORE_H__
19
20#include <stdint.h>
21
22// note state values overlap with ResponseCode for the purposes of the state() API
23enum State {
24    STATE_NO_ERROR      = 1,
25    STATE_LOCKED        = 2,
26    STATE_UNINITIALIZED = 3,
27};
28
29enum ResponseCode {
30    NO_ERROR          =  STATE_NO_ERROR, // 1
31    LOCKED            =  STATE_LOCKED, // 2
32    UNINITIALIZED     =  STATE_UNINITIALIZED, // 3
33    SYSTEM_ERROR      =  4,
34    PROTOCOL_ERROR    =  5,
35    PERMISSION_DENIED =  6,
36    KEY_NOT_FOUND     =  7,
37    VALUE_CORRUPTED   =  8,
38    UNDEFINED_ACTION  =  9,
39    WRONG_PASSWORD_0  = 10,
40    WRONG_PASSWORD_1  = 11,
41    WRONG_PASSWORD_2  = 12,
42    WRONG_PASSWORD_3  = 13, // MAX_RETRY = 4
43    SIGNATURE_INVALID = 14,
44};
45
46enum CommandNames {
47    TEST = 0,
48    GET = 1,
49    INSERT = 2,
50    DELETE = 3,
51    EXIST = 4,
52    SAW = 5,
53    RESET = 6,
54    PASSWORD = 7,
55    LOCK = 8,
56    UNLOCK = 9,
57    ZERO = 10,
58    GENERATE = 11,
59    IMPORT = 12,
60    SIGN = 13,
61    VERIFY = 14,
62    GET_PUBKEY = 15,
63    DEL_KEY = 16,
64    GRANT = 17,
65    UNGRANT = 18,
66    GETMTIME = 19,
67};
68
69typedef uint8_t command_code_t;
70
71// Taken: a b c d e f g h i j k l m n o p q r s t u v w x y z
72//        * * * * *   *   *   * * * *   *   * * * * *   *   *
73command_code_t CommandCodes[] = {
74    't', // TEST
75    'g', // GET
76    'i', // INSERT
77    'd', // DELETE
78    'e', // EXIST
79    's', // SAW
80    'r', // RESET
81    'p', // PASSWORD
82    'l', // LOCK
83    'u', // UNLOCK
84    'z', // ZERO
85    'a', // GENERATE
86    'm', // IMPORT
87    'n', // SIGN
88    'v', // VERIFY
89    'b', // GET_PUBKEY
90    'k', // DEL_KEY
91    'x', // GRANT
92    'y', // UNGRANT
93    'c', // GETMTIME
94};
95
96/**
97 * Returns the size of the softkey magic header value for measuring
98 * and allocating purposes.
99 */
100size_t get_softkey_header_size();
101
102/**
103 * Adds the magic softkey header to a key blob.
104 *
105 * Returns NULL if the destination array is too small. Otherwise it
106 * returns the offset directly after the magic value.
107 */
108uint8_t* add_softkey_header(uint8_t* key_blob, size_t key_blob_length);
109
110/**
111 * Returns true if the key blob has a magic softkey header at the beginning.
112 */
113bool is_softkey(const uint8_t* key_blob, const size_t key_blob_length);
114
115#endif
116