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_TEST_UTILS_H_ 180a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#define SYSTEM_KEYMASTER_GOOGLE_KEYMASTER_TEST_UTILS_H_ 190a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 200a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden/* 210a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden * Utilities used to help with testing. Not used in production code. 220a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden */ 230a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 240a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <stdarg.h> 250a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 260a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <ostream> 270a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 280a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <keymaster/authorization_set.h> 290a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <keymaster/keymaster_defs.h> 300a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#include <keymaster/logger.h> 310a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 320a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstd::ostream& operator<<(std::ostream& os, const keymaster_key_param_t& param); 330a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool operator==(const keymaster_key_param_t& a, const keymaster_key_param_t& b); 340a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 350a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdennamespace keymaster { 360a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 370a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool operator==(const AuthorizationSet& a, const AuthorizationSet& b); 380a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 390a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenstd::ostream& operator<<(std::ostream& os, const AuthorizationSet& set); 400a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 410a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdennamespace test { 420a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 430a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdentemplate <keymaster_tag_t Tag, typename KeymasterEnum> 440a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool contains(const AuthorizationSet& set, TypedEnumTag<KM_ENUM, Tag, KeymasterEnum> tag, 450a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden KeymasterEnum val) { 460a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int pos = set.find(tag); 470a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return pos != -1 && set[pos].enumerated == val; 480a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} 490a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 500a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdentemplate <keymaster_tag_t Tag, typename KeymasterEnum> 510a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool contains(const AuthorizationSet& set, TypedEnumTag<KM_ENUM_REP, Tag, KeymasterEnum> tag, 520a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden KeymasterEnum val) { 530a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int pos = -1; 540a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden while ((pos = set.find(tag, pos)) != -1) 550a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden if (set[pos].enumerated == val) 560a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return true; 570a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return false; 580a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} 590a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 600a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdentemplate <keymaster_tag_t Tag> 610a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool contains(const AuthorizationSet& set, TypedTag<KM_INT, Tag> tag, uint32_t val) { 620a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int pos = set.find(tag); 630a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return pos != -1 && set[pos].integer == val; 640a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} 650a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 660a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdentemplate <keymaster_tag_t Tag> 670a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool contains(const AuthorizationSet& set, TypedTag<KM_INT_REP, Tag> tag, uint32_t val) { 680a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int pos = -1; 690a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden while ((pos = set.find(tag, pos)) != -1) 700a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden if (set[pos].integer == val) 710a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return true; 720a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return false; 730a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} 740a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 750a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdentemplate <keymaster_tag_t Tag> 760a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool contains(const AuthorizationSet& set, TypedTag<KM_LONG, Tag> tag, uint64_t val) { 770a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int pos = set.find(tag); 780a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return pos != -1 && set[pos].long_integer == val; 790a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} 800a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 810a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdentemplate <keymaster_tag_t Tag> 820a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenbool contains(const AuthorizationSet& set, TypedTag<KM_BYTES, Tag> tag, const std::string& val) { 830a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int pos = set.find(tag); 840a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return pos != -1 && 850a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden std::string(reinterpret_cast<const char*>(set[pos].blob.data), 860a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden set[pos].blob.data_length) == val; 870a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} 880a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 890a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdeninline bool contains(const AuthorizationSet& set, keymaster_tag_t tag) { 900a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return set.find(tag) != -1; 910a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} 920a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 930a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willdenclass StdoutLogger : public Logger { 940a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden public: 956f0b72fd8b0ea5c52d62dc5853318509b69db076Shawn Willden int debug(const char* fmt, ...) const { 960a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_list args; 970a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_start(args, fmt); 980a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int result = vprintf(fmt, args); 996f0b72fd8b0ea5c52d62dc5853318509b69db076Shawn Willden result += printf("\n"); 1000a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_end(args); 1010a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return result; 1020a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1030a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1040a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int info(const char* fmt, ...) const { 1050a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_list args; 1060a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_start(args, fmt); 1070a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int result = vprintf(fmt, args); 1086f0b72fd8b0ea5c52d62dc5853318509b69db076Shawn Willden result += printf("\n"); 1090a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_end(args); 1100a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return result; 1110a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1120a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1130a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int error(const char* fmt, ...) const { 1140a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_list args; 1150a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_start(args, fmt); 1160a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int result = vfprintf(stderr, fmt, args); 1176f0b72fd8b0ea5c52d62dc5853318509b69db076Shawn Willden result += printf("\n"); 1180a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_end(args); 1190a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return result; 1200a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1210a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1220a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int severe(const char* fmt, ...) const { 1230a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_list args; 1240a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_start(args, fmt); 1250a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden int result = vfprintf(stderr, fmt, args); 1266f0b72fd8b0ea5c52d62dc5853318509b69db076Shawn Willden result += printf("\n"); 1270a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden va_end(args); 1280a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden return result; 1290a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden } 1300a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden}; 1310a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1320a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} // namespace test 1330a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden} // namespace keymaster 1340a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden 1350a4df7e3a83a59e4a5abc3f605d7d7e9f636c682Shawn Willden#endif // SYSTEM_KEYMASTER_GOOGLE_KEYMASTER_TEST_UTILS_H_ 136