@ -622,19 +622,20 @@ DECLSPEC void sha512_update_swap (sha512_ctx_t *ctx, const u32 *w, const int len
DECLSPEC void sha512_update_utf16le ( sha512_ctx_t *ctx, const u32 *w, const int len )
{
if ( test_any_8th_bit ( w, len ) == 1 )
if ( hc_enc_scan ( w, len ) )
{
u32 w_utf16_buf[256] ;
hc_enc_t hc_enc ;
const int w_utf16_len = utf8_to_utf16le ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
hc_enc_init ( &hc_enc ) ;
const int blkoff = ( w_utf16_len / 64 ) * 16 ;
u32 *w_ptr = w_utf16_buf + blkoff ;
while ( hc_enc_has_next ( &hc_enc, len ) )
{
u32 enc_buf[32] ;
truncate_block_16x4_le_S ( w_ptr + 0 , w_ptr + 4 , w_ptr + 8 , w_ptr + 12 , w_utf16_len & 63 ) ;
const int enc_len = hc_enc_next ( &hc_enc, w, len, 256 , enc_buf, sizeof ( enc_buf ) ) ;
sha512_update ( ctx, w_utf16_buf, w_utf16_len ) ;
sha512_update_128 ( ctx, enc_buf + 0 , enc_buf + 4 , enc_buf + 8 , enc_buf + 12 , enc_buf + 16 , enc_buf + 20 , enc_buf + 24 , enc_buf + 28 , enc_len ) ;
}
return ;
}
@ -705,19 +706,53 @@ DECLSPEC void sha512_update_utf16le (sha512_ctx_t *ctx, const u32 *w, const int
DECLSPEC void sha512_update_utf16le_swap ( sha512_ctx_t *ctx, const u32 *w, const int len )
{
if ( test_any_8th_bit ( w, len ) == 1 )
if ( hc_enc_scan ( w, len ) )
{
u32 w_utf16_buf[256] ;
const int w_utf16_len = utf8_to_utf16le ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
const int blkoff = ( w_utf16_len / 64 ) * 16 ;
u32 *w_ptr = w_utf16_buf + blkoff ;
hc_enc_t hc_enc ;
truncate_block_16x4_le_S ( w_ptr + 0 , w_ptr + 4 , w_ptr + 8 , w_ptr + 12 , w_utf16_len & 63 ) ;
hc_enc_init ( &hc_enc ) ;
sha512_update_swap ( ctx, w_utf16_buf, w_utf16_len ) ;
while ( hc_enc_has_next ( &hc_enc, len ) )
{
u32 enc_buf[32] ;
const int enc_len = hc_enc_next ( &hc_enc, w, len, 256 , enc_buf, sizeof ( enc_buf ) ) ;
enc_buf[ 0] = hc_swap32_S ( enc_buf[ 0] ) ;
enc_buf[ 1] = hc_swap32_S ( enc_buf[ 1] ) ;
enc_buf[ 2] = hc_swap32_S ( enc_buf[ 2] ) ;
enc_buf[ 3] = hc_swap32_S ( enc_buf[ 3] ) ;
enc_buf[ 4] = hc_swap32_S ( enc_buf[ 4] ) ;
enc_buf[ 5] = hc_swap32_S ( enc_buf[ 5] ) ;
enc_buf[ 6] = hc_swap32_S ( enc_buf[ 6] ) ;
enc_buf[ 7] = hc_swap32_S ( enc_buf[ 7] ) ;
enc_buf[ 8] = hc_swap32_S ( enc_buf[ 8] ) ;
enc_buf[ 9] = hc_swap32_S ( enc_buf[ 9] ) ;
enc_buf[10] = hc_swap32_S ( enc_buf[10] ) ;
enc_buf[11] = hc_swap32_S ( enc_buf[11] ) ;
enc_buf[12] = hc_swap32_S ( enc_buf[12] ) ;
enc_buf[13] = hc_swap32_S ( enc_buf[13] ) ;
enc_buf[14] = hc_swap32_S ( enc_buf[14] ) ;
enc_buf[15] = hc_swap32_S ( enc_buf[15] ) ;
enc_buf[16] = hc_swap32_S ( enc_buf[16] ) ;
enc_buf[17] = hc_swap32_S ( enc_buf[17] ) ;
enc_buf[18] = hc_swap32_S ( enc_buf[18] ) ;
enc_buf[19] = hc_swap32_S ( enc_buf[19] ) ;
enc_buf[20] = hc_swap32_S ( enc_buf[20] ) ;
enc_buf[21] = hc_swap32_S ( enc_buf[21] ) ;
enc_buf[22] = hc_swap32_S ( enc_buf[22] ) ;
enc_buf[23] = hc_swap32_S ( enc_buf[23] ) ;
enc_buf[24] = hc_swap32_S ( enc_buf[24] ) ;
enc_buf[25] = hc_swap32_S ( enc_buf[25] ) ;
enc_buf[26] = hc_swap32_S ( enc_buf[26] ) ;
enc_buf[27] = hc_swap32_S ( enc_buf[27] ) ;
enc_buf[28] = hc_swap32_S ( enc_buf[28] ) ;
enc_buf[29] = hc_swap32_S ( enc_buf[29] ) ;
enc_buf[30] = hc_swap32_S ( enc_buf[30] ) ;
enc_buf[31] = hc_swap32_S ( enc_buf[31] ) ;
sha512_update_128 ( ctx, enc_buf + 0 , enc_buf + 4 , enc_buf + 8 , enc_buf + 12 , enc_buf + 16 , enc_buf + 20 , enc_buf + 24 , enc_buf + 28 , enc_len ) ;
}
return ;
}
@ -1096,19 +1131,20 @@ DECLSPEC void sha512_update_global_swap (sha512_ctx_t *ctx, GLOBAL_AS const u32
DECLSPEC void sha512_update_global_utf16le ( sha512_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
if ( test_any_8th_bit ( w, len ) == 1 )
if ( hc_enc_scan_global ( w, len ) )
{
u32 w_utf16_buf[256] ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
hc_enc_t hc_enc ;
const int blkoff = ( w_utf16_len / 64 ) * 16 ;
hc_enc_init ( &hc_enc ) ;
u32 *w_ptr = w_utf16_buf + blkoff ;
while ( hc_enc_has_next ( &hc_enc, len ) )
{
u32 enc_buf[32] ;
truncate_block_16x4_le_S ( w_ptr + 0 , w_ptr + 4 , w_ptr + 8 , w_ptr + 12 , w_utf16_len & 63 ) ;
const int enc_len = hc_enc_next_global ( &hc_enc, w, len, 256 , enc_buf, sizeof ( enc_buf ) ) ;
sha512_update ( ctx, w_utf16_buf, w_utf16_len ) ;
sha512_update_128 ( ctx, enc_buf + 0 , enc_buf + 4 , enc_buf + 8 , enc_buf + 12 , enc_buf + 16 , enc_buf + 20 , enc_buf + 24 , enc_buf + 28 , enc_len ) ;
}
return ;
}
@ -1179,19 +1215,53 @@ DECLSPEC void sha512_update_global_utf16le (sha512_ctx_t *ctx, GLOBAL_AS const u
DECLSPEC void sha512_update_global_utf16le_swap ( sha512_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
if ( test_any_8th_bit ( w, len ) == 1 )
if ( hc_enc_scan_global ( w, len ) )
{
u32 w_utf16_buf[256] ;
hc_enc_t hc_enc ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
hc_enc_init ( &hc_enc ) ;
const int blkoff = ( w_utf16_len / 64 ) * 16 ;
u32 *w_ptr = w_utf16_buf + blkoff ;
truncate_block_16x4_le_S ( w_ptr + 0 , w_ptr + 4 , w_ptr + 8 , w_ptr + 12 , w_utf16_len & 63 ) ;
sha512_update_swap ( ctx, w_utf16_buf, w_utf16_len ) ;
while ( hc_enc_has_next ( &hc_enc, len ) )
{
u32 enc_buf[32] ;
const int enc_len = hc_enc_next_global ( &hc_enc, w, len, 256 , enc_buf, sizeof ( enc_buf ) ) ;
enc_buf[ 0] = hc_swap32_S ( enc_buf[ 0] ) ;
enc_buf[ 1] = hc_swap32_S ( enc_buf[ 1] ) ;
enc_buf[ 2] = hc_swap32_S ( enc_buf[ 2] ) ;
enc_buf[ 3] = hc_swap32_S ( enc_buf[ 3] ) ;
enc_buf[ 4] = hc_swap32_S ( enc_buf[ 4] ) ;
enc_buf[ 5] = hc_swap32_S ( enc_buf[ 5] ) ;
enc_buf[ 6] = hc_swap32_S ( enc_buf[ 6] ) ;
enc_buf[ 7] = hc_swap32_S ( enc_buf[ 7] ) ;
enc_buf[ 8] = hc_swap32_S ( enc_buf[ 8] ) ;
enc_buf[ 9] = hc_swap32_S ( enc_buf[ 9] ) ;
enc_buf[10] = hc_swap32_S ( enc_buf[10] ) ;
enc_buf[11] = hc_swap32_S ( enc_buf[11] ) ;
enc_buf[12] = hc_swap32_S ( enc_buf[12] ) ;
enc_buf[13] = hc_swap32_S ( enc_buf[13] ) ;
enc_buf[14] = hc_swap32_S ( enc_buf[14] ) ;
enc_buf[15] = hc_swap32_S ( enc_buf[15] ) ;
enc_buf[16] = hc_swap32_S ( enc_buf[16] ) ;
enc_buf[17] = hc_swap32_S ( enc_buf[17] ) ;
enc_buf[18] = hc_swap32_S ( enc_buf[18] ) ;
enc_buf[19] = hc_swap32_S ( enc_buf[19] ) ;
enc_buf[20] = hc_swap32_S ( enc_buf[20] ) ;
enc_buf[21] = hc_swap32_S ( enc_buf[21] ) ;
enc_buf[22] = hc_swap32_S ( enc_buf[22] ) ;
enc_buf[23] = hc_swap32_S ( enc_buf[23] ) ;
enc_buf[24] = hc_swap32_S ( enc_buf[24] ) ;
enc_buf[25] = hc_swap32_S ( enc_buf[25] ) ;
enc_buf[26] = hc_swap32_S ( enc_buf[26] ) ;
enc_buf[27] = hc_swap32_S ( enc_buf[27] ) ;
enc_buf[28] = hc_swap32_S ( enc_buf[28] ) ;
enc_buf[29] = hc_swap32_S ( enc_buf[29] ) ;
enc_buf[30] = hc_swap32_S ( enc_buf[30] ) ;
enc_buf[31] = hc_swap32_S ( enc_buf[31] ) ;
sha512_update_128 ( ctx, enc_buf + 0 , enc_buf + 4 , enc_buf + 8 , enc_buf + 12 , enc_buf + 16 , enc_buf + 20 , enc_buf + 24 , enc_buf + 28 , enc_len ) ;
}
return ;
}
@ -1842,19 +1912,101 @@ DECLSPEC void sha512_hmac_init_global_swap (sha512_hmac_ctx_t *ctx, GLOBAL_AS co
DECLSPEC void sha512_hmac_init_global_utf16le_swap ( sha512_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
if ( test_any_8th_bit ( w, len ) == 1 )
if ( hc_enc_scan_global ( w, len ) )
{
u32 w_utf16_buf[256] ;
hc_enc_t hc_enc ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
hc_enc_init ( &hc_enc ) ;
const int blkoff = ( w_utf16_len / 64 ) * 16 ;
u32 *w_ptr = w_utf16_buf + blkoff ;
truncate_block_16x4_le_S ( w_ptr + 0 , w_ptr + 4 , w_ptr + 8 , w_ptr + 12 , w_utf16_len & 63 ) ;
sha512_hmac_init_swap ( ctx, w_utf16_buf, w_utf16_len ) ;
while ( hc_enc_has_next ( &hc_enc, len ) )
{
// forced full decode in one round
u32 enc_buf[256] ;
const int enc_len = hc_enc_next_global ( &hc_enc, w, len, 256 , enc_buf, sizeof ( enc_buf ) ) ;
if ( enc_len > 128 )
{
sha512_ctx_t tmp ;
sha512_init ( &tmp ) ;
sha512_update_global_utf16le_swap ( &tmp, enc_buf, enc_len ) ;
sha512_final ( &tmp ) ;
enc_buf[ 0] = h32_from_64_S ( tmp.h[0] ) ;
enc_buf[ 1] = l32_from_64_S ( tmp.h[0] ) ;
enc_buf[ 2] = h32_from_64_S ( tmp.h[1] ) ;
enc_buf[ 3] = l32_from_64_S ( tmp.h[1] ) ;
enc_buf[ 4] = h32_from_64_S ( tmp.h[2] ) ;
enc_buf[ 5] = l32_from_64_S ( tmp.h[2] ) ;
enc_buf[ 6] = h32_from_64_S ( tmp.h[3] ) ;
enc_buf[ 7] = l32_from_64_S ( tmp.h[3] ) ;
enc_buf[ 8] = h32_from_64_S ( tmp.h[4] ) ;
enc_buf[ 9] = l32_from_64_S ( tmp.h[4] ) ;
enc_buf[10] = h32_from_64_S ( tmp.h[5] ) ;
enc_buf[11] = l32_from_64_S ( tmp.h[5] ) ;
enc_buf[12] = h32_from_64_S ( tmp.h[6] ) ;
enc_buf[13] = l32_from_64_S ( tmp.h[6] ) ;
enc_buf[14] = h32_from_64_S ( tmp.h[7] ) ;
enc_buf[15] = l32_from_64_S ( tmp.h[7] ) ;
enc_buf[16] = 0 ;
enc_buf[17] = 0 ;
enc_buf[18] = 0 ;
enc_buf[19] = 0 ;
enc_buf[20] = 0 ;
enc_buf[21] = 0 ;
enc_buf[22] = 0 ;
enc_buf[23] = 0 ;
enc_buf[24] = 0 ;
enc_buf[25] = 0 ;
enc_buf[26] = 0 ;
enc_buf[27] = 0 ;
enc_buf[28] = 0 ;
enc_buf[29] = 0 ;
enc_buf[30] = 0 ;
enc_buf[31] = 0 ;
}
else
{
enc_buf[ 0] = hc_swap32_S ( enc_buf[ 0] ) ;
enc_buf[ 1] = hc_swap32_S ( enc_buf[ 1] ) ;
enc_buf[ 2] = hc_swap32_S ( enc_buf[ 2] ) ;
enc_buf[ 3] = hc_swap32_S ( enc_buf[ 3] ) ;
enc_buf[ 4] = hc_swap32_S ( enc_buf[ 4] ) ;
enc_buf[ 5] = hc_swap32_S ( enc_buf[ 5] ) ;
enc_buf[ 6] = hc_swap32_S ( enc_buf[ 6] ) ;
enc_buf[ 7] = hc_swap32_S ( enc_buf[ 7] ) ;
enc_buf[ 8] = hc_swap32_S ( enc_buf[ 8] ) ;
enc_buf[ 9] = hc_swap32_S ( enc_buf[ 9] ) ;
enc_buf[10] = hc_swap32_S ( enc_buf[10] ) ;
enc_buf[11] = hc_swap32_S ( enc_buf[11] ) ;
enc_buf[12] = hc_swap32_S ( enc_buf[12] ) ;
enc_buf[13] = hc_swap32_S ( enc_buf[13] ) ;
enc_buf[14] = hc_swap32_S ( enc_buf[14] ) ;
enc_buf[15] = hc_swap32_S ( enc_buf[15] ) ;
enc_buf[16] = hc_swap32_S ( enc_buf[16] ) ;
enc_buf[17] = hc_swap32_S ( enc_buf[17] ) ;
enc_buf[18] = hc_swap32_S ( enc_buf[18] ) ;
enc_buf[19] = hc_swap32_S ( enc_buf[19] ) ;
enc_buf[20] = hc_swap32_S ( enc_buf[20] ) ;
enc_buf[21] = hc_swap32_S ( enc_buf[21] ) ;
enc_buf[22] = hc_swap32_S ( enc_buf[22] ) ;
enc_buf[23] = hc_swap32_S ( enc_buf[23] ) ;
enc_buf[24] = hc_swap32_S ( enc_buf[24] ) ;
enc_buf[25] = hc_swap32_S ( enc_buf[25] ) ;
enc_buf[26] = hc_swap32_S ( enc_buf[26] ) ;
enc_buf[27] = hc_swap32_S ( enc_buf[27] ) ;
enc_buf[28] = hc_swap32_S ( enc_buf[28] ) ;
enc_buf[29] = hc_swap32_S ( enc_buf[29] ) ;
enc_buf[30] = hc_swap32_S ( enc_buf[30] ) ;
enc_buf[31] = hc_swap32_S ( enc_buf[31] ) ;
}
sha512_hmac_init_128 ( ctx, enc_buf + 0 , enc_buf + 4 , enc_buf + 8 , enc_buf + 12 , enc_buf + 16 , enc_buf + 20 , enc_buf + 24 , enc_buf + 28 ) ;
}
return ;
}