summaryrefslogtreecommitdiffstats
path: root/src/tests
diff options
context:
space:
mode:
authorMichael Brown2012-09-26 15:54:02 +0200
committerMichael Brown2012-09-26 15:54:02 +0200
commit681a219caaa5f9379641232157cc0b38e64a839d (patch)
tree3fa186320f8f1a6bdee04edfb2fd42a09666c515 /src/tests
parent[efi] Provide guaranteed space in transmitted packets (diff)
downloadipxe-681a219caaa5f9379641232157cc0b38e64a839d.tar.gz
ipxe-681a219caaa5f9379641232157cc0b38e64a839d.tar.xz
ipxe-681a219caaa5f9379641232157cc0b38e64a839d.zip
[test] Add speed tests for digest algorithms
Signed-off-by: Michael Brown <mcb30@ipxe.org>
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/digest_test.c35
-rw-r--r--src/tests/digest_test.h1
-rw-r--r--src/tests/md5_test.c6
-rw-r--r--src/tests/sha1_test.c6
-rw-r--r--src/tests/sha256_test.c6
5 files changed, 54 insertions, 0 deletions
diff --git a/src/tests/digest_test.c b/src/tests/digest_test.c
index ccec0e9a..6428cc72 100644
--- a/src/tests/digest_test.c
+++ b/src/tests/digest_test.c
@@ -25,8 +25,10 @@ FILE_LICENCE ( GPL2_OR_LATER );
*
*/
+#include <stdlib.h>
#include <string.h>
#include <ipxe/crypto.h>
+#include <ipxe/profile.h>
#include "digest_test.h"
/**
@@ -68,3 +70,36 @@ int digest_test ( struct digest_algorithm *digest,
/* Compare against expected output */
return ( memcmp ( expected, out, sizeof ( out ) ) == 0 );
}
+
+/**
+ * Calculate digest algorithm cost
+ *
+ * @v digest Digest algorithm
+ * @ret cost Cost (in cycles per byte)
+ */
+unsigned long digest_cost ( struct digest_algorithm *digest ) {
+ static uint8_t random[8192]; /* Too large for stack */
+ uint8_t ctx[digest->ctxsize];
+ uint8_t out[digest->digestsize];
+ union profiler profiler;
+ unsigned long long elapsed;
+ unsigned long cost;
+ unsigned int i;
+
+ /* Fill buffer with pseudo-random data */
+ srand ( 0x1234568 );
+ for ( i = 0 ; i < sizeof ( random ) ; i++ )
+ random[i] = rand();
+
+ /* Time digest calculation */
+ profile ( &profiler );
+ digest_init ( digest, ctx );
+ digest_update ( digest, ctx, random, sizeof ( random ) );
+ digest_final ( digest, ctx, out );
+ elapsed = profile ( &profiler );
+
+ /* Round to nearest whole number of cycles per byte */
+ cost = ( ( elapsed + ( sizeof ( random ) / 2 ) ) / sizeof ( random ) );
+
+ return cost;
+}
diff --git a/src/tests/digest_test.h b/src/tests/digest_test.h
index c2558780..49e06d1c 100644
--- a/src/tests/digest_test.h
+++ b/src/tests/digest_test.h
@@ -19,6 +19,7 @@ struct digest_test_fragments {
extern int digest_test ( struct digest_algorithm *digest,
struct digest_test_fragments *fragments,
void *data, size_t len, void *expected );
+extern unsigned long digest_cost ( struct digest_algorithm *digest );
/**
* Report digest test result
diff --git a/src/tests/md5_test.c b/src/tests/md5_test.c
index e54296ac..ba5f24c3 100644
--- a/src/tests/md5_test.c
+++ b/src/tests/md5_test.c
@@ -70,9 +70,11 @@ static struct digest_test_fragments md5_test_fragments[] = {
static void md5_test_exec ( void ) {
struct digest_algorithm *digest = &md5_algorithm;
struct md5_test_vector *test;
+ unsigned long cost;
unsigned int i;
unsigned int j;
+ /* Correctness test */
for ( i = 0 ; i < ( sizeof ( md5_test_vectors ) /
sizeof ( md5_test_vectors[0] ) ) ; i++ ) {
test = &md5_test_vectors[i];
@@ -85,6 +87,10 @@ static void md5_test_exec ( void ) {
test->data, test->len, test->digest );
}
}
+
+ /* Speed test */
+ cost = digest_cost ( digest );
+ DBG ( "MD5 required %ld cycles per byte\n", cost );
}
/** MD5 self-test */
diff --git a/src/tests/sha1_test.c b/src/tests/sha1_test.c
index 3ff7e3c2..bcf761bd 100644
--- a/src/tests/sha1_test.c
+++ b/src/tests/sha1_test.c
@@ -75,9 +75,11 @@ static struct digest_test_fragments sha1_test_fragments[] = {
static void sha1_test_exec ( void ) {
struct digest_algorithm *digest = &sha1_algorithm;
struct sha1_test_vector *test;
+ unsigned long cost;
unsigned int i;
unsigned int j;
+ /* Correctness test */
for ( i = 0 ; i < ( sizeof ( sha1_test_vectors ) /
sizeof ( sha1_test_vectors[0] ) ) ; i++ ) {
test = &sha1_test_vectors[i];
@@ -90,6 +92,10 @@ static void sha1_test_exec ( void ) {
test->data, test->len, test->digest );
}
}
+
+ /* Speed test */
+ cost = digest_cost ( digest );
+ DBG ( "SHA1 required %ld cycles per byte\n", cost );
}
/** SHA-1 self-test */
diff --git a/src/tests/sha256_test.c b/src/tests/sha256_test.c
index 77b6b10f..06a8cae2 100644
--- a/src/tests/sha256_test.c
+++ b/src/tests/sha256_test.c
@@ -78,9 +78,11 @@ static struct digest_test_fragments sha256_test_fragments[] = {
static void sha256_test_exec ( void ) {
struct digest_algorithm *digest = &sha256_algorithm;
struct sha256_test_vector *test;
+ unsigned long cost;
unsigned int i;
unsigned int j;
+ /* Correctness test */
for ( i = 0 ; i < ( sizeof ( sha256_test_vectors ) /
sizeof ( sha256_test_vectors[0] ) ) ; i++ ) {
test = &sha256_test_vectors[i];
@@ -93,6 +95,10 @@ static void sha256_test_exec ( void ) {
test->data, test->len, test->digest );
}
}
+
+ /* Speed test */
+ cost = digest_cost ( digest );
+ DBG ( "SHA256 required %ld cycles per byte\n", cost );
}
/** SHA-256 self-test */