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