121 lines
3.7 KiB
C
121 lines
3.7 KiB
C
|
/* Copyright (c) 2005-2007 Apple Inc. All Rights Reserved. */
|
||
|
|
||
|
/*
|
||
|
* libgRSA_DER.h - DER encoding/decoding routines
|
||
|
*/
|
||
|
|
||
|
#ifndef _LIBGRSA_LIBRSA_DER_H_
|
||
|
#define _LIBGRSA_LIBRSA_DER_H_
|
||
|
|
||
|
#include <libgRSA/libgRSA.h>
|
||
|
#include <libgRSA/libgRSA_config.h>
|
||
|
#include <libGiants/giantPlatform.h>
|
||
|
#include <libDER/DER_Encode.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Decode PKCS1 form keys into RSA{Pub,Priv}GiantKey.
|
||
|
*/
|
||
|
RSAStatus RSA_DecodePubKey(
|
||
|
const unsigned char *pkcs1Key,
|
||
|
gi_uint16 pkcs1KeyLen,
|
||
|
RSAPubGiantKey *pubKey); /* RETURNED */
|
||
|
|
||
|
RSAStatus RSA_DecodePrivKey(
|
||
|
const unsigned char *pkcs1Key,
|
||
|
gi_uint16 pkcs1KeyLen,
|
||
|
RSAPrivGiantKey *privKey); /* RETURNED */
|
||
|
|
||
|
RSAStatus RSA_DecodeKeyPair(
|
||
|
const unsigned char *pkcs1Key,
|
||
|
gi_uint16 pkcs1KeyLen,
|
||
|
RSAFullGiantKey *keyPair); /* RETURNED */
|
||
|
|
||
|
/*
|
||
|
* Decode an custom (to this library) public key with reciprocal.
|
||
|
*/
|
||
|
RSAStatus RSA_DecodeApplePubKey(
|
||
|
const unsigned char *aplePubKey,
|
||
|
gi_uint16 applePubKeyLen,
|
||
|
RSAPubGiantKey *pubKey); /* RETURNED */
|
||
|
|
||
|
/*
|
||
|
* Generated key pair encoding support.
|
||
|
*/
|
||
|
|
||
|
#define RSA_HALF_SIZE(keySizeInBytes) ((keySizeInBytes + 1) / 2)
|
||
|
|
||
|
/*
|
||
|
* To allocate space on the stack for encoded public and private keys,
|
||
|
* use these macros to determine the max size needed. They are conservative;
|
||
|
* they will almost certainly allocate more space than you really
|
||
|
* end up needing for the encoded keys.
|
||
|
*/
|
||
|
#define RSA_ENCODED_PRIV_KEY_SIZE(keySizeInBytes) \
|
||
|
DER_MAX_ENCODED_SIZE( \
|
||
|
DER_MAX_ENCODED_SIZE(1) + /* version */ \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes) + /* n */ \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes) + /* e */ \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes) + /* d */ \
|
||
|
DER_MAX_ENCODED_SIZE(RSA_HALF_SIZE(keySizeInBytes)) + /* p */ \
|
||
|
DER_MAX_ENCODED_SIZE(RSA_HALF_SIZE(keySizeInBytes)) + /* q */ \
|
||
|
DER_MAX_ENCODED_SIZE(RSA_HALF_SIZE(keySizeInBytes)) + /* dp */ \
|
||
|
DER_MAX_ENCODED_SIZE(RSA_HALF_SIZE(keySizeInBytes)) + /* dq */ \
|
||
|
DER_MAX_ENCODED_SIZE(RSA_HALF_SIZE(keySizeInBytes))) /* qInv */
|
||
|
|
||
|
#define RSA_ENCODED_PUB_KEY_SIZE(keySizeInBytes) \
|
||
|
DER_MAX_ENCODED_SIZE( \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes) + /* n */ \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes)) /* e */
|
||
|
|
||
|
#define RSA_ENCODED_APPLE_PUB_KEY_SIZE(keySizeInBytes) \
|
||
|
DER_MAX_ENCODED_SIZE( \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes) + /* n */ \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes) + /* recip */ \
|
||
|
GIANT_BYTES_PER_DIGIT + /* recip: one extra digit */ \
|
||
|
DER_MAX_ENCODED_SIZE(keySizeInBytes)) /* e */
|
||
|
|
||
|
/*
|
||
|
* Create PKCS1-formatted public key given a RSAFullGiantKey.
|
||
|
* The inOutLen param contains the number of bytes available in
|
||
|
* *pkcs1Key on entry, adn contains the number of bytes actually
|
||
|
* written to *pkcs1Key on successful return.
|
||
|
*/
|
||
|
RSAStatus RSA_EncodePubKey(
|
||
|
RSAPubGiantKey *giantKey,
|
||
|
gi_uint8 *pkcs1Key, /* data written here */
|
||
|
gi_uint32 *inOutLen); /* IN/OUT */
|
||
|
|
||
|
/*
|
||
|
* Create a PKCS1-formattted private key given a RSAFullGiantKey.
|
||
|
* The inOutLen param contains the number of bytes available in
|
||
|
* *pkcs1Key on entry, adn contains the number of bytes actually
|
||
|
* written to *pkcs1Key on successful return.
|
||
|
*/
|
||
|
RSAStatus RSA_EncodeKeyPair(
|
||
|
RSAFullGiantKey *keyPair,
|
||
|
gi_uint8 *pkcs1Key, /* data written here */
|
||
|
gi_uint32 *inOutLen); /* IN/OUT */
|
||
|
|
||
|
/*
|
||
|
* Create a custom (to this library) DER-encoded public key including
|
||
|
* the reciprocal.
|
||
|
* The inOutLen param contains the number of bytes available in
|
||
|
* *pubKey on entry, adn contains the number of bytes actually
|
||
|
* written to *pkcs1Key on successful return.
|
||
|
*/
|
||
|
RSAStatus RSA_EncodeApplePubKey(
|
||
|
RSAPubGiantKey *giantKey,
|
||
|
gi_uint8 *pubKey, /* data written here */
|
||
|
gi_uint32 *inOutLen); /* IN/OUT */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* _LIBGRSA_LIBRSA_DER_H_ */
|
||
|
|