#ifndef __RSA_H__ #define __RSA_H__ #ifndef RSA32API #define RSA32API __stdcall #endif /* 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 // Structure for passing info into BSafe calls (currently this is used for // passing in a callback function pointer for random number generation and // information needed by the RNG, may eventually support exponentiation // offload. // typedef struct { void *pRNGInfo; // dat void *pFuncRNG; // Function pointer for RNG callback // callback prototype is // void pFuncRNG( // IN void *pRNGInfo, // IN OUT unsigned char **ppbRandSeed, // initial seed value (ignored if already set) // IN unsigned long *pcbRandSeed, // IN OUT unsigned char *pbBuffer, // IN unsigned long dwLength // ); } BSAFE_OTHER_INFO; /* 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 RSA32API 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 RSA32API 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 RSA32API BSafeMakeKeyPair( LPBSAFE_PUB_KEY public_key, LPBSAFE_PRV_KEY private_key, DWORD bits ); /* BSafeMakeKeyPairEx * * BSafeMakeKeyPairEx(public_key, private_key, bits, public_exp) * * 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 * * DWORD public_exp = supplies the public key exponent. This * should be a prime number. * * * Returns * * TRUE - keys were successfully generated * FALSE - not enough memory to generate keys * */ BOOL RSA32API BSafeMakeKeyPairEx( LPBSAFE_PUB_KEY public_key, LPBSAFE_PRV_KEY private_key, DWORD bits, DWORD public_exp ); /* BSafeMakeKeyPairEx2 * * BSafeMakeKeyPairEx2(pOtherInfo, public_key, private_key, bits, public_exp) * * Generate an RSA key pair. * * Parameters * * BSAFE_OTHER_INFO pOtherInfo - points to a structure with information * alternate information to be used when * generating the RSA key pair. Currently * this structure has a pointer to a callback * function which may be used when generating * keys. It also has a information to pass * into that callback function (see OTHER_INFO). * * 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 * * DWORD public_exp = supplies the public key exponent. This * should be a prime number. * * * Returns * * TRUE - keys were successfully generated * FALSE - not enough memory to generate keys * */ BOOL RSA32API BSafeMakeKeyPairEx2(BSAFE_OTHER_INFO *pOtherInfo, LPBSAFE_PUB_KEY public_key, LPBSAFE_PRV_KEY private_key, DWORD bits, DWORD dwPubExp); /* 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 RSA32API 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 RSA32API 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 RSA32API 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 RSA32API 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 * RSA32API BSafeGetPubKeyModulus( LPBSAFE_PUB_KEY key ); #ifdef __cplusplus } #endif #endif // __RSA_H__