Question about OffloadModExpo() Function
From: JohnShen (phenerse_at_hotmail.com)
Date: 10/21/05
- Previous message: sbardhan_at_adelphia.net: "Winlogon and Smartcard CSP"
- Next in thread: lelteto: "RE: Question about OffloadModExpo() Function"
- Reply: lelteto: "RE: Question about OffloadModExpo() Function"
- Maybe reply: lelteto: "RE: Question about OffloadModExpo() Function"
- Maybe reply: john: "RE: Question about OffloadModExpo() Function"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]
Date: Thu, 20 Oct 2005 18:54:01 -0700
Hi everyone,
MSDN tells that OffloadModExpo() function can offload modular exponentiation
from a CSP to a hardware accelerator.
But these days I've been nearly crazy about this function.
I implement my own OffloadModExpo() function, which calling the ModExpo
implementation of RSAREF library. And building to a windows DLL.
Directly calling my OffloadModExpo(), encrypting & decrypting runs OK.
But When use Crypto API, which will indirectly call OffloadModExpo(),
encrypting & decrypting fails.
My implementation is like this:
///////////////
// .h
_declspec (dllexport)
BOOL /* WINAPI */ OffloadModExpo( // NOTICE: no 'WINAPI' here, if used can't
be called by Crypto API
BYTE *pbBase, // in
BYTE *pbExpo, // in
DWORD cbExpo, // in
BYTE *pbMod, // in
DWORD cbMod, // in
BYTE *pbResult, // out
void *pReserved, // reserved
DWORD dwFlags // in
);
// .c
BOOL /* WINAPI */ OffloadModExpo(
BYTE *pbBase, // in
BYTE *pbExpo, // in
DWORD cbExpo, // in
BYTE *pbMod, // in
DWORD cbMod, // in
BYTE *pbResult, // out
void *pReserved, // reserved
DWORD dwFlags // in
)
{
// here is my implementation, calling RSAREF's NN_ModExp()
...
return TRUE;
}
/////////////////
I use two test programs, one is encrypting & decrypting using RSA, another
is signing & verifying. Not calling my OffloadModExpo DLL, the two test
programs both run OK. But when using OffloadModExpo, error occurs. One error
come out when calling CryptDecrypt(), another is from CryptVerifySignature().
The error code are both: ERROR_INVALID_PARAMETER.
Then I write a program directly calling OffloadModExpo, not by Crypto API.
This time encrypting & decrypting using RSA is OK.
The test program is:
//////////////////////
#define BYTE_LEN 8
int main(int argc, char *argv[])
{
// all are little endian
BYTE enc[BYTE_LEN], decr[BYTE_LEN];
BYTE base[BYTE_LEN] = {0x11, 0x22, 0x33, 0x44, 0x55, 0xaa, 0x1}; // BASE
BYTE pub_expo[BYTE_LEN] = {0x01, 0, 0x01, 0}; // PUBLIC EXPO: 65537
BYTE mod[BYTE_LEN] = {0x29, 0x5D, 0x3C, 0x33, 0x6F, 0xD2, 0x2}; //MODULAR:
2D26F333C5D29
BYTE priv_expo[BYTE_LEN] = {0xE1, 0xF1, 0x85, 0xC2, 0x7A, 0x63, 0x1}; //
PRIVATE EXPO: 1637AC285F1E1
printf("----text %x %x %x %x %x %x %x %x\n", base[0], base[1], base[2],
base[3], base[4], base[5], base[6], base[7]);
OffloadModExpo(base, pub_expo, 3, mod, 7, enc, NULL, 0);
printf("----encr %x %x %x %x %x %x %x %x\n", enc[0], enc[1], enc[2],
enc[3], enc[4], enc[5], enc[6], enc[7]);
OffloadModExpo(enc, priv_expo, 7, mod, 7, decr, NULL, 0);
printf("----decr %x %x %x %x %x %x %x %x\n", decr[0], decr[1], decr[2],
decr[3], decr[4], decr[5], decr[6], decr[7]);
return 0;
}
////////////////////
So I think my ModExpo implementation is not wrong.
But what's the problem in?
I'm using VC++ 6.0, runing on Windows2k.
If anyone could give me some information, I'll be very grateful.
Thanks for your reading and your time.
-- John
- Previous message: sbardhan_at_adelphia.net: "Winlogon and Smartcard CSP"
- Next in thread: lelteto: "RE: Question about OffloadModExpo() Function"
- Reply: lelteto: "RE: Question about OffloadModExpo() Function"
- Maybe reply: lelteto: "RE: Question about OffloadModExpo() Function"
- Maybe reply: john: "RE: Question about OffloadModExpo() Function"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ] [ attachment ]