Crypt.au3 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727
  1. #include-once
  2. #include "FileConstants.au3"
  3. #include "WinAPIError.au3"
  4. ; #INDEX# =======================================================================================================================
  5. ; Title .........: Crypt
  6. ; AutoIt Version : 3.3.14.5
  7. ; Language ......: English
  8. ; Description ...: Functions for encrypting and hashing data.
  9. ; Author(s) .....: Andreas Karlsson (monoceres), jchd
  10. ; Dll(s) ........: Advapi32.dll
  11. ; ===============================================================================================================================
  12. ; #CURRENT# =====================================================================================================================
  13. ; _Crypt_DecryptData
  14. ; _Crypt_DecryptFile
  15. ; _Crypt_DeriveKey
  16. ; _Crypt_DestroyKey
  17. ; _Crypt_EncryptData
  18. ; _Crypt_EncryptFile
  19. ; _Crypt_GenRandom
  20. ; _Crypt_HashData
  21. ; _Crypt_HashFile
  22. ; _Crypt_Shutdown
  23. ; _Crypt_Startup
  24. ; ===============================================================================================================================
  25. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  26. ; __Crypt_Context
  27. ; __Crypt_ContextSet
  28. ; __Crypt_DllHandle
  29. ; __Crypt_DllHandleSet
  30. ; __Crypt_GetCalgFromCryptKey
  31. ; __Crypt_RefCount
  32. ; __Crypt_RefCountDec
  33. ; __Crypt_RefCountInc
  34. ; ===============================================================================================================================
  35. ; #CONSTANTS# ===================================================================================================================
  36. Global Const $PROV_RSA_FULL = 0x1
  37. Global Const $PROV_RSA_AES = 24
  38. Global Const $CRYPT_VERIFYCONTEXT = 0xF0000000
  39. Global Const $HP_HASHSIZE = 0x0004
  40. Global Const $HP_HASHVAL = 0x0002
  41. Global Const $CRYPT_EXPORTABLE = 0x00000001
  42. Global Const $CRYPT_USERDATA = 1
  43. Global Const $KP_ALGID = 0x00000007
  44. Global Const $CALG_MD2 = 0x00008001
  45. Global Const $CALG_MD4 = 0x00008002
  46. Global Const $CALG_MD5 = 0x00008003
  47. Global Const $CALG_SHA1 = 0x00008004
  48. Global Const $CALG_SHA_256 = 0x0000800c
  49. Global Const $CALG_SHA_384 = 0x0000800d
  50. Global Const $CALG_SHA_512 = 0x0000800e
  51. Global Const $CALG_3DES = 0x00006603
  52. Global Const $CALG_AES_128 = 0x0000660e
  53. Global Const $CALG_AES_192 = 0x0000660f
  54. Global Const $CALG_AES_256 = 0x00006610
  55. Global Const $CALG_DES = 0x00006601
  56. Global Const $CALG_RC2 = 0x00006602
  57. Global Const $CALG_RC4 = 0x00006801
  58. Global Const $CALG_USERKEY = 0
  59. ; #VARIABLES# ===================================================================================================================
  60. Global $__g_aCryptInternalData[3]
  61. ; #FUNCTION# ====================================================================================================================
  62. ; Author ........: Andreas Karlsson (monoceres)
  63. ; Modified ......: jpm
  64. ; ===============================================================================================================================
  65. Func _Crypt_Startup()
  66. If __Crypt_RefCount() = 0 Then
  67. Local $hAdvapi32 = DllOpen("Advapi32.dll")
  68. If $hAdvapi32 = -1 Then Return SetError(1001, 0, False)
  69. __Crypt_DllHandleSet($hAdvapi32)
  70. Local $iProviderID = $PROV_RSA_AES
  71. Local $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptAcquireContext", "handle*", 0, "ptr", 0, "ptr", 0, "dword", $iProviderID, "dword", $CRYPT_VERIFYCONTEXT)
  72. If @error Or Not $aRet[0] Then
  73. Local $iError = @error + 1002, $iExtended = @extended
  74. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  75. DllClose(__Crypt_DllHandle())
  76. Return SetError($iError, $iExtended, False)
  77. Else
  78. __Crypt_ContextSet($aRet[1])
  79. ; Fall through to success.
  80. EndIf
  81. EndIf
  82. __Crypt_RefCountInc()
  83. Return True
  84. EndFunc ;==>_Crypt_Startup
  85. ; #FUNCTION# ====================================================================================================================
  86. ; Author ........: Andreas Karlsson (monoceres)
  87. ; Modified ......:
  88. ; ===============================================================================================================================
  89. Func _Crypt_Shutdown()
  90. __Crypt_RefCountDec()
  91. If __Crypt_RefCount() = 0 Then
  92. DllCall(__Crypt_DllHandle(), "bool", "CryptReleaseContext", "handle", __Crypt_Context(), "dword", 0)
  93. DllClose(__Crypt_DllHandle())
  94. EndIf
  95. EndFunc ;==>_Crypt_Shutdown
  96. ; #FUNCTION# ====================================================================================================================
  97. ; Author ........: Andreas Karlsson (monoceres)
  98. ; Modified ......: jpm
  99. ; ===============================================================================================================================
  100. Func _Crypt_DeriveKey($vPassword, $iAlgID, $iHashPasswordID = $CALG_MD5)
  101. Local $aRet = 0, _
  102. $tBuff = 0, $hCryptHash = 0, _
  103. $iError = 0, $iExtended = 0, _
  104. $vReturn = 0
  105. _Crypt_Startup()
  106. If @error Then Return SetError(@error, @extended, -1)
  107. Do
  108. ; Create Hash object
  109. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptCreateHash", "handle", __Crypt_Context(), "uint", $iHashPasswordID, "ptr", 0, "dword", 0, "handle*", 0)
  110. If @error Or Not $aRet[0] Then
  111. $iError = @error + 10
  112. $iExtended = @extended
  113. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  114. $vReturn = -1
  115. ExitLoop
  116. EndIf
  117. $hCryptHash = $aRet[5]
  118. $tBuff = DllStructCreate("byte[" & BinaryLen($vPassword) & "]")
  119. DllStructSetData($tBuff, 1, $vPassword)
  120. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptHashData", "handle", $hCryptHash, "struct*", $tBuff, "dword", DllStructGetSize($tBuff), "dword", $CRYPT_USERDATA)
  121. If @error Or Not $aRet[0] Then
  122. $iError = @error + 20
  123. $iExtended = @extended
  124. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  125. $vReturn = -1
  126. ExitLoop
  127. EndIf
  128. ; Create key
  129. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptDeriveKey", "handle", __Crypt_Context(), "uint", $iAlgID, "handle", $hCryptHash, "dword", $CRYPT_EXPORTABLE, "handle*", 0)
  130. If @error Or Not $aRet[0] Then
  131. $iError = @error + 30
  132. $iExtended = @extended
  133. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  134. $vReturn = -1
  135. ExitLoop
  136. EndIf
  137. $vReturn = $aRet[5]
  138. Until True
  139. If $hCryptHash <> 0 Then DllCall(__Crypt_DllHandle(), "bool", "CryptDestroyHash", "handle", $hCryptHash)
  140. Return SetError($iError, $iExtended, $vReturn)
  141. EndFunc ;==>_Crypt_DeriveKey
  142. ; #FUNCTION# ====================================================================================================================
  143. ; Author ........: Andreas Karlsson (monoceres)
  144. ; Modified ......: jpm
  145. ; ===============================================================================================================================
  146. Func _Crypt_DestroyKey($hCryptKey)
  147. Local $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptDestroyKey", "handle", $hCryptKey)
  148. Local $iError = @error, $iExtended = @extended
  149. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  150. _Crypt_Shutdown()
  151. If $iError Or Not $aRet[0] Then
  152. Return SetError($iError + 10, $iExtended, False)
  153. Else
  154. Return True
  155. EndIf
  156. EndFunc ;==>_Crypt_DestroyKey
  157. ; #FUNCTION# ====================================================================================================================
  158. ; Author ........: Andreas Karlsson (monoceres)
  159. ; Modified ......: jchd, jpm
  160. ; ===============================================================================================================================
  161. Func _Crypt_EncryptData($vData, $vCryptKey, $iAlgID, $bFinal = True)
  162. Switch $iAlgID
  163. Case $CALG_USERKEY
  164. Local $iCalgUsed = __Crypt_GetCalgFromCryptKey($vCryptKey)
  165. If @error Then Return SetError(@error, @extended, -1)
  166. If $iCalgUsed = $CALG_RC4 Then ContinueCase
  167. Case $CALG_RC4
  168. If BinaryLen($vData) = 0 Then Return SetError(0, 0, Binary(''))
  169. EndSwitch
  170. Local $iReqBuffSize = 0, _
  171. $aRet = 0, _
  172. $tBuff = 0, _
  173. $iError = 0, $iExtended = 0, _
  174. $vReturn = 0
  175. _Crypt_Startup()
  176. If @error Then Return SetError(@error, @extended, -1)
  177. Do
  178. If $iAlgID <> $CALG_USERKEY Then
  179. $vCryptKey = _Crypt_DeriveKey($vCryptKey, $iAlgID)
  180. If @error Then
  181. $iError = @error
  182. $iExtended = @extended
  183. $vReturn = -1
  184. ExitLoop
  185. EndIf
  186. EndIf
  187. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptEncrypt", "handle", $vCryptKey, "handle", 0, "bool", $bFinal, "dword", 0, "ptr", 0, _
  188. "dword*", BinaryLen($vData), "dword", 0)
  189. If @error Or Not $aRet[0] Then
  190. $iError = @error + 50
  191. $iExtended = @extended
  192. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  193. $vReturn = -1
  194. ExitLoop
  195. EndIf
  196. $iReqBuffSize = $aRet[6]
  197. $tBuff = DllStructCreate("byte[" & $iReqBuffSize + 1 & "]")
  198. DllStructSetData($tBuff, 1, $vData)
  199. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptEncrypt", "handle", $vCryptKey, "handle", 0, "bool", $bFinal, "dword", 0, "struct*", $tBuff, _
  200. "dword*", BinaryLen($vData), "dword", $iReqBuffSize)
  201. If @error Or Not $aRet[0] Then
  202. $iError = @error + 60
  203. $iExtended = @extended
  204. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  205. $vReturn = -1
  206. ExitLoop
  207. EndIf
  208. $vReturn = BinaryMid(DllStructGetData($tBuff, 1), 1, $iReqBuffSize)
  209. Until True
  210. If $iAlgID <> $CALG_USERKEY Then _Crypt_DestroyKey($vCryptKey)
  211. _Crypt_Shutdown()
  212. Return SetError($iError, $iExtended, $vReturn)
  213. EndFunc ;==>_Crypt_EncryptData
  214. ; #FUNCTION# ====================================================================================================================
  215. ; Author ........: Andreas Karlsson (monoceres)
  216. ; Modified ......: jchd, jpm
  217. ; ===============================================================================================================================
  218. Func _Crypt_DecryptData($vData, $vCryptKey, $iAlgID, $bFinal = True)
  219. Switch $iAlgID
  220. Case $CALG_USERKEY
  221. Local $iCalgUsed = __Crypt_GetCalgFromCryptKey($vCryptKey)
  222. If @error Then Return SetError(@error, @extended, -1)
  223. If $iCalgUsed = $CALG_RC4 Then ContinueCase
  224. Case $CALG_RC4
  225. If BinaryLen($vData) = 0 Then Return SetError(0, 0, Binary(''))
  226. EndSwitch
  227. Local $aRet = 0, _
  228. $tBuff = 0, $tTempStruct = 0, _
  229. $iError = 0, $iExtended = 0, $iPlainTextSize = 0, _
  230. $vReturn = 0
  231. _Crypt_Startup()
  232. If @error Then Return SetError(@error, @extended, -1)
  233. Do
  234. If $iAlgID <> $CALG_USERKEY Then
  235. $vCryptKey = _Crypt_DeriveKey($vCryptKey, $iAlgID)
  236. If @error Then
  237. $iError = @error
  238. $iExtended = @extended
  239. $vReturn = -1
  240. ExitLoop
  241. EndIf
  242. EndIf
  243. $tBuff = DllStructCreate("byte[" & BinaryLen($vData) + 1000 & "]")
  244. If BinaryLen($vData) > 0 Then DllStructSetData($tBuff, 1, $vData)
  245. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptDecrypt", "handle", $vCryptKey, "handle", 0, "bool", $bFinal, "dword", 0, "struct*", $tBuff, "dword*", BinaryLen($vData))
  246. If @error Or Not $aRet[0] Then
  247. $iError = @error + 70
  248. $iExtended = @extended
  249. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  250. $vReturn = -1
  251. ExitLoop
  252. EndIf
  253. $iPlainTextSize = $aRet[6]
  254. $tTempStruct = DllStructCreate("byte[" & $iPlainTextSize + 1 & "]", DllStructGetPtr($tBuff))
  255. $vReturn = BinaryMid(DllStructGetData($tTempStruct, 1), 1, $iPlainTextSize)
  256. Until True
  257. If $iAlgID <> $CALG_USERKEY Then _Crypt_DestroyKey($vCryptKey)
  258. _Crypt_Shutdown()
  259. Return SetError($iError, $iExtended, $vReturn)
  260. EndFunc ;==>_Crypt_DecryptData
  261. ; #FUNCTION# ====================================================================================================================
  262. ; Author ........: Andreas Karlsson (monoceres)
  263. ; Modified ......: jpm
  264. ; ===============================================================================================================================
  265. Func _Crypt_HashData($vData, $iAlgID, $bFinal = True, $hCryptHash = 0)
  266. Local $aRet = 0, _
  267. $tBuff = 0, _
  268. $iError = 0, $iExtended = 0, $iHashSize = 0, _
  269. $vReturn = 0
  270. _Crypt_Startup()
  271. If @error Then Return SetError(@error, @extended, -1)
  272. Do
  273. If $hCryptHash = 0 Then
  274. ; Create Hash object
  275. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptCreateHash", "handle", __Crypt_Context(), "uint", $iAlgID, "ptr", 0, "dword", 0, "handle*", 0)
  276. If @error Or Not $aRet[0] Then
  277. $iError = @error + 10
  278. $iExtended = @extended
  279. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  280. $vReturn = -1
  281. ExitLoop
  282. EndIf
  283. $hCryptHash = $aRet[5]
  284. EndIf
  285. $tBuff = DllStructCreate("byte[" & BinaryLen($vData) & "]")
  286. DllStructSetData($tBuff, 1, $vData)
  287. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptHashData", "handle", $hCryptHash, "struct*", $tBuff, "dword", DllStructGetSize($tBuff), "dword", $CRYPT_USERDATA)
  288. If @error Or Not $aRet[0] Then
  289. $iError = @error + 20
  290. $iExtended = @extended
  291. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  292. $vReturn = -1
  293. ExitLoop
  294. EndIf
  295. If $bFinal Then
  296. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptGetHashParam", "handle", $hCryptHash, "dword", $HP_HASHSIZE, "dword*", 0, "dword*", 4, "dword", 0)
  297. If @error Or Not $aRet[0] Then
  298. $iError = @error + 30
  299. $iExtended = @extended
  300. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  301. $vReturn = -1
  302. ExitLoop
  303. EndIf
  304. $iHashSize = $aRet[3]
  305. ; Get Hash
  306. $tBuff = DllStructCreate("byte[" & $iHashSize & "]")
  307. $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptGetHashParam", "handle", $hCryptHash, "dword", $HP_HASHVAL, "struct*", $tBuff, "dword*", $iHashSize, "dword", 0)
  308. If @error Or Not $aRet[0] Then
  309. $iError = @error + 40
  310. $iExtended = @extended
  311. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  312. $vReturn = -1
  313. ExitLoop
  314. EndIf
  315. $vReturn = DllStructGetData($tBuff, 1)
  316. Else
  317. $vReturn = $hCryptHash
  318. EndIf
  319. Until True
  320. ; Cleanup and return hash
  321. If $hCryptHash <> 0 And $bFinal Then DllCall(__Crypt_DllHandle(), "bool", "CryptDestroyHash", "handle", $hCryptHash)
  322. _Crypt_Shutdown()
  323. Return SetError($iError, $iExtended, $vReturn)
  324. EndFunc ;==>_Crypt_HashData
  325. ; #FUNCTION# ====================================================================================================================
  326. ; Author ........: Andreas Karlsson (monoceres)
  327. ; Modified ......: jpm
  328. ; ===============================================================================================================================
  329. Func _Crypt_HashFile($sFilePath, $iAlgID)
  330. Local $dTempData = 0, _
  331. $hFile = 0, $hHashObject = 0, _
  332. $iError = 0, $iExtended = 0, _
  333. $vReturn = 0
  334. _Crypt_Startup()
  335. If @error Then Return SetError(@error, @extended, -1)
  336. Do
  337. $hFile = FileOpen($sFilePath, $FO_BINARY)
  338. If $hFile = -1 Then
  339. $iError = 1
  340. $iExtended = _WinAPI_GetLastError()
  341. $vReturn = -1
  342. ExitLoop
  343. EndIf
  344. Do
  345. $dTempData = FileRead($hFile, 512 * 1024)
  346. If @error Then
  347. $vReturn = _Crypt_HashData($dTempData, $iAlgID, True, $hHashObject)
  348. If @error Then
  349. $iError = @error
  350. $iExtended = @extended
  351. $vReturn = -1
  352. ExitLoop 2
  353. EndIf
  354. ExitLoop 2
  355. Else
  356. $hHashObject = _Crypt_HashData($dTempData, $iAlgID, False, $hHashObject)
  357. If @error Then
  358. $iError = @error + 100
  359. $iExtended = @extended
  360. $vReturn = -1
  361. ExitLoop 2
  362. EndIf
  363. EndIf
  364. Until False
  365. Until True
  366. _Crypt_Shutdown()
  367. If $hFile <> -1 Then FileClose($hFile)
  368. Return SetError($iError, $iExtended, $vReturn)
  369. EndFunc ;==>_Crypt_HashFile
  370. ; #FUNCTION# ====================================================================================================================
  371. ; Author ........: Andreas Karlsson (monoceres)
  372. ; Modified ......: jpm
  373. ; ===============================================================================================================================
  374. Func _Crypt_EncryptFile($sSourceFile, $sDestinationFile, $vCryptKey, $iAlgID)
  375. Local $dTempData = 0, _
  376. $hInFile = 0, $hOutFile = 0, _
  377. $iError = 0, $iExtended = 0, $iFileSize = FileGetSize($sSourceFile), $iRead = 0, _
  378. $bReturn = True
  379. _Crypt_Startup()
  380. If @error Then Return SetError(@error, @extended, -1)
  381. Do
  382. If $iAlgID <> $CALG_USERKEY Then
  383. $vCryptKey = _Crypt_DeriveKey($vCryptKey, $iAlgID)
  384. If @error Then
  385. $iError = @error
  386. $iExtended = @extended
  387. $bReturn = False
  388. ExitLoop
  389. EndIf
  390. EndIf
  391. $hInFile = FileOpen($sSourceFile, $FO_BINARY)
  392. If $hInFile = -1 Then
  393. $iError = 2
  394. $iExtended = _WinAPI_GetLastError()
  395. $bReturn = False
  396. ExitLoop
  397. EndIf
  398. $hOutFile = FileOpen($sDestinationFile, $FO_OVERWRITE + $FO_CREATEPATH + $FO_BINARY)
  399. If $hOutFile = -1 Then
  400. $iError = 3
  401. $iExtended = _WinAPI_GetLastError()
  402. $bReturn = False
  403. ExitLoop
  404. EndIf
  405. Do
  406. $dTempData = FileRead($hInFile, 1024 * 1024)
  407. $iRead += BinaryLen($dTempData)
  408. If $iRead = $iFileSize Then
  409. $dTempData = _Crypt_EncryptData($dTempData, $vCryptKey, $CALG_USERKEY, True)
  410. If @error Then
  411. $iError = @error + 400
  412. $iExtended = @extended
  413. $bReturn = False
  414. EndIf
  415. FileWrite($hOutFile, $dTempData)
  416. ExitLoop 2
  417. Else
  418. $dTempData = _Crypt_EncryptData($dTempData, $vCryptKey, $CALG_USERKEY, False)
  419. If @error Then
  420. $iError = @error + 500
  421. $iExtended = @extended
  422. $bReturn = False
  423. ExitLoop 2
  424. EndIf
  425. FileWrite($hOutFile, $dTempData)
  426. EndIf
  427. Until False
  428. Until True
  429. If $iAlgID <> $CALG_USERKEY Then _Crypt_DestroyKey($vCryptKey)
  430. _Crypt_Shutdown()
  431. If $hInFile <> -1 Then FileClose($hInFile)
  432. If $hOutFile <> -1 Then FileClose($hOutFile)
  433. Return SetError($iError, $iExtended, $bReturn)
  434. EndFunc ;==>_Crypt_EncryptFile
  435. ; #FUNCTION# ====================================================================================================================
  436. ; Author ........: Andreas Karlsson (monoceres)
  437. ; Modified ......: jpm
  438. ; ===============================================================================================================================
  439. Func _Crypt_DecryptFile($sSourceFile, $sDestinationFile, $vCryptKey, $iAlgID)
  440. Local $dTempData = 0, _
  441. $hInFile = 0, $hOutFile = 0, _
  442. $iError = 0, $iExtended = 0, $iFileSize = FileGetSize($sSourceFile), $iRead = 0, _
  443. $bReturn = True
  444. _Crypt_Startup()
  445. If @error Then Return SetError(@error, @extended, -1)
  446. Do
  447. If $iAlgID <> $CALG_USERKEY Then
  448. $vCryptKey = _Crypt_DeriveKey($vCryptKey, $iAlgID)
  449. If @error Then
  450. $iError = @error
  451. $iExtended = @extended
  452. $bReturn = False
  453. ExitLoop
  454. EndIf
  455. EndIf
  456. $hInFile = FileOpen($sSourceFile, $FO_BINARY)
  457. If $hInFile = -1 Then
  458. $iError = 2
  459. $iExtended = _WinAPI_GetLastError()
  460. $bReturn = False
  461. ExitLoop
  462. EndIf
  463. $hOutFile = FileOpen($sDestinationFile, $FO_OVERWRITE + $FO_CREATEPATH + $FO_BINARY)
  464. If $hOutFile = -1 Then
  465. $iError = 3
  466. $iExtended = _WinAPI_GetLastError()
  467. $bReturn = False
  468. ExitLoop
  469. EndIf
  470. Do
  471. $dTempData = FileRead($hInFile, 1024 * 1024)
  472. $iRead += BinaryLen($dTempData)
  473. If $iRead = $iFileSize Then
  474. $dTempData = _Crypt_DecryptData($dTempData, $vCryptKey, $CALG_USERKEY, True)
  475. If @error Then
  476. $iError = @error + 400
  477. $iExtended = @extended
  478. $bReturn = False
  479. EndIf
  480. FileWrite($hOutFile, $dTempData)
  481. ExitLoop 2
  482. Else
  483. $dTempData = _Crypt_DecryptData($dTempData, $vCryptKey, $CALG_USERKEY, False)
  484. If @error Then
  485. $iError = @error + 500
  486. $iExtended = @extended
  487. $bReturn = False
  488. ExitLoop 2
  489. EndIf
  490. FileWrite($hOutFile, $dTempData)
  491. EndIf
  492. Until False
  493. Until True
  494. If $iAlgID <> $CALG_USERKEY Then _Crypt_DestroyKey($vCryptKey)
  495. _Crypt_Shutdown()
  496. If $hInFile <> -1 Then FileClose($hInFile)
  497. If $hOutFile <> -1 Then FileClose($hOutFile)
  498. Return SetError($iError, $iExtended, $bReturn)
  499. EndFunc ;==>_Crypt_DecryptFile
  500. ; #FUNCTION# ====================================================================================================================
  501. ; Author ........: Erik Pilsits (wraithdu)
  502. ; Modified ......: jpm
  503. ; ===============================================================================================================================
  504. Func _Crypt_GenRandom($pBuffer, $iSize)
  505. _Crypt_Startup()
  506. If @error Then Return SetError(@error, @extended, False)
  507. Local $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptGenRandom", "handle", __Crypt_Context(), "dword", $iSize, "struct*", $pBuffer)
  508. Local $iError = @error, $iExtended = @extended
  509. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  510. _Crypt_Shutdown()
  511. If $iError Or (Not $aRet[0]) Then
  512. Return SetError($iError + 10, $iExtended, False)
  513. Else
  514. Return True
  515. EndIf
  516. EndFunc ;==>_Crypt_GenRandom
  517. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  518. ; Name...........: __Crypt_RefCount
  519. ; Description ...: Retrieves the internal reference count.
  520. ; Syntax.........: __Crypt_RefCount ( )
  521. ; Parameters ....:
  522. ; Return values .: The current internal reference count.
  523. ; Author ........: Valik
  524. ; Modified.......:
  525. ; Remarks .......: For Internal Use Only
  526. ; Related .......:
  527. ; Link ..........:
  528. ; Example .......:
  529. ; ===============================================================================================================================
  530. Func __Crypt_RefCount()
  531. Return $__g_aCryptInternalData[0]
  532. EndFunc ;==>__Crypt_RefCount
  533. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  534. ; Name...........: __Crypt_RefCountInc
  535. ; Description ...: Increments the internal reference count.
  536. ; Syntax.........: __Crypt_RefCountInc ( )
  537. ; Parameters ....:
  538. ; Return values .:
  539. ; Author ........: Valik
  540. ; Modified.......:
  541. ; Remarks .......: For Internal Use Only
  542. ; Related .......:
  543. ; Link ..........:
  544. ; Example .......:
  545. ; ===============================================================================================================================
  546. Func __Crypt_RefCountInc()
  547. $__g_aCryptInternalData[0] += 1
  548. EndFunc ;==>__Crypt_RefCountInc
  549. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  550. ; Name...........: __Crypt_RefCountDec
  551. ; Description ...: Decrements the internal reference count.
  552. ; Syntax.........: __Crypt_RefCountDec ( )
  553. ; Parameters ....:
  554. ; Return values .:
  555. ; Author ........: Valik
  556. ; Modified.......:
  557. ; Remarks .......: For Internal Use Only
  558. ; Related .......:
  559. ; Link ..........:
  560. ; Example .......:
  561. ; ===============================================================================================================================
  562. Func __Crypt_RefCountDec()
  563. If $__g_aCryptInternalData[0] > 0 Then $__g_aCryptInternalData[0] -= 1
  564. EndFunc ;==>__Crypt_RefCountDec
  565. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  566. ; Name...........: __Crypt_DllHandle
  567. ; Description ...: Retrieves the internal DLL handle.
  568. ; Syntax.........: __Crypt_DllHandle ( )
  569. ; Parameters ....:
  570. ; Return values .: The current internal DLL handle.
  571. ; Author ........: Valik
  572. ; Modified.......:
  573. ; Remarks .......: For Internal Use Only
  574. ; Related .......:
  575. ; Link ..........:
  576. ; Example .......:
  577. ; ===============================================================================================================================
  578. Func __Crypt_DllHandle()
  579. Return $__g_aCryptInternalData[1]
  580. EndFunc ;==>__Crypt_DllHandle
  581. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  582. ; Name...........: __Crypt_DllHandleSet
  583. ; Description ...: Stores the internal DLL handle.
  584. ; Syntax.........: __Crypt_DllHandleSet ( $hAdvapi32 )
  585. ; Parameters ....: $hAdvapi32 - The new handle to store.
  586. ; Return values .:
  587. ; Author ........: Valik
  588. ; Modified.......:
  589. ; Remarks .......: For Internal Use Only
  590. ; Related .......:
  591. ; Link ..........:
  592. ; Example .......:
  593. ; ===============================================================================================================================
  594. Func __Crypt_DllHandleSet($hAdvapi32)
  595. $__g_aCryptInternalData[1] = $hAdvapi32
  596. EndFunc ;==>__Crypt_DllHandleSet
  597. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  598. ; Name...........: __Crypt_Context
  599. ; Description ...: Retrieves the internal crypt context.
  600. ; Syntax.........: __Crypt_Context ( )
  601. ; Parameters ....:
  602. ; Return values .: The current internal crypt context.
  603. ; Author ........: Valik
  604. ; Modified.......:
  605. ; Remarks .......: For Internal Use Only
  606. ; Related .......:
  607. ; Link ..........:
  608. ; Example .......:
  609. ; ===============================================================================================================================
  610. Func __Crypt_Context()
  611. Return $__g_aCryptInternalData[2]
  612. EndFunc ;==>__Crypt_Context
  613. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  614. ; Name...........: __Crypt_ContextSet
  615. ; Description ...: Stores the internal crypt context.
  616. ; Syntax.........: __Crypt_ContextSet ( $hCryptContext )
  617. ; Parameters ....: $hCryptContext - The new crypt context to store.
  618. ; Return values .:
  619. ; Author ........: Valik
  620. ; Modified.......:
  621. ; Remarks .......: For Internal Use Only
  622. ; Related .......:
  623. ; Link ..........:
  624. ; Example .......:
  625. ; ===============================================================================================================================
  626. Func __Crypt_ContextSet($hCryptContext)
  627. $__g_aCryptInternalData[2] = $hCryptContext
  628. EndFunc ;==>__Crypt_ContextSet
  629. ; #INTERNAL_USE_ONLY# ===========================================================================================================
  630. ; Name...........: __Crypt_GetCalgFromCryptKey
  631. ; Description ...: Retrieves the crypto-algorithm use by a USERKEY.
  632. ; Syntax.........: __Crypt_GetCalgFromCryptKey($vCryptKey)
  633. ; Parameters ....: $vCryptKey - The USERKEY handle.
  634. ; Return values .:
  635. ; Author ........: jchd
  636. ; Modified.......: jpm
  637. ; Remarks .......: For Internal Use Only
  638. ; Related .......:
  639. ; Link ..........:
  640. ; Example .......:
  641. ; ===============================================================================================================================
  642. Func __Crypt_GetCalgFromCryptKey($vCryptKey)
  643. Local $tAlgId = DllStructCreate("uint")
  644. Local $aRet = DllCall(__Crypt_DllHandle(), "bool", "CryptGetKeyParam", "handle", $vCryptKey, "dword", $KP_ALGID, "struct*", $tAlgId, "dword*", DllStructGetSize($tAlgId), "dword", 0)
  645. Local $iError = @error, $iExtended = @extended
  646. If Not $aRet[0] Then $iExtended = _WinAPI_GetLastError()
  647. If $iError Or Not $aRet[0] Then
  648. Return SetError($iError + 80, $iExtended, $CRYPT_USERDATA)
  649. Else
  650. Return DllStructGetData($tAlgId, 1)
  651. EndIf
  652. EndFunc ;==>__Crypt_GetCalgFromCryptKey