iBoot/lib/pki/libDER/DER_Keys.c

168 lines
4.1 KiB
C
Raw Normal View History

2023-07-08 13:03:17 -07:00
/* Copyright (c) 2005-2007 Apple Inc. All Rights Reserved. */
/*
* DER_Cert.c - support for decoding RSA keys
*
* Created Nov. 8 2005 by Doug Mitchell.
*/
#include <libDER/DER_Decode.h>
#include <libDER/DER_Encode.h>
#include <libDER/DER_Keys.h>
#include <libDER/asn1Types.h>
#include <libDER/libDER_config.h>
#ifndef DER_DECODE_ENABLE
#error Please define DER_DECODE_ENABLE.
#endif
#if DER_DECODE_ENABLE
/*
* DERItemSpecs for decoding RSA keys.
*/
/* Algorithm Identifier */
const DERItemSpec DERAlgorithmIdItemSpecs[] =
{
{ DER_OFFSET(DERAlgorithmId, oid),
ASN1_OBJECT_ID,
DER_DEC_NO_OPTS },
{ DER_OFFSET(DERAlgorithmId, params),
0, /* no tag - any */
DER_DEC_ASN_ANY | DER_DEC_OPTIONAL | DER_DEC_SAVE_DER }
};
const DERSize DERNumAlgorithmIdItemSpecs =
sizeof(DERAlgorithmIdItemSpecs) / sizeof(DERItemSpec);
/* X509 SubjectPublicKeyInfo */
const DERItemSpec DERSubjPubKeyInfoItemSpecs[] =
{
{ DER_OFFSET(DERSubjPubKeyInfo, algId),
ASN1_CONSTR_SEQUENCE,
DER_DEC_NO_OPTS },
{ DER_OFFSET(DERSubjPubKeyInfo, pubKey),
ASN1_BIT_STRING,
DER_DEC_NO_OPTS },
};
const DERSize DERNumSubjPubKeyInfoItemSpecs =
sizeof(DERSubjPubKeyInfoItemSpecs) / sizeof(DERItemSpec);
/*
* RSA private key in CRT format
*/
const DERItemSpec DERRSAPrivKeyCRTItemSpecs[] =
{
/* version, n, e, d - skip */
{ 0,
ASN1_INTEGER,
DER_DEC_SKIP },
{ 0,
ASN1_INTEGER,
DER_DEC_SKIP },
{ 0,
ASN1_INTEGER,
DER_DEC_SKIP },
{ 0,
ASN1_INTEGER,
DER_DEC_SKIP },
{ DER_OFFSET(DERRSAPrivKeyCRT, p),
ASN1_INTEGER,
DER_DEC_NO_OPTS },
{ DER_OFFSET(DERRSAPrivKeyCRT, q),
ASN1_INTEGER,
DER_DEC_NO_OPTS },
{ DER_OFFSET(DERRSAPrivKeyCRT, dp),
ASN1_INTEGER,
DER_DEC_NO_OPTS },
{ DER_OFFSET(DERRSAPrivKeyCRT, dq),
ASN1_INTEGER,
DER_DEC_NO_OPTS },
{ DER_OFFSET(DERRSAPrivKeyCRT, qInv),
ASN1_INTEGER,
DER_DEC_NO_OPTS },
/* ignore the (optional) rest */
};
const DERSize DERNumRSAPrivKeyCRTItemSpecs =
sizeof(DERRSAPrivKeyCRTItemSpecs) / sizeof(DERItemSpec);
#endif /* DER_DECODE_ENABLE */
#if DER_DECODE_ENABLE || DER_ENCODE_ENABLE
/* RSA public key in PKCS1 format - encode and decode */
const DERItemSpec DERRSAPubKeyPKCS1ItemSpecs[] =
{
{ DER_OFFSET(DERRSAPubKeyPKCS1, modulus),
ASN1_INTEGER,
DER_DEC_NO_OPTS | DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAPubKeyPKCS1, pubExponent),
ASN1_INTEGER,
DER_DEC_NO_OPTS | DER_ENC_SIGNED_INT },
};
const DERSize DERNumRSAPubKeyPKCS1ItemSpecs =
sizeof(DERRSAPubKeyPKCS1ItemSpecs) / sizeof(DERItemSpec);
/* RSA public key in Apple custome format with reciprocal - encode and decode */
const DERItemSpec DERRSAPubKeyAppleItemSpecs[] =
{
{ DER_OFFSET(DERRSAPubKeyApple, modulus),
ASN1_INTEGER,
DER_DEC_NO_OPTS | DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAPubKeyApple, reciprocal),
ASN1_INTEGER,
DER_DEC_NO_OPTS | DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAPubKeyApple, pubExponent),
ASN1_INTEGER,
DER_DEC_NO_OPTS | DER_ENC_SIGNED_INT },
};
const DERSize DERNumRSAPubKeyAppleItemSpecs =
sizeof(DERRSAPubKeyAppleItemSpecs) / sizeof(DERItemSpec);
#endif /* DER_DECODE_ENABLE || DER_ENCODE_ENABLE */
#ifndef DER_ENCODE_ENABLE
#error Please define DER_ENCODE_ENABLE.
#endif
#if DER_ENCODE_ENABLE
/* RSA Key Pair, encode only */
const DERItemSpec DERRSAKeyPairItemSpecs[] =
{
{ DER_OFFSET(DERRSAKeyPair, version),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, n),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, e),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, d),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, p),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, q),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, dp),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, dq),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
{ DER_OFFSET(DERRSAKeyPair, qInv),
ASN1_INTEGER,
DER_ENC_SIGNED_INT },
};
const DERSize DERNumRSAKeyPairItemSpecs =
sizeof(DERRSAKeyPairItemSpecs) / sizeof(DERItemSpec);
#endif /* DER_ENCODE_ENABLE */