diff options
Diffstat (limited to 'private/lsa/crypt/engine/rsa.h')
-rw-r--r-- | private/lsa/crypt/engine/rsa.h | 272 |
1 files changed, 272 insertions, 0 deletions
diff --git a/private/lsa/crypt/engine/rsa.h b/private/lsa/crypt/engine/rsa.h new file mode 100644 index 000000000..9b69ca4b2 --- /dev/null +++ b/private/lsa/crypt/engine/rsa.h @@ -0,0 +1,272 @@ +/* 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 + + + |