| /* 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. | 
 |  */ | 
 |  | 
 | #pragma once | 
 |  | 
 | #include "2crypto.h" | 
 | #include "2struct.h" | 
 |  | 
 | struct vb2_workbuf; | 
 |  | 
 | /* Public key structure in RAM */ | 
 | struct vb2_public_key { | 
 | 	uint32_t arrsize;    /* Length of n[] and rr[] in number of uint32_t */ | 
 | 	uint32_t n0inv;      /* -1 / n[0] mod 2^32 */ | 
 | 	const uint32_t *n;   /* Modulus as little endian array */ | 
 | 	const uint32_t *rr;  /* R^2 as little endian array */ | 
 | 	enum vb2_signature_algorithm sig_alg;	/* Signature algorithm */ | 
 | 	enum vb2_hash_algorithm hash_alg;	/* Hash algorithm */ | 
 | 	const char *desc;			/* Description */ | 
 | 	uint32_t version;			/* Key version */ | 
 | 	const struct vb2_id *id;		/* Key ID */ | 
 | }; | 
 |  | 
 | /** | 
 |  * Convert vb2_crypto_algorithm to vb2_signature_algorithm. | 
 |  * | 
 |  * @param algorithm	Crypto algorithm (vb2_crypto_algorithm) | 
 |  * | 
 |  * @return The signature algorithm for that crypto algorithm, or | 
 |  * VB2_SIG_INVALID if the crypto algorithm or its corresponding signature | 
 |  * algorithm is invalid or not supported. | 
 |  */ | 
 | enum vb2_signature_algorithm vb2_crypto_to_signature(uint32_t algorithm); | 
 |  | 
 | /** | 
 |  * Return the size of a RSA signature | 
 |  * | 
 |  * @param sig_alg	Signature algorithm | 
 |  * @return The size of the signature in bytes, or 0 if error. | 
 |  */ | 
 | uint32_t vb2_rsa_sig_size(enum vb2_signature_algorithm sig_alg); | 
 |  | 
 | /** | 
 |  * Return the size of a pre-processed RSA public key. | 
 |  * | 
 |  * @param sig_alg	Signature algorithm | 
 |  * @return The size of the preprocessed key in bytes, or 0 if error. | 
 |  */ | 
 | uint32_t vb2_packed_key_size(enum vb2_signature_algorithm sig_alg); | 
 |  | 
 | /** | 
 |  * Check pkcs 1.5 padding bytes | 
 |  * | 
 |  * @param sig		Signature to verify | 
 |  * @param key		Key to take signature and hash algorithms from | 
 |  * @return VB2_SUCCESS, or non-zero if error. | 
 |  */ | 
 | int vb2_check_padding(const uint8_t *sig, const struct vb2_public_key *key); | 
 |  | 
 | /* Size of work buffer sufficient for vb2_rsa_verify_digest() worst case */ | 
 | #define VB2_VERIFY_RSA_DIGEST_WORKBUF_BYTES (3 * 1024) | 
 |  | 
 | /** | 
 |  * Verify a RSA PKCS1.5 signature against an expected hash digest. | 
 |  * | 
 |  * @param key		Key to use in signature verification | 
 |  * @param sig		Signature to verify (destroyed in process) | 
 |  * @param digest	Digest of signed data | 
 |  * @param wb		Work buffer | 
 |  * @return VB2_SUCCESS, or non-zero if error. | 
 |  */ | 
 | int vb2_rsa_verify_digest(const struct vb2_public_key *key, | 
 | 			  uint8_t *sig, | 
 | 			  const uint8_t *digest, | 
 | 			  const struct vb2_workbuf *wb); | 
 |  |