1
1
mirror of https://github.com/henrydcase/pqc.git synced 2024-11-23 16:08:59 +00:00
pqcrypto/crypto_sign/rainbowIa-classic/clean/utils_hash.c
2019-07-16 15:56:01 -04:00

63 lines
1.5 KiB
C

/// @file utils_hash.c
/// @brief the adapter for SHA2 families.
///
///
#include "hash_len_config.h"
#include "rainbow_config.h"
#include "sha2.h"
#include "utils_hash.h"
static inline
int _hash( unsigned char *digest, const unsigned char *m, unsigned long long mlen ) {
// #if 32 == _HASH_LEN
sha256(digest, m, mlen);
// #elif 48 == _HASH_LEN
// sha384(digest, m, mlen);
// #elif 64 == _HASH_LEN
// sha512(digest, m, mlen);
// #else
//#error "unsupported _HASH_LEN"
// #endif
return 0;
}
static inline
int expand_hash( unsigned char *digest, unsigned n_digest, const unsigned char *hash ) {
if ( _HASH_LEN >= n_digest ) {
for (unsigned i = 0; i < n_digest; i++) {
digest[i] = hash[i];
}
return 0;
}
for (unsigned i = 0; i < _HASH_LEN; i++) {
digest[i] = hash[i];
}
n_digest -= _HASH_LEN;
while ( _HASH_LEN <= n_digest ) {
_hash( digest + _HASH_LEN, digest, _HASH_LEN );
n_digest -= _HASH_LEN;
digest += _HASH_LEN;
}
unsigned char temp[_HASH_LEN];
if ( n_digest ) {
_hash( temp, digest, _HASH_LEN );
for (unsigned i = 0; i < n_digest; i++) {
digest[_HASH_LEN + i] = temp[i];
}
}
return 0;
}
int PQCLEAN_RAINBOWIACLASSIC_CLEAN_hash_msg( unsigned char *digest, unsigned len_digest, const unsigned char *m, unsigned long long mlen ) {
unsigned char buf[_HASH_LEN];
_hash( buf, m, mlen );
return expand_hash( digest, len_digest, buf );
}