You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.2 KiB
103 lines
2.2 KiB
3 months ago
|
Hashing routines
|
||
|
================
|
||
|
|
||
|
LibUCW contains implementations of several hash algorithms.
|
||
|
|
||
|
<<crypto,Cryptographic hashes>>:
|
||
|
|
||
|
- <<md5,MD5>> (RFC 1321)
|
||
|
- <<sha1,SHA1>> (RFC 3174)
|
||
|
- <<hash:sha1_hmac(),SHA1_HMAC message authentication>> (RFC 2104)
|
||
|
- <<usage,Common usage>>
|
||
|
|
||
|
<<checksum,Checksums>>:
|
||
|
|
||
|
- <<crypto:adler,Adler-32>>
|
||
|
- <<crc,CRC>>
|
||
|
|
||
|
<<nocrypto,Non-cryptographic hashes>>:
|
||
|
|
||
|
- <<strhash,String & block hashes>>
|
||
|
- <<inthash,Integer hashes>>
|
||
|
|
||
|
[[crypto]]
|
||
|
Cryptographic hashes
|
||
|
--------------------
|
||
|
|
||
|
[[md5]]
|
||
|
MD5
|
||
|
~~~
|
||
|
!!ucw/md5.h
|
||
|
|
||
|
[[sha1]]
|
||
|
SHA1
|
||
|
~~~~
|
||
|
!!ucw/sha1.h
|
||
|
|
||
|
[[usage]]
|
||
|
Common usage
|
||
|
~~~~~~~~~~~~
|
||
|
|
||
|
There are two ways you can use the hashing routines.
|
||
|
|
||
|
- Single-shot interface. If you have an in-memory buffer of the whole
|
||
|
message you want to hash, you can use this.
|
||
|
|
||
|
char *message = "Hello world";
|
||
|
byte output[MD5_SIZE];
|
||
|
md5_hash_buffer(output, message, strlen(message));
|
||
|
|
||
|
- Multi-shot interface. If you have the message scattered in many
|
||
|
buffers or you get it by parts, you do not need to concatenate the
|
||
|
parts together.
|
||
|
|
||
|
byte buffer[MAX_BUFFER];
|
||
|
uint buffer_len;
|
||
|
md5_context c;
|
||
|
md5_init(&c);
|
||
|
while(buffer_len = get_chunk(buffer, MAX_BUFFER)) {
|
||
|
md5_update(&c, buffer, buffer_len);
|
||
|
}
|
||
|
byte output[MD5_SIZE];
|
||
|
memcpy(output, md5_final(&c), MD5_SIZE);
|
||
|
|
||
|
SHA1 has the same interface, so the same two ways apply.
|
||
|
|
||
|
See also <<string:mem_to_hex()>>.
|
||
|
|
||
|
[[checksum]]
|
||
|
Checksums
|
||
|
---------
|
||
|
|
||
|
Their purpose is checking against random data changes, hardware
|
||
|
failures and alike. They are not to be used against aimed attacks.
|
||
|
|
||
|
Adler-32
|
||
|
~~~~~~~~
|
||
|
|
||
|
The <<compress:adler,Adler-32 checksum>> is documented in the
|
||
|
<<compress:,compression capter>>.
|
||
|
|
||
|
CRC-32
|
||
|
~~~~~~
|
||
|
|
||
|
32-bit Cyclic Redundancy Check with the polynomial suggested by
|
||
|
Castagnoli et al.: Optimization of Cyclic Redundancy-Check Codes
|
||
|
with 24 and 32 Parity Bits", IEEE Trans. on Communications, Vol. 41,
|
||
|
No. 6, 1993.
|
||
|
|
||
|
The interface is similar to the one we use for the cryptographic hashes.
|
||
|
|
||
|
!!ucw/crc.h
|
||
|
|
||
|
[[nocrypto]]
|
||
|
Non-cryptographic hashes
|
||
|
------------------------
|
||
|
|
||
|
They are usually used to identify values in hash tables.
|
||
|
|
||
|
All these functions expect to be moduled by the size of a hash table.
|
||
|
The size should be a prime number (it gives better distribution).
|
||
|
|
||
|
!!ucw/hashfunc.h
|