Created
April 5, 2015 23:05
-
-
Save apense/3e4204690a8974c83f45 to your computer and use it in GitHub Desktop.
Importing Windows functions, casting, and using pointers. i.e., ugly Nim
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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