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