Question

I am attempting to build CryptoPP with Cygwin x86_64, but I'm having some trouble with osrng.cpp.

I'm using gcc's C++ compiler, and I'm getting the following error at line 50 of osrng.cpp

$ make
g++ -DNDEBUG -g -O2 -march=native -pipe -c osrng.cpp
osrng.cpp: In constructor ‘CryptoPP::MicrosoftCryptoProvider::MicrosoftCryptoProvider()’:
osrng.cpp:50:80: error: invalid conversion from ‘CryptoPP::MicrosoftCryptoProvider::ProviderHandle* {aka long unsigned int*}’ to ‘HCRYPTPROV* {aka long long unsigned int*}’ [-fpermissive]
  if(!CryptAcquireContext(&m_hProvider, 0, 0, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT))
                                                                                ^
In file included from /usr/include/w32api/windows.h:95:0,
                 from osrng.cpp:19:
/usr/include/w32api/wincrypt.h:646:26: error:   initializing argument 1 of ‘WINBOOL CryptAcquireContextA(HCRYPTPROV*, LPCSTR, LPCSTR, DWORD, DWORD)’ [-fpermissive]
   WINIMPM WINBOOL WINAPI CryptAcquireContextA(HCRYPTPROV *phProv,LPCSTR szContainer,LPCSTR szProvider,DWORD dwProvType,DWORD dwFlags);
                          ^
GNUmakefile:208: recipe for target 'osrng.o' failed
make: *** [osrng.o] Error 1

I have successfully compiled the whole thing under the 32bit version of Cygwin before.

How can I fix this for the 64bit edition?

EDIT As suggested by @Yakov's answer, I replaced if defined(_WIN64)if defined(__x86_64__) by if in line 30 of osrng.h. Sadly though, I immediately run into the next problem, indicated by the following error:

$ make
g++ -DNDEBUG -g -O2 -march=native -pipe -c fipstest.cpp
In file included from dll.h:30:0,
                 from fipstest.cpp:8:
osrng.h:34:19: error: expected ‘;’ at end of member declaration
  typedef unsigned __int64 ProviderHandle; // type HCRYPTPROV, avoid #include <windows.h>
                   ^
osrng.h:34:27: error: ‘ProviderHandle’ does not name a type
  typedef unsigned __int64 ProviderHandle; // type HCRYPTPROV, avoid #include <windows.h>
                           ^
osrng.h:38:2: error: ‘ProviderHandle’ does not name a type
  ProviderHandle GetProviderHandle() const {return m_hProvider;}
  ^
osrng.h:40:2: error: ‘ProviderHandle’ does not name a type
  ProviderHandle m_hProvider;
  ^
GNUmakefile:208: recipe for target 'fipstest.o' failed
make: *** [fipstest.o] Error 1
Was it helpful?

Solution

Thankfully, GCC error messages have improved significantly in recent releases. The {aka}s tell you that there is a mismatch between long and long long. Keep in mind that Win64 is LLP64: long is still only 32-bits, and you need a long long to match the size of a pointer. Most (all?) other 64-bit platforms are LP64, meaning that long matches the size of a pointer.

In this particular case, see the if defined(_WIN64) in osrng.h; you will need to change that condition to if defined(__x86_64__) instead.

You might run into problems with the __int64 type as well. Replace those with long long. (Occurs here, here and here.)

OTHER TIPS

You might also find word64 useful. From Crypto++'s config.h:

#if defined(_MSC_VER) || defined(__BORLANDC__)
    typedef unsigned __int64 word64;
    #define W64LIT(x) x##ui64
#else
    typedef unsigned long long word64;
    #define W64LIT(x) x##ULL
#endif

There's a couple of Cygwin defines in there too. But they don't look interesting. For example:

#ifndef TYPE_OF_SOCKLEN_T
#   if defined(_WIN32) || defined(__CYGWIN__)
#       define TYPE_OF_SOCKLEN_T int
#   else
#       define TYPE_OF_SOCKLEN_T ::socklen_t
#   endif
#endif

#if defined(__CYGWIN__) && defined(PREFER_WINDOWS_STYLE_SOCKETS)
#   define __USE_W32_SOCKETS
#endif

(Sorry about the comment here. Its too bing to fit in the little comment block).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top