19c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved. 29c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler * Use of this source code is governed by a BSD-style license that can be 39c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler * found in the LICENSE file. 49c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler */ 59c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 69c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 70c3ba249abb1dc60f5ebabccf84ff13206440b83Bill Richardson#include <stdint.h> 89c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#include <stdio.h> 99c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 109c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#define _STUB_IMPLEMENTATION_ 119c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 129c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#include "cryptolib.h" 139c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#include "file_keys.h" 149c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#include "rsa_padding_test.h" 159c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#include "test_common.h" 169c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#include "utility.h" 179c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler#include "vboot_api.h" 189c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 199c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 209c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler/* Data for mock functions */ 219c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerstatic int mock_rsaverify_retval; 229c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 239c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler/* Mock functions */ 249c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangleruint8_t* DigestBuf(const uint8_t* buf, uint64_t len, int sig_algorithm) { 259c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Just need to return something; it's only passed to the mock RSAVerify() */ 269c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler return VbExMalloc(4); 279c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 289c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 299c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerint RSAVerify(const RSAPublicKey *key, 309c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler const uint8_t* sig, 319c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler const uint32_t sig_len, 329c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler const uint8_t sig_type, 339c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler const uint8_t* hash) { 349c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler return mock_rsaverify_retval; 359c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 369c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 379c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerstatic void ResetMocks(void) { 389c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler mock_rsaverify_retval = 1; 399c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 409c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 419c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler/* Test RSA utility funcs */ 429c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerstatic void TestUtils(void) { 439c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler RSAPublicKey* key; 449c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint64_t u; 459c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 469c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Processed key size */ 479c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAProcessedKeySize(0, &u), 1, "Processed key size 0"); 489c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(u, RSA1024NUMBYTES * 2 + sizeof(uint32_t) * 2, 499c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "Processed key size 0 size"); 509c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAProcessedKeySize(3, &u), 1, "Processed key size 3"); 519c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(u, RSA2048NUMBYTES * 2 + sizeof(uint32_t) * 2, 529c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "Processed key size 3 size"); 539c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAProcessedKeySize(7, &u), 1, "Processed key size 7"); 549c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(u, RSA4096NUMBYTES * 2 + sizeof(uint32_t) * 2, 559c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "Processed key size 7 size"); 569c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAProcessedKeySize(11, &u), 1, "Processed key size 11"); 579c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(u, RSA8192NUMBYTES * 2 + sizeof(uint32_t) * 2, 589c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "Processed key size 11 size"); 599c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAProcessedKeySize(kNumAlgorithms, &u), 0, 609c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "Processed key size invalid algorithm"); 619c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 629c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Alloc key */ 639c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler key = RSAPublicKeyNew(); 649c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(key == NULL, 0, "New key not null"); 659c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* New key fields */ 669c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_EQ(key->n, NULL, "New key no n"); 679c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_EQ(key->rr, NULL, "New key no rr"); 689c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(key->len, 0, "New key len"); 699c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(key->algorithm, kNumAlgorithms, "New key no algorithm"); 709c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Free key */ 719c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler RSAPublicKeyFree(key); 729c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Freeing null key shouldn't implode */ 739c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler RSAPublicKeyFree(NULL); 749c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 759c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 769c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler/* Test creating key from buffer */ 779c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerstatic void TestKeyFromBuffer(void) { 789c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler RSAPublicKey* key; 799c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint8_t* buf; 809c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint32_t* buf_key_len; 819c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler int i; 829c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 839c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler buf = malloc(8 + 2 * RSA8192NUMBYTES); 849c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler buf_key_len = (uint32_t*)buf; 859c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 869c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler for (i = 0; i < 4; i++) { 879c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint32_t key_len = RSA1024NUMBYTES << i; 889c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler Memset(buf, 0xAB, sizeof(buf)); 899c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler *buf_key_len = key_len / sizeof(uint32_t); 909c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler *(buf_key_len + 1) = 0xF00D2345; /* n0inv */ 919c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler buf[8] = 100; 929c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler buf[8 + key_len - 1] = 101; 939c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler buf[8 + key_len] = 120; 949c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler buf[8 + key_len * 2 - 1] = 121; 959c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 969c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Correct length */ 979c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler key = RSAPublicKeyFromBuf(buf, 8 + key_len * 2); 989c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_NEQ(key, NULL, "RSAPublicKeyFromBuf() ptr"); 999c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(key->len, *buf_key_len, "RSAPublicKeyFromBuf() len"); 1009c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(key->n0inv, 0xF00D2345, "RSAPublicKeyFromBuf() n0inv"); 1019c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_NEQ(key->n, NULL, "RSAPublicKeyFromBuf() n ptr"); 1029c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(((uint8_t*)key->n)[0], 100, "RSAPublicKeyFromBuf() n start"); 1039c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(((uint8_t*)key->n)[key_len - 1], 101, 1049c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "RSAPublicKeyFromBuf() n end"); 1059c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_NEQ(key->rr, NULL, "RSAPublicKeyFromBuf() rr ptr"); 1069c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(((uint8_t*)key->rr)[0], 120, "RSAPublicKeyFromBuf() rr start"); 1079c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(((uint8_t*)key->rr)[key_len - 1], 121, 1089c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "RSAPublicKeyFromBuf() rr end"); 1099c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler RSAPublicKeyFree(key); 1109c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1119c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Underflow and overflow */ 1129c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_EQ(RSAPublicKeyFromBuf(buf, 8 + key_len * 2 - 1), NULL, 1139c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "RSAPublicKeyFromBuf() underflow"); 1149c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_EQ(RSAPublicKeyFromBuf(buf, 8 + key_len * 2 + 1), NULL, 1159c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "RSAPublicKeyFromBuf() overflow"); 1169c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1179c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Invalid key length in buffer */ 1189c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler *buf_key_len = key_len / sizeof(uint32_t) + 1; 1199c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_EQ(RSAPublicKeyFromBuf(buf, 8 + key_len * 2 + 1), NULL, 1209c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "RSAPublicKeyFromBuf() invalid key length"); 1219c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1229c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Valid key length in buffer, but for some other length key */ 1239c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler *buf_key_len = (RSA1024NUMBYTES << ((i + 1) & 3)) / sizeof(uint32_t); 1249c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_PTR_EQ(RSAPublicKeyFromBuf(buf, 8 + key_len * 2 + 1), NULL, 1259c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler "RSAPublicKeyFromBuf() key length for wrong key"); 1269c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler } 1279c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler free(buf); 1289c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 1299c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1309c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler/* Test verifying binary */ 1319c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerstatic void TestVerifyBinary(void) { 1329c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler RSAPublicKey key; 1339c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint8_t keybuf[8 + 2 * RSA1024NUMBYTES]; 1349c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint32_t* keybuf_len = (uint32_t*)keybuf; 1359c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint8_t buf[120]; 1369c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint8_t sig[4]; 1379c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1389c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler *keybuf_len = RSA1024NUMBYTES / sizeof(uint32_t); 1399c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1409c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Successful verification */ 1419c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1429c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinary_f(NULL, &key, buf, sizeof(buf), sig, 0), 1439c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1, "RSAVerifyBinary_f() success"); 1449c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Successful verification using key blob */ 1459c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinary_f(keybuf, NULL, buf, sizeof(buf), sig, 0), 1469c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1, "RSAVerifyBinary_f() success with keyblob"); 1479c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1489c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Invalid algorithm */ 1499c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1509c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinary_f(NULL, &key, buf, sizeof(buf), sig, kNumAlgorithms), 1519c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinary_f() invalid algorithm"); 1529c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Must have either a key or a key blob */ 1539c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1549c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinary_f(NULL, NULL, buf, sizeof(buf), sig, kNumAlgorithms), 1559c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinary_f() no key or key_blob"); 1569c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Wrong algorithm for key buffer (so key buffer is wrong size) */ 1579c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1589c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinary_f(keybuf, NULL, buf, sizeof(buf), sig, 3), 1599c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinary_f() wrong alg for key blob"); 1609c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1619c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Simulate failed verification */ 1629c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1639c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler mock_rsaverify_retval = 0; 1649c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinary_f(NULL, &key, buf, sizeof(buf), sig, 0), 1659c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinary_f() bad verify"); 1669c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 1679c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1689c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler/* Test verifying binary with digest */ 1699c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerstatic void TestVerifyBinaryWithDigest(void) { 1709c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler RSAPublicKey key; 1719c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint8_t keybuf[8 + 2 * RSA1024NUMBYTES]; 1729c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint32_t* keybuf_len = (uint32_t*)keybuf; 1739c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint8_t digest[120]; 1749c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler uint8_t sig[4]; 1759c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1769c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler *keybuf_len = RSA1024NUMBYTES / sizeof(uint32_t); 1779c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1789c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Successful verification */ 1799c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1809c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinaryWithDigest_f(NULL, &key, digest, sig, 0), 1819c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1, "RSAVerifyBinaryWithDigest_f() success"); 1829c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Successful verification using key blob */ 1839c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinaryWithDigest_f(keybuf, NULL, digest, sig, 0), 1849c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1, "RSAVerifyBinaryWithDigest_f() success with keyblob"); 1859c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1869c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Invalid algorithm */ 1879c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1889c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinaryWithDigest_f(NULL, &key, digest, sig, kNumAlgorithms), 1899c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinaryWithDigest_f() invalid algorithm"); 1909c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Must have either a key or a key blob */ 1919c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1929c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinaryWithDigest_f(NULL, NULL, digest, sig, kNumAlgorithms), 1939c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinaryWithDigest_f() no key or key_blob"); 1949c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Wrong algorithm for key buffer (so key buffer is wrong size) */ 1959c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 1969c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinaryWithDigest_f(keybuf, NULL, digest, sig, 3), 1979c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinaryWithDigest_f() wrong alg for key blob"); 1989c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 1999c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Simulate failed verification */ 2009c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler ResetMocks(); 2019c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler mock_rsaverify_retval = 0; 2029c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TEST_EQ(RSAVerifyBinaryWithDigest_f(NULL, &key, digest, sig, 0), 2039c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 0, "RSAVerifyBinaryWithDigest_f() bad verify"); 2049c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 2059c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 2069c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spanglerint main(int argc, char* argv[]) { 2079c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler int error_code = 0; 2089c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 2099c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler /* Run tests */ 2109c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TestUtils(); 2119c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TestKeyFromBuffer(); 2129c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TestVerifyBinary(); 2139c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler TestVerifyBinaryWithDigest(); 2149c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 2159c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler if (!gTestSuccess) 2169c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler error_code = 255; 2179c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler 2189c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler return error_code; 2199c9606b7a6e2fe7a2d8147c0d61c2d3f5b98956dRandall Spangler} 220