Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Comment: | {4109} added new HashFile() wrapper function |
---|---|
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
906b6f74c4ca80a25844cf846a1c31f0 |
User & Date: | ab 2017-12-27 17:24:53 |
2017-12-28
| ||
10:35 | {4110} new TSynHasher object and associated HashFull() function check-in: 4ba6b4a29d user: ab tags: trunk | |
2017-12-27
| ||
17:24 | {4109} added new HashFile() wrapper function check-in: 906b6f74c4 user: ab tags: trunk | |
2017-12-26
| ||
21:30 | {4108} small fix to TQWordRec type definition check-in: 7388c7c290 user: ab tags: trunk | |
Changes to SynCommons.pas.
57710 57711 57712 57713 57714 57715 57716 57717 57718 57719 57720 57721 57722 57723 57724 |
end; function TSynDictionary.DeleteDeprecated: integer; var i: integer; now: cardinal; begin result := 0; if (fSafe.Padding[DIC_TIMECOUNT].VInteger=0) or // no entry (fSafe.Padding[DIC_TIMESEC].VInteger=0) then // nothing in fTimeOut[] exit; now := GetTickCount64 shr 10; if fSafe.Padding[DIC_TIMETIX].VInteger=integer(now) then exit; // no need to search more often than every second fSafe.Lock; try |
| |
57710 57711 57712 57713 57714 57715 57716 57717 57718 57719 57720 57721 57722 57723 57724 |
end;
function TSynDictionary.DeleteDeprecated: integer;
var i: integer;
now: cardinal;
begin
result := 0;
if (self=nil) or (fSafe.Padding[DIC_TIMECOUNT].VInteger=0) or // no entry
(fSafe.Padding[DIC_TIMESEC].VInteger=0) then // nothing in fTimeOut[]
exit;
now := GetTickCount64 shr 10;
if fSafe.Padding[DIC_TIMETIX].VInteger=integer(now) then
exit; // no need to search more often than every second
fSafe.Lock;
try
|
Changes to SynCrypto.pas.
1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 .... 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 .... 1265 1266 1267 1268 1269 1270 1271 1272 1273 1274 1275 1276 1277 1278 1279 .... 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 1319 .... 1344 1345 1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 .... 1852 1853 1854 1855 1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866 1867 1868 1869 1870 1871 1872 1873 .... 7012 7013 7014 7015 7016 7017 7018 7019 7020 7021 7022 7023 7024 7025 .... 7253 7254 7255 7256 7257 7258 7259 7260 7261 7262 7263 7264 7265 7266 .... 7355 7356 7357 7358 7359 7360 7361 7362 7363 7364 7365 7366 7367 7368 .... 8462 8463 8464 8465 8466 8467 8468 8469 8470 8471 8472 8473 8474 8475 .... 8558 8559 8560 8561 8562 8563 8564 8565 8566 8567 8568 8569 8570 8571 ..... 10227 10228 10229 10230 10231 10232 10233 10234 10235 10236 10237 10238 10239 10240 |
/// update the SHA-1 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-1 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-1 hash Digest of all data // affected to Update() method // - will also call Init to reset all internal temporary context, for safety procedure Final(out Digest: TSHA1Digest; NoInit: boolean=false); /// one method to rule them all // - call Init, then Update(), then Final() // - only Full() is Padlock-implemented - use this rather than Update() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA1Digest); end; PSHA256Digest = ^TSHA256Digest; ................................................................................ procedure Init; /// update the SHA-256 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-256 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-256 hash Digest of all data // affected to Update() method procedure Final(out Digest: TSHA256Digest; NoInit: boolean=false); /// one method to rule them all // - call Init, then Update(), then Final() // - only Full() is Padlock-implemented - use this rather than Update() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA256Digest); end; TSHA512Hash = record a, b, c, d, e, f, g, h: QWord; end; ................................................................................ /// update the SHA-384 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-384 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-384 hash Digest of all data // affected to Update() method // - will also call Init to reset all internal temporary context, for safety procedure Final(out Digest: TSHA384Digest; NoInit: boolean=false); /// one method to rule them all // - call Init, then Update(), then Final() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA384Digest); end; /// points to SHA-384 hashing instance PSHA384 = ^TSHA384; ................................................................................ /// update the SHA-512 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-512 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-512 hash Digest of all data // affected to Update() method // - will also call Init to reset all internal temporary context, for safety procedure Final(out Digest: TSHA512Digest; NoInit: boolean=false); /// one method to rule them all // - call Init, then Update(), then Final() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA512Digest); end; /// points to SHA-512 hashing instance PSHA512 = ^TSHA512; ................................................................................ procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-3 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-3 hash 256-bit Digest procedure Final(out Digest: THash256; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-3 hash 512-bit Digest procedure Final(out Digest: THash512; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-3 hash Digest // - Digest destination buffer must contain enough bytes // - default DigestBits=0 will write the default number of bits to Digest // output memory buffer, according to the current TSHA3Algo // - you can call this method several times, to use this SHA-3 hasher as // "Extendable-Output Function" (XOF), e.g. for stream encryption (ensure // NoInit is set to true, to enable recall) ................................................................................ /// direct SHA-3 hash calculation of some data (string-encoded) // - result is returned in hexadecimal format // - default DigestBits=0 will write the default number of bits to Digest // output memory buffer, according to the specified TSHA3Algo function SHA3(Algo: TSHA3Algo; const s: RawByteString; DigestBits: integer=0): RawUTF8; overload; /// direct SHA-3 hash calculation of some binary buffer // - result is returned in hexadecimal format // - default DigestBits=0 will write the default number of bits to Digest // output memory buffer, according to the specified TSHA3Algo function SHA3(Algo: TSHA3Algo; Buffer: pointer; Len: integer; DigestBits: integer=0): RawUTF8; overload; /// compute the HMAC message authentication code using crc256c as hash function // - HMAC over a non cryptographic hash function like crc256c is known to be // safe as MAC, if the supplied key comes e.g. from cryptographic HMAC_SHA256 // - performs two crc32c hashes, so SSE 4.2 gives more than 2.2 GB/s on a Core i7 procedure HMAC_CRC256C(key,msg: pointer; keylen,msglen: integer; out result: THash256); overload; ................................................................................ sha256Compress(Data.Hash,@Data.Buffer); // Hash -> Digest to little endian format bswap256(@Data.Hash,@Digest); // clear Data and internally stored Digest if not NoInit then Init; end; procedure TSHA256.Full(Buffer: pointer; Len: integer; out Digest: TSHA256Digest); begin {$ifdef USEPADLOCK} // Padlock need all data once -> Full() is OK, not successive Update() if padlock_available then begin Init; // for later Update use ................................................................................ sha512_sse4(@Data,@Hash,1) else {$endif} sha512_compresspas(Hash,@Data); bswap64array(@Hash,@Digest,6); if not NoInit then Init; end; procedure TSHA384.Full(Buffer: pointer; Len: integer; out Digest: TSHA384Digest); begin Init; Update(Buffer,Len); // final bytes Final(Digest); end; ................................................................................ sha512_sse4(@Data,@Hash,1) else {$endif} sha512_compresspas(Hash,@Data); bswap64array(@Hash,@Digest,8); if not NoInit then Init; end; procedure TSHA512.Full(Buffer: pointer; Len: integer; out Digest: TSHA512Digest); begin Init; Update(Buffer,Len); // final bytes Final(Digest); end; ................................................................................ if TSHA3Context(Context).Squeezing then // used as Extendable-Output Function PSHA3Context(@Context)^.Squeeze(Digest, DigestBits) else PSHA3Context(@Context)^.FinalBit_LSB(0, 0, Digest, DigestBits); if not NoInit then FillCharFast(Context, sizeof(Context), 0); end; procedure TSHA3.Full(Buffer: pointer; Len: integer; out Digest: THash256); begin Full(SHA3_256, Buffer, Len, @Digest, 256); end; procedure TSHA3.Full(Buffer: pointer; Len: integer; out Digest: THash512); ................................................................................ function SHA3(Algo: TSHA3Algo; Buffer: pointer; Len, DigestBits: integer): RawUTF8; var instance: TSHA3; begin result := instance.FullStr(algo, Buffer, Len, DigestBits); end; procedure AES(const Key; KeySize: cardinal; buffer: pointer; Len: Integer; Encrypt: boolean); begin AES(Key,KeySize,buffer,buffer,Len,Encrypt); end; ................................................................................ sha1Compress(Data.Hash,@Data.Buffer); // Hash -> Digest to little endian format bswap160(@Data.Hash,@Digest); // Clear Data if not NoInit then Init; end; procedure TSHA1.Full(Buffer: pointer; Len: integer; out Digest: TSHA1Digest); begin {$ifdef USEPADLOCK} // Padlock need all data once -> Full() is OK, not successive Update() if padlock_available then begin Init; // for later Update use |
| > > > > | > > > | > > > | > > > > > > > | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > |
1205 1206 1207 1208 1209 1210 1211 1212 1213 1214 1215 1216 1217 1218 1219 1220 1221 1222 1223 .... 1236 1237 1238 1239 1240 1241 1242 1243 1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 .... 1272 1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 .... 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 .... 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 .... 1869 1870 1871 1872 1873 1874 1875 1876 1877 1878 1879 1880 1881 1882 1883 1884 1885 1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 .... 7037 7038 7039 7040 7041 7042 7043 7044 7045 7046 7047 7048 7049 7050 7051 7052 7053 7054 7055 .... 7283 7284 7285 7286 7287 7288 7289 7290 7291 7292 7293 7294 7295 7296 7297 7298 7299 7300 7301 .... 7390 7391 7392 7393 7394 7395 7396 7397 7398 7399 7400 7401 7402 7403 7404 7405 7406 7407 7408 .... 8502 8503 8504 8505 8506 8507 8508 8509 8510 8511 8512 8513 8514 8515 8516 8517 8518 8519 8520 8521 8522 8523 8524 8525 .... 8608 8609 8610 8611 8612 8613 8614 8615 8616 8617 8618 8619 8620 8621 8622 8623 8624 8625 8626 8627 8628 8629 8630 8631 8632 8633 8634 8635 8636 8637 8638 8639 8640 8641 8642 8643 8644 8645 8646 8647 8648 8649 8650 8651 8652 8653 8654 8655 8656 8657 8658 8659 8660 8661 8662 8663 8664 8665 8666 8667 8668 8669 8670 8671 8672 8673 8674 8675 8676 8677 8678 8679 8680 8681 ..... 10337 10338 10339 10340 10341 10342 10343 10344 10345 10346 10347 10348 10349 10350 10351 10352 10353 10354 10355 |
/// update the SHA-1 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-1 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-1 hash Digest of all data // affected to Update() method // - will also call Init to reset all internal temporary context, for safety procedure Final(out Digest: TSHA1Digest; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-1 hash Digest of all data // affected to Update() method // - will also call Init to reset all internal temporary context, for safety function Final(NoInit: boolean=false): TSHA1Digest; overload; {$ifdef HASINLINE}inline;{$endif} /// one method to rule them all // - call Init, then Update(), then Final() // - only Full() is Padlock-implemented - use this rather than Update() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA1Digest); end; PSHA256Digest = ^TSHA256Digest; ................................................................................ procedure Init; /// update the SHA-256 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-256 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-256 hash Digest of all data // affected to Update() method procedure Final(out Digest: TSHA256Digest; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-256 hash Digest of all data // affected to Update() method function Final(NoInit: boolean=false): TSHA256Digest; overload; {$ifdef HASINLINE}inline;{$endif} /// one method to rule them all // - call Init, then Update(), then Final() // - only Full() is Padlock-implemented - use this rather than Update() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA256Digest); end; TSHA512Hash = record a, b, c, d, e, f, g, h: QWord; end; ................................................................................ /// update the SHA-384 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-384 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-384 hash Digest of all data // affected to Update() method // - will also call Init to reset all internal temporary context, for safety procedure Final(out Digest: TSHA384Digest; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-384 hash Digest of all data // affected to Update() method function Final(NoInit: boolean=false): TSHA384Digest; overload; {$ifdef HASINLINE}inline;{$endif} /// one method to rule them all // - call Init, then Update(), then Final() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA384Digest); end; /// points to SHA-384 hashing instance PSHA384 = ^TSHA384; ................................................................................ /// update the SHA-512 context with some data procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-512 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-512 hash Digest of all data // affected to Update() method // - will also call Init to reset all internal temporary context, for safety procedure Final(out Digest: TSHA512Digest; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-512 hash Digest of all data // affected to Update() method function Final(NoInit: boolean=false): TSHA512Digest; overload; {$ifdef HASINLINE}inline;{$endif} /// one method to rule them all // - call Init, then Update(), then Final() procedure Full(Buffer: pointer; Len: integer; out Digest: TSHA512Digest); end; /// points to SHA-512 hashing instance PSHA512 = ^TSHA512; ................................................................................ procedure Update(Buffer: pointer; Len: integer); overload; /// update the SHA-3 context with some data procedure Update(const Buffer: RawByteString); overload; /// finalize and compute the resulting SHA-3 hash 256-bit Digest procedure Final(out Digest: THash256; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-3 hash 512-bit Digest procedure Final(out Digest: THash512; NoInit: boolean=false); overload; /// finalize and compute the resulting SHA-3 hash 256-bit Digest function Final256(NoInit: boolean=false): THash256; /// finalize and compute the resulting SHA-3 hash 512-bit Digest function Final512(NoInit: boolean=false): THash512; /// finalize and compute the resulting SHA-3 hash Digest // - Digest destination buffer must contain enough bytes // - default DigestBits=0 will write the default number of bits to Digest // output memory buffer, according to the current TSHA3Algo // - you can call this method several times, to use this SHA-3 hasher as // "Extendable-Output Function" (XOF), e.g. for stream encryption (ensure // NoInit is set to true, to enable recall) ................................................................................ /// direct SHA-3 hash calculation of some data (string-encoded) // - result is returned in hexadecimal format // - default DigestBits=0 will write the default number of bits to Digest // output memory buffer, according to the specified TSHA3Algo function SHA3(Algo: TSHA3Algo; const s: RawByteString; DigestBits: integer=0): RawUTF8; overload; /// direct SHA-3 hash calculation of some binary buffer // - result is returned in hexadecimal format // - default DigestBits=0 will write the default number of bits to Digest // output memory buffer, according to the specified TSHA3Algo function SHA3(Algo: TSHA3Algo; Buffer: pointer; Len: integer; DigestBits: integer=0): RawUTF8; overload; type /// hash algorithms available for HashFile() function THashAlgo = (hfMD5, hfSHA1, hfSHA256, hfSHA384, hfSHA512, hfSHA3_256, hfSHA3_512); /// compute the hexadecimal hash of any (big) file // - using a temporary buffer of 1MB for the reading function HashFile(const aFileName: TFileName; aAlgo: THashAlgo): RawUTF8; /// compute the HMAC message authentication code using crc256c as hash function // - HMAC over a non cryptographic hash function like crc256c is known to be // safe as MAC, if the supplied key comes e.g. from cryptographic HMAC_SHA256 // - performs two crc32c hashes, so SSE 4.2 gives more than 2.2 GB/s on a Core i7 procedure HMAC_CRC256C(key,msg: pointer; keylen,msglen: integer; out result: THash256); overload; ................................................................................ sha256Compress(Data.Hash,@Data.Buffer); // Hash -> Digest to little endian format bswap256(@Data.Hash,@Digest); // clear Data and internally stored Digest if not NoInit then Init; end; function TSHA256.Final(NoInit: boolean): TSHA256Digest; begin Final(result,NoInit); end; procedure TSHA256.Full(Buffer: pointer; Len: integer; out Digest: TSHA256Digest); begin {$ifdef USEPADLOCK} // Padlock need all data once -> Full() is OK, not successive Update() if padlock_available then begin Init; // for later Update use ................................................................................ sha512_sse4(@Data,@Hash,1) else {$endif} sha512_compresspas(Hash,@Data); bswap64array(@Hash,@Digest,6); if not NoInit then Init; end; function TSHA384.Final(NoInit: boolean): TSHA384Digest; begin Final(result,NoInit); end; procedure TSHA384.Full(Buffer: pointer; Len: integer; out Digest: TSHA384Digest); begin Init; Update(Buffer,Len); // final bytes Final(Digest); end; ................................................................................ sha512_sse4(@Data,@Hash,1) else {$endif} sha512_compresspas(Hash,@Data); bswap64array(@Hash,@Digest,8); if not NoInit then Init; end; function TSHA512.Final(NoInit: boolean): TSHA512Digest; begin Final(result,NoInit); end; procedure TSHA512.Full(Buffer: pointer; Len: integer; out Digest: TSHA512Digest); begin Init; Update(Buffer,Len); // final bytes Final(Digest); end; ................................................................................ if TSHA3Context(Context).Squeezing then // used as Extendable-Output Function PSHA3Context(@Context)^.Squeeze(Digest, DigestBits) else PSHA3Context(@Context)^.FinalBit_LSB(0, 0, Digest, DigestBits); if not NoInit then FillCharFast(Context, sizeof(Context), 0); end; function TSHA3.Final256(NoInit: boolean): THash256; begin Final(result,NoInit); end; function TSHA3.Final512(NoInit: boolean): THash512; begin Final(result,NoInit); end; procedure TSHA3.Full(Buffer: pointer; Len: integer; out Digest: THash256); begin Full(SHA3_256, Buffer, Len, @Digest, 256); end; procedure TSHA3.Full(Buffer: pointer; Len: integer; out Digest: THash512); ................................................................................ function SHA3(Algo: TSHA3Algo; Buffer: pointer; Len, DigestBits: integer): RawUTF8; var instance: TSHA3; begin result := instance.FullStr(algo, Buffer, Len, DigestBits); end; function HashFile(const aFileName: TFileName; aAlgo: THashAlgo): RawUTF8; var temp: RawByteString; md5: TMD5; sha1: TSHA1; sha256: TSHA256; sha384: TSHA384; sha512: TSHA512; sha3: TSHA3; F: THandle; size: TQWordRec; read: cardinal; begin result := ''; if aFileName='' then exit; F := FileOpenSequentialRead(aFileName); if PtrInt(F)>=0 then try size.L := GetFileSize(F,@size.H); case aAlgo of hfMD5: md5.Init; hfSHA1: sha1.Init; hfSHA256: sha256.Init; hfSHA384: sha384.Init; hfSHA512: sha512.Init; hfSHA3_256: sha3.Init(SHA3_256); hfSHA3_512: sha3.Init(SHA3_512); else exit; end; SetLength(temp,1 shl 20); while size.V>0 do begin read := FileRead(F,pointer(temp)^,1 shl 20); if read<=0 then exit; case aAlgo of hfMD5: md5.Update(pointer(temp)^,read); hfSHA1: sha1.Update(pointer(temp),read); hfSHA256: sha256.Update(pointer(temp),read); hfSHA384: sha384.Update(pointer(temp),read); hfSHA512: sha512.Update(pointer(temp),read); hfSHA3_256: sha3.Update(pointer(temp),read); hfSHA3_512: sha3.Update(pointer(temp),read); end; dec(size.V,read); end; case aAlgo of hfMD5: result := MD5DigestToString(md5.Final); hfSHA1: result := SHA1DigestToString(sha1.Final); hfSHA256: result := SHA256DigestToString(sha256.Final); hfSHA384: result := SHA384DigestToString(sha384.Final); hfSHA512: result := SHA512DigestToString(sha512.Final); hfSHA3_256: result := SHA256DigestToString(sha3.Final256); hfSHA3_512: result := SHA512DigestToString(sha3.Final512); end; finally FileClose(F); end; end; procedure AES(const Key; KeySize: cardinal; buffer: pointer; Len: Integer; Encrypt: boolean); begin AES(Key,KeySize,buffer,buffer,Len,Encrypt); end; ................................................................................ sha1Compress(Data.Hash,@Data.Buffer); // Hash -> Digest to little endian format bswap160(@Data.Hash,@Digest); // Clear Data if not NoInit then Init; end; function TSHA1.Final(NoInit: boolean): TSHA1Digest; begin Final(result,NoInit); end; procedure TSHA1.Full(Buffer: pointer; Len: integer; out Digest: TSHA1Digest); begin {$ifdef USEPADLOCK} // Padlock need all data once -> Full() is OK, not successive Update() if padlock_available then begin Init; // for later Update use |
Changes to SynopseCommit.inc.
1 |
'1.18.4108'
|
| |
1 |
'1.18.4109'
|