mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-11-24 02:05:01 +00:00
Originally, vboot1 code used VbExMalloc() and VbExFree() since it needed to talk to EFI firmware that didn't have standard malloc() and free(). Now, coreboot and depthcharge implement them as wrappers around those standard calls. vboot2 code already calls them directly, so let vboot1 code do that too. BUG=chromium:611535 BRANCH=none TEST=make runtests; emerge-kevin coreboot depthcharge Change-Id: I49ad0e32e38d278dc3589bfaf494bcf0e4b0a4bd Signed-off-by: Randall Spangler <rspangler@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/400905
123 lines
3.8 KiB
C
123 lines
3.8 KiB
C
/* Copyright (c) 2014 The Chromium OS Authors. All rights reserved.
|
|
* Use of this source code is governed by a BSD-style license that can be
|
|
* found in the LICENSE file.
|
|
*/
|
|
|
|
|
|
#include <stdint.h>
|
|
#include <stdio.h>
|
|
|
|
#include "2sysincludes.h"
|
|
|
|
#include "2common.h"
|
|
#include "2rsa.h"
|
|
#include "file_keys.h"
|
|
#include "rsa_padding_test.h"
|
|
#include "test_common.h"
|
|
#include "utility.h"
|
|
#include "vboot_api.h"
|
|
|
|
/*
|
|
* Internal functions from 2rsa.c that have error conditions we can't trigger
|
|
* from the public APIs. These include checks for bad algorithms where the
|
|
* next call level up already checks for bad algorithms, etc.
|
|
*
|
|
* These functions aren't in 2rsa.h because they're not part of the public
|
|
* APIs.
|
|
*/
|
|
int vb2_mont_ge(const struct vb2_public_key *key, uint32_t *a);
|
|
int vb2_check_padding(const uint8_t *sig, const struct vb2_public_key *key);
|
|
|
|
/**
|
|
* Test RSA utility funcs
|
|
*/
|
|
static void test_utils(void)
|
|
{
|
|
uint8_t sig[RSA1024NUMBYTES];
|
|
struct vb2_public_key kbad = {.sig_alg = VB2_SIG_INVALID,
|
|
.hash_alg = VB2_HASH_INVALID};
|
|
|
|
/* Verify old and new algorithm count constants match */
|
|
TEST_EQ(VB2_ALG_COUNT, VB2_ALG_COUNT, "Algorithm counts");
|
|
|
|
/* Crypto algorithm to sig algorithm mapping */
|
|
TEST_EQ(vb2_crypto_to_signature(VB2_ALG_RSA1024_SHA1),
|
|
VB2_SIG_RSA1024, "Crypto map to RSA1024");
|
|
TEST_EQ(vb2_crypto_to_signature(VB2_ALG_RSA2048_SHA256),
|
|
VB2_SIG_RSA2048, "Crypto map to RSA2048");
|
|
TEST_EQ(vb2_crypto_to_signature(VB2_ALG_RSA4096_SHA256),
|
|
VB2_SIG_RSA4096, "Crypto map to RSA4096");
|
|
TEST_EQ(vb2_crypto_to_signature(VB2_ALG_RSA8192_SHA512),
|
|
VB2_SIG_RSA8192, "Crypto map to RSA8192");
|
|
TEST_EQ(vb2_crypto_to_signature(VB2_ALG_COUNT),
|
|
VB2_SIG_INVALID, "Crypto map to invalid");
|
|
|
|
/* Sig size */
|
|
TEST_EQ(vb2_rsa_sig_size(VB2_SIG_RSA1024), RSA1024NUMBYTES,
|
|
"Sig size RSA1024");
|
|
TEST_EQ(vb2_rsa_sig_size(VB2_SIG_RSA2048), RSA2048NUMBYTES,
|
|
"Sig size RSA2048");
|
|
TEST_EQ(vb2_rsa_sig_size(VB2_SIG_RSA4096), RSA4096NUMBYTES,
|
|
"Sig size RSA4096");
|
|
TEST_EQ(vb2_rsa_sig_size(VB2_SIG_RSA8192), RSA8192NUMBYTES,
|
|
"Sig size RSA8192");
|
|
TEST_EQ(vb2_rsa_sig_size(VB2_SIG_INVALID), 0,
|
|
"Sig size invalid algorithm");
|
|
TEST_EQ(vb2_rsa_sig_size(VB2_SIG_NONE), 0,
|
|
"Sig size no signing algorithm");
|
|
|
|
/* Packed key size */
|
|
TEST_EQ(vb2_packed_key_size(VB2_SIG_RSA1024),
|
|
RSA1024NUMBYTES * 2 + sizeof(uint32_t) * 2,
|
|
"Packed key size VB2_SIG_RSA1024");
|
|
TEST_EQ(vb2_packed_key_size(VB2_SIG_RSA2048),
|
|
RSA2048NUMBYTES * 2 + sizeof(uint32_t) * 2,
|
|
"Packed key size VB2_SIG_RSA2048");
|
|
TEST_EQ(vb2_packed_key_size(VB2_SIG_RSA4096),
|
|
RSA4096NUMBYTES * 2 + sizeof(uint32_t) * 2,
|
|
"Packed key size VB2_SIG_RSA4096");
|
|
TEST_EQ(vb2_packed_key_size(VB2_SIG_RSA8192),
|
|
RSA8192NUMBYTES * 2 + sizeof(uint32_t) * 2,
|
|
"Packed key size VB2_SIG_RSA8192");
|
|
TEST_EQ(vb2_packed_key_size(VB2_SIG_INVALID), 0,
|
|
"Packed key size invalid algorithm");
|
|
TEST_EQ(vb2_packed_key_size(VB2_SIG_NONE), 0,
|
|
"Packed key size no signing algorithm");
|
|
|
|
/* Test padding check with bad algorithm */
|
|
memcpy(sig, signatures[0], sizeof(sig));
|
|
TEST_EQ(vb2_check_padding(sig, &kbad),
|
|
VB2_ERROR_RSA_PADDING_SIZE,
|
|
"vb2_check_padding() bad padding algorithm/size");
|
|
|
|
/* Test safe memcmp */
|
|
TEST_EQ(vb2_safe_memcmp("foo", "foo", 3), 0, "vb2_safe_memcmp() good");
|
|
TEST_NEQ(vb2_safe_memcmp("foo", "bar", 3), 0, "vb2_safe_memcmp() bad");
|
|
TEST_EQ(vb2_safe_memcmp("foo", "bar", 0), 0, "vb2_safe_memcmp() zero");
|
|
|
|
/* Test Montgomery >= */
|
|
{
|
|
uint32_t n[4] = {4, 4, 4, 4};
|
|
uint32_t a[4] = {4, 4, 4, 4};
|
|
struct vb2_public_key k = {
|
|
.arrsize = 4,
|
|
.n = n,
|
|
};
|
|
TEST_EQ(vb2_mont_ge(&k, a), 1, "mont_ge equal");
|
|
|
|
a[2] = 3;
|
|
TEST_EQ(vb2_mont_ge(&k, a), 0, "mont_ge less");
|
|
|
|
a[1] = 5;
|
|
TEST_EQ(vb2_mont_ge(&k, a), 0, "mont_ge greater");
|
|
}
|
|
}
|
|
|
|
int main(int argc, char* argv[])
|
|
{
|
|
/* Run tests */
|
|
test_utils();
|
|
|
|
return gTestSuccess ? 0 : 255;
|
|
}
|