Skip to content

Instantly share code, notes, and snippets.

@apense
Created April 5, 2015 23:05
Show Gist options
  • Save apense/3e4204690a8974c83f45 to your computer and use it in GitHub Desktop.
Save apense/3e4204690a8974c83f45 to your computer and use it in GitHub Desktop.
Importing Windows functions, casting, and using pointers. i.e., ugly Nim
import windows
when defined(windows):
type HCRYPTPROV* = ptr int # ULONG_PTR typedef
const PROV_RSA_FULL* = DWORD(1)
const CRYPT_VERIFYCONTEXT* = DWORD(0xf0000000)
proc CryptAcquireContextA(phProv: ptr HCRYPTPROV, pszContainer, pszProvider: LPCTSTR,
dwProvType, dwFlags: DWORD): WINBOOL {.stdcall, dynlib: "AdvApi32.dll", importc: "CryptAcquireContextA".}
proc CryptAcquireContextW(phProv: ptr HCRYPTPROV, pszContainer, pszProvider: LPCTSTR,
dwProvType, dwFlags: DWORD): WINBOOL {.stdcall, dynlib: "AdvApi32.dll", importc: "CryptAcquireContextW".}
proc CryptGenRandom(phProv: HCRYPTPROV, dwLen: DWORD, pbBuffer: openarray[char]): WINBOOL {.
stdcall, dynlib: "AdvApi32.dll", importc: "CryptGenRandom".}
proc win_urandom(buffer: openarray[char]) =
var hCryptProv: HCRYPTPROV = nil
when defined(winUnicode):
if(CryptAcquireContextW(addr(hCryptProv), LPCTSTR(nil), LPCTSTR(nil), PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == 0):
raise newException(ValueError, "CryptAcquireContextW() failed")
else:
if(CryptAcquireContextA(addr(hCryptProv), LPCTSTR(nil), LPCTSTR(nil), PROV_RSA_FULL, CRYPT_VERIFYCONTEXT) == 0):
raise newException(ValueError, "CryptAcquireContextA() failed")
var res = CryptGenRandom(hCryptProv, DWORD(len(buffer)), buffer)
if(res == 0):
echo "Error was ", GetLastError()
raise newException(ValueError, "Failed to initialize the randomized hash secret using CryptoGen")
var buffer: array[0..999, char]
win_urandom(buffer)
# output as byte sequence
echo cast[seq[byte]](@buffer)
# output as string
echo cast[string](addr(buffer))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment