mirror of https://github.com/ipxe/ipxe.git
139 lines
4.3 KiB
C
139 lines
4.3 KiB
C
#ifndef _IPXE_RSA_H
|
|
#define _IPXE_RSA_H
|
|
|
|
/** @file
|
|
*
|
|
* RSA public-key cryptography
|
|
*/
|
|
|
|
FILE_LICENCE ( GPL2_OR_LATER );
|
|
|
|
#include <ipxe/crypto.h>
|
|
#include <ipxe/bigint.h>
|
|
#include <ipxe/asn1.h>
|
|
|
|
/** ASN.1 OID for iso(1) member-body(2) us(840) */
|
|
#define ASN1_OID_ISO_US ASN1_OID_ISO_MEMBERBODY, ASN1_OID_DOUBLE ( 840 )
|
|
|
|
/** ASN.1 OID for iso(1) member-body(2) us(840) rsadsi(113549) */
|
|
#define ASN1_OID_RSADSI ASN1_OID_ISO_US, ASN1_OID_TRIPLE ( 113549 )
|
|
|
|
/** ASN.1 OID for iso(1) member-body(2) us(840) rsadsi(113549) pkcs(1) */
|
|
#define ASN1_OID_PKCS ASN1_OID_RSADSI, ASN1_OID_SINGLE ( 1 )
|
|
|
|
/** ASN.1 OID for iso(1) member-body(2) us(840) rsadsi(113549)
|
|
* digestAlgorithm(2)
|
|
*/
|
|
#define ASN1_OID_DIGESTALGORITHM ASN1_OID_RSADSI, ASN1_OID_SINGLE ( 2 )
|
|
|
|
/** ASN.1 OID for iso(1) identified-organization(3) oiw(14) */
|
|
#define ASN1_OID_OIW ASN1_OID_IDENTIFIED_ORGANIZATION, ASN1_OID_SINGLE ( 14 )
|
|
|
|
/** ASN.1 OID for iso(1) identified-organization(3) oiw(14) secsig(3) */
|
|
#define ASN1_OID_SECSIG ASN1_OID_OIW, ASN1_OID_SINGLE ( 3 )
|
|
|
|
/** ASN1. OID for iso(1) identified-organization(3) oiw(14) secsig(3)
|
|
* algorithms(2)
|
|
*/
|
|
#define ASN1_OID_SECSIG_ALGORITHMS ASN1_OID_SECSIG, ASN1_OID_SINGLE ( 2 )
|
|
|
|
/** ASN.1 OID for joint-iso-itu-t(2) country(16) us(840) */
|
|
#define ASN1_OID_COUNTRY_US ASN1_OID_COUNTRY, ASN1_OID_DOUBLE ( 840 )
|
|
|
|
/** ASN.1 OID for joint-iso-itu-t(2) country(16) us(840) organization(1) */
|
|
#define ASN1_OID_US_ORGANIZATION ASN1_OID_COUNTRY_US, ASN1_OID_SINGLE ( 1 )
|
|
|
|
/** ASN.1 OID for joint-iso-itu-t(2) country(16) us(840)
|
|
* organization(1) gov(101)
|
|
*/
|
|
#define ASN1_OID_US_GOV ASN1_OID_US_ORGANIZATION, ASN1_OID_SINGLE ( 101 )
|
|
|
|
/** ASN.1 OID for joint-iso-itu-t(2) country(16) us(840)
|
|
* organization(1) gov(101) csor(3)
|
|
*/
|
|
#define ASN1_OID_CSOR ASN1_OID_US_GOV, ASN1_OID_SINGLE ( 3 )
|
|
|
|
/** ASN.1 OID for joint-iso-itu-t(2) country(16) us(840)
|
|
* organization(1) gov(101) csor(3) nistalgorithm(4)
|
|
*/
|
|
#define ASN1_OID_NISTALGORITHM ASN1_OID_CSOR, ASN1_OID_SINGLE ( 4 )
|
|
|
|
/** ASN.1 OID for joint-iso-itu-t(2) country(16) us(840)
|
|
* organization(1) gov(101) csor(3) nistalgorithm(4) hashalgs(2)
|
|
*/
|
|
#define ASN1_OID_HASHALGS ASN1_OID_NISTALGORITHM, ASN1_OID_SINGLE ( 2 )
|
|
|
|
/** ASN.1 OID for pkcs-1 */
|
|
#define ASN1_OID_PKCS_1 ASN1_OID_PKCS, ASN1_OID_SINGLE ( 1 )
|
|
|
|
/** ASN.1 OID for rsaEncryption */
|
|
#define ASN1_OID_RSAENCRYPTION ASN1_OID_PKCS_1, ASN1_OID_SINGLE ( 1 )
|
|
|
|
/** ASN.1 OID for md5WithRSAEncryption */
|
|
#define ASN1_OID_MD5WITHRSAENCRYPTION ASN1_OID_PKCS_1, ASN1_OID_SINGLE ( 4 )
|
|
|
|
/** ASN.1 OID for sha1WithRSAEncryption */
|
|
#define ASN1_OID_SHA1WITHRSAENCRYPTION ASN1_OID_PKCS_1, ASN1_OID_SINGLE ( 5 )
|
|
|
|
/** ASN.1 OID for sha256WithRSAEncryption */
|
|
#define ASN1_OID_SHA256WITHRSAENCRYPTION ASN1_OID_PKCS_1, ASN1_OID_SINGLE ( 11 )
|
|
|
|
/** ASN.1 OID for id-md5 */
|
|
#define ASN1_OID_MD5 ASN1_OID_DIGESTALGORITHM, ASN1_OID_SINGLE ( 5 )
|
|
|
|
/** ASN.1 OID for id-sha1 */
|
|
#define ASN1_OID_SHA1 ASN1_OID_SECSIG_ALGORITHMS, ASN1_OID_SINGLE ( 26 )
|
|
|
|
/** ASN.1 OID for id-sha256 */
|
|
#define ASN1_OID_SHA256 ASN1_OID_HASHALGS, ASN1_OID_SINGLE ( 1 )
|
|
|
|
/** RSA digestAlgorithm sequence contents */
|
|
#define RSA_DIGESTALGORITHM_CONTENTS( ... ) \
|
|
ASN1_OID, VA_ARG_COUNT ( __VA_ARGS__ ), __VA_ARGS__, \
|
|
ASN1_NULL, 0x00
|
|
|
|
/** RSA digestAlgorithm sequence */
|
|
#define RSA_DIGESTALGORITHM( ... ) \
|
|
ASN1_SEQUENCE, \
|
|
VA_ARG_COUNT ( RSA_DIGESTALGORITHM_CONTENTS ( __VA_ARGS__ ) ), \
|
|
RSA_DIGESTALGORITHM_CONTENTS ( __VA_ARGS__ )
|
|
|
|
/** RSA digest prefix */
|
|
#define RSA_DIGEST_PREFIX( digest_size ) \
|
|
ASN1_OCTET_STRING, digest_size
|
|
|
|
/** RSA digestInfo prefix */
|
|
#define RSA_DIGESTINFO_PREFIX( digest_size, ... ) \
|
|
ASN1_SEQUENCE, \
|
|
( VA_ARG_COUNT ( RSA_DIGESTALGORITHM ( __VA_ARGS__ ) ) + \
|
|
VA_ARG_COUNT ( RSA_DIGEST_PREFIX ( digest_size ) ) + \
|
|
digest_size ), \
|
|
RSA_DIGESTALGORITHM ( __VA_ARGS__ ), \
|
|
RSA_DIGEST_PREFIX ( digest_size )
|
|
|
|
/** An RSA context */
|
|
struct rsa_context {
|
|
/** Allocated memory */
|
|
void *dynamic;
|
|
/** Modulus */
|
|
bigint_element_t *modulus0;
|
|
/** Modulus size */
|
|
unsigned int size;
|
|
/** Modulus length */
|
|
size_t max_len;
|
|
/** Exponent */
|
|
bigint_element_t *exponent0;
|
|
/** Exponent size */
|
|
unsigned int exponent_size;
|
|
/** Input buffer */
|
|
bigint_element_t *input0;
|
|
/** Output buffer */
|
|
bigint_element_t *output0;
|
|
/** Temporary working space for modular exponentiation */
|
|
void *tmp;
|
|
};
|
|
|
|
extern struct pubkey_algorithm rsa_algorithm;
|
|
|
|
#endif /* _IPXE_RSA_H */
|