RAND_Bytes in Windows CE (Pocket PC or smartphone)

2005-03-22 Thread Antonio Ruiz Martínez
Hello!
   I'm writing you because when I call to the function to make a pkcs#7 
enveloped data, I get the following error:
1673169562:error:2406064:random number generator:SSLEAY_RAND_BYTES_PRNG 
not seeded:.\crypto\rand\md_rand.c:503:You need to read the OpenSSL FAQ.

I read it but the problems are related to Unix System, but what about 
Windows CE?
Could you help me to solve it, please?
Thanks in advance,
Regards,
Antonio.

--
--
Antonio Ruiz Martínez
Faculty of Computer Science-University of Murcia
30071 Murcia - Spain
e-mail: [EMAIL PROTECTED] or arm [at] dif [dot] um [dot] es
--
__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]


RE: RAND_Bytes in Windows CE (Pocket PC or smartphone)

2005-03-22 Thread Brant Thomsen
The attached code will make it so that the RAND_screen function can be used
to seed OpenSSL on CE.  It replaces the readscreen function provided with
the library in the crypto\rand\rand_win.c function.  I have not tested it on
non-CE devices, so you may want to #ifdef it in if you will be supporting
standard Windows as well.

static void readscreen(void)
{
HDC hdc, hdcScr;
int nWidth, nHeight;
BITMAPINFO dibInfo;
BYTE *pBGR = NULL;
HBITMAP hNewBitmap, hOldBitmap;
int nBufSize;
int nChunkSize;
int y;

// Take a snapshot of the screen
hdcScr = GetDC(NULL);
hdc = CreateCompatibleDC(hdcScr);

// Get screen resolution
nWidth = GetDeviceCaps(hdc, HORZRES);
nHeight = GetDeviceCaps(hdc, VERTRES);

// Fill in the DIB structure
dibInfo.bmiHeader.biBitCount = 24;
dibInfo.bmiHeader.biClrImportant = 0;
dibInfo.bmiHeader.biClrUsed = 0;
dibInfo.bmiHeader.biCompression = 0;
dibInfo.bmiHeader.biHeight = nHeight;
dibInfo.bmiHeader.biPlanes = 1;
dibInfo.bmiHeader.biSize = 40;
dibInfo.bmiHeader.biSizeImage = nWidth*nHeight*3;
dibInfo.bmiHeader.biWidth = nWidth;
dibInfo.bmiHeader.biXPelsPerMeter = 3780;
dibInfo.bmiHeader.biYPelsPerMeter = 3780;
dibInfo.bmiColors[0].rgbBlue = 0;
dibInfo.bmiColors[0].rgbGreen = 0;
dibInfo.bmiColors[0].rgbRed = 0;
dibInfo.bmiColors[0].rgbReserved = 0;

// Create a new device independent bitmap and retrieve
// a pointer to its bit storage -- this is the raw
// bitmap data that will be hashed
hNewBitmap = CreateDIBSection(hdc,
(const BITMAPINFO*)dibInfo,
DIB_RGB_COLORS, (void**)pBGR, NULL, 0);
hOldBitmap = (HBITMAP) SelectObject(hdc, hNewBitmap);

// Copy the bitmap into the new device context -- this will
// also copy the bitmap to the DIB
BitBlt(hdc, 0, 0, nWidth, nHeight, hdcScr, 0, 0, SRCCOPY);

// Determine the buffer size of the screen data
nBufSize = 3 * nWidth * nHeight;
nChunkSize = nBufSize / ( 3 * 16 );

/* Now go through the whole screen, repeatedly grabbing n lines */
for ( y = 0; y  nBufSize; y += nChunkSize )
{
unsigned char md[MD_DIGEST_LENGTH];

/* Get the hash of the bitmap */
MD(pBGR + y, nChunkSize, md);

/* Seed the random generator with the hash value */
RAND_seed(md, MD_DIGEST_LENGTH);
}

// Restore the empty bitmap to the device context -- this
// clears up any potential resource leaks
SelectObject(hdc, hOldBitmap);

// Delete the DIB
DeleteObject(hNewBitmap);

// Done with the DCs.
DeleteDC( hdc );
DeleteDC( hdcScr );
}


The code is derived from an article in Dr. Dobb's Journal (December 2002,
Automated Testing  Windows CE), so you should have no problems
distributing it.  Unfortunately, I haven't found a better way get random
information on the CE devices.

One additional suggestion would be to use the RAND_write_file and
RAND_load_file functions each time you exit and restart your application.
This will allow your randomness to accumulate each time your appliction is
run.

Brant Thomsen
Sr. Software Engineer
Wavelink Corporation

 -Original Message-
 From: [EMAIL PROTECTED]
 [mailto:[EMAIL PROTECTED] Behalf Of Antonio Ruiz
 Martínez
 Sent: Tuesday, March 22, 2005 12:23 PM
 To: openssl-users@openssl.org
 Subject: RAND_Bytes in Windows CE (Pocket PC or smartphone)


 Hello!

 I'm writing you because when I call to the function to make a pkcs#7
 enveloped data, I get the following error:
 1673169562:error:2406064:random number generator:SSLEAY_RAND_BYTES_PRNG
 not seeded:.\crypto\rand\md_rand.c:503:You need to read the OpenSSL FAQ.

 I read it but the problems are related to Unix System, but what about
 Windows CE?
 Could you help me to solve it, please?
 Thanks in advance,
 Regards,
 Antonio.

__
OpenSSL Project http://www.openssl.org
User Support Mailing Listopenssl-users@openssl.org
Automated List Manager   [EMAIL PROTECTED]