216 lines
10 KiB
VB.net
216 lines
10 KiB
VB.net
' A warning to parents that this programming language is unsuited for small
|
|
' children
|
|
|
|
Option Explicit
|
|
|
|
'****************************************************************************
|
|
'* *
|
|
'* Encryption Algorithm Types/Modes *
|
|
'* *
|
|
'****************************************************************************
|
|
|
|
' The encryption algorithms we can use
|
|
|
|
Global Const CRYPT_ALGO_NONE = 0 ' No encryption
|
|
Global Const CRYPT_ALGO_MDCSHS = 1 ' MDC/SHS
|
|
Global Const CRYPT_ALGO_DES = 2 ' DES
|
|
Global Const CRYPT_ALGO_3DES = 3 ' Two-key triple DES
|
|
Global Const CRYPT_ALGO_IDEA = 4 ' IDEA
|
|
Global Const CRYPT_ALGO_RC4 = 5 ' RC4
|
|
Global Const CRYPT_ALGO_SAFER = 6 ' SAFER and SAFER-SK
|
|
Global Const CRYPT_ALGO_LAST = 7 ' Last possible crypt algo value
|
|
|
|
' The encryption modes we can use
|
|
|
|
Global Const CRYPT_MODE_NONE = 0 ' No encryption
|
|
Global Const CRYPT_MODE_STREAM = 1 ' Stream cipher
|
|
Global Const CRYPT_MODE_ECB = 2 ' ECB
|
|
Global Const CRYPT_MODE_CBC = 3 ' CBC
|
|
Global Const CRYPT_MODE_CFB = 4 ' CFB
|
|
Global Const CRYPT_MODE_OFB = 5 ' OFB
|
|
Global Const CRYPT_MODE_PCBC = 6 ' PCBC
|
|
Global Const CRYPT_MODE_LAST = 6 ' Last possible crypt algo value
|
|
|
|
'****************************************************************************
|
|
'* *
|
|
'* Library-Wide Constants and Definitions *
|
|
'* *
|
|
'****************************************************************************
|
|
|
|
' The maximum user key size - 2048 bits
|
|
|
|
Global Const CRYPT_MAX_KEYSIZE = 256
|
|
|
|
' The maximum IV size - 256 bits
|
|
|
|
Global Const CRYPT_MAX_IVSIZE = 64
|
|
|
|
' The maximum speed ratio for an encryption algorithm
|
|
|
|
Global Const CRYPT_MAX_SPEED = 1000
|
|
|
|
'****************************************************************************
|
|
'* *
|
|
'* Data Structures *
|
|
'* *
|
|
'****************************************************************************
|
|
|
|
' An encryption context. Note the order of the BYTE[] fields in this
|
|
' structure, which ensures they're aligned to the machine word size
|
|
|
|
Type CRYPT_INFO
|
|
' Basic information on the encryption we're using (a pointer to an
|
|
' internal data structure)
|
|
capabilityInfo As Long ' The encryption capability data
|
|
|
|
' User keying information. The user key is the key as entered by the
|
|
' user, the transformed user key is (for those algoriths which do this)
|
|
' the user key transformed by whatever key preprocessing method is used,
|
|
' stored in canonical form. The IV is the initial IV stored in canonical
|
|
' form
|
|
userKey As String * MAX_KEYSIZE ' User encryption key
|
|
transUserKey As String * MAX_KEYSIZE ' Transformed user key
|
|
iv As String * MAX_IVSIZE ' Initial IV
|
|
userKeyLength As Integer ' User encryption key length in bytes
|
|
ivLength As Integer ' IV length in bytes
|
|
keySet As Integer ' Whether the key is set up
|
|
ivSet As Integer ' Whether the IV is set up
|
|
|
|
' Keying information. The key is the raw encryption key stored in
|
|
' whatever form is required by the algorithm. This may be simply an
|
|
' endianness-adjusted form of the transformed key (in the case of
|
|
' algorithms like MDC/SHS) or a processed form of the user key (in the
|
|
' case of algorithms like DES or IDEA). The IV is the current working
|
|
' IV stored in an endianness-adjusted form. The ivCount is the number
|
|
' of bytes of IV in use, and may be used for various chaining modes.
|
|
' These fields may be unused if the algorithm is implemented in hardware
|
|
key As Long ' Pointer to internal working key
|
|
currentIV As String * MAX_IVSIZE ' Internal working IV
|
|
keyLength As Integer ' Internal key length in bytes
|
|
ivCount As Integer ' Internal IV count for chaining modes
|
|
|
|
' Private data needed by the algorithm
|
|
privateData As Long ' For private use
|
|
End Type
|
|
|
|
' Extra algorithm-specific information stored within a crypt context
|
|
|
|
Type CRYPT_INFO_MDCSHS
|
|
keySetupIterations As Integer ' No.iterations for user key setup
|
|
End Type
|
|
|
|
Type CRYPT_INFO_SAFER
|
|
rounds As Integer ' Number of encryption rounds
|
|
currentRounds As Integer ' Internal number of rounds for this key
|
|
useSaferSK As Integer ' Whether to use strengthened-key version
|
|
End Type
|
|
|
|
' Results returned from the encryption capability query
|
|
|
|
Type CRYPT_QUERY_INFO
|
|
' The algorithm, encryption mode, and algorithm name. Note that the
|
|
' algorithm name is a pointer to a C string, which current versions of
|
|
' Visual Basic can't handle when they're inside a structure. To use it,
|
|
' you need to extract it into a String in the VB program
|
|
cryptAlgo As Integer ' The encryption algorithm
|
|
cryptMode As Integer ' The encryption mode
|
|
algoName As Long ' The algorithm name
|
|
|
|
' The algorithm parameters
|
|
blockSize As Integer ' The basic block size of the algorithm
|
|
minKeySize As Integer ' Minimum key size in bytes
|
|
keySize As Integer ' Recommended key size in bytes
|
|
maxKeySize As Integer ' Maximum key size in bytes
|
|
minIVsize As Integer ' Minimum IV size in bytes
|
|
ivSize As Integer ' Recommended IV size in bytes
|
|
maxIVsize As Integer ' Maximum IV size in bytes
|
|
|
|
' Various algorithm characteristics
|
|
speed As Integer ' Speed relative to block copy
|
|
End Type
|
|
|
|
'****************************************************************************
|
|
'* *
|
|
'* Status Codes *
|
|
'* *
|
|
'****************************************************************************
|
|
|
|
' No error in function call
|
|
|
|
Global Const CRYPT_OK = 0 ' No error
|
|
|
|
' Generic internal error
|
|
|
|
Global Const CRYPT_ERROR = -1 ' Nonspecific error
|
|
|
|
' Failed self-test in encryption code
|
|
|
|
Global Const CRYPT_SELFTEST = -2 ' Failed self-test
|
|
|
|
' Error in parameters passed to function
|
|
|
|
Global Const CRYPT_BADPARM = -3 ' Generic bad argument to function
|
|
Global Const CRYPT_BADPARM1 = -4 ' Bad argument, parameter 1
|
|
Global Const CRYPT_BADPARM2 = -5 ' Bad argument, parameter 2
|
|
Global Const CRYPT_BADPARM3 = -6 ' Bad argument, parameter 3
|
|
Global Const CRYPT_BADPARM4 = -7 ' Bad argument, parameter 4
|
|
Global Const CRYPT_BADPARM5 = -8 ' Bad argument, parameter 5
|
|
Global Const CRYPT_BADPARM6 = -9 ' Bad argument, parameter 6
|
|
Global Const CRYPT_BADPARM7 = -10 ' Bad argument, parameter 7
|
|
Global Const CRYPT_BADPARM8 = -11 ' Bad argument, parameter 8
|
|
Global Const CRYPT_BADPARM9 = -12 ' Bad argument, parameter 9
|
|
Global Const CRYPT_BADPARM10 = -13 ' Bad argument, parameter 10
|
|
Global Const CRYPT_BADPARM11 = -14 ' Bad argument, parameter 11
|
|
Global Const CRYPT_BADPARM12 = -15 ' Bad argument, parameter 12
|
|
Global Const CRYPT_BADPARM13 = -16 ' Bad argument, parameter 13
|
|
Global Const CRYPT_BADPARM14 = -17 ' Bad argument, parameter 14
|
|
Global Const CRYPT_BADPARM15 = -18 ' Bad argument, parameter 15
|
|
|
|
' Errors due to insufficient resources
|
|
|
|
Global Const CRYPT_NOMEM = -19 ' Out of memory
|
|
Global Const CRYPT_NOTINITED = -20 ' Data has not been initialised
|
|
Global Const CRYPT_INITED = -21 ' Data has already been initialised
|
|
Global Const CRYPT_NOALGO = -22 ' Algorithm unavailable
|
|
Global Const CRYPT_NOMODE = -23 ' Encryption mode unavailable
|
|
Global Const CRYPT_NOKEY = -24 ' Key not initialised
|
|
Global Const CRYPT_NOIV = -25 ' IV not initialised
|
|
|
|
'****************************************************************************
|
|
'* *
|
|
'* Public Functions *
|
|
'* *
|
|
'****************************************************************************
|
|
|
|
' Initialise and shut down the encryption library
|
|
|
|
Declare Function initLibrary Lib "Crypt.Dll" () As Integer
|
|
Declare Function endLibrary Lib "Crypt.Dll" () As Integer
|
|
|
|
' Query the capabilities of the encryption library
|
|
|
|
Declare Function queryModeAvailability Lib "Crypt.Dll" (ByVal cryptAlgo As Integer, ByVal cryptMode As Integer) As Integer
|
|
Declare Function queryAlgoAvailability Lib "Crypt.Dll" (ByVal cryptAlgo As Integer) As Integer
|
|
Declare Function queryAlgoModeInformation Lib "Crypt.Dll" (ByVal cryptAlgo As Integer, ByVal cryptMode As Integer, cryptQueryInfo As CRYPT_QUERY_INFO) As Integer
|
|
Declare Function queryContextInformation Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, cryptQueryInfo As CRYPT_QUERY_INFO) As Integer
|
|
|
|
' Initialise and destroy an encryption context
|
|
|
|
Declare Function initCryptContext Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal cryptAlgo As Integer, ByVal cryptMode As Integer) As Integer
|
|
Declare Function initCryptContextEx Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal cryptAlgo As Integer, ByVal cryptMode As Integer, cryptInfoEx As Any) As Integer
|
|
Declare Function destroyCryptContext Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO) As Integer
|
|
|
|
' Load a user key into a crypt context
|
|
|
|
Declare Function loadCryptContext Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal key As String, ByVal keyLength As Integer) As Integer
|
|
|
|
' Load/retreive an IV into/from a crypt context
|
|
|
|
Declare Function loadIV Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal iv As String, ByVal length As Integer) As Integer
|
|
Declare Function retrieveIV Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal iv As String) As Integer
|
|
|
|
' Encrypt/decrypt a block of memory
|
|
|
|
Declare Function encryptBuffer Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal buffer As String, ByVal length As Integer) As Integer
|
|
Declare Function decryptBuffer Lib "Crypt.Dll" (cryptInfo As CRYPT_INFO, ByVal buffer As String, ByVal length As Integer) As Integer
|