@ -622,20 +622,234 @@ 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 )
{
u32 w_utf16_buf[256] = { 0 } ;
if ( test_any_8th_bit ( w, len ) == 1 )
{
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 ;
truncate_block_16x4_le_S ( w_ptr + 0 , w_ptr + 4 , w_ptr + 8 , w_ptr + 12 , w_utf16_len & 63 ) ;
sha512_update ( ctx, w_utf16_buf, w_utf16_len ) ;
return ;
}
u32 w0[4] ;
u32 w1[4] ;
u32 w2[4] ;
u32 w3[4] ;
u32 w4[4] ;
u32 w5[4] ;
u32 w6[4] ;
u32 w7[4] ;
int pos1 ;
int pos4 ;
for ( pos1 = 0 , pos4 = 0 ; pos1 < len - 64; pos1 += 64, pos4 += 16)
{
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
const int w_utf16_len = utf8_to_utf16le ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
sha512_update ( ctx, w_utf16_buf, w_utf16_len ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2 ) ;
}
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, ( len - pos1 ) * 2 ) ;
}
DECLSPEC void sha512_update_utf16le_swap ( sha512_ctx_t *ctx, const u32 *w, const int len )
{
u32 w_utf16_buf[256] = { 0 } ;
if ( test_any_8th_bit ( w, len ) == 1 )
{
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 ;
const int w_utf16_len = utf8_to_utf16le ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
u32 *w_ptr = w_utf16_buf + blkoff ;
sha512_update_swap ( ctx, w_utf16_buf, w_utf16_len ) ;
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 ) ;
return ;
}
u32 w0[4] ;
u32 w1[4] ;
u32 w2[4] ;
u32 w3[4] ;
u32 w4[4] ;
u32 w5[4] ;
u32 w6[4] ;
u32 w7[4] ;
int pos1 ;
int pos4 ;
for ( pos1 = 0 , pos4 = 0 ; pos1 < len - 64; pos1 += 64, pos4 += 16)
{
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
w0[0] = hc_swap32_S ( w0[0] ) ;
w0[1] = hc_swap32_S ( w0[1] ) ;
w0[2] = hc_swap32_S ( w0[2] ) ;
w0[3] = hc_swap32_S ( w0[3] ) ;
w1[0] = hc_swap32_S ( w1[0] ) ;
w1[1] = hc_swap32_S ( w1[1] ) ;
w1[2] = hc_swap32_S ( w1[2] ) ;
w1[3] = hc_swap32_S ( w1[3] ) ;
w2[0] = hc_swap32_S ( w2[0] ) ;
w2[1] = hc_swap32_S ( w2[1] ) ;
w2[2] = hc_swap32_S ( w2[2] ) ;
w2[3] = hc_swap32_S ( w2[3] ) ;
w3[0] = hc_swap32_S ( w3[0] ) ;
w3[1] = hc_swap32_S ( w3[1] ) ;
w3[2] = hc_swap32_S ( w3[2] ) ;
w3[3] = hc_swap32_S ( w3[3] ) ;
w4[0] = hc_swap32_S ( w4[0] ) ;
w4[1] = hc_swap32_S ( w4[1] ) ;
w4[2] = hc_swap32_S ( w4[2] ) ;
w4[3] = hc_swap32_S ( w4[3] ) ;
w5[0] = hc_swap32_S ( w5[0] ) ;
w5[1] = hc_swap32_S ( w5[1] ) ;
w5[2] = hc_swap32_S ( w5[2] ) ;
w5[3] = hc_swap32_S ( w5[3] ) ;
w6[0] = hc_swap32_S ( w6[0] ) ;
w6[1] = hc_swap32_S ( w6[1] ) ;
w6[2] = hc_swap32_S ( w6[2] ) ;
w6[3] = hc_swap32_S ( w6[3] ) ;
w7[0] = hc_swap32_S ( w7[0] ) ;
w7[1] = hc_swap32_S ( w7[1] ) ;
w7[2] = hc_swap32_S ( w7[2] ) ;
w7[3] = hc_swap32_S ( w7[3] ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2 ) ;
}
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
w0[0] = hc_swap32_S ( w0[0] ) ;
w0[1] = hc_swap32_S ( w0[1] ) ;
w0[2] = hc_swap32_S ( w0[2] ) ;
w0[3] = hc_swap32_S ( w0[3] ) ;
w1[0] = hc_swap32_S ( w1[0] ) ;
w1[1] = hc_swap32_S ( w1[1] ) ;
w1[2] = hc_swap32_S ( w1[2] ) ;
w1[3] = hc_swap32_S ( w1[3] ) ;
w2[0] = hc_swap32_S ( w2[0] ) ;
w2[1] = hc_swap32_S ( w2[1] ) ;
w2[2] = hc_swap32_S ( w2[2] ) ;
w2[3] = hc_swap32_S ( w2[3] ) ;
w3[0] = hc_swap32_S ( w3[0] ) ;
w3[1] = hc_swap32_S ( w3[1] ) ;
w3[2] = hc_swap32_S ( w3[2] ) ;
w3[3] = hc_swap32_S ( w3[3] ) ;
w4[0] = hc_swap32_S ( w4[0] ) ;
w4[1] = hc_swap32_S ( w4[1] ) ;
w4[2] = hc_swap32_S ( w4[2] ) ;
w4[3] = hc_swap32_S ( w4[3] ) ;
w5[0] = hc_swap32_S ( w5[0] ) ;
w5[1] = hc_swap32_S ( w5[1] ) ;
w5[2] = hc_swap32_S ( w5[2] ) ;
w5[3] = hc_swap32_S ( w5[3] ) ;
w6[0] = hc_swap32_S ( w6[0] ) ;
w6[1] = hc_swap32_S ( w6[1] ) ;
w6[2] = hc_swap32_S ( w6[2] ) ;
w6[3] = hc_swap32_S ( w6[3] ) ;
w7[0] = hc_swap32_S ( w7[0] ) ;
w7[1] = hc_swap32_S ( w7[1] ) ;
w7[2] = hc_swap32_S ( w7[2] ) ;
w7[3] = hc_swap32_S ( w7[3] ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, ( len - pos1 ) * 2 ) ;
}
DECLSPEC void sha512_update_global ( sha512_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
@ -882,20 +1096,234 @@ 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 )
{
u32 w_utf16_buf[256] = { 0 } ;
if ( test_any_8th_bit ( w, len ) == 1 )
{
u32 w_utf16_buf[256] ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
const int blkoff = ( w_utf16_len / 64 ) * 16 ;
sha512_update ( ctx, w_utf16_buf, w_utf16_len ) ;
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 ( ctx, w_utf16_buf, w_utf16_len ) ;
return ;
}
u32 w0[4] ;
u32 w1[4] ;
u32 w2[4] ;
u32 w3[4] ;
u32 w4[4] ;
u32 w5[4] ;
u32 w6[4] ;
u32 w7[4] ;
int pos1 ;
int pos4 ;
for ( pos1 = 0 , pos4 = 0 ; pos1 < len - 64; pos1 += 64, pos4 += 16)
{
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2 ) ;
}
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, ( len - pos1 ) * 2 ) ;
}
DECLSPEC void sha512_update_global_utf16le_swap ( sha512_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
u32 w_utf16_buf[256] = { 0 } ;
if ( test_any_8th_bit ( w, len ) == 1 )
{
u32 w_utf16_buf[256] ;
const int w_utf16_len = utf8_to_utf16le_global ( 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 ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
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 ) ;
sha512_update_swap ( ctx, w_utf16_buf, w_utf16_len ) ;
return ;
}
u32 w0[4] ;
u32 w1[4] ;
u32 w2[4] ;
u32 w3[4] ;
u32 w4[4] ;
u32 w5[4] ;
u32 w6[4] ;
u32 w7[4] ;
int pos1 ;
int pos4 ;
for ( pos1 = 0 , pos4 = 0 ; pos1 < len - 64; pos1 += 64, pos4 += 16)
{
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
w0[0] = hc_swap32_S ( w0[0] ) ;
w0[1] = hc_swap32_S ( w0[1] ) ;
w0[2] = hc_swap32_S ( w0[2] ) ;
w0[3] = hc_swap32_S ( w0[3] ) ;
w1[0] = hc_swap32_S ( w1[0] ) ;
w1[1] = hc_swap32_S ( w1[1] ) ;
w1[2] = hc_swap32_S ( w1[2] ) ;
w1[3] = hc_swap32_S ( w1[3] ) ;
w2[0] = hc_swap32_S ( w2[0] ) ;
w2[1] = hc_swap32_S ( w2[1] ) ;
w2[2] = hc_swap32_S ( w2[2] ) ;
w2[3] = hc_swap32_S ( w2[3] ) ;
w3[0] = hc_swap32_S ( w3[0] ) ;
w3[1] = hc_swap32_S ( w3[1] ) ;
w3[2] = hc_swap32_S ( w3[2] ) ;
w3[3] = hc_swap32_S ( w3[3] ) ;
w4[0] = hc_swap32_S ( w4[0] ) ;
w4[1] = hc_swap32_S ( w4[1] ) ;
w4[2] = hc_swap32_S ( w4[2] ) ;
w4[3] = hc_swap32_S ( w4[3] ) ;
w5[0] = hc_swap32_S ( w5[0] ) ;
w5[1] = hc_swap32_S ( w5[1] ) ;
w5[2] = hc_swap32_S ( w5[2] ) ;
w5[3] = hc_swap32_S ( w5[3] ) ;
w6[0] = hc_swap32_S ( w6[0] ) ;
w6[1] = hc_swap32_S ( w6[1] ) ;
w6[2] = hc_swap32_S ( w6[2] ) ;
w6[3] = hc_swap32_S ( w6[3] ) ;
w7[0] = hc_swap32_S ( w7[0] ) ;
w7[1] = hc_swap32_S ( w7[1] ) ;
w7[2] = hc_swap32_S ( w7[2] ) ;
w7[3] = hc_swap32_S ( w7[3] ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, 64 * 2 ) ;
}
w0[0] = w[pos4 + 0] ;
w0[1] = w[pos4 + 1] ;
w0[2] = w[pos4 + 2] ;
w0[3] = w[pos4 + 3] ;
w1[0] = w[pos4 + 4] ;
w1[1] = w[pos4 + 5] ;
w1[2] = w[pos4 + 6] ;
w1[3] = w[pos4 + 7] ;
w2[0] = w[pos4 + 8] ;
w2[1] = w[pos4 + 9] ;
w2[2] = w[pos4 + 10] ;
w2[3] = w[pos4 + 11] ;
w3[0] = w[pos4 + 12] ;
w3[1] = w[pos4 + 13] ;
w3[2] = w[pos4 + 14] ;
w3[3] = w[pos4 + 15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
w0[0] = hc_swap32_S ( w0[0] ) ;
w0[1] = hc_swap32_S ( w0[1] ) ;
w0[2] = hc_swap32_S ( w0[2] ) ;
w0[3] = hc_swap32_S ( w0[3] ) ;
w1[0] = hc_swap32_S ( w1[0] ) ;
w1[1] = hc_swap32_S ( w1[1] ) ;
w1[2] = hc_swap32_S ( w1[2] ) ;
w1[3] = hc_swap32_S ( w1[3] ) ;
w2[0] = hc_swap32_S ( w2[0] ) ;
w2[1] = hc_swap32_S ( w2[1] ) ;
w2[2] = hc_swap32_S ( w2[2] ) ;
w2[3] = hc_swap32_S ( w2[3] ) ;
w3[0] = hc_swap32_S ( w3[0] ) ;
w3[1] = hc_swap32_S ( w3[1] ) ;
w3[2] = hc_swap32_S ( w3[2] ) ;
w3[3] = hc_swap32_S ( w3[3] ) ;
w4[0] = hc_swap32_S ( w4[0] ) ;
w4[1] = hc_swap32_S ( w4[1] ) ;
w4[2] = hc_swap32_S ( w4[2] ) ;
w4[3] = hc_swap32_S ( w4[3] ) ;
w5[0] = hc_swap32_S ( w5[0] ) ;
w5[1] = hc_swap32_S ( w5[1] ) ;
w5[2] = hc_swap32_S ( w5[2] ) ;
w5[3] = hc_swap32_S ( w5[3] ) ;
w6[0] = hc_swap32_S ( w6[0] ) ;
w6[1] = hc_swap32_S ( w6[1] ) ;
w6[2] = hc_swap32_S ( w6[2] ) ;
w6[3] = hc_swap32_S ( w6[3] ) ;
w7[0] = hc_swap32_S ( w7[0] ) ;
w7[1] = hc_swap32_S ( w7[1] ) ;
w7[2] = hc_swap32_S ( w7[2] ) ;
w7[3] = hc_swap32_S ( w7[3] ) ;
sha512_update_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7, ( len - pos1 ) * 2 ) ;
}
DECLSPEC void sha512_final ( sha512_ctx_t *ctx )
@ -1412,22 +1840,138 @@ DECLSPEC void sha512_hmac_init_global_swap (sha512_hmac_ctx_t *ctx, GLOBAL_AS co
sha512_hmac_init_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7 ) ;
}
DECLSPEC void sha512_hmac_init_global_ut 16le ( sha512_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
DECLSPEC void sha512_hmac_init_global_ut f 16le_swap ( sha512_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
u32 w_utf16_buf[256] = { 0 } ;
if ( test_any_8th_bit ( w, len ) == 1 )
{
u32 w_utf16_buf[256] ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
sha512_hmac_init ( ctx, w_utf16_buf, w_utf16_len ) ;
}
const int blkoff = ( w_utf16_len / 64 ) * 16 ;
DECLSPEC void sha512_hmac_init_global_utf16le_swap ( sha512_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
u32 w_utf16_buf[256] = { 0 } ;
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 ) ;
return ;
}
u32 w0[4] ;
u32 w1[4] ;
u32 w2[4] ;
u32 w3[4] ;
u32 w4[4] ;
u32 w5[4] ;
u32 w6[4] ;
u32 w7[4] ;
const int w_utf16_len = utf8_to_utf16le_global ( w, len, 256 , w_utf16_buf, sizeof ( w_utf16_buf ) ) ;
const int len_new = len * 2 ;
sha512_hmac_init_swap ( ctx, w_utf16_buf, w_utf16_len ) ;
if ( len_new > 128 )
{
sha512_ctx_t tmp ;
sha512_init ( &tmp ) ;
sha512_update_global_utf16le_swap ( &tmp, w, len ) ;
sha512_final ( &tmp ) ;
w0[0] = h32_from_64_S ( tmp.h[0] ) ;
w0[1] = l32_from_64_S ( tmp.h[0] ) ;
w0[2] = h32_from_64_S ( tmp.h[1] ) ;
w0[3] = l32_from_64_S ( tmp.h[1] ) ;
w1[0] = h32_from_64_S ( tmp.h[2] ) ;
w1[1] = l32_from_64_S ( tmp.h[2] ) ;
w1[2] = h32_from_64_S ( tmp.h[3] ) ;
w1[3] = l32_from_64_S ( tmp.h[3] ) ;
w2[0] = h32_from_64_S ( tmp.h[4] ) ;
w2[1] = l32_from_64_S ( tmp.h[4] ) ;
w2[2] = h32_from_64_S ( tmp.h[5] ) ;
w2[3] = l32_from_64_S ( tmp.h[5] ) ;
w3[0] = h32_from_64_S ( tmp.h[6] ) ;
w3[1] = l32_from_64_S ( tmp.h[6] ) ;
w3[2] = h32_from_64_S ( tmp.h[7] ) ;
w3[3] = l32_from_64_S ( tmp.h[7] ) ;
w4[0] = 0 ;
w4[1] = 0 ;
w4[2] = 0 ;
w4[3] = 0 ;
w5[0] = 0 ;
w5[1] = 0 ;
w5[2] = 0 ;
w5[3] = 0 ;
w6[0] = 0 ;
w6[1] = 0 ;
w6[2] = 0 ;
w6[3] = 0 ;
w7[0] = 0 ;
w7[1] = 0 ;
w7[2] = 0 ;
w7[3] = 0 ;
}
else
{
w0[0] = w[ 0] ;
w0[1] = w[ 1] ;
w0[2] = w[ 2] ;
w0[3] = w[ 3] ;
w1[0] = w[ 4] ;
w1[1] = w[ 5] ;
w1[2] = w[ 6] ;
w1[3] = w[ 7] ;
w2[0] = w[ 8] ;
w2[1] = w[ 9] ;
w2[2] = w[10] ;
w2[3] = w[11] ;
w3[0] = w[12] ;
w3[1] = w[13] ;
w3[2] = w[14] ;
w3[3] = w[15] ;
make_utf16le_S ( w3, w6, w7 ) ;
make_utf16le_S ( w2, w4, w5 ) ;
make_utf16le_S ( w1, w2, w3 ) ;
make_utf16le_S ( w0, w0, w1 ) ;
w0[0] = hc_swap32_S ( w0[0] ) ;
w0[1] = hc_swap32_S ( w0[1] ) ;
w0[2] = hc_swap32_S ( w0[2] ) ;
w0[3] = hc_swap32_S ( w0[3] ) ;
w1[0] = hc_swap32_S ( w1[0] ) ;
w1[1] = hc_swap32_S ( w1[1] ) ;
w1[2] = hc_swap32_S ( w1[2] ) ;
w1[3] = hc_swap32_S ( w1[3] ) ;
w2[0] = hc_swap32_S ( w2[0] ) ;
w2[1] = hc_swap32_S ( w2[1] ) ;
w2[2] = hc_swap32_S ( w2[2] ) ;
w2[3] = hc_swap32_S ( w2[3] ) ;
w3[0] = hc_swap32_S ( w3[0] ) ;
w3[1] = hc_swap32_S ( w3[1] ) ;
w3[2] = hc_swap32_S ( w3[2] ) ;
w3[3] = hc_swap32_S ( w3[3] ) ;
w4[0] = hc_swap32_S ( w4[0] ) ;
w4[1] = hc_swap32_S ( w4[1] ) ;
w4[2] = hc_swap32_S ( w4[2] ) ;
w4[3] = hc_swap32_S ( w4[3] ) ;
w5[0] = hc_swap32_S ( w5[0] ) ;
w5[1] = hc_swap32_S ( w5[1] ) ;
w5[2] = hc_swap32_S ( w5[2] ) ;
w5[3] = hc_swap32_S ( w5[3] ) ;
w6[0] = hc_swap32_S ( w6[0] ) ;
w6[1] = hc_swap32_S ( w6[1] ) ;
w6[2] = hc_swap32_S ( w6[2] ) ;
w6[3] = hc_swap32_S ( w6[3] ) ;
w7[0] = hc_swap32_S ( w7[0] ) ;
w7[1] = hc_swap32_S ( w7[1] ) ;
w7[2] = hc_swap32_S ( w7[2] ) ;
w7[3] = hc_swap32_S ( w7[3] ) ;
}
sha512_hmac_init_128 ( ctx, w0, w1, w2, w3, w4, w5, w6, w7 ) ;
}
DECLSPEC void sha512_hmac_update_128 ( sha512_hmac_ctx_t *ctx, u32 *w0, u32 *w1, u32 *w2, u32 *w3, u32 *w4, u32 *w5, u32 *w6, u32 *w7, const int len )
@ -1445,6 +1989,16 @@ DECLSPEC void sha512_hmac_update_swap (sha512_hmac_ctx_t *ctx, const u32 *w, con
sha512_update_swap ( &ctx->ipad, w, len ) ;
}
DECLSPEC void sha512_hmac_update_utf16le ( sha512_hmac_ctx_t *ctx, const u32 *w, const int len )
{
sha512_update_utf16le ( &ctx->ipad, w, len ) ;
}
DECLSPEC void sha512_hmac_update_utf16le_swap ( sha512_hmac_ctx_t *ctx, const u32 *w, const int len )
{
sha512_update_utf16le_swap ( &ctx->ipad, w, len ) ;
}
DECLSPEC void sha512_hmac_update_global ( sha512_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
sha512_update_global ( &ctx->ipad, w, len ) ;
@ -1455,6 +2009,16 @@ DECLSPEC void sha512_hmac_update_global_swap (sha512_hmac_ctx_t *ctx, GLOBAL_AS
sha512_update_global_swap ( &ctx->ipad, w, len ) ;
}
DECLSPEC void sha512_hmac_update_global_utf16le ( sha512_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
sha512_update_global_utf16le ( &ctx->ipad, w, len ) ;
}
DECLSPEC void sha512_hmac_update_global_utf16le_swap ( sha512_hmac_ctx_t *ctx, GLOBAL_AS const u32 *w, const int len )
{
sha512_update_global_utf16le_swap ( &ctx->ipad, w, len ) ;
}
DECLSPEC void sha512_hmac_final ( sha512_hmac_ctx_t *ctx )
{
sha512_final ( &ctx->ipad ) ;