mirror of
https://xff.cz/git/u-boot/
synced 2025-09-30 06:51:28 +02:00
Add to support rsa 3072 bits algorithm in tools for image sign at host side and adds rsa 3072 bits verification in the image binary. Add test case in vboot for sha384 with rsa3072 algorithm testing. Signed-off-by: Jamin Lin <jamin_lin@aspeedtech.com> Reviewed-by: Simon Glass <sjg@chromium.org>
125 lines
3.7 KiB
C
125 lines
3.7 KiB
C
/* SPDX-License-Identifier: GPL-2.0+ */
|
|
/*
|
|
* Copyright (c) 2013, Google Inc.
|
|
*
|
|
* (C) Copyright 2008 Semihalf
|
|
*
|
|
* (C) Copyright 2000-2006
|
|
* Wolfgang Denk, DENX Software Engineering, wd@denx.de.
|
|
*/
|
|
|
|
#ifndef _RSA_H
|
|
#define _RSA_H
|
|
|
|
#include <errno.h>
|
|
#include <image.h>
|
|
|
|
/**
|
|
* struct rsa_public_key - holder for a public key
|
|
*
|
|
* An RSA public key consists of a modulus (typically called N), the inverse
|
|
* and R^2, where R is 2^(# key bits).
|
|
*/
|
|
|
|
struct rsa_public_key {
|
|
uint len; /* len of modulus[] in number of uint32_t */
|
|
uint32_t n0inv; /* -1 / modulus[0] mod 2^32 */
|
|
uint32_t *modulus; /* modulus as little endian array */
|
|
uint32_t *rr; /* R^2 as little endian array */
|
|
uint64_t exponent; /* public exponent */
|
|
};
|
|
|
|
struct image_sign_info;
|
|
|
|
/**
|
|
* sign() - calculate and return signature for given input data
|
|
*
|
|
* @info: Specifies key and FIT information
|
|
* @data: Pointer to the input data
|
|
* @data_len: Data length
|
|
* @sigp: Set to an allocated buffer holding the signature
|
|
* @sig_len: Set to length of the calculated hash
|
|
*
|
|
* This computes input data signature according to selected algorithm.
|
|
* Resulting signature value is placed in an allocated buffer, the
|
|
* pointer is returned as *sigp. The length of the calculated
|
|
* signature is returned via the sig_len pointer argument. The caller
|
|
* should free *sigp.
|
|
*
|
|
* @return: 0, on success, -ve on error
|
|
*/
|
|
int rsa_sign(struct image_sign_info *info,
|
|
const struct image_region region[],
|
|
int region_count, uint8_t **sigp, uint *sig_len);
|
|
|
|
/**
|
|
* add_verify_data() - Add verification information to FDT
|
|
*
|
|
* Add public key information to the FDT node, suitable for
|
|
* verification at run-time. The information added depends on the
|
|
* algorithm being used.
|
|
*
|
|
* @info: Specifies key and FIT information
|
|
* @keydest: Destination FDT blob for public key data
|
|
* @return: node offset within the FDT blob where the data was written on
|
|
* success, -ENOSPC if the keydest FDT blob ran out of space, other -ve
|
|
* value on other error
|
|
*/
|
|
int rsa_add_verify_data(struct image_sign_info *info, void *keydest);
|
|
|
|
/**
|
|
* rsa_verify_hash() - Verify a signature against a hash
|
|
*
|
|
* Verify a RSA PKCS1.5 signature against an expected hash.
|
|
*
|
|
* @info: Specifies key and FIT information
|
|
* @hash: Hash according to algorithm specified in @info
|
|
* @sig: Signature
|
|
* @sig_len: Number of bytes in signature
|
|
* Return: 0 if verified, -ve on error
|
|
*/
|
|
int rsa_verify_hash(struct image_sign_info *info,
|
|
const uint8_t *hash, uint8_t *sig, uint sig_len);
|
|
|
|
/**
|
|
* rsa_verify() - Verify a signature against some data
|
|
*
|
|
* Verify a RSA PKCS1.5 signature against an expected hash.
|
|
*
|
|
* @info: Specifies key and FIT information
|
|
* @data: Pointer to the input data
|
|
* @data_len: Data length
|
|
* @sig: Signature
|
|
* @sig_len: Number of bytes in signature
|
|
* Return: 0 if verified, -ve on error
|
|
*/
|
|
int rsa_verify(struct image_sign_info *info,
|
|
const struct image_region region[], int region_count,
|
|
uint8_t *sig, uint sig_len);
|
|
|
|
int rsa_verify_with_pkey(struct image_sign_info *info,
|
|
const void *hash, uint8_t *sig, uint sig_len);
|
|
|
|
int padding_pkcs_15_verify(struct image_sign_info *info,
|
|
uint8_t *msg, int msg_len,
|
|
const uint8_t *hash, int hash_len);
|
|
|
|
int padding_pss_verify(struct image_sign_info *info,
|
|
uint8_t *msg, int msg_len,
|
|
const uint8_t *hash, int hash_len);
|
|
|
|
#define RSA_DEFAULT_PADDING_NAME "pkcs-1.5"
|
|
|
|
#define RSA2048_BYTES (2048 / 8)
|
|
#define RSA3072_BYTES (3072 / 8)
|
|
#define RSA4096_BYTES (4096 / 8)
|
|
|
|
/* This is the minimum/maximum key size we support, in bits */
|
|
#define RSA_MIN_KEY_BITS 2048
|
|
#define RSA_MAX_KEY_BITS 4096
|
|
|
|
/* This is the maximum signature length that we support, in bits */
|
|
#define RSA_MAX_SIG_BITS 4096
|
|
|
|
#endif
|