These changes are the raw update to qemu-2.6.
[kvmfornfv.git] / qemu / roms / ipxe / src / tests / cipher_test.h
diff --git a/qemu/roms/ipxe/src/tests/cipher_test.h b/qemu/roms/ipxe/src/tests/cipher_test.h
new file mode 100644 (file)
index 0000000..d7c5aef
--- /dev/null
@@ -0,0 +1,111 @@
+#ifndef _CIPHER_TEST_H
+#define _CIPHER_TEST_H
+
+/** @file
+ *
+ * Cipher self-tests
+ *
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
+
+#include <stdint.h>
+#include <ipxe/crypto.h>
+#include <ipxe/test.h>
+
+/** A cipher test */
+struct cipher_test {
+       /** Cipher algorithm */
+       struct cipher_algorithm *cipher;
+       /** Key */
+       const void *key;
+       /** Length of key */
+       size_t key_len;
+       /** Initialisation vector */
+       const void *iv;
+       /** Length of initialisation vector */
+       size_t iv_len;
+       /** Plaintext */
+       const void *plaintext;
+       /** Ciphertext */
+       const void *ciphertext;
+       /** Length of text */
+       size_t len;
+};
+
+/** Define inline key */
+#define KEY(...) { __VA_ARGS__ }
+
+/** Define inline initialisation vector */
+#define IV(...) { __VA_ARGS__ }
+
+/** Define inline plaintext data */
+#define PLAINTEXT(...) { __VA_ARGS__ }
+
+/** Define inline ciphertext data */
+#define CIPHERTEXT(...) { __VA_ARGS__ }
+
+/**
+ * Define a cipher test
+ *
+ * @v name             Test name
+ * @v CIPHER           Cipher algorithm
+ * @v KEY              Key
+ * @v IV               Initialisation vector
+ * @v PLAINTEXT                Plaintext
+ * @v CIPHERTEXT       Ciphertext
+ * @ret test           Cipher test
+ */
+#define CIPHER_TEST( name, CIPHER, KEY, IV, PLAINTEXT, CIPHERTEXT )    \
+       static const uint8_t name ## _key [] = KEY;                     \
+       static const uint8_t name ## _iv [] = IV;                       \
+       static const uint8_t name ## _plaintext [] = PLAINTEXT;         \
+       static const uint8_t name ## _ciphertext                        \
+               [ sizeof ( name ## _plaintext ) ] = CIPHERTEXT;         \
+       static struct cipher_test name = {                              \
+               .cipher = CIPHER,                                       \
+               .key = name ## _key,                                    \
+               .key_len = sizeof ( name ## _key ),                     \
+               .iv = name ## _iv,                                      \
+               .iv_len = sizeof ( name ## _iv ),                       \
+               .plaintext = name ## _plaintext,                        \
+               .ciphertext = name ## _ciphertext,                      \
+               .len = sizeof ( name ## _plaintext ),                   \
+       }
+
+extern void cipher_encrypt_okx ( struct cipher_test *test, const char *file,
+                                unsigned int line );
+extern void cipher_decrypt_okx ( struct cipher_test *test, const char *file,
+                                unsigned int line );
+extern void cipher_okx ( struct cipher_test *test, const char *file,
+                        unsigned int line );
+extern unsigned long cipher_cost_encrypt ( struct cipher_algorithm *cipher,
+                                          size_t key_len );
+extern unsigned long cipher_cost_decrypt ( struct cipher_algorithm *cipher,
+                                          size_t key_len );
+
+/**
+ * Report a cipher encryption test result
+ *
+ * @v test             Cipher test
+ */
+#define cipher_encrypt_ok( test ) \
+       cipher_encrypt_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report a cipher decryption test result
+ *
+ * @v test             Cipher test
+ */
+#define cipher_decrypt_ok( test ) \
+       cipher_decrypt_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report a cipher encryption and decryption test result
+ *
+ * @v test             Cipher test
+ */
+#define cipher_ok( test ) \
+       cipher_okx ( test, __FILE__, __LINE__ )
+
+#endif /* _CIPHER_TEST_H */