#!/usr/bin/perl -w # # Author: tlviewer@yahoo.com # script: PrimeGen.pl # Description: use the CryptoAPI to generate # Diffie Hellman Prime/Gen pairs for Perl # keywords: prime cryptoapi crypt diffie inline ingie # Date: 10/31/04 use Inline C => DATA => LIBS => '-luser32 -lcrypt32 '; my $tStart = Win32::GetTickCount(); my $lret; my ( $prime, $gen ); # generate the Prime/Gen pairs at the desired modulus length for my $i ( 0 .. 4 ) { $lret = main( $prime, $gen, 1536 ); print "prime=", unpack( "H*", $prime ), "\n"; print "gen =", unpack( "H*", $gen ), "\n\n"; } # /* Win32 only way to get the elapsed time */ print "elapsed=", ( Win32::GetTickCount() - $tStart ) / 1000, " seconds\n"; # __END__ __C__ /* test */ #define _WIN32_WINNT 0x0500 #include #include #include #define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING) int main( SV* prime, SV* gen, int modulen) { /* cryptoapi defs */ HCRYPTPROV prov1; HCRYPTKEY hKey1; CRYPT_DATA_BLOB blob; /* standard C defs */ BYTE DataPom[1024]; unsigned long Velikost2 = 1024,Velikost = 12; DWORD dwNJ=0; /* delete the container if there */ CryptAcquireContext(&prov1, "PrimeGen", MS_ENH_DSS_DH_PROV, PROV_DSS_DH, CRYPT_DELETEKEYSET); /* get context using no private keys */ if (!CryptAcquireContext(&prov1, "PrimeGen", MS_ENH_DSS_DH_PROV, PROV_DSS_DH, CRYPT_VERIFYCONTEXT)) { //printf("container is not defined \n"); printf("\n"); if (!CryptAcquireContext(&prov1, "PrimeGen", MS_ENH_DSS_DH_PROV, PROV_DSS_DH, CRYPT_NEWKEYSET)) { printf("Error 1: %x(%d)\n", GetLastError(), GetLastError()); exit(1); } else { /* generate the epemeral key pair and DH parameters */ //printf("trying to generate new key \n"); if (!CryptGenKey(prov1, CALG_DH_EPHEM, ( modulen << 16 ) , &hKey1)) { printf("Error 3: %x(%d)\n", GetLastError(), GetLastError()); } } } Velikost2 = 0; /* get a pointer to the Gen length */ if (!CryptGetKeyParam(hKey1, KP_G, 0, &Velikost2, 0)) { printf("Error 9: %x(%d)\n", GetLastError(), GetLastError()); } //printf("BufSize=%d \n", Velikost2); /* zero out the buffer */ for (dwNJ=0;dwNJ