Hashing functions
[Cryptographic functions]

Common cryptographic hash functions. More...

Data Structures

struct  BC_HASH
 Hash state descriptor object. More...
struct  BC_HMAC
 HMAC state descriptor object. More...

Functions

void BC_HashInit (BC_HASH *hash, const struct bc_hfun_s *func)
 Initialise hash calculations.
void BC_HashData (BC_HASH *hash, const void *data, unsigned dlen)
 Feeds data into a hash.
void BC_HashDone (const BC_HASH *hash, void *data)
 Calculate the hash value of the data fed to the hash function so far.
void BC_HmacInit (BC_HMAC *hmac, const struct bc_hfun_s *func, const void *kptr, unsigned int klen)
 Initialise a HMAC calculation.
void BC_HmacData (BC_HMAC *hmac, const void *data, unsigned dlen)
 Process the next data block in a HMAC calculations.
void BC_HmacDone (const BC_HMAC *hmac, void *data)
 Finalises a HMAC calculation.

Detailed Description

Common cryptographic hash functions.

A hash function is a function that receives some input of arbitrary length and generates a fixed length output. Since the input is usually much longer than the output, you can not recover the input from the output. Furthermore, even a single bit change in the input will cause many bits of the output to change. Since the output is of a fixed length capable of representing only a finite number of possible values but there are infinitely many possible inputs, there will be clashes, when two different inputs generate the same output. However, cryptographic hash functions are designed to make such clashes extremely improbable on similar inputs. Therefore, hash functions can be used to verify that a message is not altered.

The most commonly used two cryptographic hash functions, MD5 and SHA-1 are implemented in this sub-module. In addition, HMAC, the keyed hash message authentication code (using MD5 or SHA-1) is also provided.

Although MD5 has been broken (meaning that there exist programs that can generate input that will hash to a given output value), it is probably the most frequently used cryptographic hash function. SHA-1 is more resistent; even though vulnerabilities of the algorithm were identified, as of 2009 it has not been broken yet.

To use the these functions, you need to include crypto/hash.h.

The following table gives you a rough idea about the performance of the various hash functions. The values represent the time (in milliseconds) required to calculate the hash of 1KB of data using various functions. The final calculation of the hash is included in the time. The performance of these functions is significantly different depending on whether you use the ARM or the THUMB versions. If you can afford the FLASH, you should consider enabling interworking and use the ARM version of the crypto library even if you use THUMB mode otherwise. The times were measured on an LPC23xx running at 60MHz.

Time needed to hash 1KB of data [ms]

Hash function     ARM      THUMB

MD5               1.38     2.30
MD5 fast          0.77     1.25
SHA1              1.48     2.92
SHA1 fast         1.13     1.81

Function Documentation

void BC_HashData ( BC_HASH hash,
const void *  data,
unsigned  dlen 
)

Feeds data into a hash.

The function takes an already initialised hash state descriptor, a pointer to some data and the length of the data and upgrades the hash state with the data. The data is not changed. Subsequent calls to this function are equivalent to a single call with the data for the separate calls concatenated, that is,

    BC_HashData( &myhash, "abc", 3 );
    BC_HashData( &myhash, "def", 3 );

is equivalent to

    BC_HashData( &myhash, "abcdef", 6 );
Parameters:
hash Pointer to a BC_HASH structure, the hash state.
data Pointer to the data to feed to the hash.
dlen The length of the data.
void BC_HashDone ( const BC_HASH hash,
void *  data 
)

Calculate the hash value of the data fed to the hash function so far.

The function calculates the actual value of an MD5 or SHA1 hash, on the data that has been fed into the hash state so far. The final hash value is stored in the result buffer. For MD5 the buffer must be at least 16 bytes long, for SHA1 it must be at least 20 bytes long. The hash state is not changed, therefore further data can be fed to the hash. This allows the calculation of hash values on portions of the data.

Parameters:
hash The hash state, which is not modified.
data Pointer to the result buffer. For MD5 it must be 16, for SHA1 20 bytes long.
void BC_HashInit ( BC_HASH hash,
const struct bc_hfun_s *  func 
)

Initialise hash calculations.

The function prepares for a hash calculation. The hash state, passed as a pointer to a BC_HASH structure is prepared to be ready to receive data of which the hash should be calculated. The second argument is a pointer to an opaque structure. That structure defines the hash function to be used. Four such structures are defined by the library and they are #define-d:

  • BC_HASH_MD5
    The hash will use the MD5 algorithm, resulting in a 16-byte hash value.
  • BC_HASH_MD5_FAST
    The has will use the MD5 algorithm, but the hash calculating core is faster (and larger). Apart from the code size and the speed there's no difference between BC_HASH_MD5 and BC_HASH_MD5_FAST.
  • BC_HASH_SHA1
    The hash will use the SHA-1 algorithm, resulting in a 20-byte hash value.
  • BC_HASH_MD5_FAST
    The has will use the SHA-1 algorithm, but the hash calculating core is somewhat faster (and much larger). Apart from the code size and the speed there's no difference between BC_HASH_SHA1 and BC_HASH_SHA1_FAST.
Parameters:
hash Pointer to a BC_HASH structure, the hash state.
func Pointer to an opaque structure that selects the hash function. Use the predefined values described above.
void BC_HmacData ( BC_HMAC hmac,
const void *  data,
unsigned  dlen 
)

Process the next data block in a HMAC calculations.

Parameters:
hmac Pointer to the HMAC state
data Pointer to data
dlen The length of the data, in bytes.
void BC_HmacDone ( const BC_HMAC hmac,
void *  data 
)

Finalises a HMAC calculation.

The function modifies neither the HMAC state nor the data, therefore it can be used to calculate the partial HMAC value at any given point of a bytestream.

Parameters:
hmac Pointer to the HMAC state
data Pointer to the result buffer (16 or 20 bytes, for MD5 and SHA1 respectively).
void BC_HmacInit ( BC_HMAC hmac,
const struct bc_hfun_s *  func,
const void *  kptr,
unsigned int  klen 
)

Initialise a HMAC calculation.

This function prepares for a HMAC operation. It can use MD5 or SHA-1 as its hash function. This call prepares the BC_HMAC structure passed as the first argumanet. The hash funtion that will be used is determined by the second argument, which should be one of BC_HASH_MD5, BC_HASH_SHA1, BC_HASH_MD5_FAST or BC_HASH_SHA1_FAST. The third argument is apointer to the key and the fourth is the length of the key, in bytes.

Parameters:
hmac Pointer to the HMAC state structure
func The hash function to use, the same as the parameter for the BC_HashInit() function.
kptr Pointer to the HMAC key
klen The length of the key (in bytes).
Generated on Mon Aug 16 09:50:08 2010 by  doxygen 1.6.3