Blame view

include/u-boot/rsa.h 3.24 KB
19c402afa   Simon Glass   image: Add RSA su...
1
2
3
4
5
6
7
8
  /*
   * Copyright (c) 2013, Google Inc.
   *
   * (C) Copyright 2008 Semihalf
   *
   * (C) Copyright 2000-2006
   * Wolfgang Denk, DENX Software Engineering, wd@denx.de.
   *
1a4596601   Wolfgang Denk   Add GPL-2.0+ SPDX...
9
   * SPDX-License-Identifier:	GPL-2.0+
19c402afa   Simon Glass   image: Add RSA su...
10
11
12
13
14
15
16
   */
  
  #ifndef _RSA_H
  #define _RSA_H
  
  #include <errno.h>
  #include <image.h>
646257d1f   Heiko Schocher   rsa: add sha256-r...
17
18
19
20
21
22
23
24
25
26
27
28
  /**
   * 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 */
e0f2f1553   Michael van der Westhuizen   Implement general...
29
  	uint64_t exponent;	/* public exponent */
646257d1f   Heiko Schocher   rsa: add sha256-r...
30
  };
73223f0e1   Simon Glass   Kconfig: Move CON...
31
  struct image_sign_info;
19c402afa   Simon Glass   image: Add RSA su...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
  #if IMAGE_ENABLE_SIGN
  /**
   * 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
4f427a421   Simon Glass   fdt: Update funct...
63
64
   * @return: 0, on success, -ENOSPC if the keydest FDT blob ran out of space,
  		other -ve value on error
19c402afa   Simon Glass   image: Add RSA su...
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
  */
  int rsa_add_verify_data(struct image_sign_info *info, void *keydest);
  #else
  static inline int rsa_sign(struct image_sign_info *info,
  		const struct image_region region[], int region_count,
  		uint8_t **sigp, uint *sig_len)
  {
  	return -ENXIO;
  }
  
  static inline int rsa_add_verify_data(struct image_sign_info *info,
  				      void *keydest)
  {
  	return -ENXIO;
  }
  #endif
  
  #if IMAGE_ENABLE_VERIFY
  /**
   * 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);
  #else
  static inline int rsa_verify(struct image_sign_info *info,
  		const struct image_region region[], int region_count,
  		uint8_t *sig, uint sig_len)
  {
  	return -ENXIO;
  }
  #endif
db1b5f3d2   Heiko Schocher   rsa: add sha256,r...
106
107
108
109
110
111
112
113
114
  #define RSA2048_BYTES	(2048 / 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
19c402afa   Simon Glass   image: Add RSA su...
115
  #endif