| 1:2:
 3:
 4:
 5:
 6:
 7:
 8:
 9:
 10:
 11:
 12:
 13:
 14:
 15:
 16:
 17:
 18:
 19:
 20:
 21:
 22:
 23:
 24:
 25:
 26:
 27:
 28:
 29:
 30:
 31:
 32:
 33:
 34:
 35:
 36:
 37:
 38:
 39:
 40:
 41:
 42:
 43:
 44:
 45:
 46:
 47:
 48:
 49:
 50:
 51:
 52:
 53:
 54:
 55:
 56:
 57:
 58:
 59:
 60:
 61:
 62:
 63:
 64:
 65:
 66:
 67:
 68:
 69:
 70:
 71:
 72:
 73:
 74:
 75:
 76:
 77:
 78:
 79:
 80:
 81:
 82:
 83:
 84:
 85:
 86:
 87:
 88:
 89:
 90:
 91:
 92:
 93:
 94:
 95:
 96:
 97:
 98:
 99:
 100:
 101:
 102:
 103:
 104:
 105:
 106:
 107:
 108:
 109:
 110:
 111:
 112:
 113:
 114:
 115:
 116:
 117:
 118:
 119:
 120:
 121:
 122:
 123:
 124:
 125:
 126:
 127:
 128:
 129:
 130:
 131:
 132:
 133:
 134:
 135:
 136:
 137:
 138:
 139:
 140:
 141:
 142:
 143:
 144:
 145:
 146:
 147:
 148:
 149:
 150:
 151:
 152:
 153:
 154:
 155:
 156:
 157:
 158:
 159:
 160:
 161:
 162:
 163:
 164:
 165:
 166:
 167:
 168:
 169:
 170:
 171:
 172:
 173:
 174:
 175:
 176:
 177:
 178:
 179:
 180:
 181:
 182:
 183:
 184:
 185:
 186:
 187:
 188:
 189:
 190:
 191:
 192:
 193:
 194:
 195:
 196:
 197:
 198:
 199:
 200:
 201:
 202:
 203:
 204:
 205:
 206:
 207:
 208:
 209:
 210:
 211:
 212:
 213:
 214:
 215:
 216:
 217:
 218:
 219:
 220:
 221:
 222:
 223:
 224:
 225:
 226:
 227:
 228:
 229:
 230:
 231:
 232:
 233:
 234:
 235:
 236:
 237:
 238:
 239:
 240:
 241:
 
 | procedure DLL_TceCrypto.InitDecVars(aSymCypher, aChainIds : integer; var ACipherClass : TDECCipherClass;var ACipherMode : TCipherMode; var AHashClass : TDECHashClass;
 var ATextFormat: TDECFormatClass; var AKDFIndex : LongWord);
 begin
 AHashClass := THash_Whirlpool;
 ATextFormat := TFormat_Mime64;
 AKDFIndex := 1;
 
 case aSymCypher of
 0 : ACipherClass := TCipher_Blowfish;
 1 : ACipherClass := TCipher_Twofish;
 2 : ACipherClass := TCipher_IDEA;
 3 : ACipherClass := TCipher_Cast256;
 4 : ACipherClass := TCipher_Mars;
 5 : ACipherClass := TCipher_RC4;
 6 : ACipherClass := TCipher_RC6;
 7 : ACipherClass := TCipher_Rijndael;
 8 : ACipherClass := TCipher_Square;
 9 : ACipherClass := TCipher_SCOP;
 10 : ACipherClass := TCipher_Sapphire;
 11 : ACipherClass := TCipher_1DES;
 12 : ACipherClass := TCipher_2DES;
 13 : ACipherClass := TCipher_3DES;
 14 : ACipherClass := TCipher_2DDES;
 15 : ACipherClass := TCipher_3DDES;
 16 : ACipherClass := TCipher_3TDES;
 17 : ACipherClass := TCipher_3Way;
 18 : ACipherClass := TCipher_Cast128;
 19 : ACipherClass := TCipher_Gost;
 20 : ACipherClass := TCipher_Misty;
 21 : ACipherClass := TCipher_NewDES;
 22 : ACipherClass := TCipher_Q128;
 23 : ACipherClass := TCipher_RC2;
 24 : ACipherClass := TCipher_RC5;
 25 : ACipherClass := TCipher_SAFER;
 26 : ACipherClass := TCipher_Shark;
 27 : ACipherClass := TCipher_Skipjack;
 28 : ACipherClass := TCipher_TEA;
 29 : ACipherClass := TCipher_TEAN;
 else aCipherClass := TCipher_Rijndael;
 end;
 
 case aChainIds of
 0 : ACipherMode := TCipherMode.cmCTSx;     1 : ACipherMode := TCipherMode.cmCBCx;     2 : ACipherMode := TCipherMode.cmCFB8;     3 : ACipherMode := TCipherMode.cmCFBx;     4 : ACipherMode := TCipherMode.cmOFB8;     5 : ACipherMode := TCipherMode.cmOFBx;     6 : ACipherMode := TCipherMode.cmCFS8;     7 : ACipherMode := TCipherMode.cmCFSx;     8 : ACipherMode := TCipherMode.cmECBx;     else ACipherMode := cmCBCx;
 end;
 
 end;
 
 function DLL_TceCrypto.DECEncrypt(const aText: String; const aPassword: String; const aSymCypher : integer = 0; const aChainIds : integer = 0): String;
 var
 ASalt: Binary;
 AData: Binary;
 APass: Binary;
 ACipherClass: TDECCipherClass;   ACipherMode: TCipherMode;   AHashClass: TDECHashClass;   ATextFormat: TDECFormatClass;   AKDFIndex: LongWord; begin
 InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
 with ValidCipher(ACipherClass).Create, Context do
 try
 ASalt := RandomBinary(16);
 APass := ValidHash(aHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
 Mode := ACipherMode;
 Init(APass);
 SetLength(AData, Length(AText) * SizeOf(AText[1]));
 Encode(AText[1], AData[1], Length(AData));
 Result := ValidFormat(aTextFormat).Encode(aSalt + aData + CalcMAC);
 finally
 Free;
 ProtectBinary(ASalt);
 ProtectBinary(AData);
 ProtectBinary(APass);
 end;
 end;
 
 function DLL_TceCrypto.DECEncrypt(const AText: WideString; const APassword: WideString; const aSymCypher : integer = 0; const aChainIds : integer = 0): WideString;
 var
 ASalt: Binary;
 AData: Binary;
 APass: Binary;
 ACipherClass: TDECCipherClass;   ACipherMode: TCipherMode;   AHashClass: TDECHashClass;   ATextFormat: TDECFormatClass;   AKDFIndex: LongWord; begin
 InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
 with ValidCipher(ACipherClass).Create, Context do
 try
 ASalt := RandomBinary(16);
 APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
 Mode := ACipherMode;
 Init(APass);
 SetLength(AData, Length(AText) * SizeOf(AText[1]));
 Encode(AText[1], AData[1], Length(AData));
 Result := ValidFormat(ATextFormat).Encode(ASalt + AData + CalcMAC);
 finally
 Free;
 ProtectBinary(ASalt);
 ProtectBinary(AData);
 ProtectBinary(APass);
 end;
 end;
 
 function DLL_TceCrypto.DECDecrypt(const aText: String; const aPassword: String; const aSymCypher : integer = 0; const aChainIds : integer = 0): String;
 var
 ASalt: Binary;
 AData: Binary;
 ACheck: Binary;
 APass: Binary;
 ALen: Integer;
 ACipherClass: TDECCipherClass;   ACipherMode: TCipherMode;   AHashClass: TDECHashClass;   ATextFormat: TDECFormatClass;   AKDFIndex: LongWord; begin
 InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
 with ValidCipher(ACipherClass).Create, Context do
 try
 ASalt := ValidFormat(ATextFormat).Decode(AText);
 ALen := Length(ASalt) - 16 - BufferSize;
 AData := System.Copy(ASalt, 17, ALen);
 ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
 SetLength(ASalt, 16);
 APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
 Mode := ACipherMode;
 Init(APass);
 SetLength(Result, ALen div SizeOf(AText[1]));
 Decode(AData[1], Result[1], ALen);
 if ACheck <> CalcMAC then
 raise Exception.Create('Invalid data');
 finally
 Free;
 ProtectBinary(ASalt);
 ProtectBinary(AData);
 ProtectBinary(ACheck);
 ProtectBinary(APass);
 end;
 end;
 
 function DLL_TceCrypto.DECDecrypt(const AText: WideString; const APassword: WideString; const aSymCypher : integer = 0; const aChainIds : integer = 0): WideString;
 var
 ASalt: Binary;
 AData: Binary;
 ACheck: Binary;
 APass: Binary;
 ALen: Integer;
 ACipherClass: TDECCipherClass;   ACipherMode: TCipherMode;   AHashClass: TDECHashClass;   ATextFormat: TDECFormatClass;   AKDFIndex: LongWord; begin
 InitDecVars(aSymCypher, aChainIds, ACipherClass, ACipherMode, AHashClass, ATextFormat, AKDFIndex);
 with ValidCipher(ACipherClass).Create, Context do
 try
 ASalt := ValidFormat(ATextFormat).Decode(AText);
 ALen := Length(ASalt) - 16 - BufferSize;
 AData := System.Copy(ASalt, 17, ALen);
 ACheck := System.Copy(ASalt, ALen + 17, BufferSize);
 SetLength(ASalt, 16);
 APass := ValidHash(AHashClass).KDFx(APassword[1], Length(APassword) * SizeOf(APassword[1]), ASalt[1], Length(ASalt), KeySize, TFormat_Copy, AKDFIndex);
 Mode := ACipherMode;
 Init(APass);
 SetLength(Result, ALen div SizeOf(AText[1]));
 Decode(AData[1], Result[1], ALen);
 if ACheck <> CalcMAC then
 raise Exception.Create('Invalid data');
 finally
 Free;
 ProtectBinary(ASalt);
 ProtectBinary(AData);
 ProtectBinary(ACheck);
 ProtectBinary(APass);
 end;
 end;
 
 function DLL_TceCrypto.DECRegister() : boolean;
 begin
 try
 
 TFormat_Copy.register;
 TFormat_HEX.register;
 TFormat_MIME64.register;
 TFormat_MIME32.register;
 
 THash_SHA512.register;
 THash_Whirlpool.register;
 
 TCipher_Blowfish.register;
 TCipher_Twofish.register;
 TCipher_IDEA.Register;
 TCipher_Cast256.Register;
 TCipher_Mars.Register;
 TCipher_RC4.Register;
 TCipher_RC6.Register;
 TCipher_Rijndael.Register;
 TCipher_Square.Register;
 TCipher_SCOP.Register;
 TCipher_Sapphire.Register;
 TCipher_1DES.Register;
 TCipher_2DES.Register;
 TCipher_3DES.Register;
 TCipher_2DDES.Register;
 TCipher_3DDES.Register;
 TCipher_3TDES.Register;
 TCipher_3Way.Register;
 TCipher_Cast128.Register;
 TCipher_Gost.Register;
 TCipher_Misty.Register;
 TCipher_NewDES.Register;
 TCipher_Q128.Register;
 TCipher_RC2.Register;
 TCipher_RC5.Register;
 TCipher_SAFER.Register;
 TCipher_Shark.Register;
 TCipher_Skipjack.Register;
 TCipher_TEA.Register;
 TCipher_TEAN.Register;
 
 SetDefaultCipherClass(TCipher_Rijndael);
 SetDefaultHashClass(THash_SHA512);
 
 result := true;
 except
 on exception do result := false;
 end;
 end;
 |