blob: 2a0d8b7e2143bed321232eb1313e708841f893d2 [file] [log] [blame]
Ajay Dudanifb5cdde2012-09-20 14:57:01 -07001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License"); you
5 * may not use this file except in compliance with the License. You may
6 * 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
13 * implied. See the License for the specific language governing
14 * permissions and limitations under the License.
15 */
16
17#ifndef ANDROID_HARDWARE_QCOM_KEYMASTER_H
18#define ANDROID_HARDWARE_QCOM_KEYMASTER_H
19
20#include <stdint.h>
21#include <sys/cdefs.h>
22#include <sys/types.h>
23
24__BEGIN_DECLS
25
26/**
27 * The id of this module
28 */
29#define QCOM_KEYSTORE_KEYMASTER "qcom_keymaster"
30/**
31 * Operation result
32 */
33#define KEYMATER_SUCCESS 0
34#define KEYMASTER_FAILURE -1
35
36/**
37 * The API level of this version of the header. The allows the implementing
38 * module to recognize which API level of the client it is dealing with in
39 * the case of pre-compiled binary clients.
40 */
Paul Lawrencef4191b52014-05-06 13:59:38 -070041#define QCOM_KEYMASTER_API_VERSION KEYMASTER_MODULE_API_VERSION_0_3
Ajay Dudanifb5cdde2012-09-20 14:57:01 -070042
43#define KM_MAGIC_NUM (0x4B4D4B42) /* "KMKB" Key Master Key Blob in hex */
Ajay Dudani70789f22013-05-15 21:07:58 -070044#define KM_KEY_SIZE_MAX (512) /* 4096 bits */
Ajay Dudanifb5cdde2012-09-20 14:57:01 -070045#define KM_IV_LENGTH (16) /* AES128 CBC IV */
46#define KM_HMAC_LENGTH (32) /* SHA2 will be used for HMAC */
47
48struct qcom_km_key_blob {
49 uint32_t magic_num;
50 uint32_t version_num;
51 uint8_t modulus[KM_KEY_SIZE_MAX];
52 uint32_t modulus_size;
53 uint8_t public_exponent[KM_KEY_SIZE_MAX];
54 uint32_t public_exponent_size;
55 uint8_t iv[KM_IV_LENGTH];
56 uint8_t encrypted_private_exponent[KM_KEY_SIZE_MAX];
57 uint32_t encrypted_private_exponent_size;
58 uint8_t hmac[KM_HMAC_LENGTH];
59};
60typedef struct qcom_km_key_blob qcom_km_key_blob_t;
61/**
62 * Commands supported
63 */
64enum keymaster_cmd_t {
65 /*
66 * List the commands supportedin by the hardware.
67 */
68 KEYMASTER_GENERATE_KEYPAIR = 0x00000001,
69 KEYMASTER_IMPORT_KEYPAIR = 0x00000002,
70 KEYMASTER_SIGN_DATA = 0x00000003,
71 KEYMASTER_VERIFY_DATA = 0x00000004,
72};
73
74
75/**
76 * Command to Generate a public and private key. The key data returned
77 * (by secure app) is in shared buffer at offset of "key_blob" and is opaque
78 *
79 * cmd_id : Command issue to secure app
80 * key_type : Currently on RSA_TYPE is supported
81 * rsa_params : Parameters needed to generate an RSA key
82 */
83 struct keymaster_gen_keypair_cmd {
84 keymaster_cmd_t cmd_id;
85 keymaster_keypair_t key_type;
86 keymaster_rsa_keygen_params_t rsa_params;
87};
88typedef struct keymaster_gen_keypair_cmd keymaster_gen_keypair_cmd_t;
89
90/**
91 * Response to Generate a public and private key. The key data returned
92 * (by secure app) is in shared buffer at offset of "key_blob" and is opaque
93 *
94 * cmd_id : Command issue to secure app
95 * key_blob : key blob data
96 * key_blob_len : Total length of key blob information
97 * status : Result (success 0, or failure -1)
98 */
99struct keymaster_gen_keypair_resp {
100 keymaster_cmd_t cmd_id;
101 qcom_km_key_blob_t key_blob;
102 size_t key_blob_len;
103 int32_t status;
104};
105typedef struct keymaster_gen_keypair_resp keymaster_gen_keypair_resp_t;
106
107
108/**
109 * Command to import a public and private key pair. The imported keys
110 * will be in PKCS#8 format with DER encoding (Java standard). The key
111 * data returned (by secure app) is in shared buffer at offset of
112 * "key_blob" and is opaque
113 *
114 * cmd_id : Command issue to secure app
115 * pkcs8_key : Pointer to pkcs8 formatted key information
116 * pkcs8_key_len: PKCS8 formatted key length
117 */
118struct keymaster_import_keypair_cmd {
119 keymaster_cmd_t cmd_id;
120 uint32_t pkcs8_key;
121 size_t pkcs8_key_len;
122};
123typedef struct keymaster_import_keypair_cmd keymaster_import_keypair_cmd_t;
124
125/**
126 * Response to import a public and private key. The key data returned
127 * (by secure app) is in shared buffer at offset of "key_blob" and is opaque
128 *
129 * cmd_id : Command issue to secure app
130 * key_blob : key blob data
131 * key_blob_len : Total length of key blob information
132 * status : Result (success 0, or failure -1)
133 */
134struct keymaster_import_keypair_resp {
135 keymaster_cmd_t cmd_id;
136 qcom_km_key_blob_t key_blob;
137 size_t key_blob_len;
138 int32_t status;
139};
140typedef struct keymaster_import_keypair_resp keymaster_import_keypair_resp_t;
141
142/**
143 * Command to sign data using a key info generated before. This can use either
144 * an asymmetric key or a secret key.
145 * The signed data is returned (by secure app) at offset of data + dlen.
146 *
147 * cmd_id : Command issue to secure app
148 * sign_param :
149 * key_blob : Key data information (in shared buffer)
150 * data : Pointer to plain data buffer
151 * dlen : Plain data length
152 */
153struct keymaster_sign_data_cmd {
154 keymaster_cmd_t cmd_id;
155 keymaster_rsa_sign_params_t sign_param;
156 qcom_km_key_blob_t key_blob;
157 uint32_t data;
158 size_t dlen;
159};
160typedef struct keymaster_sign_data_cmd keymaster_sign_data_cmd_t;
161
162/**
163 * Response to sign data response
164 *
165 * cmd_id : Command issue to secure app
166 * signed_data : signature
167 * sig_len : Signed data length
168 * status : Result (success 0, or failure -1)
169 */
170struct keymaster_sign_data_resp {
171 keymaster_cmd_t cmd_id;
172 uint8_t signed_data[KM_KEY_SIZE_MAX];
173 size_t sig_len;
174 int32_t status;
175};
176
177typedef struct keymaster_sign_data_resp keymaster_sign_data_resp_t;
178
179/**
180 * Command to verify data using a key info generated before. This can use either
181 * an asymmetric key or a secret key.
182 *
183 * cmd_id : Command issue to secure app
184 * sign_param :
185 * key_blob : Key data information (in shared buffer)
186 * key_blob_len: Total key length
187 * signed_data : Pointer to signed data buffer
188 * signed_dlen : Signed data length
189 * signature : Offset to the signature data buffer (from signed data buffer)
190 * slen : Signature data length
191 */
192struct keymaster_verify_data_cmd {
193 keymaster_cmd_t cmd_id;
194 keymaster_rsa_sign_params_t sign_param;
195 qcom_km_key_blob_t key_blob;
196 uint32_t signed_data;
197 size_t signed_dlen;
198 uint32_t signature;
199 size_t slen;
200};
201typedef struct keymaster_verify_data_cmd keymaster_verify_data_cmd_t;
202/**
203 * Response to verify data
204 *
205 * cmd_id : Command issue to secure app
206 * status : Result (success 0, or failure -1)
207 */
208struct keymaster_verify_data_resp {
209 keymaster_cmd_t cmd_id;
210 int32_t status;
211};
212typedef struct keymaster_verify_data_resp keymaster_verify_data_resp_t;
213
214__END_DECLS
215
216#endif // ANDROID_HARDWARE_QCOM_KEYMASTER_H