AES256 CBC Mode Decoder und Encoder - Update 27.02.2014
Verfasst: 24.02.2014 21:32

Das deutsche PureBasic-Forum
https://www.purebasic.fr/german/
Code: Alles auswählen
Procedure.q AES256CBC_Encoder(*inBuffer.Quad, *outBuffer.Quad, bytes.q, *key, *i_v)
;(AES256_CBC mode encoder , by Werner Albus , www.nachtoptik.de :-)
Protected result_1.q
If (bytes % 16)
ProcedureReturn 0
EndIf
Protected *iv.Quad = AllocateMemory(16)
CopyMemory(*i_v, *iv, 16)
Protected rounds.q = (bytes >> 4) - 1
Protected i.q, result.i
For i = 0 To rounds
result = AESEncoder(*inBuffer, *outBuffer, 16, *key, 256, *iv)
If (Not result)
FreeMemory(*iv)
ProcedureReturn 0
EndIf
result_1 + result
*iv\q ! *outBuffer\q
*outBuffer + 8 : *iv + 8
*iv\q ! *outBuffer\q
*outBuffer + 8 : *iv - 8
*inBuffer + 16
Next i
FreeMemory(*iv)
ProcedureReturn result_1
EndProcedure
Code: Alles auswählen
Structure AES_IV
q.q[0]
EndStructure
Macro AES256CBC(Type, dir)
Procedure.i AES256CBC_#Type(*inBuffer.AES_IV, *outBuffer.AES_IV, bytes.q, *key, *i_v)
;(AES256_CBC mode encoder , by Werner Albus (www.nachtoptik.de) and NicTheQuick (www.freakscorner.de)
If (bytes % 16)
ProcedureReturn 0
EndIf
Protected *iv.AES_IV = AllocateMemory(16)
CopyMemory(*i_v, *iv, 16)
Protected rounds.q = (bytes >> 4)
Protected i.q, result.i
While i < rounds
result = AES#Type(*inBuffer, *outBuffer, 16, *key, 256, *iv)
If (Not result)
FreeMemory(*iv)
ProcedureReturn #False
EndIf
*iv\q[0] ! *dir#Buffer\q[0]
*iv\q[1] ! *dir#Buffer\q[1]
*outBuffer + 16
*inBuffer + 16
i + 1
Wend
FreeMemory(*iv)
ProcedureReturn #True
EndProcedure
EndMacro
AES256CBC(Encoder, out)
AES256CBC(Decoder, in)