273 lines
7.8 KiB
C
273 lines
7.8 KiB
C
|
/* rsa.h
|
||
|
*
|
||
|
* RSA library functions.
|
||
|
*
|
||
|
* Copyright (C) RSA Data Security, Inc. created 1990. This is an
|
||
|
* unpublished work protected as such under copyright law. This work
|
||
|
* contains proprietary, confidential, and trade secret information of
|
||
|
* RSA Data Security, Inc. Use, disclosure or reproduction without the
|
||
|
* express written authorization of RSA Data Security, Inc. is
|
||
|
* prohibited.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
#define RSA1 ((DWORD)'R'+((DWORD)'S'<<8)+((DWORD)'A'<<16)+((DWORD)'1'<<24))
|
||
|
#define RSA2 ((DWORD)'R'+((DWORD)'S'<<8)+((DWORD)'A'<<16)+((DWORD)'2'<<24))
|
||
|
|
||
|
// Key header structures.
|
||
|
//
|
||
|
// These structs define the fixed data at the beginning of an RSA key.
|
||
|
// They are followed by a variable length of data, sized by the stlen
|
||
|
// field.
|
||
|
|
||
|
typedef struct {
|
||
|
DWORD magic; /* Should always be RSA1 */
|
||
|
DWORD keylen; // size of modulus buffer
|
||
|
DWORD bitlen; // # of bits in modulus
|
||
|
DWORD datalen; // max number of bytes to be encoded
|
||
|
DWORD pubexp; //public exponent
|
||
|
} BSAFE_PUB_KEY, FAR *LPBSAFE_PUB_KEY;
|
||
|
|
||
|
typedef struct {
|
||
|
DWORD magic; /* Should always be RSA2 */
|
||
|
DWORD keylen; // size of modulus buffer
|
||
|
DWORD bitlen; // bit size of key
|
||
|
DWORD datalen; // max number of bytes to be encoded
|
||
|
DWORD pubexp; // public exponent
|
||
|
} BSAFE_PRV_KEY, FAR *LPBSAFE_PRV_KEY;
|
||
|
|
||
|
typedef struct {
|
||
|
BYTE *modulus;
|
||
|
BYTE *prvexp;
|
||
|
BYTE *prime1;
|
||
|
BYTE *prime2;
|
||
|
BYTE *exp1;
|
||
|
BYTE *exp2;
|
||
|
BYTE *coef;
|
||
|
BYTE *invmod;
|
||
|
BYTE *invpr1;
|
||
|
BYTE *invpr2;
|
||
|
} BSAFE_KEY_PARTS, FAR *LPBSAFE_KEY_PARTS;
|
||
|
|
||
|
typedef const BYTE far *cLPBYTE; // const LPBYTE resolves wrong
|
||
|
|
||
|
/* BSafeEncPublic
|
||
|
*
|
||
|
* BSafeEncPublic(key, part_in, part_out)
|
||
|
*
|
||
|
* RSA encrypt a buffer of size key->keylen, filled with data of size
|
||
|
* key->datalen with the public key pointed to by key, returning the
|
||
|
* encrypted data in part_out.
|
||
|
*
|
||
|
* Parameters
|
||
|
*
|
||
|
* LPBSAFE_PUB_KEY key - points to a public key in BSAFE_KEY
|
||
|
* format.
|
||
|
*
|
||
|
* LPBYTE part_in - points to a BYTE array of size key->keylen
|
||
|
* holding the data to be encrypted. The
|
||
|
* data in the buffer should be no larger
|
||
|
* than key->datalen. All other bytes should
|
||
|
* be zero.
|
||
|
*
|
||
|
* LPBYTE part_out - points to a BYTE array of size keylen
|
||
|
* to receive the encrypted data.
|
||
|
*
|
||
|
* Returns
|
||
|
*
|
||
|
* TRUE - encryption succeeded.
|
||
|
* FALSE - encryption failed.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
BOOL BSafeEncPublic(const LPBSAFE_PUB_KEY key,
|
||
|
cLPBYTE part_in,
|
||
|
LPBYTE part_out);
|
||
|
|
||
|
|
||
|
/* BSafeDecPrivate
|
||
|
*
|
||
|
* BSafeDecPrivate(key, part_in, part_out)
|
||
|
*
|
||
|
* RSA decrypt a buffer of size keylen, containing key->datalen bytes
|
||
|
* of data with the private key pointed to by key, returning the
|
||
|
* decrypted data in part_out.
|
||
|
*
|
||
|
* Parameters
|
||
|
*
|
||
|
* LPBSAFE_PRV_KEY key - points to a private key in BSAFE_KEY
|
||
|
* format.
|
||
|
*
|
||
|
* LPBYTE part_in - points to a BYTE array of size key->keylen
|
||
|
* holding the data to be decrypted. The data
|
||
|
* in the buffer should be no longer than
|
||
|
* key->datalen. All other bytes should be zero.
|
||
|
*
|
||
|
* LPBYTE part_out - points to a BYTE array of size GRAINSIZE
|
||
|
* to receive the decrypted data.
|
||
|
*
|
||
|
* Returns
|
||
|
*
|
||
|
* TRUE - decryption succeeded.
|
||
|
* FALSE - decryption failed.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
BOOL BSafeDecPrivate(const LPBSAFE_PRV_KEY key,
|
||
|
cLPBYTE part_in,
|
||
|
LPBYTE part_out);
|
||
|
|
||
|
/* BSafeMakeKeyPair
|
||
|
*
|
||
|
* BSafeMakeKeyPair(public_key, private_key, bits)
|
||
|
*
|
||
|
* Generate an RSA key pair.
|
||
|
*
|
||
|
* Parameters
|
||
|
*
|
||
|
* LPBSAFE_PUB_KEY public_key - points to the memory to recieve
|
||
|
* the public key. This pointer must
|
||
|
* point to at least the number of bytes
|
||
|
* specified as the public key size by
|
||
|
* BSafeComputeKeySizes.
|
||
|
*
|
||
|
* LPBSAFE_PRV_KEY private_key - points to the memory to recieve
|
||
|
* the private key. This pointer must
|
||
|
* point to at least the number of bytes
|
||
|
* specified as the private key size
|
||
|
* by BSafeComputeKeySizes.
|
||
|
*
|
||
|
* DWORD bits - length of the requested key in bits.
|
||
|
* This value must be even and greater than 63
|
||
|
*
|
||
|
* Returns
|
||
|
*
|
||
|
* TRUE - keys were successfully generated
|
||
|
* FALSE - not enough memory to generate keys
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
BOOL BSafeMakeKeyPair(LPBSAFE_PUB_KEY public_key,
|
||
|
LPBSAFE_PRV_KEY private_key,
|
||
|
DWORD bits);
|
||
|
|
||
|
/* BSafeFreePubKey
|
||
|
*
|
||
|
* BSafeFreePubKey(public_key)
|
||
|
*
|
||
|
* Free the data associated with a public key
|
||
|
*
|
||
|
* Parameters
|
||
|
*
|
||
|
* LPBSAFE_PUB_KEY public_key - points to a BSAFE_PUB_KEY
|
||
|
* structure to free.
|
||
|
*
|
||
|
* Returns
|
||
|
*
|
||
|
* nothing
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
void BSafeFreePubKey(LPBSAFE_PUB_KEY public_key);
|
||
|
|
||
|
/* BSafeFreePrvKey
|
||
|
*
|
||
|
* BSafeFreePrvKey(public_key)
|
||
|
*
|
||
|
* Free the data associated with a private key
|
||
|
*
|
||
|
* Parameters
|
||
|
*
|
||
|
* LPBSAFE_PRV_KEY private_key - points to a BSAFE_PRV_KEY
|
||
|
* structure to free.
|
||
|
*
|
||
|
* Returns
|
||
|
*
|
||
|
* nothing
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
void BSafeFreePrvKey(LPBSAFE_PRV_KEY private_key);
|
||
|
|
||
|
|
||
|
/* BSafeComputeKeySizes
|
||
|
*
|
||
|
* BSafeComputeKeySizes( LPDWORD PubKeySize,
|
||
|
* LPDWORD PrivKeySize,
|
||
|
* LPDWORD bits )
|
||
|
*
|
||
|
* Computes the required memory to hold a public and private key of
|
||
|
* a specified number of bits.
|
||
|
*
|
||
|
* Parameters:
|
||
|
*
|
||
|
* LPDWORD PubKeySize - pointer to DWORD to return the public
|
||
|
* key size, in bytes.
|
||
|
*
|
||
|
* LPDWORD PrivKeySize - pointer to DWORD to return the private
|
||
|
* key size, in bytes.
|
||
|
*
|
||
|
* LPDWORD bits - pointer to DWORD specifying number of bits
|
||
|
* in the RSA modulus.
|
||
|
*
|
||
|
* Returns:
|
||
|
*
|
||
|
* TRUE if *bits is a valid RSA modulus size.
|
||
|
* FALSE if *bits is an invalid RSA modulus size.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
BOOL BSafeComputeKeySizes(LPDWORD PublicKeySize,
|
||
|
LPDWORD PrivateKeySize,
|
||
|
LPDWORD bits);
|
||
|
|
||
|
/* BSafeGetPrvKeyParts
|
||
|
*
|
||
|
* BOOL BSafeGetPrvKeyParts( LPBSAFE_PRV_KEY key,
|
||
|
* LPBSAFE_KEY_PARTS parts)
|
||
|
*
|
||
|
* Returns pointers to the parts of a private key, and the length of
|
||
|
* the modulus in bytes.
|
||
|
*
|
||
|
* Parameters:
|
||
|
*
|
||
|
* LPBSAFE_PRV_KEY key - the key to disassemble
|
||
|
* LPBSAFE_KEY_PARTS parts - the structure to fill in
|
||
|
*
|
||
|
* Returns -
|
||
|
* FALSE if the key is not valid.
|
||
|
*/
|
||
|
|
||
|
BOOL BSafeGetPrvKeyParts(LPBSAFE_PRV_KEY key,
|
||
|
LPBSAFE_KEY_PARTS parts);
|
||
|
|
||
|
|
||
|
/* BSafeGetPubKeyModulus
|
||
|
*
|
||
|
* BYTE *BSafeGetPubKeyModulus(LPBSAFE_PUB_KEY key)
|
||
|
*
|
||
|
* Returns pointer to the modulus of a public key
|
||
|
*
|
||
|
* Parameters:
|
||
|
*
|
||
|
* LPBSAFE_PUB_KEY key - the key to disassemble
|
||
|
*
|
||
|
* Returns -
|
||
|
*
|
||
|
* Pointer to the parts, VOID on error.
|
||
|
* Fails if the key is not valid.
|
||
|
*/
|
||
|
|
||
|
BYTE *BSafeGetPubKeyModulus(LPBSAFE_PUB_KEY key);
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
|
||
|
|