10a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden/* 20a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * Copyright 2014 The Android Open Source Project 30a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * 40a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * Licensed under the Apache License, Version 2.0 (the "License"); 50a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * you may not use this file except in compliance with the License. 60a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * You may obtain a copy of the License at 70a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * 80a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * http://www.apache.org/licenses/LICENSE-2.0 90a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * 100a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * Unless required by applicable law or agreed to in writing, software 110a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * distributed under the License is distributed on an "AS IS" BASIS, 120a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 130a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * See the License for the specific language governing permissions and 140a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * limitations under the License. 150a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden */ 160a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 170a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#ifndef SYSTEM_KEYMASTER_GOOGLE_KEYMASTER_MESSAGES_H_ 180a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#define SYSTEM_KEYMASTER_GOOGLE_KEYMASTER_MESSAGES_H_ 190a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 200a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <stdlib.h> 210a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <string.h> 220a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 230a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <keymaster/authorization_set.h> 240a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <keymaster/google_keymaster_utils.h> 250a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 260a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdennamespace keymaster { 270a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 280a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden// Commands 290a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenconst uint32_t GENERATE_KEY = 0; 300a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenconst uint32_t BEGIN_OPERATION = 1; 310a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenconst uint32_t UPDATE_OPERATION = 2; 320a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenconst uint32_t FINISH_OPERATION = 3; 330a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenconst uint32_t ABORT_OPERATION = 4; 340a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenconst uint32_t IMPORT_KEY = 5; 350a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenconst uint32_t EXPORT_KEY = 6; 360a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 370a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden/** 380a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * All responses include an error value, and if the error is not KM_ERROR_OK, return no additional 390a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * data. This abstract class factors out the common serialization functionality for all of the 400a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * responses, so we only have to implement it once. Inheritance for reuse is generally not a great 410a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * structure, but in this case it's the cleanest option. 420a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden */ 430a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct KeymasterResponse : public Serializable { 440a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 450a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 460a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 470a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 480a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual size_t NonErrorSerializedSize() const = 0; 490a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const = 0; 500a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden virtual bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) = 0; 510a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 520a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_error_t error; 530a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 540a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 550a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct SupportedAlgorithmsResponse : public KeymasterResponse { 560a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden SupportedAlgorithmsResponse() : algorithms(NULL), algorithms_length(0) {} 570a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~SupportedAlgorithmsResponse() { delete[] algorithms; } 580a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 590a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 600a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 610a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 620a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 630a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_algorithm_t* algorithms; 640a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t algorithms_length; 650a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 660a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 670a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdentemplate <typename T> struct SupportedResponse : public KeymasterResponse { 680a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden SupportedResponse() : results(NULL), results_length(0) {} 690a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~SupportedResponse() { delete[] results; } 700a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 710a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden template <size_t N> void SetResults(const T (&arr)[N]) { 720a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden delete[] results; 730a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden results_length = 0; 740a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden results = dup_array(arr); 750a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden if (results == NULL) { 760a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden error = KM_ERROR_MEMORY_ALLOCATION_FAILED; 770a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } else { 780a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden results_length = N; 790a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden error = KM_ERROR_OK; 800a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 810a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 820a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 830a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const { 840a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return sizeof(uint32_t) + results_length * sizeof(uint32_t); 850a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 860a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const { 870a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return append_uint32_array_to_buf(buf, end, results, results_length); 880a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 890a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end) { 900a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden delete[] results; 910a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden results = NULL; 920a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden UniquePtr<T[]> tmp; 930a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden if (!copy_uint32_array_from_buf(buf_ptr, end, &tmp, &results_length)) 940a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return false; 950a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden results = tmp.release(); 960a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return true; 970a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 980a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 990a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden T* results; 1000a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t results_length; 1010a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1020a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1030a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct GenerateKeyRequest : public Serializable { 1040a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden GenerateKeyRequest() {} 1050a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden GenerateKeyRequest(uint8_t* buf, size_t size) : key_description(buf, size) {} 1060a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1070a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const { return key_description.SerializedSize(); } 1080a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const { 1090a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return key_description.Serialize(buf, end); 1100a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1110a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end) { 1120a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return key_description.Deserialize(buf_ptr, end); 1130a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1140a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1150a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet key_description; 1160a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1170a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1180a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct GenerateKeyResponse : public KeymasterResponse { 1190a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden GenerateKeyResponse() { 1200a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden error = KM_ERROR_OK; 1210a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden key_blob.key_material = NULL; 1220a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden key_blob.key_material_size = 0; 1230a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1240a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~GenerateKeyResponse(); 1250a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1260a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 1270a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 1280a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 1290a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1300a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_key_blob_t key_blob; 1310a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet enforced; 1320a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet unenforced; 1330a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1340a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1350a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct GetKeyCharacteristicsRequest : public Serializable { 1360a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden GetKeyCharacteristicsRequest() { key_blob.key_material = NULL; } 1370a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~GetKeyCharacteristicsRequest(); 1380a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1390a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const void* key_material, size_t length); 1400a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const keymaster_key_blob_t& blob) { 1410a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden SetKeyMaterial(blob.key_material, blob.key_material_size); 1420a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1430a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1440a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 1450a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 1460a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 1470a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1480a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_key_blob_t key_blob; 1490a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet additional_params; 1500a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1510a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1520a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct GetKeyCharacteristicsResponse : public KeymasterResponse { 1530a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 1540a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 1550a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 1560a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1570a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet enforced; 1580a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet unenforced; 1590a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1600a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1610a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct BeginOperationRequest : public Serializable { 1620a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden BeginOperationRequest() { key_blob.key_material = NULL; } 1630a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~BeginOperationRequest() { delete[] key_blob.key_material; } 1640a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1650a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const void* key_material, size_t length); 1660a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const keymaster_key_blob_t& blob) { 1670a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden SetKeyMaterial(blob.key_material, blob.key_material_size); 1680a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1690a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1700a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 1710a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 1720a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 1730a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1740a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_purpose_t purpose; 1750a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_key_blob_t key_blob; 1760a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet additional_params; 1770a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1780a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1790a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct BeginOperationResponse : public KeymasterResponse { 1800a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 1810a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 1820a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 1830a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1840a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_operation_handle_t op_handle; 1850a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1860a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1870a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct UpdateOperationRequest : public Serializable { 1880a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 1890a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 1900a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 1910a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1920a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_operation_handle_t op_handle; 1930a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden Buffer input; 1940a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1950a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1960a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct UpdateOperationResponse : public KeymasterResponse { 1970a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 1980a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 1990a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 2000a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2010a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden Buffer output; 2020a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2030a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2040a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct FinishOperationRequest : public Serializable { 2050a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 2060a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 2070a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 2080a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2090a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_operation_handle_t op_handle; 2100a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden Buffer signature; 2110a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2120a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2130a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct FinishOperationResponse : public KeymasterResponse { 2140a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 2150a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 2160a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 2170a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2180a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden Buffer output; 2190a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2200a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2210a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct AddEntropyRequest : public Serializable { 2220a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 2230a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 2240a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 2250a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2260a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden Buffer random_data; 2270a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2280a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2290a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct ImportKeyRequest : public Serializable { 2300a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ImportKeyRequest() : key_data(NULL) {} 2310a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~ImportKeyRequest() { delete[] key_data; } 2320a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2330a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const void* key_material, size_t length); 2340a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2350a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 2360a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 2370a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 2380a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2390a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet key_description; 2400a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_key_format_t key_format; 2410a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* key_data; 2420a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t key_data_length; 2430a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2440a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2450a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct ImportKeyResponse : public KeymasterResponse { 2460a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ImportKeyResponse() { key_blob.key_material = NULL; } 2470a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~ImportKeyResponse() { delete[] key_blob.key_material; } 2480a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2490a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const void* key_material, size_t length); 2500a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const keymaster_key_blob_t& blob) { 2510a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden SetKeyMaterial(blob.key_material, blob.key_material_size); 2520a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 2530a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2540a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 2550a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 2560a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 2570a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2580a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_key_blob_t key_blob; 2590a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet enforced; 2600a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet unenforced; 2610a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2620a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2630a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct ExportKeyRequest : public Serializable { 2640a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ExportKeyRequest() { key_blob.key_material = NULL; } 2650a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~ExportKeyRequest() { delete[] key_blob.key_material; } 2660a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2670a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const void* key_material, size_t length); 2680a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const keymaster_key_blob_t& blob) { 2690a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden SetKeyMaterial(blob.key_material, blob.key_material_size); 2700a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 2710a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2720a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t SerializedSize() const; 2730a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* Serialize(uint8_t* buf, const uint8_t* end) const; 2740a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool Deserialize(const uint8_t** buf_ptr, const uint8_t* end); 2750a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2760a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden AuthorizationSet additional_params; 2770a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_key_format_t key_format; 2780a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden keymaster_key_blob_t key_blob; 2790a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2800a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2810a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct ExportKeyResponse : public KeymasterResponse { 2820a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ExportKeyResponse() : key_data(NULL) {} 2830a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden ~ExportKeyResponse() { delete[] key_data; } 2840a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2850a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden void SetKeyMaterial(const void* key_material, size_t length); 2860a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2870a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t NonErrorSerializedSize() const; 2880a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* NonErrorSerialize(uint8_t* buf, const uint8_t* end) const; 2890a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden bool NonErrorDeserialize(const uint8_t** buf_ptr, const uint8_t* end); 2900a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2910a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden uint8_t* key_data; 2920a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden size_t key_data_length; 2930a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 2940a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2950a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden// The structs below are trivial because they're not implemented yet. 2960a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct RescopeRequest : public Serializable {}; 2970a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstruct RescopeResponse : public KeymasterResponse {}; 2980a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 2990a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} // namespace keymaster 3000a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 3010a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#endif // SYSTEM_KEYMASTER_GOOGLE_KEYMASTER_MESSAGES_H_ 302