for (i = 0; i < 8; i++)
{
UNPACK32 (ctx->h[i], &digest[i << 2]);
}
}
#ifdef TEST_VECTORS
/* FIPS 180-2 Validation tests */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void test (const char *vector, unsigned char *digest, unsigned int digest_size)
{
char output[2 * SM3_DIGEST_SIZE + 1];
int i;
output[2 * digest_size] = '\0';
for (i = 0; i < (int) digest_size; i++)
{
sprintf (output + 2 * i, "%02x", digest[i]);
} printf ("\nH: %s\n", output);
if (strcmp (vector, output))
{
fprintf (stderr, "Test failed.\n"
exit (EXIT_FAILURE);
}
}
#ifdef __cplusplus
#include <cstdint>
#else
#include <stdint.h>
#endif
__inline__ uint64_t rdtsc(void) {
uint32_t lo, hi;
__asm__ __volatile__ (
" xorl %%eax,%%eax \n"
" cpuid" // serialize
::: "%rax", "%rbx", "%rcx", "%rdx"
/* We cannot use "=A", since this would use %rax on x86_64 and return only the lower 32bits of the TSC */
__asm__ __volatile__ ("rdtsc" : "=a" (lo), "=d" (hi));
return (uint64_t)hi << 32 | lo;
}