aboutsummaryrefslogtreecommitdiffstats
path: root/roms/ipxe/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'roms/ipxe/src/tests')
-rw-r--r--roms/ipxe/src/tests/aes_cbc_test.c193
-rw-r--r--roms/ipxe/src/tests/base16_test.c121
-rw-r--r--roms/ipxe/src/tests/base64_test.c124
-rw-r--r--roms/ipxe/src/tests/bigint_test.c2437
-rw-r--r--roms/ipxe/src/tests/bofm_test.c170
-rw-r--r--roms/ipxe/src/tests/byteswap_test.c92
-rw-r--r--roms/ipxe/src/tests/cbc_test.c177
-rw-r--r--roms/ipxe/src/tests/cbc_test.h57
-rw-r--r--roms/ipxe/src/tests/cms_test.c1476
-rw-r--r--roms/ipxe/src/tests/comboot/shuffle-simple.asm40
-rw-r--r--roms/ipxe/src/tests/comboot/version.asm136
-rw-r--r--roms/ipxe/src/tests/crc32_test.c116
-rw-r--r--roms/ipxe/src/tests/deflate_test.c246
-rw-r--r--roms/ipxe/src/tests/digest_test.c114
-rw-r--r--roms/ipxe/src/tests/digest_test.h37
-rw-r--r--roms/ipxe/src/tests/dns_test.c605
-rw-r--r--roms/ipxe/src/tests/entropy_sample.c72
-rw-r--r--roms/ipxe/src/tests/gdbstub_test.S54
-rwxr-xr-xroms/ipxe/src/tests/gdbstub_test.gdb116
-rw-r--r--roms/ipxe/src/tests/hash_df_test.c898
-rw-r--r--roms/ipxe/src/tests/hmac_drbg_test.c1386
-rw-r--r--roms/ipxe/src/tests/ipv6_test.c219
-rw-r--r--roms/ipxe/src/tests/linebuf_test.c35
-rw-r--r--roms/ipxe/src/tests/list_test.c483
-rw-r--r--roms/ipxe/src/tests/math_test.c326
-rw-r--r--roms/ipxe/src/tests/md5_test.c100
-rw-r--r--roms/ipxe/src/tests/memcpy_test.c269
-rw-r--r--roms/ipxe/src/tests/ocsp_test.c1861
-rw-r--r--roms/ipxe/src/tests/pixbuf_test.c76
-rw-r--r--roms/ipxe/src/tests/pixbuf_test.h66
-rw-r--r--roms/ipxe/src/tests/png_test.c1993
-rw-r--r--roms/ipxe/src/tests/pnm_test.c230
-rw-r--r--roms/ipxe/src/tests/profile_test.c140
-rw-r--r--roms/ipxe/src/tests/pubkey_test.h175
-rw-r--r--roms/ipxe/src/tests/rsa_test.c492
-rw-r--r--roms/ipxe/src/tests/settings_test.c401
-rw-r--r--roms/ipxe/src/tests/sha1_test.c105
-rw-r--r--roms/ipxe/src/tests/sha256_test.c108
-rw-r--r--roms/ipxe/src/tests/string_test.c163
-rw-r--r--roms/ipxe/src/tests/tcpip_test.c239
-rw-r--r--roms/ipxe/src/tests/test.c178
-rw-r--r--roms/ipxe/src/tests/tests.c58
-rw-r--r--roms/ipxe/src/tests/time_test.c183
-rw-r--r--roms/ipxe/src/tests/umalloc_test.c26
-rw-r--r--roms/ipxe/src/tests/uri_test.c858
-rw-r--r--roms/ipxe/src/tests/vsprintf_test.c102
-rw-r--r--roms/ipxe/src/tests/x509_test.c1112
47 files changed, 18665 insertions, 0 deletions
diff --git a/roms/ipxe/src/tests/aes_cbc_test.c b/roms/ipxe/src/tests/aes_cbc_test.c
new file mode 100644
index 00000000..4ae3a92e
--- /dev/null
+++ b/roms/ipxe/src/tests/aes_cbc_test.c
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * AES-in-CBC-mode tests
+ *
+ * These test vectors are provided by NIST as part of the
+ * Cryptographic Toolkit Examples, downloadable from:
+ *
+ * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/AES_CBC.pdf
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <assert.h>
+#include <string.h>
+#include <ipxe/aes.h>
+#include <ipxe/test.h>
+#include "cbc_test.h"
+
+/** 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__ }
+
+/** An AES-in-CBC-mode test */
+struct aes_cbc_test {
+ /** 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;
+ /** Length of plaintext */
+ size_t plaintext_len;
+ /** Ciphertext */
+ const void *ciphertext;
+ /** Length of ciphertext */
+ size_t ciphertext_len;
+};
+
+/**
+ * Define an AES-in-CBC-mode test
+ *
+ * @v name Test name
+ * @v key_array Key
+ * @v iv_array Initialisation vector
+ * @v plaintext_array Plaintext
+ * @v ciphertext_array Ciphertext
+ * @ret test AES-in-CBC-mode test
+ */
+#define AES_CBC_TEST( name, key_array, iv_array, plaintext_array, \
+ ciphertext_array ) \
+ static const uint8_t name ## _key [] = key_array; \
+ static const uint8_t name ## _iv [] = iv_array; \
+ static const uint8_t name ## _plaintext [] = plaintext_array; \
+ static const uint8_t name ## _ciphertext [] = ciphertext_array; \
+ static struct aes_cbc_test name = { \
+ .key = name ## _key, \
+ .key_len = sizeof ( name ## _key ), \
+ .iv = name ## _iv, \
+ .iv_len = sizeof ( name ## _iv ), \
+ .plaintext = name ## _plaintext, \
+ .plaintext_len = sizeof ( name ## _plaintext ), \
+ .ciphertext = name ## _ciphertext, \
+ .ciphertext_len = sizeof ( name ## _ciphertext ), \
+ }
+
+/**
+ * Report AES-in-CBC-mode
+ *
+ * @v state HMAC_DRBG internal state
+ * @v test Instantiation test
+ */
+#define aes_cbc_ok( test ) do { \
+ struct cipher_algorithm *cipher = &aes_cbc_algorithm; \
+ \
+ assert ( (test)->iv_len == cipher->blocksize ); \
+ assert ( (test)->plaintext_len == (test)->ciphertext_len ); \
+ cbc_encrypt_ok ( cipher, (test)->key, (test)->key_len, \
+ (test)->iv, (test)->plaintext, \
+ (test)->ciphertext, (test)->plaintext_len ); \
+ cbc_decrypt_ok ( cipher, (test)->key, (test)->key_len, \
+ (test)->iv, (test)->ciphertext, \
+ (test)->plaintext, (test)->ciphertext_len ); \
+ } while ( 0 )
+
+/** CBC_AES128 */
+AES_CBC_TEST ( test_128,
+ KEY ( 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15,
+ 0x88, 0x09, 0xcf, 0x4f, 0x3c ),
+ IV ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f ),
+ PLAINTEXT ( 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+ 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
+ 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+ 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
+ 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+ 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
+ 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+ 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 ),
+ CIPHERTEXT ( 0x76, 0x49, 0xab, 0xac, 0x81, 0x19, 0xb2, 0x46,
+ 0xce, 0xe9, 0x8e, 0x9b, 0x12, 0xe9, 0x19, 0x7d,
+ 0x50, 0x86, 0xcb, 0x9b, 0x50, 0x72, 0x19, 0xee,
+ 0x95, 0xdb, 0x11, 0x3a, 0x91, 0x76, 0x78, 0xb2,
+ 0x73, 0xbe, 0xd6, 0xb8, 0xe3, 0xc1, 0x74, 0x3b,
+ 0x71, 0x16, 0xe6, 0x9e, 0x22, 0x22, 0x95, 0x16,
+ 0x3f, 0xf1, 0xca, 0xa1, 0x68, 0x1f, 0xac, 0x09,
+ 0x12, 0x0e, 0xca, 0x30, 0x75, 0x86, 0xe1, 0xa7 ) );
+
+/** CBC_AES256 */
+AES_CBC_TEST ( test_256,
+ KEY ( 0x60, 0x3d, 0xeb, 0x10, 0x15, 0xca, 0x71, 0xbe, 0x2b, 0x73, 0xae,
+ 0xf0, 0x85, 0x7d, 0x77, 0x81, 0x1f, 0x35, 0x2c, 0x07, 0x3b, 0x61,
+ 0x08, 0xd7, 0x2d, 0x98, 0x10, 0xa3, 0x09, 0x14, 0xdf, 0xf4 ),
+ IV ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f ),
+ PLAINTEXT ( 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96,
+ 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a,
+ 0xae, 0x2d, 0x8a, 0x57, 0x1e, 0x03, 0xac, 0x9c,
+ 0x9e, 0xb7, 0x6f, 0xac, 0x45, 0xaf, 0x8e, 0x51,
+ 0x30, 0xc8, 0x1c, 0x46, 0xa3, 0x5c, 0xe4, 0x11,
+ 0xe5, 0xfb, 0xc1, 0x19, 0x1a, 0x0a, 0x52, 0xef,
+ 0xf6, 0x9f, 0x24, 0x45, 0xdf, 0x4f, 0x9b, 0x17,
+ 0xad, 0x2b, 0x41, 0x7b, 0xe6, 0x6c, 0x37, 0x10 ),
+ CIPHERTEXT ( 0xf5, 0x8c, 0x4c, 0x04, 0xd6, 0xe5, 0xf1, 0xba,
+ 0x77, 0x9e, 0xab, 0xfb, 0x5f, 0x7b, 0xfb, 0xd6,
+ 0x9c, 0xfc, 0x4e, 0x96, 0x7e, 0xdb, 0x80, 0x8d,
+ 0x67, 0x9f, 0x77, 0x7b, 0xc6, 0x70, 0x2c, 0x7d,
+ 0x39, 0xf2, 0x33, 0x69, 0xa9, 0xd9, 0xba, 0xcf,
+ 0xa5, 0x30, 0xe2, 0x63, 0x04, 0x23, 0x14, 0x61,
+ 0xb2, 0xeb, 0x05, 0xe2, 0xc3, 0x9b, 0xe9, 0xfc,
+ 0xda, 0x6c, 0x19, 0x07, 0x8c, 0x6a, 0x9d, 0x1b ) );
+
+/**
+ * Perform AES-in-CBC-mode self-test
+ *
+ */
+static void aes_cbc_test_exec ( void ) {
+ struct cipher_algorithm *cipher = &aes_cbc_algorithm;
+
+ /* Correctness tests */
+ aes_cbc_ok ( &test_128 );
+ aes_cbc_ok ( &test_256 );
+
+ /* Speed tests */
+ DBG ( "AES128 encryption required %ld cycles per byte\n",
+ cbc_cost_encrypt ( cipher, test_128.key_len ) );
+ DBG ( "AES128 decryption required %ld cycles per byte\n",
+ cbc_cost_decrypt ( cipher, test_128.key_len ) );
+ DBG ( "AES256 encryption required %ld cycles per byte\n",
+ cbc_cost_encrypt ( cipher, test_256.key_len ) );
+ DBG ( "AES256 decryption required %ld cycles per byte\n",
+ cbc_cost_decrypt ( cipher, test_256.key_len ) );
+}
+
+/** AES-in-CBC-mode self-test */
+struct self_test aes_cbc_test __self_test = {
+ .name = "aes_cbc",
+ .exec = aes_cbc_test_exec,
+};
diff --git a/roms/ipxe/src/tests/base16_test.c b/roms/ipxe/src/tests/base16_test.c
new file mode 100644
index 00000000..9b047b74
--- /dev/null
+++ b/roms/ipxe/src/tests/base16_test.c
@@ -0,0 +1,121 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Base16 tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <string.h>
+#include <ipxe/base16.h>
+#include <ipxe/test.h>
+
+/** A Base16 test */
+struct base16_test {
+ /** Raw data */
+ const void *data;
+ /** Length of raw data */
+ size_t len;
+ /** Base16-encoded data */
+ const char *encoded;
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define a base16 test */
+#define BASE16( name, DATA, ENCODED ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static struct base16_test name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ .encoded = ENCODED, \
+ }
+
+/** Empty data test */
+BASE16 ( empty_test, DATA(), "" );
+
+/** "Hello world" test */
+BASE16 ( hw_test,
+ DATA ( 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' ),
+ "48656c6c6f20776f726c64" );
+
+/** Random data test */
+BASE16 ( random_test,
+ DATA ( 0x8b, 0x1a, 0xa2, 0x6c, 0xa9, 0x38, 0x43, 0xb8, 0x81, 0xf8,
+ 0x30, 0x44, 0xb2, 0x32, 0x6e, 0x82, 0xfe, 0x0f, 0x84, 0x91 ),
+ "8b1aa26ca93843b881f83044b2326e82fe0f8491" );
+
+/**
+ * Report a base16 encoding test result
+ *
+ * @v test Base16 test
+ */
+#define base16_encode_ok( test ) do { \
+ size_t len = base16_encoded_len ( (test)->len ); \
+ char buf[ len + 1 /* NUL */ ]; \
+ ok ( len == strlen ( (test)->encoded ) ); \
+ base16_encode ( (test)->data, (test)->len, buf ); \
+ ok ( strcmp ( (test)->encoded, buf ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report a base16 decoding test result
+ *
+ * @v test Base16 test
+ */
+#define base16_decode_ok( test ) do { \
+ size_t max_len = base16_decoded_max_len ( (test)->encoded ); \
+ uint8_t buf[max_len]; \
+ int len; \
+ len = base16_decode ( (test)->encoded, buf ); \
+ ok ( len >= 0 ); \
+ ok ( ( size_t ) len <= max_len ); \
+ ok ( ( size_t ) len == (test)->len ); \
+ ok ( memcmp ( (test)->data, buf, len ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Perform Base16 self-tests
+ *
+ */
+static void base16_test_exec ( void ) {
+
+ base16_encode_ok ( &empty_test );
+ base16_decode_ok ( &empty_test );
+
+ base16_encode_ok ( &hw_test );
+ base16_decode_ok ( &hw_test );
+
+ base16_encode_ok ( &random_test );
+ base16_decode_ok ( &random_test );
+}
+
+/** Base16 self-test */
+struct self_test base16_test __self_test = {
+ .name = "base16",
+ .exec = base16_test_exec,
+};
diff --git a/roms/ipxe/src/tests/base64_test.c b/roms/ipxe/src/tests/base64_test.c
new file mode 100644
index 00000000..c088298c
--- /dev/null
+++ b/roms/ipxe/src/tests/base64_test.c
@@ -0,0 +1,124 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Base64 tests
+ *
+ * Test vectors generated using "base64 -w 0"
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <string.h>
+#include <ipxe/base64.h>
+#include <ipxe/test.h>
+
+/** A Base64 test */
+struct base64_test {
+ /** Raw data */
+ const void *data;
+ /** Length of raw data */
+ size_t len;
+ /** Base64-encoded data */
+ const char *encoded;
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define a base64 test */
+#define BASE64( name, DATA, ENCODED ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static struct base64_test name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ .encoded = ENCODED, \
+ }
+
+/** Empty data test */
+BASE64 ( empty_test, DATA(), "" );
+
+/** "Hello world" test */
+BASE64 ( hw_test,
+ DATA ( 'H', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' ),
+ "SGVsbG8gd29ybGQ=" );
+
+/** Random data test */
+BASE64 ( random_test,
+ DATA ( 0x36, 0x03, 0x84, 0xdc, 0x4e, 0x03, 0x46, 0xa0, 0xb5, 0x2d,
+ 0x03, 0x6e, 0xd0, 0x56, 0xed, 0xa0, 0x37, 0x02, 0xac, 0xc6,
+ 0x65, 0xd1 ),
+ "NgOE3E4DRqC1LQNu0FbtoDcCrMZl0Q==" );
+
+/**
+ * Report a base64 encoding test result
+ *
+ * @v test Base64 test
+ */
+#define base64_encode_ok( test ) do { \
+ size_t len = base64_encoded_len ( (test)->len ); \
+ char buf[ len + 1 /* NUL */ ]; \
+ ok ( len == strlen ( (test)->encoded ) ); \
+ base64_encode ( (test)->data, (test)->len, buf ); \
+ ok ( strcmp ( (test)->encoded, buf ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report a base64 decoding test result
+ *
+ * @v test Base64 test
+ */
+#define base64_decode_ok( test ) do { \
+ size_t max_len = base64_decoded_max_len ( (test)->encoded ); \
+ uint8_t buf[max_len]; \
+ int len; \
+ len = base64_decode ( (test)->encoded, buf ); \
+ ok ( len >= 0 ); \
+ ok ( ( size_t ) len <= max_len ); \
+ ok ( ( size_t ) len == (test)->len ); \
+ ok ( memcmp ( (test)->data, buf, len ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Perform Base64 self-tests
+ *
+ */
+static void base64_test_exec ( void ) {
+
+ base64_encode_ok ( &empty_test );
+ base64_decode_ok ( &empty_test );
+
+ base64_encode_ok ( &hw_test );
+ base64_decode_ok ( &hw_test );
+
+ base64_encode_ok ( &random_test );
+ base64_decode_ok ( &random_test );
+}
+
+/** Base64 self-test */
+struct self_test base64_test __self_test = {
+ .name = "base64",
+ .exec = base64_test_exec,
+};
diff --git a/roms/ipxe/src/tests/bigint_test.c b/roms/ipxe/src/tests/bigint_test.c
new file mode 100644
index 00000000..75a80622
--- /dev/null
+++ b/roms/ipxe/src/tests/bigint_test.c
@@ -0,0 +1,2437 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Big integer self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <assert.h>
+#include <string.h>
+#include <ipxe/bigint.h>
+#include <ipxe/test.h>
+
+/** Define inline big integer */
+#define BIGINT(...) { __VA_ARGS__ }
+
+/* Provide global functions to allow inspection of generated assembly code */
+
+void bigint_init_sample ( bigint_element_t *value0, unsigned int size,
+ const void *data, size_t len ) {
+ bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( void * ) value0 );
+
+ bigint_init ( value, data, len );
+}
+
+void bigint_done_sample ( const bigint_element_t *value0, unsigned int size,
+ void *out, size_t len ) {
+ const bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( const void * ) value0 );
+
+ bigint_done ( value, out, len );
+}
+
+void bigint_add_sample ( const bigint_element_t *addend0,
+ bigint_element_t *value0, unsigned int size ) {
+ const bigint_t ( size ) *addend __attribute__ (( may_alias ))
+ = ( ( const void * ) addend0 );
+ bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( void * ) value0 );
+
+ bigint_add ( addend, value );
+}
+
+void bigint_subtract_sample ( const bigint_element_t *subtrahend0,
+ bigint_element_t *value0, unsigned int size ) {
+ const bigint_t ( size ) *subtrahend __attribute__ (( may_alias ))
+ = ( ( const void * ) subtrahend0 );
+ bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( void * ) value0 );
+
+ bigint_subtract ( subtrahend, value );
+}
+
+void bigint_rol_sample ( bigint_element_t *value0, unsigned int size ) {
+ bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( void * ) value0 );
+
+ bigint_rol ( value );
+}
+
+void bigint_ror_sample ( bigint_element_t *value0, unsigned int size ) {
+ bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( void * ) value0 );
+
+ bigint_ror ( value );
+}
+
+int bigint_is_zero_sample ( const bigint_element_t *value0,
+ unsigned int size ) {
+ const bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( const void * ) value0 );
+
+ return bigint_is_zero ( value );
+}
+
+int bigint_is_geq_sample ( const bigint_element_t *value0,
+ const bigint_element_t *reference0,
+ unsigned int size ) {
+ const bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( const void * ) value0 );
+ const bigint_t ( size ) *reference __attribute__ (( may_alias ))
+ = ( ( const void * ) reference0 );
+
+ return bigint_is_geq ( value, reference );
+}
+
+int bigint_bit_is_set_sample ( const bigint_element_t *value0,
+ unsigned int size, unsigned int bit ) {
+ const bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( const void * ) value0 );
+
+ return bigint_bit_is_set ( value, bit );
+}
+
+int bigint_max_set_bit_sample ( const bigint_element_t *value0,
+ unsigned int size ) {
+ const bigint_t ( size ) *value __attribute__ (( may_alias ))
+ = ( ( const void * ) value0 );
+
+ return bigint_max_set_bit ( value );
+}
+
+void bigint_grow_sample ( const bigint_element_t *source0,
+ unsigned int source_size, bigint_element_t *dest0,
+ unsigned int dest_size ) {
+ const bigint_t ( source_size ) *source __attribute__ (( may_alias ))
+ = ( ( const void * ) source0 );
+ bigint_t ( dest_size ) *dest __attribute__ (( may_alias ))
+ = ( ( void * ) dest0 );
+
+ bigint_grow ( source, dest );
+}
+
+void bigint_shrink_sample ( const bigint_element_t *source0,
+ unsigned int source_size, bigint_element_t *dest0,
+ unsigned int dest_size ) {
+ const bigint_t ( source_size ) *source __attribute__ (( may_alias ))
+ = ( ( const void * ) source0 );
+ bigint_t ( dest_size ) *dest __attribute__ (( may_alias ))
+ = ( ( void * ) dest0 );
+
+ bigint_shrink ( source, dest );
+}
+
+void bigint_multiply_sample ( const bigint_element_t *multiplicand0,
+ const bigint_element_t *multiplier0,
+ bigint_element_t *result0,
+ unsigned int size ) {
+ const bigint_t ( size ) *multiplicand __attribute__ (( may_alias ))
+ = ( ( const void * ) multiplicand0 );
+ const bigint_t ( size ) *multiplier __attribute__ (( may_alias ))
+ = ( ( const void * ) multiplier0 );
+ bigint_t ( size * 2 ) *result __attribute__ (( may_alias ))
+ = ( ( void * ) result0 );
+
+ bigint_multiply ( multiplicand, multiplier, result );
+}
+
+void bigint_mod_multiply_sample ( const bigint_element_t *multiplicand0,
+ const bigint_element_t *multiplier0,
+ const bigint_element_t *modulus0,
+ bigint_element_t *result0,
+ unsigned int size,
+ void *tmp ) {
+ const bigint_t ( size ) *multiplicand __attribute__ (( may_alias ))
+ = ( ( const void * ) multiplicand0 );
+ const bigint_t ( size ) *multiplier __attribute__ (( may_alias ))
+ = ( ( const void * ) multiplier0 );
+ const bigint_t ( size ) *modulus __attribute__ (( may_alias ))
+ = ( ( const void * ) modulus0 );
+ bigint_t ( size ) *result __attribute__ (( may_alias ))
+ = ( ( void * ) result0 );
+
+ bigint_mod_multiply ( multiplicand, multiplier, modulus, result, tmp );
+}
+
+void bigint_mod_exp_sample ( const bigint_element_t *base0,
+ const bigint_element_t *modulus0,
+ const bigint_element_t *exponent0,
+ bigint_element_t *result0,
+ unsigned int size, unsigned int exponent_size,
+ void *tmp ) {
+ const bigint_t ( size ) *base __attribute__ (( may_alias ))
+ = ( ( const void * ) base0 );
+ const bigint_t ( size ) *modulus __attribute__ (( may_alias ))
+ = ( ( const void * ) modulus0 );
+ const bigint_t ( exponent_size ) *exponent __attribute__ (( may_alias ))
+ = ( ( const void * ) exponent0 );
+ bigint_t ( size ) *result __attribute__ (( may_alias ))
+ = ( ( void * ) result0 );
+
+ bigint_mod_exp ( base, modulus, exponent, result, tmp );
+}
+
+/**
+ * Report result of big integer addition test
+ *
+ * @v addend Big integer to add
+ * @v value Big integer to be added to
+ * @v expected Big integer expected result
+ */
+#define bigint_add_ok( addend, value, expected ) do { \
+ static const uint8_t addend_raw[] = addend; \
+ static const uint8_t value_raw[] = value; \
+ static const uint8_t expected_raw[] = expected; \
+ uint8_t result_raw[ sizeof ( expected_raw ) ]; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) addend_temp; \
+ bigint_t ( size ) value_temp; \
+ {} /* Fix emacs alignment */ \
+ \
+ assert ( bigint_size ( &addend_temp ) == \
+ bigint_size ( &value_temp ) ); \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ bigint_init ( &addend_temp, addend_raw, \
+ sizeof ( addend_raw ) ); \
+ DBG ( "Add:\n" ); \
+ DBG_HDA ( 0, &addend_temp, sizeof ( addend_temp ) ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_add ( &addend_temp, &value_temp ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_done ( &value_temp, result_raw, sizeof ( result_raw ) ); \
+ \
+ ok ( memcmp ( result_raw, expected_raw, \
+ sizeof ( result_raw ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer subtraction test
+ *
+ * @v subtrahend Big integer to subtract
+ * @v value Big integer to be subtracted from
+ * @v expected Big integer expected result
+ */
+#define bigint_subtract_ok( subtrahend, value, expected ) do { \
+ static const uint8_t subtrahend_raw[] = subtrahend; \
+ static const uint8_t value_raw[] = value; \
+ static const uint8_t expected_raw[] = expected; \
+ uint8_t result_raw[ sizeof ( expected_raw ) ]; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) subtrahend_temp; \
+ bigint_t ( size ) value_temp; \
+ {} /* Fix emacs alignment */ \
+ \
+ assert ( bigint_size ( &subtrahend_temp ) == \
+ bigint_size ( &value_temp ) ); \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ bigint_init ( &subtrahend_temp, subtrahend_raw, \
+ sizeof ( subtrahend_raw ) ); \
+ DBG ( "Subtract:\n" ); \
+ DBG_HDA ( 0, &subtrahend_temp, sizeof ( subtrahend_temp ) ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_subtract ( &subtrahend_temp, &value_temp ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_done ( &value_temp, result_raw, sizeof ( result_raw ) ); \
+ \
+ ok ( memcmp ( result_raw, expected_raw, \
+ sizeof ( result_raw ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer left rotation test
+ *
+ * @v value Big integer
+ * @v expected Big integer expected result
+ */
+#define bigint_rol_ok( value, expected ) do { \
+ static const uint8_t value_raw[] = value; \
+ static const uint8_t expected_raw[] = expected; \
+ uint8_t result_raw[ sizeof ( expected_raw ) ]; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) value_temp; \
+ {} /* Fix emacs alignment */ \
+ \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ DBG ( "Rotate left:\n" ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_rol ( &value_temp ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_done ( &value_temp, result_raw, sizeof ( result_raw ) ); \
+ \
+ ok ( memcmp ( result_raw, expected_raw, \
+ sizeof ( result_raw ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer right rotation test
+ *
+ * @v value Big integer
+ * @v expected Big integer expected result
+ */
+#define bigint_ror_ok( value, expected ) do { \
+ static const uint8_t value_raw[] = value; \
+ static const uint8_t expected_raw[] = expected; \
+ uint8_t result_raw[ sizeof ( expected_raw ) ]; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) value_temp; \
+ {} /* Fix emacs alignment */ \
+ \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ DBG ( "Rotate right:\n" ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_ror ( &value_temp ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bigint_done ( &value_temp, result_raw, sizeof ( result_raw ) ); \
+ \
+ ok ( memcmp ( result_raw, expected_raw, \
+ sizeof ( result_raw ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer zero comparison test
+ *
+ * @v value Big integer
+ * @v expected Expected result
+ */
+#define bigint_is_zero_ok( value, expected ) do { \
+ static const uint8_t value_raw[] = value; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) value_temp; \
+ int is_zero; \
+ {} /* Fix emacs alignment */ \
+ \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ DBG ( "Zero comparison:\n" ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ is_zero = bigint_is_zero ( &value_temp ); \
+ DBG ( "...is %szero\n", ( is_zero ? "" : "not " ) ); \
+ ok ( ( !! is_zero ) == ( !! (expected) ) ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer greater-than-or-equal comparison test
+ *
+ * @v value Big integer
+ * @v reference Reference big integer
+ * @v expected Expected result
+ */
+#define bigint_is_geq_ok( value, reference, expected ) do { \
+ static const uint8_t value_raw[] = value; \
+ static const uint8_t reference_raw[] = reference; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) value_temp; \
+ bigint_t ( size ) reference_temp; \
+ int is_geq; \
+ {} /* Fix emacs alignment */ \
+ \
+ assert ( bigint_size ( &reference_temp ) == \
+ bigint_size ( &value_temp ) ); \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ bigint_init ( &reference_temp, reference_raw, \
+ sizeof ( reference_raw ) ); \
+ DBG ( "Greater-than-or-equal comparison:\n" ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ DBG_HDA ( 0, &reference_temp, sizeof ( reference_temp ) ); \
+ is_geq = bigint_is_geq ( &value_temp, &reference_temp ); \
+ DBG ( "...is %sgreater than or equal\n", \
+ ( is_geq ? "" : "not " ) ); \
+ ok ( ( !! is_geq ) == ( !! (expected) ) ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer bit-set test
+ *
+ * @v value Big integer
+ * @v bit Bit to test
+ * @v expected Expected result
+ */
+#define bigint_bit_is_set_ok( value, bit, expected ) do { \
+ static const uint8_t value_raw[] = value; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) value_temp; \
+ int bit_is_set; \
+ {} /* Fix emacs alignment */ \
+ \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ DBG ( "Bit set:\n" ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ bit_is_set = bigint_bit_is_set ( &value_temp, bit ); \
+ DBG ( "...bit %d is %sset\n", bit, \
+ ( bit_is_set ? "" : "not " ) ); \
+ ok ( ( !! bit_is_set ) == ( !! (expected) ) ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer maximum set bit test
+ *
+ * @v value Big integer
+ * @v expected Expected result
+ */
+#define bigint_max_set_bit_ok( value, expected ) do { \
+ static const uint8_t value_raw[] = value; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( value_raw ) ); \
+ bigint_t ( size ) value_temp; \
+ int max_set_bit; \
+ {} /* Fix emacs alignment */ \
+ \
+ bigint_init ( &value_temp, value_raw, sizeof ( value_raw ) ); \
+ DBG ( "Maximum set bit:\n" ); \
+ DBG_HDA ( 0, &value_temp, sizeof ( value_temp ) ); \
+ max_set_bit = bigint_max_set_bit ( &value_temp ); \
+ DBG ( "...maximum set bit is bit %d\n", ( max_set_bit - 1 ) ); \
+ ok ( max_set_bit == (expected) ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer multiplication test
+ *
+ * @v multiplicand Big integer to be multiplied
+ * @v multiplier Big integer to be multiplied
+ * @v expected Big integer expected result
+ */
+#define bigint_multiply_ok( multiplicand, multiplier, expected ) do { \
+ static const uint8_t multiplicand_raw[] = multiplicand; \
+ static const uint8_t multiplier_raw[] = multiplier; \
+ static const uint8_t expected_raw[] = expected; \
+ uint8_t result_raw[ sizeof ( expected_raw ) ]; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( multiplicand_raw ) ); \
+ bigint_t ( size ) multiplicand_temp; \
+ bigint_t ( size ) multiplier_temp; \
+ bigint_t ( size * 2 ) result_temp; \
+ {} /* Fix emacs alignment */ \
+ \
+ assert ( bigint_size ( &multiplier_temp ) == \
+ bigint_size ( &multiplicand_temp ) ); \
+ assert ( bigint_size ( &result_temp ) == \
+ ( 2 * bigint_size ( &multiplicand_temp ) ) ); \
+ bigint_init ( &multiplicand_temp, multiplicand_raw, \
+ sizeof ( multiplicand_raw ) ); \
+ bigint_init ( &multiplier_temp, multiplier_raw, \
+ sizeof ( multiplier_raw ) ); \
+ DBG ( "Multiply:\n" ); \
+ DBG_HDA ( 0, &multiplicand_temp, sizeof ( multiplicand_temp ) );\
+ DBG_HDA ( 0, &multiplier_temp, sizeof ( multiplier_temp ) ); \
+ bigint_multiply ( &multiplicand_temp, &multiplier_temp, \
+ &result_temp ); \
+ DBG_HDA ( 0, &result_temp, sizeof ( result_temp ) ); \
+ bigint_done ( &result_temp, result_raw, sizeof ( result_raw ) );\
+ \
+ ok ( memcmp ( result_raw, expected_raw, \
+ sizeof ( result_raw ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer modular multiplication test
+ *
+ * @v multiplicand Big integer to be multiplied
+ * @v multiplier Big integer to be multiplied
+ * @v modulus Big integer modulus
+ * @v expected Big integer expected result
+ */
+#define bigint_mod_multiply_ok( multiplicand, multiplier, modulus, \
+ expected ) do { \
+ static const uint8_t multiplicand_raw[] = multiplicand; \
+ static const uint8_t multiplier_raw[] = multiplier; \
+ static const uint8_t modulus_raw[] = modulus; \
+ static const uint8_t expected_raw[] = expected; \
+ uint8_t result_raw[ sizeof ( expected_raw ) ]; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( multiplicand_raw ) ); \
+ bigint_t ( size ) multiplicand_temp; \
+ bigint_t ( size ) multiplier_temp; \
+ bigint_t ( size ) modulus_temp; \
+ bigint_t ( size ) result_temp; \
+ size_t tmp_len = bigint_mod_multiply_tmp_len ( &modulus_temp ); \
+ uint8_t tmp[tmp_len]; \
+ {} /* Fix emacs alignment */ \
+ \
+ assert ( bigint_size ( &multiplier_temp ) == \
+ bigint_size ( &multiplicand_temp ) ); \
+ assert ( bigint_size ( &multiplier_temp ) == \
+ bigint_size ( &modulus_temp ) ); \
+ assert ( bigint_size ( &multiplier_temp ) == \
+ bigint_size ( &result_temp ) ); \
+ bigint_init ( &multiplicand_temp, multiplicand_raw, \
+ sizeof ( multiplicand_raw ) ); \
+ bigint_init ( &multiplier_temp, multiplier_raw, \
+ sizeof ( multiplier_raw ) ); \
+ bigint_init ( &modulus_temp, modulus_raw, \
+ sizeof ( modulus_raw ) ); \
+ DBG ( "Modular multiply:\n" ); \
+ DBG_HDA ( 0, &multiplicand_temp, sizeof ( multiplicand_temp ) );\
+ DBG_HDA ( 0, &multiplier_temp, sizeof ( multiplier_temp ) ); \
+ DBG_HDA ( 0, &modulus_temp, sizeof ( modulus_temp ) ); \
+ bigint_mod_multiply ( &multiplicand_temp, &multiplier_temp, \
+ &modulus_temp, &result_temp, tmp ); \
+ DBG_HDA ( 0, &result_temp, sizeof ( result_temp ) ); \
+ bigint_done ( &result_temp, result_raw, sizeof ( result_raw ) );\
+ \
+ ok ( memcmp ( result_raw, expected_raw, \
+ sizeof ( result_raw ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report result of big integer modular exponentiation test
+ *
+ * @v base Big integer base
+ * @v modulus Big integer modulus
+ * @v exponent Big integer exponent
+ * @v expected Big integer expected result
+ */
+#define bigint_mod_exp_ok( base, modulus, exponent, expected ) do { \
+ static const uint8_t base_raw[] = base; \
+ static const uint8_t modulus_raw[] = modulus; \
+ static const uint8_t exponent_raw[] = exponent; \
+ static const uint8_t expected_raw[] = expected; \
+ uint8_t result_raw[ sizeof ( expected_raw ) ]; \
+ unsigned int size = \
+ bigint_required_size ( sizeof ( base_raw ) ); \
+ unsigned int exponent_size = \
+ bigint_required_size ( sizeof ( exponent_raw ) ); \
+ bigint_t ( size ) base_temp; \
+ bigint_t ( size ) modulus_temp; \
+ bigint_t ( exponent_size ) exponent_temp; \
+ bigint_t ( size ) result_temp; \
+ size_t tmp_len = bigint_mod_exp_tmp_len ( &modulus_temp, \
+ &exponent_temp ); \
+ uint8_t tmp[tmp_len]; \
+ {} /* Fix emacs alignment */ \
+ \
+ assert ( bigint_size ( &modulus_temp ) == \
+ bigint_size ( &base_temp ) ); \
+ assert ( bigint_size ( &modulus_temp ) == \
+ bigint_size ( &result_temp ) ); \
+ bigint_init ( &base_temp, base_raw, sizeof ( base_raw ) ); \
+ bigint_init ( &modulus_temp, modulus_raw, \
+ sizeof ( modulus_raw ) ); \
+ bigint_init ( &exponent_temp, exponent_raw, \
+ sizeof ( exponent_raw ) ); \
+ DBG ( "Modular exponentiation:\n" ); \
+ DBG_HDA ( 0, &base_temp, sizeof ( base_temp ) ); \
+ DBG_HDA ( 0, &modulus_temp, sizeof ( modulus_temp ) ); \
+ DBG_HDA ( 0, &exponent_temp, sizeof ( exponent_temp ) ); \
+ bigint_mod_exp ( &base_temp, &modulus_temp, &exponent_temp, \
+ &result_temp, tmp ); \
+ DBG_HDA ( 0, &result_temp, sizeof ( result_temp ) ); \
+ bigint_done ( &result_temp, result_raw, sizeof ( result_raw ) );\
+ \
+ ok ( memcmp ( result_raw, expected_raw, \
+ sizeof ( result_raw ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Perform big integer self-tests
+ *
+ */
+static void bigint_test_exec ( void ) {
+
+ bigint_add_ok ( BIGINT ( 0x8a ),
+ BIGINT ( 0x43 ),
+ BIGINT ( 0xcd ) );
+ bigint_add_ok ( BIGINT ( 0xc5, 0x7b ),
+ BIGINT ( 0xd6, 0xb1 ),
+ BIGINT ( 0x9c, 0x2c ) );
+ bigint_add_ok ( BIGINT ( 0xf9, 0xd9, 0xdc ),
+ BIGINT ( 0x6d, 0x4b, 0xca ),
+ BIGINT ( 0x67, 0x25, 0xa6 ) );
+ bigint_add_ok ( BIGINT ( 0xdd, 0xc2, 0x20, 0x5f ),
+ BIGINT ( 0x80, 0x32, 0xc4, 0xb0 ),
+ BIGINT ( 0x5d, 0xf4, 0xe5, 0x0f ) );
+ bigint_add_ok ( BIGINT ( 0x01, 0xed, 0x45, 0x4b, 0x41, 0xeb, 0x4c,
+ 0x2e, 0x53, 0x07, 0x15, 0x51, 0x56, 0x47,
+ 0x29, 0xfc, 0x9c, 0xbd, 0xbd, 0xfb, 0x1b,
+ 0xd1, 0x1d ),
+ BIGINT ( 0x73, 0xed, 0xfc, 0x35, 0x31, 0x22, 0xd7,
+ 0xb1, 0xea, 0x91, 0x5a, 0xe4, 0xba, 0xbc,
+ 0xa1, 0x38, 0x72, 0xae, 0x4b, 0x1c, 0xc1,
+ 0x05, 0xb3 ),
+ BIGINT ( 0x75, 0xdb, 0x41, 0x80, 0x73, 0x0e, 0x23,
+ 0xe0, 0x3d, 0x98, 0x70, 0x36, 0x11, 0x03,
+ 0xcb, 0x35, 0x0f, 0x6c, 0x09, 0x17, 0xdc,
+ 0xd6, 0xd0 ) );
+ bigint_add_ok ( BIGINT ( 0x06, 0x8e, 0xd6, 0x18, 0xbb, 0x4b, 0x0c,
+ 0xc5, 0x85, 0xde, 0xee, 0x9b, 0x3f, 0x65,
+ 0x63, 0x86, 0xf5, 0x5a, 0x9f, 0xa2, 0xd7,
+ 0xb2, 0xc7, 0xb6, 0x1d, 0x28, 0x6c, 0x50,
+ 0x47, 0x10, 0x0a, 0x0e, 0x86, 0xcd, 0x2a,
+ 0x64, 0xdc, 0xe6, 0x9d, 0x96, 0xd8, 0xf4,
+ 0x56, 0x46, 0x6f, 0xbb, 0x7b, 0x64, 0x6f,
+ 0xdc, 0x2a, 0xd1, 0x3b, 0xcc, 0x03, 0x85,
+ 0x95, 0xf4, 0xe9, 0x68, 0x1f, 0x5c, 0xc5,
+ 0xbf, 0x97, 0x19, 0x12, 0x88, 0x2e, 0x88,
+ 0xb9, 0x34, 0xac, 0x74, 0x83, 0x2d, 0x8f,
+ 0xb3, 0x97, 0x53, 0x99, 0xf3, 0xb4, 0x8b,
+ 0x2d, 0x98, 0x69, 0x8d, 0x19, 0xf0, 0x40,
+ 0x66, 0x3f, 0x60, 0x78, 0x34, 0x7f, 0x9b,
+ 0xf7, 0x01, 0x74, 0x55, 0xca, 0x63, 0x25,
+ 0x7b, 0x86, 0xe9, 0x73, 0xfd, 0x5d, 0x77,
+ 0x32, 0x5e, 0x9e, 0x42, 0x53, 0xb6, 0x35,
+ 0x92, 0xb9, 0xd7, 0x1b, 0xf7, 0x16, 0x55,
+ 0xf6, 0xe2 ),
+ BIGINT ( 0x3f, 0x8f, 0x62, 0x21, 0x4a, 0x7a, 0xa2,
+ 0xef, 0xa8, 0x79, 0x9b, 0x73, 0xac, 0xde,
+ 0x72, 0xe4, 0xfc, 0x3c, 0xd3, 0xa9, 0x44,
+ 0x1a, 0x6a, 0x02, 0x76, 0xe3, 0x78, 0x4d,
+ 0x2e, 0x07, 0x9b, 0xb6, 0x3d, 0x5d, 0xc5,
+ 0xcd, 0x68, 0x23, 0x4b, 0x5f, 0x89, 0x0e,
+ 0xd7, 0xa7, 0xff, 0x18, 0x80, 0xdc, 0xfb,
+ 0x34, 0x45, 0xca, 0x4b, 0xdb, 0x8a, 0x19,
+ 0xcb, 0xc9, 0xe5, 0xa1, 0x63, 0xa2, 0x0d,
+ 0x56, 0xc4, 0xf9, 0x51, 0x1b, 0x88, 0x4e,
+ 0x36, 0xab, 0x15, 0x4d, 0x8f, 0xdc, 0x08,
+ 0xc4, 0x4d, 0x43, 0xc7, 0x2b, 0xc9, 0x5c,
+ 0x05, 0x26, 0xe3, 0x46, 0xf0, 0x64, 0xaa,
+ 0x02, 0xa4, 0xbe, 0x3a, 0xd1, 0xca, 0x07,
+ 0x6a, 0x6e, 0x62, 0xf4, 0x57, 0x71, 0x96,
+ 0xec, 0xf0, 0x0b, 0xac, 0xa4, 0x4a, 0xa3,
+ 0x6d, 0x01, 0xba, 0xbd, 0x62, 0xc0, 0x10,
+ 0x54, 0x33, 0x8a, 0x71, 0xef, 0xaa, 0x1c,
+ 0x25, 0x25 ),
+ BIGINT ( 0x46, 0x1e, 0x38, 0x3a, 0x05, 0xc5, 0xaf,
+ 0xb5, 0x2e, 0x58, 0x8a, 0x0e, 0xec, 0x43,
+ 0xd6, 0x6b, 0xf1, 0x97, 0x73, 0x4c, 0x1b,
+ 0xcd, 0x31, 0xb8, 0x94, 0x0b, 0xe4, 0x9d,
+ 0x75, 0x17, 0xa5, 0xc4, 0xc4, 0x2a, 0xf0,
+ 0x32, 0x45, 0x09, 0xe8, 0xf6, 0x62, 0x03,
+ 0x2d, 0xee, 0x6e, 0xd3, 0xfc, 0x41, 0x6b,
+ 0x10, 0x70, 0x9b, 0x87, 0xa7, 0x8d, 0x9f,
+ 0x61, 0xbe, 0xcf, 0x09, 0x82, 0xfe, 0xd3,
+ 0x16, 0x5c, 0x12, 0x63, 0xa3, 0xb6, 0xd6,
+ 0xef, 0xdf, 0xc1, 0xc2, 0x13, 0x09, 0x98,
+ 0x77, 0xe4, 0x97, 0x61, 0x1f, 0x7d, 0xe7,
+ 0x32, 0xbf, 0x4c, 0xd4, 0x0a, 0x54, 0xea,
+ 0x68, 0xe4, 0x1e, 0xb3, 0x06, 0x49, 0xa3,
+ 0x61, 0x6f, 0xd7, 0x4a, 0x21, 0xd4, 0xbc,
+ 0x68, 0x76, 0xf5, 0x20, 0xa1, 0xa8, 0x1a,
+ 0x9f, 0x60, 0x58, 0xff, 0xb6, 0x76, 0x45,
+ 0xe6, 0xed, 0x61, 0x8d, 0xe6, 0xc0, 0x72,
+ 0x1c, 0x07 ) );
+ bigint_subtract_ok ( BIGINT ( 0x83 ),
+ BIGINT ( 0x50 ),
+ BIGINT ( 0xcd ) );
+ bigint_subtract_ok ( BIGINT ( 0x2c, 0x7c ),
+ BIGINT ( 0x49, 0x0e ),
+ BIGINT ( 0x1c, 0x92 ) );
+ bigint_subtract_ok ( BIGINT ( 0x9c, 0x30, 0xbf ),
+ BIGINT ( 0xde, 0x4e, 0x07 ),
+ BIGINT ( 0x42, 0x1d, 0x48 ) );
+ bigint_subtract_ok ( BIGINT ( 0xbb, 0x77, 0x32, 0x5a ),
+ BIGINT ( 0x5a, 0xd5, 0xfe, 0x28 ),
+ BIGINT ( 0x9f, 0x5e, 0xcb, 0xce ) );
+ bigint_subtract_ok ( BIGINT ( 0x7b, 0xaa, 0x16, 0xcf, 0x15, 0x87,
+ 0xe0, 0x4f, 0x2c, 0xa3, 0xec, 0x2f,
+ 0x46, 0xfb, 0x83, 0xc6, 0xe0, 0xee,
+ 0x57, 0xfa, 0x04, 0xce, 0xa6 ),
+ BIGINT ( 0x46, 0x55, 0xb6, 0x23, 0x63, 0xd0,
+ 0x55, 0xdb, 0x8f, 0xcc, 0x55, 0xa8,
+ 0x2f, 0x85, 0xc1, 0x9f, 0x2c, 0x13,
+ 0x10, 0x9e, 0x76, 0x3c, 0x11 ),
+ BIGINT ( 0xca, 0xab, 0x9f, 0x54, 0x4e, 0x48,
+ 0x75, 0x8c, 0x63, 0x28, 0x69, 0x78,
+ 0xe8, 0x8a, 0x3d, 0xd8, 0x4b, 0x24,
+ 0xb8, 0xa4, 0x71, 0x6d, 0x6b ) );
+ bigint_subtract_ok ( BIGINT ( 0x5b, 0x06, 0x77, 0x7b, 0xfd, 0x34,
+ 0x5f, 0x0f, 0xd9, 0xbd, 0x8e, 0x5d,
+ 0xc8, 0x4a, 0x70, 0x95, 0x1b, 0xb6,
+ 0x48, 0xfb, 0x0e, 0x40, 0xce, 0x06,
+ 0x66, 0xcc, 0x29, 0xe9, 0x51, 0x59,
+ 0x59, 0xc9, 0x65, 0x07, 0x75, 0xb8,
+ 0xd4, 0xcb, 0x07, 0x68, 0x14, 0x48,
+ 0xc7, 0x1e, 0xfe, 0xb3, 0x4c, 0xf1,
+ 0x10, 0xf0, 0xc7, 0x82, 0x38, 0x4c,
+ 0xaf, 0x05, 0x6d, 0x91, 0xc5, 0x18,
+ 0xfd, 0x1e, 0x26, 0x1b, 0xef, 0x71,
+ 0x70, 0x2e, 0x06, 0x70, 0x8e, 0x54,
+ 0xfa, 0x2b, 0x4d, 0x96, 0x85, 0x10,
+ 0x03, 0x76, 0xe7, 0x17, 0x59, 0x86,
+ 0x6c, 0x8b, 0x24, 0x6e, 0xd9, 0x30,
+ 0xf3, 0xd2, 0x9b, 0x62, 0xdc, 0x23,
+ 0x54, 0x06, 0x51, 0xb1, 0x95, 0x58,
+ 0xec, 0x27, 0xf6, 0x19, 0xae, 0xf4,
+ 0x31, 0xec, 0x72, 0x53, 0xcd, 0x32,
+ 0xed, 0xf4, 0x25, 0x4a, 0x5b, 0x36,
+ 0xa2, 0xb4, 0xa0, 0x29, 0x0c, 0x6b,
+ 0x3f, 0xc2 ),
+ BIGINT ( 0x7a, 0xd4, 0x25, 0xf1, 0xb5, 0xf5,
+ 0x00, 0x96, 0x47, 0x5b, 0x4f, 0x9f,
+ 0x1f, 0x61, 0x69, 0xd9, 0x72, 0x47,
+ 0xde, 0xbd, 0x87, 0x5d, 0x50, 0x91,
+ 0x69, 0xd8, 0x35, 0xe0, 0x43, 0xd8,
+ 0xd5, 0x15, 0xf2, 0xcd, 0x01, 0x73,
+ 0x0d, 0x34, 0xf0, 0x34, 0x46, 0x76,
+ 0xc0, 0x55, 0x7b, 0x27, 0xf5, 0x7b,
+ 0x55, 0xe9, 0xd0, 0x29, 0x0b, 0x4b,
+ 0x9f, 0x07, 0xbf, 0x2c, 0x3f, 0xef,
+ 0x36, 0x34, 0xde, 0x29, 0x1d, 0x5d,
+ 0x84, 0x5a, 0x5d, 0xc1, 0x02, 0x4d,
+ 0x56, 0xf1, 0x47, 0x39, 0x37, 0xc9,
+ 0xb5, 0x5f, 0x73, 0xec, 0x7c, 0x3d,
+ 0xbd, 0xc0, 0xfd, 0x38, 0x6c, 0x91,
+ 0x88, 0x4a, 0x0f, 0xee, 0xa1, 0x80,
+ 0xf5, 0x6a, 0x7c, 0x8c, 0x02, 0xc3,
+ 0x5a, 0xb2, 0x15, 0xa6, 0x2f, 0x6b,
+ 0x5b, 0x78, 0xb5, 0xf3, 0xbd, 0xd0,
+ 0xc8, 0xbc, 0xb1, 0xbb, 0xe1, 0xce,
+ 0x22, 0x80, 0x34, 0x5a, 0x2a, 0x27,
+ 0x83, 0xdc ),
+ BIGINT ( 0x1f, 0xcd, 0xae, 0x75, 0xb8, 0xc0,
+ 0xa1, 0x86, 0x6d, 0x9d, 0xc1, 0x41,
+ 0x57, 0x16, 0xf9, 0x44, 0x56, 0x91,
+ 0x95, 0xc2, 0x79, 0x1c, 0x82, 0x8b,
+ 0x03, 0x0c, 0x0b, 0xf6, 0xf2, 0x7f,
+ 0x7b, 0x4c, 0x8d, 0xc5, 0x8b, 0xba,
+ 0x38, 0x69, 0xe8, 0xcc, 0x32, 0x2d,
+ 0xf9, 0x36, 0x7c, 0x74, 0xa8, 0x8a,
+ 0x44, 0xf9, 0x08, 0xa6, 0xd2, 0xfe,
+ 0xf0, 0x02, 0x51, 0x9a, 0x7a, 0xd6,
+ 0x39, 0x16, 0xb8, 0x0d, 0x2d, 0xec,
+ 0x14, 0x2c, 0x57, 0x50, 0x73, 0xf8,
+ 0x5c, 0xc5, 0xf9, 0xa2, 0xb2, 0xb9,
+ 0xb1, 0xe8, 0x8c, 0xd5, 0x22, 0xb7,
+ 0x51, 0x35, 0xd8, 0xc9, 0x93, 0x60,
+ 0x94, 0x77, 0x74, 0x8b, 0xc5, 0x5d,
+ 0xa1, 0x64, 0x2a, 0xda, 0x6d, 0x6a,
+ 0x6e, 0x8a, 0x1f, 0x8c, 0x80, 0x77,
+ 0x29, 0x8c, 0x43, 0x9f, 0xf0, 0x9d,
+ 0xda, 0xc8, 0x8c, 0x71, 0x86, 0x97,
+ 0x7f, 0xcb, 0x94, 0x31, 0x1d, 0xbc,
+ 0x44, 0x1a ) );
+ bigint_rol_ok ( BIGINT ( 0xe0 ),
+ BIGINT ( 0xc0 ) );
+ bigint_rol_ok ( BIGINT ( 0x43, 0x1d ),
+ BIGINT ( 0x86, 0x3a ) );
+ bigint_rol_ok ( BIGINT ( 0xac, 0xed, 0x9b ),
+ BIGINT ( 0x59, 0xdb, 0x36 ) );
+ bigint_rol_ok ( BIGINT ( 0x2c, 0xe8, 0x3a, 0x22 ),
+ BIGINT ( 0x59, 0xd0, 0x74, 0x44 ) );
+ bigint_rol_ok ( BIGINT ( 0x4e, 0x88, 0x4a, 0x05, 0x5e, 0x10, 0xee,
+ 0x5b, 0xc6, 0x40, 0x0e, 0x03, 0xd7, 0x0d,
+ 0x28, 0xa5, 0x55, 0xb2, 0x50, 0xef, 0x69,
+ 0xd1, 0x1d ),
+ BIGINT ( 0x9d, 0x10, 0x94, 0x0a, 0xbc, 0x21, 0xdc,
+ 0xb7, 0x8c, 0x80, 0x1c, 0x07, 0xae, 0x1a,
+ 0x51, 0x4a, 0xab, 0x64, 0xa1, 0xde, 0xd3,
+ 0xa2, 0x3a ) );
+ bigint_rol_ok ( BIGINT ( 0x07, 0x62, 0x78, 0x70, 0x2e, 0xd4, 0x41,
+ 0xaa, 0x9b, 0x50, 0xb1, 0x9a, 0x71, 0xf5,
+ 0x1c, 0x2f, 0xe7, 0x0d, 0xf1, 0x46, 0x57,
+ 0x04, 0x99, 0x78, 0x4e, 0x84, 0x78, 0xba,
+ 0x57, 0xea, 0xa5, 0x43, 0xf7, 0x02, 0xf0,
+ 0x7a, 0x22, 0x60, 0x65, 0x42, 0xf2, 0x33,
+ 0x7d, 0xe3, 0xa8, 0x1b, 0xc4, 0x14, 0xdb,
+ 0xee, 0x4a, 0xf1, 0xe1, 0x52, 0xd4, 0xda,
+ 0x23, 0xed, 0x13, 0x5d, 0xea, 0xcf, 0xf6,
+ 0x5e, 0x39, 0x84, 0xe2, 0xb3, 0xa2, 0x05,
+ 0xba, 0xd9, 0x49, 0x8e, 0x75, 0x1d, 0xdb,
+ 0xe6, 0xb1, 0x6e, 0xda, 0x0a, 0x83, 0xd0,
+ 0x6e, 0xcf, 0x7a, 0x66, 0xb7, 0x64, 0x84,
+ 0xf5, 0x09, 0x5a, 0xa8, 0x11, 0x93, 0xf3,
+ 0x4f, 0x02, 0x28, 0x00, 0x3a, 0xf0, 0xa9,
+ 0x08, 0x77, 0x04, 0xf5, 0x04, 0xcd, 0x6b,
+ 0x24, 0xbe, 0x0f, 0x6d, 0xe3, 0xb2, 0xd3,
+ 0x07, 0x68, 0xe9, 0x00, 0x59, 0xa0, 0xe4,
+ 0x9e, 0x5e ),
+ BIGINT ( 0x0e, 0xc4, 0xf0, 0xe0, 0x5d, 0xa8, 0x83,
+ 0x55, 0x36, 0xa1, 0x63, 0x34, 0xe3, 0xea,
+ 0x38, 0x5f, 0xce, 0x1b, 0xe2, 0x8c, 0xae,
+ 0x09, 0x32, 0xf0, 0x9d, 0x08, 0xf1, 0x74,
+ 0xaf, 0xd5, 0x4a, 0x87, 0xee, 0x05, 0xe0,
+ 0xf4, 0x44, 0xc0, 0xca, 0x85, 0xe4, 0x66,
+ 0xfb, 0xc7, 0x50, 0x37, 0x88, 0x29, 0xb7,
+ 0xdc, 0x95, 0xe3, 0xc2, 0xa5, 0xa9, 0xb4,
+ 0x47, 0xda, 0x26, 0xbb, 0xd5, 0x9f, 0xec,
+ 0xbc, 0x73, 0x09, 0xc5, 0x67, 0x44, 0x0b,
+ 0x75, 0xb2, 0x93, 0x1c, 0xea, 0x3b, 0xb7,
+ 0xcd, 0x62, 0xdd, 0xb4, 0x15, 0x07, 0xa0,
+ 0xdd, 0x9e, 0xf4, 0xcd, 0x6e, 0xc9, 0x09,
+ 0xea, 0x12, 0xb5, 0x50, 0x23, 0x27, 0xe6,
+ 0x9e, 0x04, 0x50, 0x00, 0x75, 0xe1, 0x52,
+ 0x10, 0xee, 0x09, 0xea, 0x09, 0x9a, 0xd6,
+ 0x49, 0x7c, 0x1e, 0xdb, 0xc7, 0x65, 0xa6,
+ 0x0e, 0xd1, 0xd2, 0x00, 0xb3, 0x41, 0xc9,
+ 0x3c, 0xbc ) );
+ bigint_ror_ok ( BIGINT ( 0x8f ),
+ BIGINT ( 0x47 ) );
+ bigint_ror_ok ( BIGINT ( 0xaa, 0x1d ),
+ BIGINT ( 0x55, 0x0e ) );
+ bigint_ror_ok ( BIGINT ( 0xf0, 0xbd, 0x68 ),
+ BIGINT ( 0x78, 0x5e, 0xb4 ) );
+ bigint_ror_ok ( BIGINT ( 0x33, 0xa0, 0x3d, 0x95 ),
+ BIGINT ( 0x19, 0xd0, 0x1e, 0xca ) );
+ bigint_ror_ok ( BIGINT ( 0xa1, 0xf4, 0xb9, 0x64, 0x91, 0x99, 0xa1,
+ 0xf4, 0xae, 0xeb, 0x71, 0x97, 0x1b, 0x71,
+ 0x09, 0x38, 0x3f, 0x8f, 0xc5, 0x3a, 0xb9,
+ 0x75, 0x94 ),
+ BIGINT ( 0x50, 0xfa, 0x5c, 0xb2, 0x48, 0xcc, 0xd0,
+ 0xfa, 0x57, 0x75, 0xb8, 0xcb, 0x8d, 0xb8,
+ 0x84, 0x9c, 0x1f, 0xc7, 0xe2, 0x9d, 0x5c,
+ 0xba, 0xca ) );
+ bigint_ror_ok ( BIGINT ( 0xc0, 0xb3, 0x78, 0x46, 0x69, 0x6e, 0x35,
+ 0x94, 0xed, 0x28, 0xdc, 0xfd, 0xf6, 0xdb,
+ 0x2d, 0x24, 0xcb, 0xa4, 0x6f, 0x0e, 0x58,
+ 0x89, 0x04, 0xec, 0xc8, 0x0c, 0x2d, 0xb3,
+ 0x58, 0xa7, 0x22, 0x6d, 0x93, 0xe0, 0xb8,
+ 0x48, 0x6a, 0x3f, 0x04, 0x7e, 0xbe, 0xb8,
+ 0xa7, 0x84, 0xf5, 0xc9, 0x2f, 0x60, 0x9e,
+ 0x7c, 0xbc, 0xaf, 0x28, 0x89, 0x2f, 0xaa,
+ 0xd1, 0x82, 0x77, 0xa4, 0xdf, 0xf3, 0x4a,
+ 0xc6, 0xed, 0xa3, 0x07, 0xb4, 0xa9, 0xfd,
+ 0xef, 0xf8, 0x20, 0xb9, 0xb3, 0xff, 0x35,
+ 0x27, 0xed, 0x02, 0xea, 0xec, 0x63, 0xc0,
+ 0x46, 0x97, 0xc0, 0x4c, 0xca, 0x89, 0xca,
+ 0x14, 0xe8, 0xe0, 0x02, 0x14, 0x44, 0x46,
+ 0xf3, 0x2f, 0xbc, 0x6a, 0x28, 0xa2, 0xbe,
+ 0x20, 0xc8, 0xaa, 0x0f, 0xd9, 0x51, 0x8e,
+ 0x8d, 0x51, 0x29, 0x61, 0xef, 0x48, 0xae,
+ 0x3e, 0xe5, 0x10, 0xbf, 0xda, 0x9b, 0x92,
+ 0xb3, 0x77 ),
+ BIGINT ( 0x60, 0x59, 0xbc, 0x23, 0x34, 0xb7, 0x1a,
+ 0xca, 0x76, 0x94, 0x6e, 0x7e, 0xfb, 0x6d,
+ 0x96, 0x92, 0x65, 0xd2, 0x37, 0x87, 0x2c,
+ 0x44, 0x82, 0x76, 0x64, 0x06, 0x16, 0xd9,
+ 0xac, 0x53, 0x91, 0x36, 0xc9, 0xf0, 0x5c,
+ 0x24, 0x35, 0x1f, 0x82, 0x3f, 0x5f, 0x5c,
+ 0x53, 0xc2, 0x7a, 0xe4, 0x97, 0xb0, 0x4f,
+ 0x3e, 0x5e, 0x57, 0x94, 0x44, 0x97, 0xd5,
+ 0x68, 0xc1, 0x3b, 0xd2, 0x6f, 0xf9, 0xa5,
+ 0x63, 0x76, 0xd1, 0x83, 0xda, 0x54, 0xfe,
+ 0xf7, 0xfc, 0x10, 0x5c, 0xd9, 0xff, 0x9a,
+ 0x93, 0xf6, 0x81, 0x75, 0x76, 0x31, 0xe0,
+ 0x23, 0x4b, 0xe0, 0x26, 0x65, 0x44, 0xe5,
+ 0x0a, 0x74, 0x70, 0x01, 0x0a, 0x22, 0x23,
+ 0x79, 0x97, 0xde, 0x35, 0x14, 0x51, 0x5f,
+ 0x10, 0x64, 0x55, 0x07, 0xec, 0xa8, 0xc7,
+ 0x46, 0xa8, 0x94, 0xb0, 0xf7, 0xa4, 0x57,
+ 0x1f, 0x72, 0x88, 0x5f, 0xed, 0x4d, 0xc9,
+ 0x59, 0xbb ) );
+ bigint_is_zero_ok ( BIGINT ( 0x9b ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0x5a, 0x9d ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0x5f, 0x80, 0x78 ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0xa0, 0x52, 0x47, 0x2e ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0x18, 0x08, 0x49, 0xdb, 0x7b, 0x5c,
+ 0xe7, 0x41, 0x07, 0xdf, 0xed, 0xf9,
+ 0xd3, 0x92, 0x0d, 0x75, 0xa6, 0xb0,
+ 0x14, 0xfa, 0xdd, 0xfd, 0x82 ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0x04, 0x04, 0xb5, 0xf5, 0x01, 0xae,
+ 0x2b, 0x91, 0xa7, 0xc1, 0x49, 0x97,
+ 0x3f, 0x45, 0x53, 0x52, 0xb8, 0x52,
+ 0xf1, 0x62, 0xa5, 0x21, 0x18, 0xd4,
+ 0xb0, 0xb4, 0x8a, 0x17, 0x0e, 0xe8,
+ 0xeb, 0xaa, 0x28, 0xae, 0x3d, 0x8e,
+ 0xe3, 0x6c, 0xd0, 0x01, 0x0c, 0x54,
+ 0xca, 0x23, 0xbb, 0x06, 0xcd, 0x7a,
+ 0x61, 0x89, 0x38, 0x34, 0x6e, 0xc7,
+ 0xc2, 0xee, 0xb1, 0x80, 0x61, 0x0e,
+ 0xc6, 0x8d, 0x65, 0xa0, 0xeb, 0x34,
+ 0xe9, 0x63, 0x09, 0x4c, 0x20, 0xac,
+ 0x42, 0xe3, 0x35, 0xa2, 0x3e, 0x3b,
+ 0x2e, 0x18, 0x70, 0x45, 0x7c, 0xab,
+ 0x42, 0xcc, 0xe0, 0x9e, 0x7c, 0x42,
+ 0xd1, 0xda, 0x6c, 0x51, 0x10, 0x1e,
+ 0x0e, 0x3f, 0xe5, 0xd6, 0xd8, 0x56,
+ 0x08, 0xb2, 0x3b, 0x15, 0xc4, 0x7c,
+ 0x0c, 0x7e, 0xaf, 0x7b, 0x9d, 0xd6,
+ 0x2b, 0xc0, 0x2f, 0xa2, 0xa3, 0xa3,
+ 0x77, 0x58, 0x1b, 0xe9, 0xa8, 0x9a,
+ 0x23, 0x7f ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0x00 ),
+ 1 );
+ bigint_is_zero_ok ( BIGINT ( 0x00, 0x00 ),
+ 1 );
+ bigint_is_zero_ok ( BIGINT ( 0x00, 0x00, 0x00 ),
+ 1 );
+ bigint_is_zero_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00 ),
+ 1 );
+ bigint_is_zero_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00 ),
+ 1 );
+ bigint_is_zero_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00 ),
+ 1 );
+ bigint_is_zero_ok ( BIGINT ( 0xff ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0xff, 0xff ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0xff, 0xff, 0xff ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff ),
+ 0 );
+ bigint_is_zero_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff ),
+ 0 );
+ bigint_is_geq_ok ( BIGINT ( 0xa2 ),
+ BIGINT ( 0x58 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0x58 ),
+ BIGINT ( 0xa2 ),
+ 0 );
+ bigint_is_geq_ok ( BIGINT ( 0xa2 ),
+ BIGINT ( 0xa2 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0x61, 0x29 ),
+ BIGINT ( 0x87, 0xac ),
+ 0 );
+ bigint_is_geq_ok ( BIGINT ( 0x87, 0xac ),
+ BIGINT ( 0x61, 0x29 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0x61, 0x29 ),
+ BIGINT ( 0x61, 0x29 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0xe6, 0x63, 0x14 ),
+ BIGINT ( 0xb7, 0x2b, 0x76 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0xb7, 0x2b, 0x76 ),
+ BIGINT ( 0xe6, 0x63, 0x14 ),
+ 0 );
+ bigint_is_geq_ok ( BIGINT ( 0xe6, 0x63, 0x14 ),
+ BIGINT ( 0xe6, 0x63, 0x14 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0xe7, 0x4f, 0xd4, 0x80 ),
+ BIGINT ( 0xb5, 0xf9, 0x9b, 0x90 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0xb5, 0xf9, 0x9b, 0x90 ),
+ BIGINT ( 0xe7, 0x4f, 0xd4, 0x80 ),
+ 0 );
+ bigint_is_geq_ok ( BIGINT ( 0xe7, 0x4f, 0xd4, 0x80 ),
+ BIGINT ( 0xe7, 0x4f, 0xd4, 0x80 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0xe6, 0x2c, 0x7c, 0x24, 0x78, 0x8f, 0x12,
+ 0x20, 0xde, 0xd3, 0x6b, 0xc9, 0x97, 0x2d,
+ 0x66, 0x74, 0xe5, 0xb6, 0xf7, 0x8f, 0x2b,
+ 0x60, 0x98 ),
+ BIGINT ( 0x77, 0xbc, 0x3b, 0x1b, 0x57, 0x43, 0x3b,
+ 0x8c, 0x82, 0xda, 0xb5, 0xc7, 0x18, 0x09,
+ 0xb3, 0x59, 0x0e, 0x53, 0x2a, 0xb9, 0xd8,
+ 0xa2, 0xb4 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0x77, 0xbc, 0x3b, 0x1b, 0x57, 0x43, 0x3b,
+ 0x8c, 0x82, 0xda, 0xb5, 0xc7, 0x18, 0x09,
+ 0xb3, 0x59, 0x0e, 0x53, 0x2a, 0xb9, 0xd8,
+ 0xa2, 0xb4 ),
+ BIGINT ( 0xe6, 0x2c, 0x7c, 0x24, 0x78, 0x8f, 0x12,
+ 0x20, 0xde, 0xd3, 0x6b, 0xc9, 0x97, 0x2d,
+ 0x66, 0x74, 0xe5, 0xb6, 0xf7, 0x8f, 0x2b,
+ 0x60, 0x98 ),
+ 0 );
+ bigint_is_geq_ok ( BIGINT ( 0xe6, 0x2c, 0x7c, 0x24, 0x78, 0x8f, 0x12,
+ 0x20, 0xde, 0xd3, 0x6b, 0xc9, 0x97, 0x2d,
+ 0x66, 0x74, 0xe5, 0xb6, 0xf7, 0x8f, 0x2b,
+ 0x60, 0x98 ),
+ BIGINT ( 0xe6, 0x2c, 0x7c, 0x24, 0x78, 0x8f, 0x12,
+ 0x20, 0xde, 0xd3, 0x6b, 0xc9, 0x97, 0x2d,
+ 0x66, 0x74, 0xe5, 0xb6, 0xf7, 0x8f, 0x2b,
+ 0x60, 0x98 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0x2a, 0x98, 0xfd, 0x87, 0x5d, 0x9f, 0xb4,
+ 0x8b, 0x5c, 0xcd, 0x5f, 0xcd, 0x53, 0xb3,
+ 0xd1, 0x81, 0x6a, 0x9c, 0x93, 0x66, 0x40,
+ 0xa7, 0x64, 0xe0, 0x8c, 0xec, 0x96, 0x63,
+ 0x4d, 0x29, 0xfa, 0xb1, 0x5d, 0x93, 0x2f,
+ 0xf9, 0x36, 0xea, 0x3b, 0xc1, 0xaf, 0x85,
+ 0xcb, 0xde, 0x2d, 0xc8, 0x48, 0x33, 0xce,
+ 0x7b, 0xa4, 0xa4, 0xda, 0x0f, 0xaa, 0x1b,
+ 0xcb, 0xed, 0xbe, 0x3a, 0xa5, 0xbb, 0x73,
+ 0x28, 0x04, 0xc6, 0x2a, 0xfb, 0x3a, 0xc3,
+ 0xae, 0x42, 0x1f, 0x53, 0x6c, 0xb2, 0x76,
+ 0xb7, 0xe2, 0x88, 0xcb, 0x88, 0xcf, 0xf0,
+ 0x52, 0x81, 0xd3, 0xb2, 0x1f, 0x56, 0xe1,
+ 0xe1, 0x47, 0x93, 0x6f, 0x2b, 0x49, 0xaa,
+ 0x50, 0x99, 0x7a, 0xc4, 0x56, 0xb7, 0x13,
+ 0x80, 0xf4, 0x73, 0x88, 0xc7, 0x39, 0x83,
+ 0x67, 0xc7, 0xcc, 0xb2, 0x28, 0x7a, 0xd3,
+ 0xdc, 0x48, 0xea, 0x62, 0x0d, 0xf5, 0x5a,
+ 0x27, 0x96 ),
+ BIGINT ( 0xd4, 0x6b, 0x0a, 0x2e, 0x9f, 0xde, 0x4b,
+ 0x64, 0xfa, 0x6b, 0x37, 0x73, 0x66, 0x06,
+ 0xee, 0x04, 0xef, 0xe6, 0x3c, 0x7d, 0x57,
+ 0x22, 0x7f, 0x1f, 0x62, 0x1c, 0x7e, 0x20,
+ 0xda, 0x97, 0xd0, 0x27, 0x23, 0xf6, 0x77,
+ 0x5b, 0x49, 0x97, 0xe1, 0x65, 0x91, 0x13,
+ 0x93, 0xd6, 0x12, 0xc3, 0x66, 0x91, 0x76,
+ 0xe8, 0x47, 0x4c, 0x6a, 0x1b, 0xa2, 0x02,
+ 0xf8, 0x94, 0xaa, 0xe0, 0x1b, 0x0b, 0x17,
+ 0x86, 0x5e, 0xf5, 0x17, 0x23, 0xf5, 0x17,
+ 0x91, 0x6b, 0xd7, 0x2f, 0x5a, 0xfe, 0x8a,
+ 0x63, 0x28, 0x31, 0x1e, 0x09, 0x60, 0x29,
+ 0x5d, 0x55, 0xd8, 0x79, 0xeb, 0x78, 0x36,
+ 0x44, 0x69, 0xa4, 0x76, 0xa5, 0x35, 0x30,
+ 0xca, 0xc9, 0xf9, 0x62, 0xd7, 0x82, 0x13,
+ 0x56, 0xd0, 0x58, 0xfe, 0x16, 0x4b, 0xfb,
+ 0xa8, 0x4c, 0xb3, 0xd7, 0xcf, 0x5f, 0x93,
+ 0x9d, 0xc4, 0x11, 0xb4, 0xdd, 0xf8, 0x8f,
+ 0xe1, 0x11 ),
+ 0 );
+ bigint_is_geq_ok ( BIGINT ( 0xd4, 0x6b, 0x0a, 0x2e, 0x9f, 0xde, 0x4b,
+ 0x64, 0xfa, 0x6b, 0x37, 0x73, 0x66, 0x06,
+ 0xee, 0x04, 0xef, 0xe6, 0x3c, 0x7d, 0x57,
+ 0x22, 0x7f, 0x1f, 0x62, 0x1c, 0x7e, 0x20,
+ 0xda, 0x97, 0xd0, 0x27, 0x23, 0xf6, 0x77,
+ 0x5b, 0x49, 0x97, 0xe1, 0x65, 0x91, 0x13,
+ 0x93, 0xd6, 0x12, 0xc3, 0x66, 0x91, 0x76,
+ 0xe8, 0x47, 0x4c, 0x6a, 0x1b, 0xa2, 0x02,
+ 0xf8, 0x94, 0xaa, 0xe0, 0x1b, 0x0b, 0x17,
+ 0x86, 0x5e, 0xf5, 0x17, 0x23, 0xf5, 0x17,
+ 0x91, 0x6b, 0xd7, 0x2f, 0x5a, 0xfe, 0x8a,
+ 0x63, 0x28, 0x31, 0x1e, 0x09, 0x60, 0x29,
+ 0x5d, 0x55, 0xd8, 0x79, 0xeb, 0x78, 0x36,
+ 0x44, 0x69, 0xa4, 0x76, 0xa5, 0x35, 0x30,
+ 0xca, 0xc9, 0xf9, 0x62, 0xd7, 0x82, 0x13,
+ 0x56, 0xd0, 0x58, 0xfe, 0x16, 0x4b, 0xfb,
+ 0xa8, 0x4c, 0xb3, 0xd7, 0xcf, 0x5f, 0x93,
+ 0x9d, 0xc4, 0x11, 0xb4, 0xdd, 0xf8, 0x8f,
+ 0xe1, 0x11 ),
+ BIGINT ( 0x2a, 0x98, 0xfd, 0x87, 0x5d, 0x9f, 0xb4,
+ 0x8b, 0x5c, 0xcd, 0x5f, 0xcd, 0x53, 0xb3,
+ 0xd1, 0x81, 0x6a, 0x9c, 0x93, 0x66, 0x40,
+ 0xa7, 0x64, 0xe0, 0x8c, 0xec, 0x96, 0x63,
+ 0x4d, 0x29, 0xfa, 0xb1, 0x5d, 0x93, 0x2f,
+ 0xf9, 0x36, 0xea, 0x3b, 0xc1, 0xaf, 0x85,
+ 0xcb, 0xde, 0x2d, 0xc8, 0x48, 0x33, 0xce,
+ 0x7b, 0xa4, 0xa4, 0xda, 0x0f, 0xaa, 0x1b,
+ 0xcb, 0xed, 0xbe, 0x3a, 0xa5, 0xbb, 0x73,
+ 0x28, 0x04, 0xc6, 0x2a, 0xfb, 0x3a, 0xc3,
+ 0xae, 0x42, 0x1f, 0x53, 0x6c, 0xb2, 0x76,
+ 0xb7, 0xe2, 0x88, 0xcb, 0x88, 0xcf, 0xf0,
+ 0x52, 0x81, 0xd3, 0xb2, 0x1f, 0x56, 0xe1,
+ 0xe1, 0x47, 0x93, 0x6f, 0x2b, 0x49, 0xaa,
+ 0x50, 0x99, 0x7a, 0xc4, 0x56, 0xb7, 0x13,
+ 0x80, 0xf4, 0x73, 0x88, 0xc7, 0x39, 0x83,
+ 0x67, 0xc7, 0xcc, 0xb2, 0x28, 0x7a, 0xd3,
+ 0xdc, 0x48, 0xea, 0x62, 0x0d, 0xf5, 0x5a,
+ 0x27, 0x96 ),
+ 1 );
+ bigint_is_geq_ok ( BIGINT ( 0x2a, 0x98, 0xfd, 0x87, 0x5d, 0x9f, 0xb4,
+ 0x8b, 0x5c, 0xcd, 0x5f, 0xcd, 0x53, 0xb3,
+ 0xd1, 0x81, 0x6a, 0x9c, 0x93, 0x66, 0x40,
+ 0xa7, 0x64, 0xe0, 0x8c, 0xec, 0x96, 0x63,
+ 0x4d, 0x29, 0xfa, 0xb1, 0x5d, 0x93, 0x2f,
+ 0xf9, 0x36, 0xea, 0x3b, 0xc1, 0xaf, 0x85,
+ 0xcb, 0xde, 0x2d, 0xc8, 0x48, 0x33, 0xce,
+ 0x7b, 0xa4, 0xa4, 0xda, 0x0f, 0xaa, 0x1b,
+ 0xcb, 0xed, 0xbe, 0x3a, 0xa5, 0xbb, 0x73,
+ 0x28, 0x04, 0xc6, 0x2a, 0xfb, 0x3a, 0xc3,
+ 0xae, 0x42, 0x1f, 0x53, 0x6c, 0xb2, 0x76,
+ 0xb7, 0xe2, 0x88, 0xcb, 0x88, 0xcf, 0xf0,
+ 0x52, 0x81, 0xd3, 0xb2, 0x1f, 0x56, 0xe1,
+ 0xe1, 0x47, 0x93, 0x6f, 0x2b, 0x49, 0xaa,
+ 0x50, 0x99, 0x7a, 0xc4, 0x56, 0xb7, 0x13,
+ 0x80, 0xf4, 0x73, 0x88, 0xc7, 0x39, 0x83,
+ 0x67, 0xc7, 0xcc, 0xb2, 0x28, 0x7a, 0xd3,
+ 0xdc, 0x48, 0xea, 0x62, 0x0d, 0xf5, 0x5a,
+ 0x27, 0x96 ),
+ BIGINT ( 0x2a, 0x98, 0xfd, 0x87, 0x5d, 0x9f, 0xb4,
+ 0x8b, 0x5c, 0xcd, 0x5f, 0xcd, 0x53, 0xb3,
+ 0xd1, 0x81, 0x6a, 0x9c, 0x93, 0x66, 0x40,
+ 0xa7, 0x64, 0xe0, 0x8c, 0xec, 0x96, 0x63,
+ 0x4d, 0x29, 0xfa, 0xb1, 0x5d, 0x93, 0x2f,
+ 0xf9, 0x36, 0xea, 0x3b, 0xc1, 0xaf, 0x85,
+ 0xcb, 0xde, 0x2d, 0xc8, 0x48, 0x33, 0xce,
+ 0x7b, 0xa4, 0xa4, 0xda, 0x0f, 0xaa, 0x1b,
+ 0xcb, 0xed, 0xbe, 0x3a, 0xa5, 0xbb, 0x73,
+ 0x28, 0x04, 0xc6, 0x2a, 0xfb, 0x3a, 0xc3,
+ 0xae, 0x42, 0x1f, 0x53, 0x6c, 0xb2, 0x76,
+ 0xb7, 0xe2, 0x88, 0xcb, 0x88, 0xcf, 0xf0,
+ 0x52, 0x81, 0xd3, 0xb2, 0x1f, 0x56, 0xe1,
+ 0xe1, 0x47, 0x93, 0x6f, 0x2b, 0x49, 0xaa,
+ 0x50, 0x99, 0x7a, 0xc4, 0x56, 0xb7, 0x13,
+ 0x80, 0xf4, 0x73, 0x88, 0xc7, 0x39, 0x83,
+ 0x67, 0xc7, 0xcc, 0xb2, 0x28, 0x7a, 0xd3,
+ 0xdc, 0x48, 0xea, 0x62, 0x0d, 0xf5, 0x5a,
+ 0x27, 0x96 ),
+ 1 );
+ bigint_bit_is_set_ok ( BIGINT ( 0x37 ),
+ 0, 1 );
+ bigint_bit_is_set_ok ( BIGINT ( 0xe6, 0xcb ),
+ 0, 1 );
+ bigint_bit_is_set_ok ( BIGINT ( 0xd9, 0x0c, 0x5b ),
+ 0, 1 );
+ bigint_bit_is_set_ok ( BIGINT ( 0x8b, 0x56, 0x89, 0xaf ),
+ 0, 1 );
+ bigint_bit_is_set_ok ( BIGINT ( 0x25, 0xfc, 0xaf, 0xeb, 0x81, 0xc3,
+ 0xb8, 0x2f, 0xbb, 0xe3, 0x07, 0xb2,
+ 0xe2, 0x2a, 0xe2, 0x2d, 0xb4, 0x4d,
+ 0x6d, 0xec, 0x51, 0xa0, 0x2f ),
+ 0, 1 );
+ bigint_bit_is_set_ok ( BIGINT ( 0x25, 0xfc, 0xaf, 0xeb, 0x81, 0xc3,
+ 0xb8, 0x2f, 0xbb, 0xe3, 0x07, 0xb2,
+ 0xe2, 0x2a, 0xe2, 0x2d, 0xb4, 0x4d,
+ 0x6d, 0xec, 0x51, 0xa0, 0x2f ),
+ 45, 0 );
+ bigint_bit_is_set_ok ( BIGINT ( 0x88, 0x04, 0xec, 0xe6, 0xfb, 0x31,
+ 0x87, 0x43, 0xb2, 0x04, 0x9e, 0x09,
+ 0xba, 0x3e, 0x6d, 0x64, 0x1a, 0x85,
+ 0xb6, 0x46, 0x7d, 0x71, 0x3c, 0x06,
+ 0xd6, 0x40, 0x52, 0x39, 0x95, 0xa1,
+ 0x06, 0xff, 0x6a, 0x5c, 0xa3, 0x6d,
+ 0x4a, 0xc9, 0x77, 0x87, 0x75, 0x25,
+ 0x57, 0x65, 0x72, 0x73, 0x64, 0x7e,
+ 0xe9, 0x16, 0x17, 0xf3, 0x65, 0x3f,
+ 0xd5, 0xcc, 0xd7, 0xa2, 0xee, 0xe7,
+ 0x8d, 0x48, 0xd5, 0x7e, 0xdd, 0x59,
+ 0x4b, 0xf0, 0x96, 0x8b, 0x21, 0x65,
+ 0x04, 0x66, 0xc5, 0xff, 0x3e, 0x60,
+ 0xba, 0x28, 0x38, 0x7d, 0x9c, 0x09,
+ 0xd1, 0x8e, 0xac, 0x73, 0x8e, 0xf2,
+ 0x1e, 0xdf, 0x83, 0x6e, 0x54, 0xd5,
+ 0x34, 0xc1, 0xc6, 0xf9, 0x62, 0x2a,
+ 0x7d, 0xec, 0x47, 0xf2, 0xfc, 0xa2,
+ 0x10, 0x0a, 0x67, 0x1b, 0xc6, 0x11,
+ 0x9d, 0x68, 0x25, 0x8b, 0xb5, 0x9b,
+ 0x83, 0xf8, 0xa2, 0x11, 0xf5, 0xd4,
+ 0xcb, 0xe0 ),
+ 0, 0 );
+ bigint_bit_is_set_ok ( BIGINT ( 0x88, 0x04, 0xec, 0xe6, 0xfb, 0x31,
+ 0x87, 0x43, 0xb2, 0x04, 0x9e, 0x09,
+ 0xba, 0x3e, 0x6d, 0x64, 0x1a, 0x85,
+ 0xb6, 0x46, 0x7d, 0x71, 0x3c, 0x06,
+ 0xd6, 0x40, 0x52, 0x39, 0x95, 0xa1,
+ 0x06, 0xff, 0x6a, 0x5c, 0xa3, 0x6d,
+ 0x4a, 0xc9, 0x77, 0x87, 0x75, 0x25,
+ 0x57, 0x65, 0x72, 0x73, 0x64, 0x7e,
+ 0xe9, 0x16, 0x17, 0xf3, 0x65, 0x3f,
+ 0xd5, 0xcc, 0xd7, 0xa2, 0xee, 0xe7,
+ 0x8d, 0x48, 0xd5, 0x7e, 0xdd, 0x59,
+ 0x4b, 0xf0, 0x96, 0x8b, 0x21, 0x65,
+ 0x04, 0x66, 0xc5, 0xff, 0x3e, 0x60,
+ 0xba, 0x28, 0x38, 0x7d, 0x9c, 0x09,
+ 0xd1, 0x8e, 0xac, 0x73, 0x8e, 0xf2,
+ 0x1e, 0xdf, 0x83, 0x6e, 0x54, 0xd5,
+ 0x34, 0xc1, 0xc6, 0xf9, 0x62, 0x2a,
+ 0x7d, 0xec, 0x47, 0xf2, 0xfc, 0xa2,
+ 0x10, 0x0a, 0x67, 0x1b, 0xc6, 0x11,
+ 0x9d, 0x68, 0x25, 0x8b, 0xb5, 0x9b,
+ 0x83, 0xf8, 0xa2, 0x11, 0xf5, 0xd4,
+ 0xcb, 0xe0 ),
+ 45, 1 );
+ bigint_bit_is_set_ok ( BIGINT ( 0x88, 0x04, 0xec, 0xe6, 0xfb, 0x31,
+ 0x87, 0x43, 0xb2, 0x04, 0x9e, 0x09,
+ 0xba, 0x3e, 0x6d, 0x64, 0x1a, 0x85,
+ 0xb6, 0x46, 0x7d, 0x71, 0x3c, 0x06,
+ 0xd6, 0x40, 0x52, 0x39, 0x95, 0xa1,
+ 0x06, 0xff, 0x6a, 0x5c, 0xa3, 0x6d,
+ 0x4a, 0xc9, 0x77, 0x87, 0x75, 0x25,
+ 0x57, 0x65, 0x72, 0x73, 0x64, 0x7e,
+ 0xe9, 0x16, 0x17, 0xf3, 0x65, 0x3f,
+ 0xd5, 0xcc, 0xd7, 0xa2, 0xee, 0xe7,
+ 0x8d, 0x48, 0xd5, 0x7e, 0xdd, 0x59,
+ 0x4b, 0xf0, 0x96, 0x8b, 0x21, 0x65,
+ 0x04, 0x66, 0xc5, 0xff, 0x3e, 0x60,
+ 0xba, 0x28, 0x38, 0x7d, 0x9c, 0x09,
+ 0xd1, 0x8e, 0xac, 0x73, 0x8e, 0xf2,
+ 0x1e, 0xdf, 0x83, 0x6e, 0x54, 0xd5,
+ 0x34, 0xc1, 0xc6, 0xf9, 0x62, 0x2a,
+ 0x7d, 0xec, 0x47, 0xf2, 0xfc, 0xa2,
+ 0x10, 0x0a, 0x67, 0x1b, 0xc6, 0x11,
+ 0x9d, 0x68, 0x25, 0x8b, 0xb5, 0x9b,
+ 0x83, 0xf8, 0xa2, 0x11, 0xf5, 0xd4,
+ 0xcb, 0xe0 ),
+ 1013, 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x3a ),
+ 6 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x03 ),
+ 2 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00 ),
+ 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xff ),
+ 8 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x20, 0x30 ),
+ 14 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x10 ),
+ 5 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00 ),
+ 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xff, 0xff ),
+ 16 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x06, 0xdb, 0x7a ),
+ 19 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x00 ),
+ 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x00 ),
+ 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xff, 0xff, 0xff ),
+ 24 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xee, 0xcb, 0x7b, 0xfd ),
+ 32 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x01, 0xdd ),
+ 9 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00 ),
+ 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff ),
+ 32 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x32, 0x39, 0x96, 0x52, 0x10, 0x67,
+ 0x7e, 0x32, 0xfc, 0x4e, 0x56, 0xc3,
+ 0x68, 0x18, 0x76, 0x1a, 0xac, 0x0e,
+ 0x93, 0xee, 0x55, 0xc5, 0x6e ),
+ 182 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0xc8, 0xe6, 0x59 ),
+ 24 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00 ),
+ 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff ),
+ 184 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xcd, 0xb3, 0x22, 0x30, 0xdd, 0xa7,
+ 0xff, 0x37, 0xbf, 0xe3, 0x38, 0xf7,
+ 0xe1, 0x41, 0x73, 0xea, 0x3a, 0xfc,
+ 0x78, 0x9e, 0xfb, 0x4f, 0x85, 0xdc,
+ 0x1c, 0x40, 0x89, 0x6e, 0xda, 0xf9,
+ 0x9d, 0x6d, 0x12, 0x97, 0xb1, 0x80,
+ 0x2a, 0xeb, 0x91, 0xce, 0x3b, 0x83,
+ 0xb8, 0xa5, 0x3d, 0xce, 0x46, 0x56,
+ 0xb7, 0xd1, 0x28, 0xbc, 0x93, 0x4e,
+ 0x8c, 0x29, 0x6d, 0x2c, 0xcc, 0x58,
+ 0x49, 0x2f, 0x37, 0xa0, 0x08, 0x37,
+ 0x86, 0xdd, 0x38, 0x21, 0xa7, 0x57,
+ 0x37, 0xe3, 0xc5, 0xcc, 0x50, 0x11,
+ 0x1a, 0xe4, 0xea, 0xe7, 0x4d, 0x3c,
+ 0x37, 0x65, 0x78, 0xd1, 0xf6, 0xc3,
+ 0x94, 0x46, 0xd4, 0x0e, 0xd3, 0x9a,
+ 0x21, 0x8b, 0xa6, 0x54, 0xc0, 0xd2,
+ 0x88, 0x07, 0x24, 0xbf, 0x7d, 0x31,
+ 0xfd, 0x15, 0xa8, 0x92, 0x65, 0xe1,
+ 0x8d, 0xed, 0x70, 0x7b, 0x68, 0x0f,
+ 0xcc, 0x13, 0xb9, 0xb2, 0xdd, 0x3c,
+ 0x6a, 0x52 ),
+ 1024 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x66, 0xd9,
+ 0x91, 0x18, 0x6e, 0xd3, 0xff, 0x9b,
+ 0xdf, 0xf1, 0x9c, 0x7b, 0xf0, 0xa0,
+ 0xb9, 0xf5 ),
+ 127 );
+ bigint_max_set_bit_ok ( BIGINT ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00 ),
+ 0 );
+ bigint_max_set_bit_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff ),
+ 1024 );
+ bigint_multiply_ok ( BIGINT ( 0xf0 ),
+ BIGINT ( 0xeb ),
+ BIGINT ( 0xdc, 0x50 ) );
+ bigint_multiply_ok ( BIGINT ( 0xd7, 0x16 ),
+ BIGINT ( 0x88, 0xfb ),
+ BIGINT ( 0x73, 0x16, 0x92, 0x92 ) );
+ bigint_multiply_ok ( BIGINT ( 0xfe, 0xed, 0x1d ),
+ BIGINT ( 0x69, 0x9c, 0x03 ),
+ BIGINT ( 0x69, 0x2a, 0x9c, 0x5f, 0x73, 0x57 ) );
+ bigint_multiply_ok ( BIGINT ( 0x96, 0xe9, 0x6f, 0x81 ),
+ BIGINT ( 0x67, 0x3c, 0x5a, 0x16 ),
+ BIGINT ( 0x3c, 0xdb, 0x7f, 0xae, 0x12, 0x7e,
+ 0xef, 0x16 ) );
+ bigint_multiply_ok ( BIGINT ( 0xe8, 0x08, 0x0b, 0xe9, 0x29, 0x36,
+ 0xea, 0x51, 0x1d, 0x75, 0x1a, 0xd5,
+ 0xba, 0xc6, 0xa0, 0xf3, 0x48, 0x5c,
+ 0xdf, 0x42, 0xdf, 0x28, 0x38 ),
+ BIGINT ( 0x22, 0x07, 0x41, 0x54, 0x4e, 0xf9,
+ 0x90, 0xa8, 0xaf, 0xba, 0xf6, 0xb0,
+ 0x35, 0x7e, 0x98, 0xef, 0x2c, 0x31,
+ 0xc9, 0xa7, 0x25, 0x74, 0x8d ),
+ BIGINT ( 0x1e, 0xd7, 0xa5, 0x03, 0xc0, 0x18,
+ 0x2e, 0x29, 0xb1, 0x3e, 0x96, 0x71,
+ 0x90, 0xa5, 0x6d, 0x43, 0x58, 0xf7,
+ 0x22, 0x80, 0x0b, 0x21, 0xc6, 0x70,
+ 0x90, 0x1c, 0xa8, 0x85, 0x87, 0xaf,
+ 0xd7, 0xdd, 0x27, 0x69, 0xaf, 0x20,
+ 0xa0, 0x2d, 0x43, 0x5d, 0xda, 0xba,
+ 0x4b, 0x3a, 0x86, 0xd8 ) );
+ bigint_multiply_ok ( BIGINT ( 0xa2, 0x0f, 0xc6, 0x08, 0x0a, 0x01,
+ 0x19, 0x42, 0x0e, 0xaa, 0x5c, 0xae,
+ 0x4f, 0x4e, 0xb0, 0xad, 0xb2, 0xe8,
+ 0xee, 0xd5, 0x65, 0xec, 0x5a, 0xda,
+ 0xc0, 0xba, 0x78, 0xa8, 0x0f, 0x15,
+ 0x39, 0xd7, 0x7a, 0x10, 0xc2, 0xa7,
+ 0xec, 0x44, 0xac, 0xad, 0x39, 0x04,
+ 0x2e, 0x66, 0x54, 0x70, 0x57, 0xee,
+ 0xf6, 0x97, 0x19, 0x71, 0x16, 0xf9,
+ 0xbb, 0x2e, 0x84, 0x09, 0x6e, 0x9a,
+ 0x3b, 0x16, 0xb2, 0x65, 0x74, 0x50,
+ 0x19, 0xd1, 0xe9, 0x95, 0xa0, 0x7b,
+ 0x33, 0xb5, 0xac, 0x7c, 0x9e, 0xd4,
+ 0x68, 0x0d, 0xc9, 0xe4, 0x03, 0x86,
+ 0x1a, 0xa3, 0x42, 0x33, 0x28, 0x14,
+ 0x12, 0x7d, 0x5a, 0xd9, 0x30, 0x18,
+ 0x0a, 0xf4, 0x0c, 0x96, 0x58, 0xc9,
+ 0xb5, 0x37, 0xdb, 0x49, 0xdc, 0x01,
+ 0x4a, 0xcb, 0x6d, 0x87, 0x52, 0xf6,
+ 0xae, 0xa7, 0x71, 0x31, 0x9a, 0x1a,
+ 0xe2, 0x1c, 0x87, 0x51, 0xc9, 0xeb,
+ 0x70, 0x71 ),
+ BIGINT ( 0x7c, 0xdd, 0x2f, 0x5d, 0x27, 0xfe,
+ 0xca, 0x70, 0x96, 0xc3, 0xb1, 0x1f,
+ 0xac, 0xa9, 0x3a, 0xdc, 0xcd, 0xbc,
+ 0x58, 0xb4, 0xde, 0xe7, 0xe5, 0x34,
+ 0x1a, 0xc0, 0xb9, 0x46, 0xf7, 0x52,
+ 0x76, 0x23, 0xe8, 0xe9, 0x92, 0xa1,
+ 0x86, 0x3c, 0x6f, 0xf1, 0x22, 0xf4,
+ 0x72, 0xb1, 0xde, 0xd3, 0x8f, 0x11,
+ 0x9e, 0x52, 0xe5, 0x81, 0x54, 0xe9,
+ 0xa7, 0x72, 0x3f, 0x3e, 0xa0, 0x80,
+ 0xbb, 0xae, 0x0e, 0x30, 0x6a, 0x11,
+ 0x91, 0x11, 0x3b, 0x3f, 0x44, 0x1f,
+ 0x8d, 0x4d, 0xea, 0xdd, 0x09, 0x95,
+ 0x9d, 0x02, 0xa6, 0x6d, 0x3b, 0x08,
+ 0x40, 0x8d, 0xb4, 0x4b, 0x05, 0x74,
+ 0x8c, 0x1f, 0xaa, 0x61, 0x6f, 0x0e,
+ 0xcc, 0xcf, 0xe0, 0x81, 0x03, 0xe4,
+ 0x9b, 0x11, 0xd9, 0xab, 0xf3, 0x24,
+ 0xe2, 0x3b, 0xe0, 0x05, 0x60, 0x65,
+ 0x16, 0xc6, 0x2e, 0x83, 0xa0, 0x98,
+ 0x8e, 0x11, 0x05, 0x00, 0xe4, 0x3f,
+ 0x7e, 0x65 ),
+ BIGINT ( 0x4f, 0x0b, 0xa9, 0x85, 0xb8, 0x31,
+ 0x48, 0xea, 0x11, 0x44, 0xaf, 0x2d,
+ 0xed, 0x1a, 0x76, 0x45, 0xac, 0x87,
+ 0x0c, 0xf3, 0xd7, 0xc4, 0x8e, 0x5c,
+ 0xd7, 0xdf, 0x28, 0x74, 0xa6, 0x40,
+ 0xe4, 0x6b, 0x5b, 0x19, 0x36, 0x37,
+ 0x9c, 0xcd, 0x43, 0x76, 0x15, 0x00,
+ 0x5d, 0x23, 0xa2, 0x8a, 0x53, 0x25,
+ 0xbf, 0x18, 0xda, 0xe6, 0x09, 0xdf,
+ 0xaa, 0xeb, 0x9a, 0x82, 0x01, 0x14,
+ 0x2b, 0x20, 0x2b, 0xb6, 0x22, 0x62,
+ 0x6b, 0xcc, 0xd4, 0xc9, 0x02, 0x67,
+ 0x95, 0x43, 0x75, 0x4e, 0x97, 0x4e,
+ 0xec, 0x04, 0xde, 0x29, 0x0a, 0xef,
+ 0xf7, 0xc1, 0x72, 0x8c, 0x64, 0x38,
+ 0x16, 0x47, 0x9f, 0x16, 0x0c, 0xa5,
+ 0x79, 0x6b, 0xea, 0x2e, 0x4c, 0x3d,
+ 0x0c, 0xe6, 0x57, 0x51, 0x65, 0xa5,
+ 0x3b, 0xca, 0xae, 0x54, 0x0c, 0x67,
+ 0xf8, 0x23, 0x00, 0xc9, 0x8d, 0xe6,
+ 0x16, 0x91, 0x19, 0xb3, 0x5b, 0x68,
+ 0x7b, 0xf2, 0xe2, 0x5d, 0x69, 0x48,
+ 0x3f, 0x2b, 0xa0, 0x4f, 0x7c, 0x3c,
+ 0x26, 0xf9, 0xd9, 0xfd, 0x3d, 0x5d,
+ 0xd6, 0x05, 0x00, 0xd8, 0xdf, 0x5a,
+ 0x56, 0x8f, 0x16, 0x68, 0x4f, 0x15,
+ 0x19, 0x9d, 0xd7, 0x11, 0x51, 0x7d,
+ 0x73, 0x5c, 0xd4, 0xd5, 0xb4, 0xc7,
+ 0x42, 0xe3, 0xee, 0xf1, 0x67, 0xd6,
+ 0x69, 0x72, 0x04, 0x4b, 0x88, 0x3d,
+ 0x05, 0xd8, 0x1e, 0x50, 0xcb, 0xce,
+ 0x39, 0x19, 0x42, 0xb6, 0xa7, 0xf3,
+ 0xba, 0x78, 0x90, 0xd2, 0x09, 0x05,
+ 0x87, 0xf8, 0xc0, 0x9c, 0x47, 0xff,
+ 0xbf, 0xaa, 0x21, 0x8d, 0x81, 0x86,
+ 0xcd, 0x58, 0xdf, 0x30, 0xf1, 0xd1,
+ 0x60, 0x53, 0x85, 0x40, 0xbf, 0x14,
+ 0x3e, 0xdc, 0x9e, 0x9e, 0xc4, 0xc7,
+ 0x48, 0xa0, 0x83, 0xe0, 0x99, 0x8b,
+ 0x43, 0xf8, 0x52, 0x8a, 0x15, 0x88,
+ 0x89, 0x83, 0x7d, 0x71, 0xbb, 0x62,
+ 0x12, 0x7a, 0x23, 0x85, 0x3a, 0xbb,
+ 0xdb, 0x09, 0xfa, 0x95 ) );
+ bigint_multiply_ok ( BIGINT ( 0xff ),
+ BIGINT ( 0xff ),
+ BIGINT ( 0xfe, 0x01 ) );
+ bigint_multiply_ok ( BIGINT ( 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff ),
+ BIGINT ( 0xff, 0xfe, 0x00, 0x01 ) );
+ bigint_multiply_ok ( BIGINT ( 0xff, 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xfe, 0x00, 0x00, 0x01 ) );
+ bigint_multiply_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xff, 0xfe, 0x00, 0x00,
+ 0x00, 0x01 ) );
+ bigint_multiply_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xfe, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01 ) );
+ bigint_multiply_ok ( BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff ),
+ BIGINT ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xfe, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01 ) );
+ bigint_mod_multiply_ok ( BIGINT ( 0x37 ),
+ BIGINT ( 0x67 ),
+ BIGINT ( 0x3f ),
+ BIGINT ( 0x3a ) );
+ bigint_mod_multiply_ok ( BIGINT ( 0x45, 0x94 ),
+ BIGINT ( 0xbd, 0xd2 ),
+ BIGINT ( 0xca, 0xc7 ),
+ BIGINT ( 0xac, 0xc1 ) );
+ bigint_mod_multiply_ok ( BIGINT ( 0x8e, 0xcd, 0x74 ),
+ BIGINT ( 0xe2, 0xf1, 0xea ),
+ BIGINT ( 0x59, 0x51, 0x53 ),
+ BIGINT ( 0x22, 0xdd, 0x1c ) );
+ bigint_mod_multiply_ok ( BIGINT ( 0xc2, 0xa8, 0x40, 0x6f ),
+ BIGINT ( 0x29, 0xd7, 0xf4, 0x77 ),
+ BIGINT ( 0xbb, 0xbd, 0xdb, 0x3d ),
+ BIGINT ( 0x8f, 0x39, 0xd0, 0x47 ) );
+ bigint_mod_multiply_ok ( BIGINT ( 0x2e, 0xcb, 0x74, 0x7c, 0x64, 0x60,
+ 0xb3, 0x44, 0xf3, 0x23, 0x49, 0x4a,
+ 0xc6, 0xb6, 0xbf, 0xea, 0x80, 0xd8,
+ 0x34, 0xc5, 0x54, 0x22, 0x09 ),
+ BIGINT ( 0x61, 0x2c, 0x5a, 0xc5, 0xde, 0x07,
+ 0x65, 0x8e, 0xab, 0x88, 0x1a, 0x2e,
+ 0x7a, 0x95, 0x17, 0xe3, 0x3b, 0x17,
+ 0xe4, 0x21, 0xb0, 0xb4, 0x57 ),
+ BIGINT ( 0x8e, 0x46, 0xa5, 0x87, 0x7b, 0x7f,
+ 0xc4, 0xd7, 0x31, 0xb1, 0x94, 0xe7,
+ 0xe7, 0x1c, 0x7e, 0x7a, 0xc2, 0x6c,
+ 0xce, 0xcb, 0xc8, 0x5d, 0x70 ),
+ BIGINT ( 0x1e, 0xd1, 0x5b, 0x3d, 0x1d, 0x17,
+ 0x7c, 0x31, 0x95, 0x13, 0x1b, 0xd8,
+ 0xee, 0x0a, 0xb0, 0xe1, 0x5b, 0x13,
+ 0xad, 0x83, 0xe9, 0xf8, 0x7f ) );
+ bigint_mod_multiply_ok ( BIGINT ( 0x56, 0x37, 0xab, 0x07, 0x8b, 0x25,
+ 0xa7, 0xc2, 0x50, 0x30, 0x43, 0xfc,
+ 0x63, 0x8b, 0xdf, 0x84, 0x68, 0x85,
+ 0xca, 0xce, 0x44, 0x5c, 0xb1, 0x14,
+ 0xa4, 0xb5, 0xba, 0x43, 0xe0, 0x31,
+ 0x45, 0x6b, 0x82, 0xa9, 0x0b, 0x9e,
+ 0x3a, 0xb0, 0x39, 0x09, 0x2a, 0x68,
+ 0x2e, 0x0f, 0x09, 0x54, 0x47, 0x04,
+ 0xdb, 0xcf, 0x4a, 0x3a, 0x2d, 0x7b,
+ 0x7d, 0x50, 0xa4, 0xc5, 0xeb, 0x13,
+ 0xdd, 0x49, 0x61, 0x7d, 0x18, 0xa1,
+ 0x0d, 0x6b, 0x58, 0xba, 0x9f, 0x7c,
+ 0x81, 0x34, 0x9e, 0xf9, 0x9c, 0x9e,
+ 0x28, 0xa8, 0x1c, 0x15, 0x16, 0x20,
+ 0x3c, 0x0a, 0xb1, 0x11, 0x06, 0x93,
+ 0xbc, 0xd8, 0x4e, 0x49, 0xae, 0x7b,
+ 0xb4, 0x02, 0x8b, 0x1c, 0x5b, 0x18,
+ 0xb4, 0xac, 0x7f, 0xdd, 0x70, 0xef,
+ 0x87, 0xac, 0x1b, 0xac, 0x25, 0xa3,
+ 0xc9, 0xa7, 0x3a, 0xc5, 0x76, 0x68,
+ 0x09, 0x1f, 0xa1, 0x48, 0x53, 0xb6,
+ 0x13, 0xac ),
+ BIGINT ( 0xef, 0x5c, 0x1f, 0x1a, 0x44, 0x64,
+ 0x66, 0xcf, 0xdd, 0x3f, 0x0b, 0x27,
+ 0x81, 0xa7, 0x91, 0x7a, 0x35, 0x7b,
+ 0x0f, 0x46, 0x5e, 0xca, 0xbf, 0xf8,
+ 0x50, 0x5e, 0x99, 0x7c, 0xc6, 0x64,
+ 0x43, 0x00, 0x9f, 0xb2, 0xda, 0xfa,
+ 0x42, 0x15, 0x9c, 0xa3, 0xd6, 0xc8,
+ 0x64, 0xa7, 0x65, 0x4a, 0x98, 0xf7,
+ 0xb3, 0x96, 0x5f, 0x42, 0xf9, 0x73,
+ 0xe1, 0x75, 0xc3, 0xc4, 0x0b, 0x5d,
+ 0x5f, 0xf3, 0x04, 0x8a, 0xee, 0x59,
+ 0xa6, 0x1b, 0x06, 0x38, 0x0b, 0xa2,
+ 0x9f, 0xb4, 0x4f, 0x6d, 0x50, 0x5e,
+ 0x37, 0x37, 0x21, 0x83, 0x9d, 0xa3,
+ 0x12, 0x16, 0x4d, 0xab, 0x36, 0x51,
+ 0x21, 0xb1, 0x74, 0x66, 0x40, 0x9a,
+ 0xd3, 0x72, 0xcc, 0x18, 0x40, 0x53,
+ 0x89, 0xff, 0xd7, 0x00, 0x8d, 0x7e,
+ 0x93, 0x81, 0xdb, 0x29, 0xb6, 0xd7,
+ 0x23, 0x2b, 0x67, 0x2f, 0x11, 0x98,
+ 0x49, 0x87, 0x2f, 0x46, 0xb7, 0x33,
+ 0x6d, 0x12 ),
+ BIGINT ( 0x67, 0x7a, 0x17, 0x6a, 0xd2, 0xf8,
+ 0x49, 0xfb, 0x7c, 0x95, 0x25, 0x54,
+ 0xf0, 0xab, 0x5b, 0xb3, 0x0e, 0x01,
+ 0xab, 0xd3, 0x65, 0x6f, 0x7e, 0x18,
+ 0x05, 0xed, 0x9b, 0xc4, 0x90, 0x6c,
+ 0xd0, 0x6d, 0x94, 0x79, 0x28, 0xd6,
+ 0x24, 0x77, 0x9a, 0x08, 0xd2, 0x2f,
+ 0x7c, 0x2d, 0xa0, 0x0c, 0x14, 0xbe,
+ 0x7b, 0xee, 0x9e, 0x48, 0x88, 0x3c,
+ 0x8f, 0x9f, 0xb9, 0x7a, 0xcb, 0x98,
+ 0x76, 0x61, 0x0d, 0xee, 0xa2, 0x42,
+ 0x67, 0x1b, 0x2c, 0x42, 0x8f, 0x41,
+ 0xcc, 0x78, 0xba, 0xba, 0xaa, 0xa2,
+ 0x92, 0xb0, 0x6e, 0x0c, 0x4e, 0xe1,
+ 0xa5, 0x13, 0x7d, 0x8a, 0x8f, 0x81,
+ 0x95, 0x8a, 0xdf, 0x57, 0x93, 0x88,
+ 0x27, 0x4f, 0x1a, 0x59, 0xa4, 0x74,
+ 0x22, 0xa9, 0x78, 0xe5, 0xed, 0xb1,
+ 0x09, 0x26, 0x59, 0xde, 0x88, 0x21,
+ 0x8d, 0xa2, 0xa8, 0x58, 0x10, 0x7b,
+ 0x65, 0x96, 0xbf, 0x69, 0x3b, 0xc5,
+ 0x55, 0xf8 ),
+ BIGINT ( 0x15, 0xf7, 0x00, 0xeb, 0xc7, 0x5a,
+ 0x6f, 0xf0, 0x50, 0xf3, 0x21, 0x8a,
+ 0x8e, 0xa6, 0xf6, 0x67, 0x56, 0x7d,
+ 0x07, 0x45, 0x89, 0xdb, 0xd7, 0x7e,
+ 0x9e, 0x28, 0x7f, 0xfb, 0xed, 0xca,
+ 0x2c, 0xbf, 0x47, 0x77, 0x99, 0x95,
+ 0xf3, 0xd6, 0x9d, 0xc5, 0x57, 0x81,
+ 0x7f, 0x97, 0xf2, 0x6b, 0x24, 0xee,
+ 0xce, 0xc5, 0x9b, 0xe6, 0x42, 0x2d,
+ 0x37, 0xb7, 0xeb, 0x3d, 0xb5, 0xf7,
+ 0x1e, 0x86, 0xc2, 0x40, 0x44, 0xc9,
+ 0x85, 0x5a, 0x1a, 0xc0, 0xac, 0x9e,
+ 0x78, 0x69, 0x00, 0x7b, 0x93, 0x65,
+ 0xd7, 0x7f, 0x0c, 0xd6, 0xba, 0x4f,
+ 0x06, 0x00, 0x61, 0x05, 0xb2, 0x44,
+ 0xb4, 0xe7, 0xbb, 0x3b, 0x96, 0xb0,
+ 0x6d, 0xe8, 0x43, 0xd2, 0x03, 0xb7,
+ 0x0a, 0xc4, 0x6d, 0x30, 0xd8, 0xd5,
+ 0xe6, 0x54, 0x65, 0xdd, 0xa9, 0x1b,
+ 0x50, 0xc0, 0xb9, 0x95, 0xb0, 0x7d,
+ 0x7c, 0xca, 0x63, 0xf8, 0x72, 0xbe,
+ 0x3b, 0x00 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xcd ),
+ BIGINT ( 0xbb ),
+ BIGINT ( 0x25 ),
+ BIGINT ( 0xab ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xc4 ),
+ BIGINT ( 0xe9 ),
+ BIGINT ( 0x02, 0x4c ),
+ BIGINT ( 0x7e ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xcb ),
+ BIGINT ( 0xde ),
+ BIGINT ( 0xbd, 0x73, 0xbf ),
+ BIGINT ( 0x17 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x17 ),
+ BIGINT ( 0xb9 ),
+ BIGINT ( 0x39, 0x68, 0xba, 0x7d ),
+ BIGINT ( 0x17 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x2e ),
+ BIGINT ( 0xb7 ),
+ BIGINT ( 0x39, 0x07, 0x1b, 0x49, 0x5b, 0xea,
+ 0xf2, 0x61, 0x75, 0x94, 0x60, 0x86,
+ 0x73, 0xd0, 0xeb, 0x11, 0x08, 0x19,
+ 0x90, 0x19, 0xe0, 0xed, 0x2a ),
+ BIGINT ( 0x19 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x59 ),
+ BIGINT ( 0xce ),
+ BIGINT ( 0xdf, 0xbc, 0x0d, 0x0c, 0x09, 0xeb,
+ 0xf8, 0xcf, 0xdb, 0xb6, 0x00, 0xa3,
+ 0x9e, 0xc3, 0x6c, 0x8d, 0xf1, 0xc3,
+ 0x03, 0x36, 0xaa, 0xd4, 0x22, 0x7c,
+ 0x20, 0x7b, 0xa9, 0x9a, 0x01, 0xe4,
+ 0xf2, 0x50, 0x42, 0x29, 0x68, 0x7a,
+ 0xa6, 0x2c, 0xdf, 0xb6, 0x51, 0xa9,
+ 0x73, 0x10, 0x98, 0x37, 0x69, 0xb3,
+ 0x21, 0x49, 0x6d, 0xcc, 0x80, 0xfa,
+ 0x7e, 0x12, 0xe4, 0x9c, 0xc2, 0xbb,
+ 0xe3, 0xa3, 0x10, 0x3f, 0xba, 0x99,
+ 0x22, 0x79, 0x71, 0x39, 0x96, 0x7b,
+ 0x1a, 0x89, 0xdc, 0xda, 0x43, 0x52,
+ 0x50, 0x7b, 0xe3, 0x8c, 0xd3, 0xc0,
+ 0xf5, 0x7d, 0xfc, 0x80, 0x71, 0x6e,
+ 0xaf, 0x5c, 0xd0, 0x14, 0xc0, 0x60,
+ 0x24, 0xa8, 0x9a, 0x8a, 0x54, 0x4a,
+ 0x6f, 0x42, 0x7a, 0x14, 0x14, 0x25,
+ 0xd5, 0x22, 0x08, 0x8f, 0xd9, 0xdb,
+ 0xd4, 0x0f, 0x14, 0xf4, 0x3b, 0x26,
+ 0x0e, 0xb6, 0x72, 0xd7, 0x03, 0xd5,
+ 0xf0, 0x0e ),
+ BIGINT ( 0xa9 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x7f, 0x30 ),
+ BIGINT ( 0x73, 0x74 ),
+ BIGINT ( 0x75 ),
+ BIGINT ( 0x4b, 0xe8 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x04, 0x6c ),
+ BIGINT ( 0x99, 0x04 ),
+ BIGINT ( 0x33, 0xd2 ),
+ BIGINT ( 0x86, 0x74 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xca, 0x88 ),
+ BIGINT ( 0xdc, 0x60 ),
+ BIGINT ( 0x7e, 0x76, 0x79 ),
+ BIGINT ( 0x42, 0x40 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x68, 0x97 ),
+ BIGINT ( 0x52, 0x8b ),
+ BIGINT ( 0x4f, 0x7f, 0xe7, 0xda ),
+ BIGINT ( 0x22, 0x77 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xbd, 0x14 ),
+ BIGINT ( 0x9e, 0xfc ),
+ BIGINT ( 0x23, 0xf7, 0xd0, 0xa1, 0x9e, 0x9b,
+ 0x05, 0xd2, 0x44, 0x24, 0x4f, 0x3f,
+ 0x83, 0xcc, 0x49, 0x70, 0xa5, 0x0d,
+ 0xfc, 0xa7, 0x43, 0xf3, 0x3e ),
+ BIGINT ( 0x1a, 0xc8 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x46, 0x3e ),
+ BIGINT ( 0xb8, 0xde ),
+ BIGINT ( 0xa9, 0xc0, 0xdc, 0x45, 0x65, 0x0d,
+ 0xa5, 0x56, 0x70, 0x4c, 0xf1, 0xda,
+ 0xab, 0x64, 0xc2, 0x04, 0xf6, 0x32,
+ 0x20, 0x68, 0x31, 0x5f, 0x9a, 0x00,
+ 0x0f, 0x7b, 0x24, 0x33, 0xdf, 0xaf,
+ 0xfe, 0x03, 0x1e, 0x4a, 0xa1, 0xf8,
+ 0x45, 0x8d, 0x5a, 0x7d, 0x12, 0x58,
+ 0x00, 0x6d, 0xba, 0x79, 0x9f, 0xe1,
+ 0xa1, 0xfc, 0x1f, 0xb9, 0xf3, 0xa7,
+ 0x07, 0xf5, 0xfe, 0xd6, 0xa1, 0xba,
+ 0xda, 0x63, 0xef, 0x39, 0x8e, 0xb7,
+ 0x48, 0xa8, 0x81, 0x86, 0xb1, 0x22,
+ 0x14, 0x9f, 0x9e, 0xac, 0x69, 0xf7,
+ 0xae, 0x1f, 0xf2, 0x99, 0x41, 0xb7,
+ 0x37, 0xa7, 0xbc, 0x42, 0xf2, 0x45,
+ 0x43, 0xf2, 0x2a, 0xef, 0xc2, 0x83,
+ 0xd5, 0x32, 0x6e, 0xfa, 0x49, 0x1c,
+ 0x94, 0x9c, 0xc2, 0xc5, 0xad, 0x28,
+ 0x53, 0x1c, 0x11, 0xc4, 0x1c, 0x78,
+ 0x8f, 0x13, 0xdc, 0xb3, 0x2a, 0x63,
+ 0xfd, 0x1f, 0x89, 0x9b, 0x0c, 0x31,
+ 0x92, 0x73 ),
+ BIGINT ( 0x7b, 0x8a ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xf3, 0xc3, 0xab ),
+ BIGINT ( 0xd0, 0x7e, 0xd0 ),
+ BIGINT ( 0xf6 ),
+ BIGINT ( 0x1f, 0xb3, 0x09 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x13, 0xec, 0xf6 ),
+ BIGINT ( 0x87, 0x1a, 0x9a ),
+ BIGINT ( 0x03, 0xf3 ),
+ BIGINT ( 0x15, 0xe9, 0x8e ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x5a, 0x96, 0xe5 ),
+ BIGINT ( 0x56, 0x4a, 0xd1 ),
+ BIGINT ( 0x89, 0x62, 0x8e ),
+ BIGINT ( 0x34, 0xb8, 0xaa ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x84, 0x7c, 0xbd ),
+ BIGINT ( 0x3c, 0x80, 0x0a ),
+ BIGINT ( 0x5e, 0x52, 0x9d, 0xba ),
+ BIGINT ( 0x04, 0xcb, 0x4f ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x50, 0x01, 0x51 ),
+ BIGINT ( 0x02, 0xe6, 0x96 ),
+ BIGINT ( 0x34, 0x0c, 0x7e, 0xbf, 0x27, 0x23,
+ 0x46, 0x92, 0x1c, 0xca, 0x91, 0xab,
+ 0x50, 0x2c, 0x3a, 0x64, 0xc8, 0x4a,
+ 0x75, 0xd6, 0xe2, 0xde, 0x31 ),
+ BIGINT ( 0x02, 0x16, 0x05 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x5e, 0x47, 0xd8 ),
+ BIGINT ( 0x26, 0xd1, 0xb6 ),
+ BIGINT ( 0x49, 0x61, 0x84, 0x7a, 0xa9, 0xfb,
+ 0x93, 0x45, 0xe4, 0xfa, 0x53, 0x60,
+ 0x73, 0x98, 0x5a, 0x17, 0xe7, 0x77,
+ 0x2d, 0xcd, 0x97, 0xf4, 0xc0, 0x34,
+ 0x46, 0xfa, 0xbd, 0x21, 0xdf, 0xa5,
+ 0xa0, 0x12, 0x38, 0x7c, 0xbd, 0xd9,
+ 0xcd, 0xbc, 0xde, 0x29, 0xa5, 0x13,
+ 0xa8, 0xf0, 0xf6, 0x88, 0xc6, 0x31,
+ 0xed, 0x90, 0x19, 0x11, 0x7d, 0xe1,
+ 0x0e, 0x81, 0x98, 0x8e, 0x98, 0x86,
+ 0xde, 0x2a, 0x4c, 0xad, 0xff, 0x57,
+ 0x12, 0xbc, 0x4b, 0xaf, 0x21, 0xde,
+ 0xca, 0x3a, 0x25, 0xd7, 0x98, 0xe3,
+ 0x25, 0xbc, 0x17, 0x74, 0x0b, 0x9c,
+ 0x53, 0xe1, 0x1a, 0xec, 0x9a, 0x5a,
+ 0xdc, 0x68, 0xdf, 0xad, 0xd6, 0x71,
+ 0x6b, 0x5b, 0x8b, 0x85, 0xbb, 0xe5,
+ 0xd5, 0x14, 0x4c, 0x30, 0x27, 0x68,
+ 0xd1, 0xf7, 0x58, 0x34, 0x4c, 0xe1,
+ 0x71, 0xde, 0x7b, 0x8d, 0xa2, 0xe6,
+ 0x0a, 0x44, 0x22, 0x26, 0x5a, 0x70,
+ 0xbb, 0x68 ),
+ BIGINT ( 0x18, 0x36, 0x96 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xc7, 0x4a, 0xf0, 0x48 ),
+ BIGINT ( 0x5d, 0x27, 0x07, 0x54 ),
+ BIGINT ( 0x4a ),
+ BIGINT ( 0x48, 0x68, 0x7b, 0xe0 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xb4, 0x89, 0xc9, 0x5b ),
+ BIGINT ( 0x7c, 0xd7, 0xc7, 0xff ),
+ BIGINT ( 0xc6, 0x9c ),
+ BIGINT ( 0x0b, 0x2d, 0xf8, 0xf7 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xea, 0x72, 0x43, 0xfe ),
+ BIGINT ( 0xfc, 0x57, 0x2d, 0x47 ),
+ BIGINT ( 0x60, 0x01, 0x2c ),
+ BIGINT ( 0x12, 0x01, 0xe3, 0xf5 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x81, 0x7f, 0x27, 0x94 ),
+ BIGINT ( 0x17, 0x21, 0x67, 0xab ),
+ BIGINT ( 0x50, 0x19, 0x12, 0x52 ),
+ BIGINT ( 0x05, 0x17, 0x6b, 0x13 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x38, 0xab, 0xd4, 0xec ),
+ BIGINT ( 0x0c, 0x2a, 0x56, 0x38 ),
+ BIGINT ( 0x2f, 0x85, 0x85, 0x57, 0xf6, 0xde,
+ 0x24, 0xb4, 0x28, 0x3c, 0x5a, 0x3c,
+ 0x0b, 0x12, 0x85, 0x85, 0x85, 0x98,
+ 0x46, 0x5b, 0x9c, 0x52, 0x3a ),
+ BIGINT ( 0x02, 0xe6, 0x6a, 0x70 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xa6, 0x35, 0xc0, 0x6f ),
+ BIGINT ( 0x23, 0xac, 0x78, 0x72 ),
+ BIGINT ( 0x6a, 0x07, 0x80, 0xbf, 0x1b, 0xa5,
+ 0xf8, 0x0b, 0x90, 0x06, 0xa4, 0xa5,
+ 0x44, 0x13, 0xba, 0x4b, 0xb3, 0xce,
+ 0x9f, 0x55, 0x42, 0x56, 0xc3, 0x30,
+ 0x82, 0x85, 0x5a, 0x3b, 0xae, 0x88,
+ 0x92, 0x4e, 0x3c, 0x37, 0xf6, 0x80,
+ 0x4c, 0x03, 0x3c, 0x1e, 0x2c, 0x17,
+ 0xef, 0x9d, 0xd7, 0x6f, 0xdc, 0xbb,
+ 0x42, 0x42, 0xa1, 0x7f, 0x97, 0x66,
+ 0xcd, 0xc8, 0x8a, 0x7c, 0xc6, 0x70,
+ 0x61, 0x54, 0x82, 0xd0, 0xd0, 0x8b,
+ 0xd5, 0x4f, 0x57, 0x7b, 0x8e, 0xab,
+ 0xdc, 0xbf, 0x8e, 0x85, 0x94, 0x83,
+ 0x8a, 0xb3, 0x72, 0x69, 0x2d, 0x51,
+ 0xdd, 0x86, 0x1e, 0x58, 0xb8, 0x00,
+ 0xe2, 0x5e, 0xa7, 0xef, 0x6a, 0x6a,
+ 0xb0, 0x10, 0x3d, 0x53, 0xfe, 0x23,
+ 0x51, 0xc0, 0x51, 0xed, 0x1f, 0x02,
+ 0x4b, 0x73, 0x17, 0x59, 0xfa, 0xb9,
+ 0xa8, 0x05, 0xa7, 0x79, 0xc3, 0xc9,
+ 0x4c, 0x2d, 0x58, 0x59, 0x10, 0x99,
+ 0x71, 0xe6 ),
+ BIGINT ( 0x01, 0x63, 0xd0, 0x07 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xff, 0x2a, 0x37, 0x04, 0xd4, 0x08,
+ 0x9f, 0xf5, 0xac, 0x29, 0x7f, 0x4b,
+ 0x93, 0x86, 0x02, 0x26, 0xac, 0x29,
+ 0xa8, 0xf9, 0x77, 0x91, 0x20 ),
+ BIGINT ( 0x2c, 0xb2, 0xe2, 0x1f, 0x4b, 0x97,
+ 0xaa, 0x3b, 0xd1, 0x36, 0xb0, 0x40,
+ 0x8b, 0x1c, 0x19, 0xa2, 0xea, 0xc8,
+ 0xc6, 0x4e, 0x2a, 0x66, 0x50 ),
+ BIGINT ( 0x97 ),
+ BIGINT ( 0x04, 0x22, 0x44, 0xe2, 0x14, 0x54,
+ 0x6c, 0x5a, 0xba, 0x1b, 0x39, 0xb7,
+ 0xaa, 0x06, 0xcf, 0x2b, 0xc8, 0x7e,
+ 0xc0, 0xe0, 0x70, 0xf2, 0x90 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xcd, 0xf3, 0xf7, 0x50, 0x13, 0x39,
+ 0x13, 0x4a, 0x56, 0xc5, 0xb8, 0xa6,
+ 0x42, 0x2d, 0x40, 0x5e, 0x07, 0xf2,
+ 0x92, 0x2a, 0x51, 0x87, 0x20 ),
+ BIGINT ( 0x93, 0x1a, 0x28, 0xbb, 0x69, 0x4f,
+ 0x31, 0x01, 0xe0, 0x88, 0x8a, 0x4c,
+ 0x4f, 0x9b, 0xda, 0xf6, 0x4e, 0xf3,
+ 0x11, 0xe7, 0x35, 0xa1, 0xfb ),
+ BIGINT ( 0x66, 0x69 ),
+ BIGINT ( 0x7a, 0x5a, 0x9b, 0x84, 0x72, 0x8f,
+ 0x57, 0x31, 0xb4, 0x34, 0x70, 0x18,
+ 0x77, 0xa6, 0x43, 0xa9, 0x51, 0x69,
+ 0x07, 0x3e, 0xf6, 0x68, 0x82 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xdd, 0x4c, 0x85, 0xcb, 0x3f, 0x45,
+ 0x61, 0xe0, 0x58, 0x1e, 0xad, 0xd3,
+ 0x6b, 0xef, 0x82, 0x53, 0x4a, 0x16,
+ 0x1a, 0xf0, 0x09, 0x82, 0x74 ),
+ BIGINT ( 0xd2, 0xa2, 0x73, 0x89, 0x0c, 0x56,
+ 0xe4, 0x31, 0xdf, 0x70, 0x3c, 0x40,
+ 0x0d, 0x36, 0xfc, 0x4a, 0xf3, 0xa2,
+ 0x8f, 0x9a, 0x9d, 0xaa, 0xb0 ),
+ BIGINT ( 0xbc, 0xca, 0x45 ),
+ BIGINT ( 0x9f, 0x5f, 0x7c, 0xac, 0x5e, 0xc7,
+ 0xf2, 0xc5, 0x72, 0x3d, 0xff, 0x29,
+ 0xd2, 0x25, 0xa9, 0x64, 0x5b, 0xbe,
+ 0x63, 0x63, 0xc6, 0x84, 0x20 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xf8, 0xc9, 0xb9, 0x3d, 0xe1, 0xff,
+ 0xa6, 0x8e, 0xb0, 0xd2, 0xa9, 0xa9,
+ 0xc1, 0x5c, 0xc5, 0x94, 0x90, 0xb9,
+ 0xca, 0x2f, 0x1a, 0xbd, 0x21 ),
+ BIGINT ( 0xa7, 0xf4, 0xb0, 0x3c, 0xf4, 0x2b,
+ 0x9d, 0x40, 0x5f, 0xfd, 0x2e, 0x28,
+ 0xa9, 0x23, 0x01, 0xaf, 0x0b, 0x73,
+ 0xaa, 0xcf, 0x14, 0xdc, 0xd8 ),
+ BIGINT ( 0x31, 0xe2, 0xe8, 0xf0 ),
+ BIGINT ( 0x53, 0x30, 0xc6, 0x10, 0x12, 0x7c,
+ 0xb3, 0x91, 0x15, 0x5f, 0x01, 0x62,
+ 0xec, 0x1f, 0x15, 0x61, 0x3b, 0x9a,
+ 0x76, 0x22, 0xf8, 0x31, 0xb1 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xff, 0x8c, 0x04, 0x74, 0x3e, 0x93,
+ 0xfd, 0xce, 0xd5, 0x7f, 0xc5, 0x58,
+ 0xce, 0x00, 0x53, 0x44, 0x02, 0xf4,
+ 0xfd, 0x01, 0xc3, 0xb0, 0x3c ),
+ BIGINT ( 0x2f, 0xbe, 0xb3, 0x2d, 0xd6, 0x59,
+ 0x69, 0x44, 0xc0, 0xd4, 0x27, 0x9c,
+ 0xff, 0x53, 0x9e, 0x66, 0x2c, 0x01,
+ 0x3a, 0x96, 0x5d, 0x75, 0xc1 ),
+ BIGINT ( 0x47, 0x3e, 0xb2, 0x81, 0x51, 0x9a,
+ 0xdf, 0x75, 0xba, 0xa5, 0x19, 0xc1,
+ 0xc7, 0xcc, 0xae, 0x82, 0x9c, 0x3e,
+ 0xfd, 0x7f, 0xb0, 0xd7, 0x00 ),
+ BIGINT ( 0x09, 0x9c, 0xd0, 0x49, 0x1d, 0x88,
+ 0xd8, 0x08, 0x45, 0x61, 0x71, 0xa1,
+ 0xb5, 0xab, 0xa9, 0x5b, 0xa8, 0xf1,
+ 0xc6, 0x53, 0x68, 0x8f, 0x3e ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xd8, 0x78, 0xad, 0x80, 0x81, 0xf1,
+ 0x84, 0x23, 0x82, 0x5d, 0x49, 0x46,
+ 0x75, 0xfd, 0xd1, 0x49, 0x53, 0x10,
+ 0x4d, 0x10, 0xab, 0x0f, 0xf0 ),
+ BIGINT ( 0x78, 0x3d, 0x09, 0x1b, 0xea, 0xa4,
+ 0xb9, 0x13, 0xf8, 0xb5, 0xb5, 0x5e,
+ 0x69, 0xa4, 0xe1, 0xfd, 0x88, 0x58,
+ 0x26, 0xb3, 0x76, 0xa2, 0x38 ),
+ BIGINT ( 0x3b, 0x12, 0xe0, 0x8e, 0xa2, 0x2f,
+ 0x2a, 0x2b, 0xb1, 0x78, 0xf9, 0xf6,
+ 0x93, 0x4d, 0x52, 0x82, 0x29, 0x2d,
+ 0xe4, 0x36, 0x92, 0x49, 0xc1, 0x25,
+ 0x6e, 0x26, 0xe6, 0x6e, 0xc2, 0x4d,
+ 0xea, 0x13, 0x86, 0x85, 0x71, 0x4d,
+ 0x85, 0x70, 0xf9, 0x2b, 0xa0, 0x0f,
+ 0x96, 0xe5, 0x63, 0x7a, 0xb4, 0x25,
+ 0x53, 0x1a, 0xd8, 0x30, 0x36, 0xba,
+ 0x6e, 0x2e, 0xce, 0x2d, 0x8f, 0x32,
+ 0xe9, 0xdc, 0x91, 0x9e, 0xd4, 0xf1,
+ 0x3b, 0x40, 0xc9, 0xf4, 0x97, 0x74,
+ 0x5e, 0x69, 0xcd, 0x34, 0x4a, 0x18,
+ 0x65, 0xe5, 0x07, 0xb5, 0x9e, 0x2a,
+ 0xc4, 0xeb, 0xb6, 0x96, 0x7b, 0x99,
+ 0x0c, 0xe4, 0xb3, 0x85, 0xff, 0x17,
+ 0x72, 0x5d, 0xf6, 0x30, 0xb4, 0xff,
+ 0x98, 0xe6, 0xf6, 0x31, 0x24, 0x82,
+ 0x91, 0xa6, 0x18, 0x6d, 0x0b, 0x84,
+ 0x6f, 0x5f, 0x64, 0xa3, 0xdf, 0x92,
+ 0x06, 0x16, 0xe3, 0x7c, 0x08, 0x61,
+ 0x77, 0xce ),
+ BIGINT ( 0x17, 0xc9, 0xc5, 0x38, 0x4c, 0x15,
+ 0x0f, 0x4e, 0xc2, 0x90, 0x3b, 0x46,
+ 0x7b, 0x2f, 0x95, 0x82, 0xfe, 0x51,
+ 0x95, 0x2b, 0xff, 0xd5, 0x28 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x69, 0xa3, 0x7e, 0x24, 0xdf, 0x9e,
+ 0x0b, 0x3e, 0x3f, 0x43, 0x06, 0x0e,
+ 0x1d, 0x57, 0x74, 0xe0, 0xa0, 0x5b,
+ 0x82, 0xca, 0xb0, 0x33, 0x8b, 0xe4,
+ 0x39, 0x27, 0x41, 0xd4, 0x2e, 0x30,
+ 0x3a, 0x0e, 0x62, 0x6f, 0xfa, 0xb4,
+ 0x02, 0x88, 0x70, 0x35, 0xa6, 0xea,
+ 0x7d, 0xb2, 0x87, 0xc3, 0xa5, 0x50,
+ 0x49, 0x38, 0xa4, 0x68, 0xa9, 0xe4,
+ 0xa6, 0xcc, 0xd7, 0x13, 0xb1, 0xd9,
+ 0x1c, 0x6a, 0x9a, 0xb8, 0x6c, 0x9b,
+ 0xff, 0xcd, 0x2c, 0xb3, 0xbd, 0xe2,
+ 0xfd, 0x1f, 0x08, 0xdd, 0xc6, 0xee,
+ 0x18, 0x0c, 0xa5, 0xcd, 0x09, 0x19,
+ 0x51, 0x51, 0xa5, 0x6f, 0x93, 0x1b,
+ 0x34, 0xfd, 0x8f, 0xd9, 0x87, 0xed,
+ 0x15, 0x7e, 0x36, 0x60, 0xdd, 0x1b,
+ 0xf4, 0xcc, 0xc4, 0x4c, 0x19, 0x2b,
+ 0xd6, 0x1e, 0xec, 0x51, 0xe9, 0x27,
+ 0xe9, 0xbd, 0x6a, 0x3f, 0x91, 0x45,
+ 0xc3, 0x6d, 0x40, 0x7e, 0x6c, 0x56,
+ 0x05, 0x5a ),
+ BIGINT ( 0x5c, 0x96, 0x05, 0x81, 0x94, 0x45,
+ 0xcf, 0x47, 0x5f, 0x1b, 0xb0, 0xf9,
+ 0xef, 0x13, 0x8f, 0xcc, 0x71, 0xfd,
+ 0x50, 0xf1, 0xe7, 0x62, 0x6e, 0xfa,
+ 0x48, 0x66, 0x1c, 0xf7, 0xef, 0x09,
+ 0x12, 0xa2, 0xfd, 0x17, 0xb7, 0x6a,
+ 0x3b, 0xed, 0xf7, 0x86, 0xd2, 0xbe,
+ 0x95, 0x90, 0xc6, 0x00, 0x14, 0x8d,
+ 0xe3, 0x27, 0xbe, 0x03, 0x7c, 0x9e,
+ 0x6b, 0x51, 0x31, 0x8d, 0x18, 0xc4,
+ 0x16, 0xd2, 0x84, 0x63, 0x9b, 0xe9,
+ 0xa4, 0xf8, 0xff, 0x70, 0x4d, 0xeb,
+ 0x6f, 0x4a, 0xb7, 0x5b, 0x54, 0xf1,
+ 0xb5, 0xbe, 0x78, 0xb6, 0xfd, 0x8b,
+ 0xe1, 0x39, 0x62, 0x85, 0x9b, 0xde,
+ 0x30, 0xa8, 0xe4, 0x37, 0x52, 0x57,
+ 0x39, 0x79, 0xdb, 0x0b, 0x19, 0x6b,
+ 0xc9, 0x17, 0xfd, 0x8c, 0x2c, 0xaa,
+ 0xa4, 0xf1, 0x04, 0xd1, 0xd3, 0x2f,
+ 0xbb, 0x3a, 0x36, 0x82, 0x31, 0xa4,
+ 0x40, 0xd4, 0x87, 0x46, 0xe3, 0x6e,
+ 0xd0, 0x17 ),
+ BIGINT ( 0x93 ),
+ BIGINT ( 0x0d, 0x39, 0x92, 0x57, 0xaa, 0x6d,
+ 0xfc, 0x3b, 0x10, 0x18, 0x6d, 0x59,
+ 0xbe, 0x31, 0x8f, 0xee, 0xf9, 0x82,
+ 0x84, 0xe0, 0xdf, 0xa5, 0x00, 0x28,
+ 0xd1, 0x64, 0x6b, 0x4b, 0x43, 0x3b,
+ 0x76, 0x3e, 0x6b, 0xc4, 0xe4, 0xf5,
+ 0x0b, 0x59, 0x5a, 0xe4, 0x53, 0x5e,
+ 0x02, 0xd4, 0xde, 0x72, 0xd3, 0xa3,
+ 0x58, 0x66, 0xa7, 0xdd, 0x2b, 0x0b,
+ 0xa4, 0x83, 0xd0, 0xd9, 0xef, 0x29,
+ 0x3d, 0x2f, 0x97, 0xff, 0x9a, 0xc7,
+ 0xf6, 0x8a, 0x8d, 0x59, 0xef, 0x87,
+ 0xd1, 0xe6, 0xba, 0x4d, 0x99, 0xd9,
+ 0x5f, 0x5e, 0x7a, 0x7e, 0x67, 0x22,
+ 0x5b, 0x77, 0x83, 0xa2, 0x02, 0xfd,
+ 0xb2, 0xe4, 0xf6, 0x20, 0x4c, 0x12,
+ 0x20, 0xa7, 0xda, 0x5b, 0x3b, 0x8c,
+ 0xa2, 0xca, 0xda, 0x20, 0xaa, 0x27,
+ 0xe6, 0x54, 0x3e, 0xa8, 0x6f, 0x64,
+ 0x9d, 0xa7, 0x0d, 0x57, 0x1b, 0x21,
+ 0xff, 0xd2, 0xe2, 0xb2, 0x0a, 0x4f,
+ 0xb7, 0x0e ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x06, 0xcf, 0x54, 0xf2, 0x0d, 0x62,
+ 0x33, 0xdd, 0xe7, 0x4d, 0x7f, 0x2f,
+ 0x8e, 0x52, 0x73, 0xf4, 0x73, 0x68,
+ 0x4b, 0x13, 0x6e, 0x58, 0x6b, 0x4a,
+ 0xb8, 0x4c, 0xef, 0x73, 0xfe, 0x5f,
+ 0xf6, 0xd0, 0xbb, 0x82, 0x17, 0x3f,
+ 0x9d, 0x91, 0xf8, 0xa3, 0xb8, 0x79,
+ 0xef, 0x41, 0x38, 0xc1, 0xef, 0xc9,
+ 0xc6, 0xcf, 0x2a, 0xc3, 0xaa, 0x75,
+ 0x17, 0xda, 0xbc, 0x76, 0x29, 0x61,
+ 0x6d, 0x05, 0x79, 0x0b, 0x44, 0xb1,
+ 0x54, 0x75, 0xb7, 0xd9, 0xf6, 0xa8,
+ 0xbd, 0xf7, 0x85, 0xe0, 0xe7, 0x90,
+ 0x62, 0xce, 0x79, 0xfb, 0xc5, 0x23,
+ 0xa5, 0x09, 0xc0, 0xc4, 0x4d, 0xe7,
+ 0x9c, 0x49, 0x8f, 0x82, 0xf1, 0x31,
+ 0x34, 0x85, 0xdd, 0x3b, 0xbe, 0xe9,
+ 0x93, 0x19, 0x03, 0x75, 0x3f, 0xc4,
+ 0xa4, 0x0f, 0x52, 0x53, 0xc1, 0xcd,
+ 0x08, 0xb0, 0x05, 0x0c, 0xa2, 0x0c,
+ 0x3a, 0x72, 0xb2, 0x3c, 0xdb, 0x4f,
+ 0xac, 0xc6 ),
+ BIGINT ( 0xe4, 0x40, 0xd8, 0x30, 0x00, 0xcf,
+ 0x4c, 0xfd, 0xda, 0xae, 0x90, 0xd3,
+ 0x5b, 0xc7, 0x20, 0xcc, 0x2b, 0xe2,
+ 0x0a, 0x39, 0x1e, 0xde, 0xef, 0x98,
+ 0x16, 0x3b, 0x9d, 0x36, 0x63, 0x0d,
+ 0x46, 0xed, 0x23, 0x6e, 0x38, 0xa8,
+ 0x15, 0xb5, 0xb1, 0xaf, 0x47, 0xb1,
+ 0xec, 0xaa, 0x8b, 0x57, 0xd6, 0xca,
+ 0x39, 0x2f, 0x62, 0xbd, 0xd5, 0xf8,
+ 0x98, 0x98, 0x5d, 0xfe, 0x14, 0xd6,
+ 0xdc, 0xe5, 0x98, 0x60, 0x5b, 0x16,
+ 0x92, 0xcb, 0xed, 0xb6, 0x9c, 0x5c,
+ 0x82, 0x40, 0x6b, 0xaa, 0x48, 0x7a,
+ 0xd4, 0xfe, 0xa3, 0xe7, 0x30, 0xf1,
+ 0x7c, 0xfb, 0x94, 0x2e, 0xeb, 0xb6,
+ 0x71, 0xe4, 0x33, 0x63, 0xc3, 0xb0,
+ 0x94, 0x6d, 0xee, 0xa5, 0x15, 0x3f,
+ 0x28, 0xf1, 0xfa, 0xdc, 0xf2, 0x13,
+ 0x0f, 0xc7, 0xd9, 0xe0, 0xbf, 0x1b,
+ 0x49, 0xee, 0x21, 0x8e, 0x26, 0xc9,
+ 0x28, 0x21, 0x86, 0x1d, 0x46, 0x33,
+ 0xd4, 0x69 ),
+ BIGINT ( 0xd9, 0x87 ),
+ BIGINT ( 0xdf, 0xff, 0xcc, 0xb7, 0xfe, 0x19,
+ 0x02, 0x92, 0x9d, 0xab, 0x33, 0xd2,
+ 0x21, 0xbc, 0xd3, 0xc4, 0x31, 0xad,
+ 0x4b, 0xb3, 0x16, 0x50, 0x96, 0xd9,
+ 0xdc, 0x88, 0x74, 0x60, 0xde, 0xdf,
+ 0xb7, 0x83, 0xdb, 0x22, 0xef, 0xcb,
+ 0xcb, 0xdb, 0x4c, 0xfb, 0x94, 0x4c,
+ 0x3f, 0xf5, 0xf5, 0x99, 0x85, 0x21,
+ 0x1a, 0x2b, 0xec, 0x90, 0x2d, 0xb4,
+ 0x20, 0x3c, 0x27, 0x9f, 0xe5, 0xb1,
+ 0x5c, 0x92, 0xfa, 0xb0, 0xa9, 0x8e,
+ 0x2c, 0x21, 0x8e, 0x8d, 0xe5, 0x55,
+ 0x84, 0x02, 0xa5, 0x15, 0x5c, 0x53,
+ 0x1f, 0x40, 0x81, 0x0a, 0x10, 0xde,
+ 0x21, 0x41, 0xa9, 0x97, 0xf8, 0x6f,
+ 0xbf, 0x42, 0x58, 0x9e, 0xc6, 0xdd,
+ 0x10, 0x33, 0x3f, 0xad, 0xe6, 0x8e,
+ 0x57, 0x27, 0x37, 0x20, 0xa4, 0x86,
+ 0xef, 0x39, 0x7b, 0x6f, 0x78, 0x77,
+ 0xab, 0xa0, 0x62, 0xe1, 0xfd, 0x9c,
+ 0xbe, 0xfa, 0x98, 0x2e, 0x29, 0xe3,
+ 0xeb, 0x52 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x00, 0x91, 0xb3, 0x87, 0xe6, 0x01,
+ 0x57, 0xe9, 0x68, 0xa4, 0xf4, 0x9b,
+ 0xea, 0x6a, 0x8a, 0x9e, 0x1a, 0x8b,
+ 0xd3, 0x85, 0x9d, 0xba, 0x85, 0xab,
+ 0xd8, 0xcd, 0x25, 0x56, 0x8e, 0x85,
+ 0x8a, 0x8e, 0x48, 0x9e, 0xb4, 0x90,
+ 0xc8, 0x2e, 0x07, 0x78, 0x80, 0x49,
+ 0xa0, 0xb7, 0x95, 0x6a, 0xd8, 0xad,
+ 0xb5, 0xda, 0x5d, 0xe6, 0x11, 0x87,
+ 0xb8, 0x33, 0x8f, 0xa8, 0x6f, 0x4e,
+ 0xc6, 0xc3, 0x0d, 0xf5, 0xa9, 0x4e,
+ 0xb2, 0x42, 0x53, 0x81, 0xcd, 0x33,
+ 0x83, 0x49, 0xab, 0x0d, 0x0e, 0xf5,
+ 0x2c, 0xcd, 0x84, 0x58, 0xf3, 0x30,
+ 0xa3, 0x6e, 0x3c, 0x3a, 0xc6, 0x77,
+ 0x43, 0xb0, 0xe7, 0x4b, 0x66, 0x30,
+ 0xe9, 0x48, 0x0b, 0x0d, 0x86, 0x3f,
+ 0xd8, 0xe2, 0xb5, 0x88, 0xc1, 0x44,
+ 0xb2, 0x6b, 0xb0, 0x7a, 0x35, 0x3b,
+ 0x56, 0x83, 0xb1, 0xac, 0x9e, 0xeb,
+ 0x9b, 0x08, 0x43, 0xac, 0x0a, 0x3a,
+ 0x31, 0x69 ),
+ BIGINT ( 0x96, 0x6f, 0xb0, 0xa7, 0x02, 0xb5,
+ 0xd9, 0x19, 0xbe, 0x4b, 0x27, 0x65,
+ 0x5b, 0x96, 0xd4, 0x0b, 0x49, 0x70,
+ 0xf0, 0x09, 0x8e, 0xf2, 0x04, 0x85,
+ 0x93, 0xe9, 0x2e, 0x09, 0x31, 0x76,
+ 0x8b, 0xbb, 0xe9, 0xe1, 0x2b, 0x4f,
+ 0xed, 0x83, 0xa6, 0x87, 0xa3, 0x07,
+ 0x0a, 0x3d, 0x1c, 0x65, 0x14, 0x5a,
+ 0xd5, 0xc0, 0x5d, 0x3c, 0x31, 0x9a,
+ 0x83, 0xad, 0xca, 0x6a, 0x93, 0x0d,
+ 0x1a, 0x67, 0x4e, 0x68, 0x06, 0x64,
+ 0x53, 0x2e, 0x15, 0xd9, 0xdd, 0x5e,
+ 0xcb, 0xb7, 0x2e, 0xef, 0xd3, 0xbb,
+ 0x5f, 0xaf, 0xef, 0x9e, 0xf2, 0x7b,
+ 0x69, 0x15, 0xb0, 0x18, 0x6c, 0x67,
+ 0x10, 0xda, 0x33, 0x07, 0x48, 0x97,
+ 0x31, 0xb3, 0x3d, 0x3d, 0xc9, 0x2e,
+ 0x0b, 0x68, 0x91, 0x3f, 0x6a, 0x3b,
+ 0x1a, 0xdf, 0xa8, 0x69, 0x46, 0x1c,
+ 0xb2, 0x69, 0x08, 0x0b, 0x02, 0x1b,
+ 0x03, 0x64, 0xae, 0xb6, 0x2d, 0xc6,
+ 0xc4, 0x0a ),
+ BIGINT ( 0x6d, 0x3f, 0xdd ),
+ BIGINT ( 0x40, 0x6e, 0x9d, 0x3e, 0xeb, 0xa4,
+ 0xb1, 0x8d, 0xb7, 0xb4, 0x0f, 0x5b,
+ 0x12, 0xad, 0x27, 0x9e, 0xbd, 0xe7,
+ 0xe5, 0x9d, 0xec, 0xb4, 0xac, 0x23,
+ 0x5f, 0xa9, 0xec, 0x9c, 0xd1, 0x6a,
+ 0xbe, 0x99, 0xba, 0xb3, 0x66, 0x0e,
+ 0x17, 0xaa, 0x13, 0xa2, 0x2e, 0x01,
+ 0x28, 0xb1, 0x6c, 0xba, 0xad, 0x68,
+ 0x48, 0xf0, 0xf3, 0x4c, 0x08, 0x9f,
+ 0xd1, 0x9c, 0xb7, 0x75, 0xc5, 0xb6,
+ 0x5a, 0x05, 0xb0, 0x14, 0xd4, 0x61,
+ 0xea, 0x18, 0x9f, 0xe6, 0xe5, 0xe3,
+ 0xd4, 0xff, 0x35, 0x43, 0x0b, 0xb8,
+ 0xf6, 0xe9, 0x19, 0x7a, 0x88, 0xa7,
+ 0x4d, 0x01, 0x92, 0x05, 0xd2, 0x6e,
+ 0xa3, 0xc1, 0xb6, 0x66, 0x75, 0xb1,
+ 0x00, 0x0d, 0x42, 0x37, 0xcc, 0xca,
+ 0xc0, 0x8d, 0xc8, 0x7e, 0x5c, 0xc9,
+ 0x53, 0x81, 0x2f, 0xc4, 0x61, 0xb6,
+ 0x96, 0x3b, 0xa5, 0x04, 0x14, 0x1b,
+ 0xa7, 0x77, 0xa1, 0xbc, 0x73, 0x1d,
+ 0xad, 0xed ) );
+ bigint_mod_exp_ok ( BIGINT ( 0x45, 0xfb, 0xf3, 0xdc, 0x31, 0xe5,
+ 0x56, 0x7a, 0xee, 0x15, 0xfb, 0x16,
+ 0xee, 0x6e, 0x90, 0x3e, 0xa3, 0x89,
+ 0xc2, 0x6d, 0x9b, 0x06, 0x65, 0xd0,
+ 0xcd, 0xa2, 0xcc, 0x01, 0x60, 0x0d,
+ 0xd1, 0xdd, 0x68, 0x14, 0xc2, 0xcd,
+ 0xd8, 0x79, 0x75, 0xad, 0x0a, 0x9f,
+ 0x39, 0x5f, 0x52, 0x4b, 0x58, 0x31,
+ 0x48, 0xbb, 0x2a, 0xcc, 0xe0, 0x42,
+ 0x18, 0x32, 0xdc, 0x63, 0x14, 0x11,
+ 0x4e, 0xab, 0x96, 0x29, 0xc5, 0x06,
+ 0x79, 0xe5, 0x06, 0xf7, 0x59, 0xdb,
+ 0x1e, 0x51, 0xfd, 0xc4, 0x48, 0x3a,
+ 0x4c, 0x7f, 0xd0, 0xe2, 0x36, 0x86,
+ 0xc1, 0x8b, 0xc5, 0x86, 0x52, 0xe0,
+ 0xdb, 0x92, 0x5f, 0x0e, 0x19, 0xb1,
+ 0xa3, 0x23, 0xdd, 0xf0, 0x78, 0xcc,
+ 0x81, 0x3f, 0x4a, 0xe6, 0xb0, 0x32,
+ 0xd1, 0x5c, 0x5e, 0x3a, 0xb0, 0xd8,
+ 0xe2, 0x04, 0xc0, 0x30, 0x85, 0x1d,
+ 0x5e, 0x28, 0xee, 0xd9, 0xb3, 0x83,
+ 0x9f, 0xe2 ),
+ BIGINT ( 0xb3, 0x2c, 0x2e, 0xc5, 0xba, 0xf8,
+ 0x41, 0x98, 0x79, 0x7e, 0xaa, 0x0c,
+ 0x2a, 0x8f, 0xd9, 0x56, 0x55, 0xaa,
+ 0x74, 0x60, 0x74, 0xd1, 0x49, 0x2c,
+ 0x6f, 0x0a, 0x4e, 0xf8, 0x3f, 0x1b,
+ 0x73, 0x4c, 0xe0, 0x17, 0x37, 0x06,
+ 0x76, 0x73, 0xd5, 0x2d, 0x4d, 0x3f,
+ 0xb0, 0x15, 0x7e, 0x98, 0xd0, 0xdf,
+ 0xf0, 0x33, 0x78, 0xe2, 0xe6, 0xec,
+ 0x21, 0x22, 0xad, 0xd5, 0xab, 0x2d,
+ 0x0d, 0x59, 0x95, 0x05, 0x34, 0x1f,
+ 0x51, 0xf5, 0xec, 0x93, 0x05, 0x15,
+ 0x37, 0xcf, 0x93, 0x03, 0xd7, 0xf6,
+ 0x35, 0x23, 0x8f, 0x33, 0xf6, 0xba,
+ 0x42, 0xc8, 0x52, 0x94, 0xd3, 0x33,
+ 0x3e, 0x39, 0x01, 0xd1, 0x55, 0x3f,
+ 0x48, 0x84, 0xe9, 0xbc, 0x0b, 0x0f,
+ 0xc9, 0x69, 0x41, 0x2c, 0x5f, 0x34,
+ 0xd0, 0xe6, 0x15, 0x50, 0x06, 0x64,
+ 0x5b, 0x8b, 0x71, 0x22, 0xb3, 0x3e,
+ 0x09, 0x9c, 0x76, 0x13, 0x9b, 0x29,
+ 0x57, 0x94 ),
+ BIGINT ( 0xca, 0x94, 0xf7, 0xca ),
+ BIGINT ( 0x83, 0x68, 0xb9, 0xe7, 0x91, 0xf3,
+ 0x3b, 0x5a, 0x0b, 0xb6, 0x1e, 0x2f,
+ 0x3f, 0x5f, 0xdc, 0x96, 0x5b, 0x7f,
+ 0x8d, 0xc5, 0x8e, 0xda, 0x6e, 0x21,
+ 0xe3, 0x20, 0xea, 0x37, 0x39, 0x3b,
+ 0xb4, 0xd7, 0xf6, 0xba, 0x61, 0xfe,
+ 0xdc, 0x7e, 0x82, 0x9a, 0x38, 0x7b,
+ 0xd5, 0xb1, 0x11, 0x98, 0xc4, 0x88,
+ 0x0b, 0x01, 0x7d, 0x81, 0xc9, 0x64,
+ 0x23, 0xc3, 0x3e, 0xf3, 0x67, 0x95,
+ 0x78, 0xca, 0xda, 0x52, 0xaf, 0x72,
+ 0x25, 0xd9, 0xf0, 0x27, 0xd3, 0x1c,
+ 0xfb, 0xad, 0xa1, 0xa7, 0x06, 0x2f,
+ 0xaa, 0x2f, 0x86, 0x5c, 0x8b, 0x30,
+ 0xe1, 0xda, 0x5a, 0x36, 0xf9, 0xfd,
+ 0xbf, 0xfe, 0x0d, 0x03, 0xf8, 0x9c,
+ 0x6b, 0x9b, 0xe5, 0x70, 0x6d, 0x75,
+ 0xd7, 0x54, 0x28, 0x43, 0x34, 0x69,
+ 0x98, 0x11, 0x29, 0xee, 0x50, 0x06,
+ 0xa4, 0xc4, 0x11, 0x6d, 0x60, 0x8c,
+ 0xcd, 0xd1, 0x88, 0xe9, 0x6b, 0xbb,
+ 0xc1, 0xd4 ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xa1, 0x01, 0x7e, 0xb4, 0x0e, 0x66,
+ 0xa5, 0x07, 0x8b, 0x10, 0x84, 0x0d,
+ 0x30, 0x0a, 0xa4, 0x2d, 0x10, 0x2c,
+ 0xd4, 0x9a, 0x27, 0xf1, 0x02, 0x8c,
+ 0x38, 0x18, 0x7f, 0x7f, 0x95, 0x65,
+ 0xf1, 0xa9, 0x3b, 0x7d, 0x1f, 0x4f,
+ 0x88, 0xb0, 0x65, 0x62, 0x63, 0x63,
+ 0xaa, 0x82, 0xfc, 0x83, 0x3a, 0x3a,
+ 0x46, 0x59, 0x6a, 0x89, 0xec, 0xa9,
+ 0xb0, 0x4c, 0x5e, 0xbe, 0x46, 0x98,
+ 0xd0, 0xd4, 0xb7, 0xe3, 0x1b, 0x30,
+ 0x0b, 0xfb, 0xbb, 0x4f, 0x0b, 0xd3,
+ 0xe4, 0xa0, 0x80, 0x54, 0xcb, 0x52,
+ 0x0a, 0xe8, 0x03, 0x75, 0x8e, 0x96,
+ 0xa4, 0x21, 0xaa, 0xbd, 0x7a, 0xfd,
+ 0xfa, 0xf8, 0xaf, 0x42, 0xf6, 0x61,
+ 0xd2, 0x93, 0xce, 0x66, 0x67, 0xe9,
+ 0x02, 0xda, 0x81, 0x0b, 0xb0, 0x1e,
+ 0x9e, 0x27, 0x57, 0x98, 0x18, 0x88,
+ 0x35, 0x49, 0xc0, 0x88, 0x88, 0x59,
+ 0xae, 0x2f, 0x66, 0x59, 0x31, 0x87,
+ 0x88, 0xda ),
+ BIGINT ( 0xfe, 0x21, 0x7c, 0xf4, 0xbe, 0xae,
+ 0x65, 0xda, 0x89, 0xd2, 0x26, 0xd6,
+ 0x9c, 0x65, 0xc6, 0xb6, 0xb4, 0x0a,
+ 0x84, 0x11, 0xe1, 0xe8, 0xba, 0xd8,
+ 0x16, 0xcf, 0x60, 0x6c, 0x83, 0xa5,
+ 0x4a, 0xbf, 0xa2, 0x24, 0x0b, 0x66,
+ 0xda, 0xe2, 0x4e, 0x2d, 0xe5, 0x9e,
+ 0xbf, 0xad, 0x5c, 0xa3, 0x1e, 0x5c,
+ 0xbd, 0xe2, 0x5b, 0x46, 0xcf, 0xcc,
+ 0xd5, 0xc9, 0x13, 0x95, 0xc3, 0xdb,
+ 0x64, 0xbf, 0xeb, 0x31, 0xa9, 0x8a,
+ 0x3b, 0xd2, 0x5d, 0x3b, 0x2e, 0xdc,
+ 0x0c, 0xca, 0xab, 0xde, 0x92, 0xae,
+ 0x45, 0x35, 0x96, 0xb0, 0xb7, 0xb9,
+ 0xe6, 0xfe, 0x28, 0x0d, 0x10, 0x72,
+ 0x53, 0x8e, 0x21, 0xc0, 0x33, 0x79,
+ 0x01, 0x43, 0x8d, 0x77, 0xc4, 0xaa,
+ 0xcf, 0x7f, 0xc3, 0xd1, 0xf5, 0xfd,
+ 0x79, 0x81, 0xf6, 0x2e, 0xb7, 0xeb,
+ 0x55, 0x5f, 0x74, 0xf0, 0x3a, 0xb9,
+ 0x57, 0x07, 0x09, 0x97, 0xa5, 0x4c,
+ 0x4a, 0x85 ),
+ BIGINT ( 0xd9, 0xb7, 0xb2, 0xd6, 0xeb, 0xf3,
+ 0x66, 0xbe, 0x15, 0x64, 0xad, 0x2e,
+ 0x9e, 0xc6, 0xaf, 0x5e, 0xaf, 0x40,
+ 0x1e, 0x90, 0x82, 0x2f, 0x98 ),
+ BIGINT ( 0x12, 0x48, 0x31, 0x7f, 0x09, 0xbb,
+ 0x8f, 0xd9, 0x02, 0x7e, 0x4a, 0xd0,
+ 0x2f, 0x42, 0x7c, 0x17, 0x6e, 0x83,
+ 0x74, 0x21, 0x95, 0x47, 0x7d, 0x93,
+ 0x4a, 0xce, 0x34, 0x7c, 0xde, 0xc7,
+ 0x8f, 0xf6, 0x28, 0x97, 0xba, 0x81,
+ 0x9b, 0xcc, 0x54, 0x14, 0x7f, 0xd3,
+ 0x93, 0x66, 0x41, 0x8c, 0x0e, 0x47,
+ 0xee, 0xc5, 0x5e, 0xd6, 0x5f, 0x01,
+ 0x62, 0x97, 0xf1, 0x2b, 0xee, 0x60,
+ 0x5e, 0x82, 0x2c, 0x7b, 0x0a, 0xf2,
+ 0xc3, 0x23, 0xbf, 0xb9, 0x83, 0xf7,
+ 0x97, 0xf5, 0xca, 0x58, 0xd7, 0xf0,
+ 0x87, 0x7b, 0xcb, 0x87, 0x69, 0x42,
+ 0xbc, 0x05, 0xc4, 0xad, 0xbd, 0x82,
+ 0xcf, 0x44, 0x16, 0x4f, 0x46, 0xe0,
+ 0xde, 0x2f, 0xfa, 0x77, 0xec, 0xa4,
+ 0x23, 0x7d, 0x47, 0x3e, 0x94, 0x19,
+ 0x8b, 0xb8, 0x84, 0x81, 0x80, 0x6c,
+ 0x1e, 0x31, 0xa3, 0x6d, 0x14, 0x94,
+ 0x57, 0x28, 0x99, 0x08, 0x0a, 0xa7,
+ 0x98, 0x4b ) );
+ bigint_mod_exp_ok ( BIGINT ( 0xda, 0x52, 0xfd, 0x44, 0x5d, 0x11,
+ 0x60, 0x6c, 0xec, 0x87, 0xbf, 0x19,
+ 0xb8, 0x46, 0xaa, 0x41, 0xfc, 0x10,
+ 0xae, 0x47, 0xd6, 0x72, 0x42, 0x57,
+ 0xc3, 0x05, 0xca, 0xe3, 0x59, 0x94,
+ 0x82, 0x7c, 0xa1, 0xe0, 0xd2, 0x6b,
+ 0x77, 0x71, 0x42, 0xa1, 0xf7, 0x84,
+ 0xae, 0xf4, 0x6f, 0x44, 0x0d, 0x88,
+ 0xa2, 0xc5, 0x45, 0x9b, 0x49, 0x36,
+ 0xd4, 0x20, 0x3a, 0x7c, 0x92, 0xdb,
+ 0x65, 0xd9, 0x20, 0xd6, 0x71, 0x22,
+ 0x90, 0x70, 0xbf, 0xf3, 0x17, 0xe8,
+ 0x2c, 0x10, 0xe9, 0x4c, 0x02, 0x69,
+ 0x37, 0xa2, 0x91, 0x04, 0x46, 0x11,
+ 0xdc, 0xab, 0x5b, 0x1e, 0x3e, 0x31,
+ 0xd8, 0x69, 0xf8, 0x48, 0x84, 0x1f,
+ 0x56, 0x46, 0xf1, 0xc0, 0x14, 0x3f,
+ 0xcc, 0x5d, 0xe2, 0xf7, 0x8b, 0xa4,
+ 0x9e, 0x94, 0x32, 0xaa, 0x3c, 0x5e,
+ 0x21, 0x70, 0x00, 0x24, 0x2a, 0x1b,
+ 0xec, 0x25, 0xb1, 0xb6, 0x83, 0x36,
+ 0x5a, 0x95 ),
+ BIGINT ( 0x5e, 0xdc, 0x71, 0x1f, 0x5b, 0x55,
+ 0xaa, 0xda, 0x56, 0xf5, 0x93, 0x9b,
+ 0xe8, 0xfc, 0x6a, 0x80, 0xe1, 0xe3,
+ 0x93, 0xe4, 0xc0, 0x58, 0x6f, 0x22,
+ 0xce, 0x9d, 0x6f, 0x84, 0x4c, 0xd4,
+ 0x12, 0x44, 0x57, 0x25, 0xca, 0xe5,
+ 0x2b, 0x7c, 0x35, 0x88, 0xc7, 0x38,
+ 0x25, 0x20, 0x9b, 0x57, 0xf2, 0xf2,
+ 0x6c, 0x28, 0x47, 0x9c, 0x3f, 0x91,
+ 0x1e, 0x3f, 0xe9, 0xeb, 0x50, 0xd6,
+ 0xa7, 0x22, 0x88, 0x6c, 0x71, 0xe5,
+ 0x62, 0x2a, 0xb7, 0xce, 0xbe, 0xf7,
+ 0x1a, 0x8c, 0x52, 0xa6, 0xff, 0xb8,
+ 0x34, 0x83, 0x7e, 0x04, 0xa8, 0x9c,
+ 0xa8, 0xa7, 0xd1, 0x05, 0x8e, 0x13,
+ 0x03, 0xe0, 0x49, 0xd8, 0x4a, 0xc4,
+ 0x4d, 0x38, 0x21, 0x5b, 0x62, 0xc2,
+ 0x38, 0x23, 0x7c, 0x9e, 0xf1, 0xe9,
+ 0xb6, 0x9a, 0x75, 0x42, 0x14, 0x99,
+ 0x63, 0x36, 0x13, 0x4c, 0x2d, 0x3a,
+ 0x77, 0xd4, 0x74, 0xb7, 0x30, 0xb2,
+ 0x00, 0x0f ),
+ BIGINT ( 0xe3, 0xe5, 0x3b, 0xb5, 0x92, 0x5a,
+ 0xc6, 0xfa, 0x8f, 0xe8, 0x00, 0xb9,
+ 0x5c, 0xa0, 0xb6, 0x3e, 0x5e, 0x14,
+ 0x12, 0xa9, 0xdd, 0x2a, 0x3d, 0x4d,
+ 0xa3, 0x91, 0x6a, 0x56, 0x99, 0xc2,
+ 0x6c, 0x8e, 0xda, 0xb0, 0x5a, 0x2a,
+ 0x37, 0x55, 0x8b, 0xd3, 0x9b, 0xb6,
+ 0x1d, 0x49, 0x7d, 0x81, 0x76, 0x1c,
+ 0x2e, 0xb9, 0x92, 0x6d, 0xfa, 0x54,
+ 0x53, 0xfc, 0x74, 0x9b, 0x6b, 0x63,
+ 0x95, 0x1a, 0x89, 0xcc, 0xbd, 0x36,
+ 0xc5, 0x31, 0x7f, 0xf5, 0x31, 0x69,
+ 0x40, 0xd5, 0x7b, 0x94, 0x5d, 0xa9,
+ 0xd1, 0x34, 0x95, 0xa1, 0x8b, 0xa5,
+ 0xb5, 0x83, 0xda, 0xb5, 0x9d, 0x5b,
+ 0x74, 0x41, 0xad, 0x81, 0x45, 0x40,
+ 0x9b, 0xc3, 0xe8, 0xfe, 0x47, 0xdc,
+ 0xb0, 0xc3, 0x34, 0x5d, 0xf6, 0x3c,
+ 0x1d, 0x07, 0x76, 0xd9, 0x25, 0xca,
+ 0xa2, 0x39, 0x6c, 0xa8, 0xae, 0x30,
+ 0x4a, 0xde, 0xfb, 0xeb, 0x19, 0x80,
+ 0x5e, 0x49 ),
+ BIGINT ( 0x4b, 0x0e, 0x74, 0xb8, 0xa7, 0x92,
+ 0x74, 0xd9, 0x50, 0xf6, 0x1b, 0x67,
+ 0x76, 0x76, 0x56, 0x6c, 0x09, 0x9c,
+ 0x01, 0xda, 0xaf, 0xa3, 0xca, 0xb2,
+ 0x12, 0x85, 0x52, 0x24, 0xe9, 0x7e,
+ 0x2b, 0xf2, 0x6e, 0xe9, 0x1a, 0x10,
+ 0x5d, 0xa0, 0x25, 0x46, 0x8f, 0x2a,
+ 0x95, 0x62, 0x50, 0xb6, 0x66, 0x43,
+ 0x37, 0x8b, 0xcb, 0x05, 0xf8, 0x61,
+ 0x59, 0xf9, 0xdd, 0xd2, 0x68, 0x72,
+ 0xfa, 0x88, 0x13, 0x36, 0xd8, 0x24,
+ 0x73, 0xec, 0x47, 0x44, 0xdd, 0x45,
+ 0x8a, 0x59, 0xd2, 0xbd, 0x43, 0xe3,
+ 0x05, 0x16, 0xd5, 0x9b, 0x1c, 0x8a,
+ 0x4b, 0x07, 0xda, 0x58, 0x0d, 0x4a,
+ 0x4e, 0xe7, 0x15, 0xfc, 0xbd, 0x95,
+ 0xf7, 0x18, 0xa5, 0xa7, 0x93, 0xff,
+ 0xf8, 0x1f, 0xd4, 0x6b, 0x07, 0xc6,
+ 0x5d, 0x90, 0x73, 0x57, 0x57, 0x37,
+ 0xfa, 0x83, 0xd4, 0x7c, 0xe9, 0x77,
+ 0x46, 0x91, 0x3a, 0x50, 0x0d, 0x6a,
+ 0x25, 0xd0 ) );
+}
+
+/** Big integer self-test */
+struct self_test bigint_test __self_test = {
+ .name = "bigint",
+ .exec = bigint_test_exec,
+};
diff --git a/roms/ipxe/src/tests/bofm_test.c b/roms/ipxe/src/tests/bofm_test.c
new file mode 100644
index 00000000..e430d12d
--- /dev/null
+++ b/roms/ipxe/src/tests/bofm_test.c
@@ -0,0 +1,170 @@
+/*
+ * Copyright (C) 2011 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdint.h>
+#include <stdio.h>
+#include <string.h>
+#include <ipxe/uaccess.h>
+#include <ipxe/init.h>
+#include <ipxe/pci.h>
+#include <ipxe/ethernet.h>
+#include <ipxe/bofm.h>
+
+/** @file
+ *
+ * IBM BladeCenter Open Fabric Manager (BOFM) tests
+ *
+ */
+
+/** Harvest test table */
+static struct {
+ struct bofm_global_header header;
+ struct bofm_section_header en_header;
+ struct bofm_en en;
+ struct bofm_section_header done;
+} __attribute__ (( packed )) bofmtab_harvest = {
+ .header = {
+ .magic = BOFM_IOAA_MAGIC,
+ .action = BOFM_ACTION_HVST,
+ .version = 0x01,
+ .level = 0x01,
+ .length = sizeof ( bofmtab_harvest ),
+ .profile = "Harvest test profile",
+ },
+ .en_header = {
+ .magic = BOFM_EN_MAGIC,
+ .length = sizeof ( bofmtab_harvest.en ),
+ },
+ .en = {
+ .options = ( BOFM_EN_MAP_PFA | BOFM_EN_USAGE_HARVEST |
+ BOFM_EN_RQ_HVST_ACTIVE ),
+ .mport = 1,
+ },
+ .done = {
+ .magic = BOFM_DONE_MAGIC,
+ },
+};
+
+/** Update test table */
+static struct {
+ struct bofm_global_header header;
+ struct bofm_section_header en_header;
+ struct bofm_en en;
+ struct bofm_section_header done;
+} __attribute__ (( packed )) bofmtab_update = {
+ .header = {
+ .magic = BOFM_IOAA_MAGIC,
+ .action = BOFM_ACTION_UPDT,
+ .version = 0x01,
+ .level = 0x01,
+ .length = sizeof ( bofmtab_update ),
+ .profile = "Update test profile",
+ },
+ .en_header = {
+ .magic = BOFM_EN_MAGIC,
+ .length = sizeof ( bofmtab_update.en ),
+ },
+ .en = {
+ .options = ( BOFM_EN_MAP_PFA | BOFM_EN_EN_A |
+ BOFM_EN_USAGE_ENTRY ),
+ .mport = 1,
+ .mac_a = { 0x02, 0x00, 0x69, 0x50, 0x58, 0x45 },
+ },
+ .done = {
+ .magic = BOFM_DONE_MAGIC,
+ },
+};
+
+/**
+ * Perform BOFM test
+ *
+ * @v pci PCI device
+ */
+void bofm_test ( struct pci_device *pci ) {
+ int bofmrc;
+
+ printf ( "BOFMTEST using " PCI_FMT "\n", PCI_ARGS ( pci ) );
+
+ /* Perform harvest test */
+ printf ( "BOFMTEST performing harvest\n" );
+ bofmtab_harvest.en.busdevfn = pci->busdevfn;
+ DBG_HDA ( 0, &bofmtab_harvest, sizeof ( bofmtab_harvest ) );
+ bofmrc = bofm ( virt_to_user ( &bofmtab_harvest ), pci );
+ printf ( "BOFMTEST harvest result %08x\n", bofmrc );
+ if ( bofmtab_harvest.en.options & BOFM_EN_HVST ) {
+ printf ( "BOFMTEST harvested MAC address %s\n",
+ eth_ntoa ( &bofmtab_harvest.en.mac_a ) );
+ } else {
+ printf ( "BOFMTEST failed to harvest a MAC address\n" );
+ }
+ DBG_HDA ( 0, &bofmtab_harvest, sizeof ( bofmtab_harvest ) );
+
+ /* Perform update test */
+ printf ( "BOFMTEST performing update\n" );
+ bofmtab_update.en.busdevfn = pci->busdevfn;
+ DBG_HDA ( 0, &bofmtab_update, sizeof ( bofmtab_update ) );
+ bofmrc = bofm ( virt_to_user ( &bofmtab_update ), pci );
+ printf ( "BOFMTEST update result %08x\n", bofmrc );
+ if ( bofmtab_update.en.options & BOFM_EN_CSM_SUCCESS ) {
+ printf ( "BOFMTEST updated MAC address to %s\n",
+ eth_ntoa ( &bofmtab_update.en.mac_a ) );
+ } else {
+ printf ( "BOFMTEST failed to update MAC address\n" );
+ }
+ DBG_HDA ( 0, &bofmtab_update, sizeof ( bofmtab_update ) );
+}
+
+/**
+ * Perform BOFM test at initialisation time
+ *
+ */
+static void bofm_test_init ( void ) {
+ struct pci_device pci;
+ int busdevfn = -1;
+ int rc;
+
+ /* Uncomment the following line and specify the correct PCI
+ * bus:dev.fn address in order to perform a BOFM test at
+ * initialisation time.
+ */
+ // busdevfn = PCI_BUSDEVFN ( <bus>, <dev>, <fn> );
+
+ /* Skip test if no PCI bus:dev.fn is defined */
+ if ( busdevfn < 0 )
+ return;
+
+ /* Initialise PCI device */
+ memset ( &pci, 0, sizeof ( pci ) );
+ pci_init ( &pci, busdevfn );
+ if ( ( rc = pci_read_config ( &pci ) ) != 0 ) {
+ printf ( "BOFMTEST could not create " PCI_FMT " device: %s\n",
+ PCI_ARGS ( &pci ), strerror ( rc ) );
+ return;
+ }
+
+ /* Perform test */
+ bofm_test ( &pci );
+}
+
+/** BOFM test initialisation function */
+struct init_fn bofm_test_init_fn __init_fn ( INIT_NORMAL ) = {
+ .initialise = bofm_test_init,
+};
diff --git a/roms/ipxe/src/tests/byteswap_test.c b/roms/ipxe/src/tests/byteswap_test.c
new file mode 100644
index 00000000..a500218b
--- /dev/null
+++ b/roms/ipxe/src/tests/byteswap_test.c
@@ -0,0 +1,92 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Byte-order swapping test functions
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <assert.h>
+#include <byteswap.h>
+#include <ipxe/test.h>
+
+/* Provide global functions to allow inspection of generated assembly code */
+
+uint16_t test_bswap16 ( uint16_t x ) {
+ return __bswap_16 ( x );
+}
+
+uint32_t test_bswap32 ( uint32_t x ) {
+ return __bswap_32 ( x );
+}
+
+uint64_t test_bswap64 ( uint64_t x ) {
+ return __bswap_64 ( x );
+}
+
+void test_bswap16s ( uint16_t *x ) {
+ __bswap_16s ( x );
+}
+
+void test_bswap32s ( uint32_t *x ) {
+ __bswap_32s ( x );
+}
+
+void test_bswap64s ( uint64_t *x ) {
+ __bswap_64s ( x );
+}
+
+/**
+ * Perform byte-order swapping
+ *
+ */
+static void byteswap_test_exec ( void ) {
+ uint16_t test16;
+ uint32_t test32;
+ uint64_t test64;
+
+ ok ( test_bswap16 ( 0x1234 ) == 0x3412 );
+ ok ( test_bswap32 ( 0x12345678UL ) == 0x78563412UL );
+ ok ( test_bswap64 ( 0x123456789abcdef0ULL ) == 0xf0debc9a78563412ULL );
+
+ test16 = 0xabcd;
+ test_bswap16s ( &test16 );
+ ok ( test16 == 0xcdab );
+
+ test32 = 0xabcdef01UL;
+ test_bswap32s ( &test32 );
+ ok ( test32 == 0x01efcdabUL );
+
+ test64 = 0xabcdef0123456789ULL;
+ test_bswap64s ( &test64 );
+ ok ( test64 == 0x8967452301efcdabULL );
+}
+
+/** Byte-order swapping self-test */
+struct self_test byteswap_test __self_test = {
+ .name = "byteswap",
+ .exec = byteswap_test_exec,
+};
diff --git a/roms/ipxe/src/tests/cbc_test.c b/roms/ipxe/src/tests/cbc_test.c
new file mode 100644
index 00000000..cb0f7bde
--- /dev/null
+++ b/roms/ipxe/src/tests/cbc_test.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * CBC self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ipxe/crypto.h>
+#include <ipxe/profile.h>
+#include "cbc_test.h"
+
+/** Number of sample iterations for profiling */
+#define PROFILE_COUNT 16
+
+/**
+ * Test CBC encryption
+ *
+ * @v cipher Cipher algorithm
+ * @v key Key
+ * @v key_len Length of key
+ * @v iv Initialisation vector
+ * @v plaintext Plaintext data
+ * @v expected_ciphertext Expected ciphertext data
+ * @v len Length of data
+ * @ret ok Ciphertext is as expected
+ */
+int cbc_test_encrypt ( struct cipher_algorithm *cipher, const void *key,
+ size_t key_len, const void *iv, const void *plaintext,
+ const void *expected_ciphertext, size_t len ) {
+ uint8_t ctx[cipher->ctxsize];
+ uint8_t ciphertext[len];
+ int rc;
+
+ /* Initialise cipher */
+ rc = cipher_setkey ( cipher, ctx, key, key_len );
+ assert ( rc == 0 );
+ cipher_setiv ( cipher, ctx, iv );
+
+ /* Perform encryption */
+ cipher_encrypt ( cipher, ctx, plaintext, ciphertext, len );
+
+ /* Verify result */
+ return ( memcmp ( ciphertext, expected_ciphertext, len ) == 0 );
+}
+
+/**
+ * Test CBC decryption
+ *
+ * @v cipher Cipher algorithm
+ * @v key Key
+ * @v key_len Length of key
+ * @v iv Initialisation vector
+ * @v ciphertext Ciphertext data
+ * @v expected_plaintext Expected plaintext data
+ * @v len Length of data
+ * @ret ok Plaintext is as expected
+ */
+int cbc_test_decrypt ( struct cipher_algorithm *cipher, const void *key,
+ size_t key_len, const void *iv, const void *ciphertext,
+ const void *expected_plaintext, size_t len ) {
+ uint8_t ctx[cipher->ctxsize];
+ uint8_t plaintext[len];
+ int rc;
+
+ /* Initialise cipher */
+ rc = cipher_setkey ( cipher, ctx, key, key_len );
+ assert ( rc == 0 );
+ cipher_setiv ( cipher, ctx, iv );
+
+ /* Perform encryption */
+ cipher_decrypt ( cipher, ctx, ciphertext, plaintext, len );
+
+ /* Verify result */
+ return ( memcmp ( plaintext, expected_plaintext, len ) == 0 );
+}
+
+/**
+ * Calculate CBC encryption or decryption cost
+ *
+ * @v cipher Cipher algorithm
+ * @v key_len Length of key
+ * @v op Encryption or decryption operation
+ * @ret cost Cost (in cycles per byte)
+ */
+static unsigned long cbc_cost ( struct cipher_algorithm *cipher,
+ size_t key_len,
+ void ( * op ) ( struct cipher_algorithm *cipher,
+ void *ctx, const void *src,
+ void *dst, size_t len ) ) {
+ static uint8_t random[8192]; /* Too large for stack */
+ uint8_t key[key_len];
+ uint8_t iv[cipher->blocksize];
+ uint8_t ctx[cipher->ctxsize];
+ struct profiler profiler;
+ unsigned long cost;
+ unsigned int i;
+ int rc;
+
+ /* Fill buffer with pseudo-random data */
+ srand ( 0x1234568 );
+ for ( i = 0 ; i < sizeof ( random ) ; i++ )
+ random[i] = rand();
+ for ( i = 0 ; i < sizeof ( key ) ; i++ )
+ key[i] = rand();
+ for ( i = 0 ; i < sizeof ( iv ) ; i++ )
+ iv[i] = rand();
+
+ /* Initialise cipher */
+ rc = cipher_setkey ( cipher, ctx, key, key_len );
+ assert ( rc == 0 );
+ cipher_setiv ( cipher, ctx, iv );
+
+ /* Profile cipher operation */
+ memset ( &profiler, 0, sizeof ( profiler ) );
+ for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
+ profile_start ( &profiler );
+ op ( cipher, ctx, random, random, sizeof ( random ) );
+ profile_stop ( &profiler );
+ }
+
+ /* Round to nearest whole number of cycles per byte */
+ cost = ( ( profile_mean ( &profiler ) + ( sizeof ( random ) / 2 ) ) /
+ sizeof ( random ) );
+
+ return cost;
+}
+
+/**
+ * Calculate CBC encryption cost
+ *
+ * @v cipher Cipher algorithm
+ * @v key_len Length of key
+ * @ret cost Cost (in cycles per byte)
+ */
+unsigned long cbc_cost_encrypt ( struct cipher_algorithm *cipher,
+ size_t key_len ) {
+ return cbc_cost ( cipher, key_len, cipher_encrypt );
+}
+
+/**
+ * Calculate CBC decryption cost
+ *
+ * @v cipher Cipher algorithm
+ * @v key_len Length of key
+ * @ret cost Cost (in cycles per byte)
+ */
+unsigned long cbc_cost_decrypt ( struct cipher_algorithm *cipher,
+ size_t key_len ) {
+ return cbc_cost ( cipher, key_len, cipher_decrypt );
+}
diff --git a/roms/ipxe/src/tests/cbc_test.h b/roms/ipxe/src/tests/cbc_test.h
new file mode 100644
index 00000000..ad9e6f34
--- /dev/null
+++ b/roms/ipxe/src/tests/cbc_test.h
@@ -0,0 +1,57 @@
+#ifndef _CBC_TEST_H
+#define _CBC_TEST_H
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdint.h>
+#include <ipxe/crypto.h>
+#include <ipxe/test.h>
+
+extern int cbc_test_encrypt ( struct cipher_algorithm *cipher, const void *key,
+ size_t key_len, const void *iv,
+ const void *plaintext,
+ const void *expected_ciphertext, size_t len );
+extern int cbc_test_decrypt ( struct cipher_algorithm *cipher, const void *key,
+ size_t key_len, const void *iv,
+ const void *ciphertext,
+ const void *expected_plaintext, size_t len );
+extern unsigned long cbc_cost_encrypt ( struct cipher_algorithm *cipher,
+ size_t key_len );
+extern unsigned long cbc_cost_decrypt ( struct cipher_algorithm *cipher,
+ size_t key_len );
+
+/**
+ * Report CBC encryption test result
+ *
+ * @v cipher Cipher algorithm
+ * @v key Key
+ * @v key_len Length of key
+ * @v iv Initialisation vector
+ * @v plaintext Plaintext data
+ * @v expected_ciphertext Expected ciphertext data
+ * @v len Length of data
+ */
+#define cbc_encrypt_ok( cipher, key, key_len, iv, plaintext, \
+ expected_ciphertext, len ) do { \
+ ok ( cbc_test_encrypt ( cipher, key, key_len, iv, plaintext, \
+ expected_ciphertext, len ) ); \
+ } while ( 0 )
+
+/**
+ * Report CBC decryption test result
+ *
+ * @v cipher Cipher algorithm
+ * @v key Key
+ * @v key_len Length of key
+ * @v iv Initialisation vector
+ * @v ciphertext Ciphertext data
+ * @v expected_plaintext Expected plaintext data
+ * @v len Length of data
+ */
+#define cbc_decrypt_ok( cipher, key, key_len, iv, ciphertext, \
+ expected_plaintext, len ) do { \
+ ok ( cbc_test_decrypt ( cipher, key, key_len, iv, ciphertext, \
+ expected_plaintext, len ) ); \
+ } while ( 0 )
+
+#endif /* _CBC_TEST_H */
diff --git a/roms/ipxe/src/tests/cms_test.c b/roms/ipxe/src/tests/cms_test.c
new file mode 100644
index 00000000..8767504c
--- /dev/null
+++ b/roms/ipxe/src/tests/cms_test.c
@@ -0,0 +1,1476 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * CMS self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <string.h>
+#include <ipxe/sha256.h>
+#include <ipxe/x509.h>
+#include <ipxe/uaccess.h>
+#include <ipxe/cms.h>
+#include <ipxe/test.h>
+
+/** Fingerprint algorithm used for X.509 test certificates */
+#define cms_test_algorithm sha256_algorithm
+
+/** CMS test code blob */
+struct cms_test_code {
+ /** Data */
+ const void *data;
+ /** Length of data */
+ size_t len;
+};
+
+/** CMS test signature */
+struct cms_test_signature {
+ /** Data */
+ const void *data;
+ /** Length of data */
+ size_t len;
+
+ /** Parsed signature */
+ struct cms_signature *sig;
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define inline fingerprint data */
+#define FINGERPRINT(...) { __VA_ARGS__ }
+
+/** Define a test code blob */
+#define SIGNED_CODE( name, DATA ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static struct cms_test_code name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ }
+
+/** Define a test signature */
+#define SIGNATURE( name, DATA ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static struct cms_test_signature name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ }
+
+/** Code that has been signed */
+SIGNED_CODE ( test_code,
+ DATA ( 0x23, 0x21, 0x69, 0x70, 0x78, 0x65, 0x0a, 0x0a, 0x65, 0x63,
+ 0x68, 0x6f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+ 0x20, 0x61, 0x20, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x20,
+ 0x61, 0x6e, 0x64, 0x20, 0x74, 0x72, 0x75, 0x73, 0x74, 0x65,
+ 0x64, 0x20, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x63, 0x72,
+ 0x69, 0x70, 0x74, 0x2e, 0x20, 0x20, 0x44, 0x6f, 0x20, 0x61,
+ 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x79, 0x6f,
+ 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x21, 0x0a, 0x73, 0x68,
+ 0x65, 0x6c, 0x6c, 0x0a ) );
+
+/** Code that has not been signed */
+SIGNED_CODE ( bad_code,
+ DATA ( 0x23, 0x21, 0x69, 0x70, 0x78, 0x65, 0x0a, 0x0a, 0x65, 0x63,
+ 0x68, 0x6f, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73,
+ 0x20, 0x61, 0x20, 0x6d, 0x61, 0x6c, 0x69, 0x63, 0x69, 0x6f,
+ 0x75, 0x73, 0x20, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x63,
+ 0x72, 0x69, 0x70, 0x74, 0x2e, 0x20, 0x20, 0x44, 0x6f, 0x20,
+ 0x61, 0x6e, 0x79, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x79,
+ 0x6f, 0x75, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x21, 0x0a, 0x73,
+ 0x68, 0x65, 0x6c, 0x6c, 0x0a ) );
+
+/** Valid signature */
+SIGNATURE ( codesigned_sig,
+ DATA ( 0x30, 0x82, 0x0c, 0x41, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x0c, 0x32, 0x30,
+ 0x82, 0x0c, 0x2e, 0x02, 0x01, 0x01, 0x31, 0x09, 0x30, 0x07,
+ 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x30, 0x0b, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01,
+ 0xa0, 0x82, 0x0a, 0xd8, 0x30, 0x82, 0x02, 0xac, 0x30, 0x82,
+ 0x02, 0x15, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x04,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,
+ 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10,
+ 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e,
+ 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c,
+ 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
+ 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72,
+ 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c,
+ 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61,
+ 0x66, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32,
+ 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x34,
+ 0x5a, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x33, 0x32, 0x32, 0x30,
+ 0x30, 0x30, 0x31, 0x33, 0x34, 0x5a, 0x30, 0x81, 0x88, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x16, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x69, 0x67,
+ 0x6e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x69, 0x70, 0x78,
+ 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89,
+ 0x02, 0x81, 0x81, 0x00, 0xc3, 0x3a, 0xdb, 0x7b, 0x17, 0x24,
+ 0x47, 0xb9, 0xb9, 0x17, 0x02, 0x17, 0xa8, 0xce, 0x21, 0x97,
+ 0x92, 0x2f, 0x65, 0x53, 0x3b, 0x7e, 0x5c, 0x7d, 0x13, 0xab,
+ 0x46, 0xe8, 0x4a, 0x44, 0x6c, 0x5d, 0x8f, 0xa2, 0x0c, 0x1d,
+ 0x69, 0xc1, 0x66, 0x48, 0xc4, 0x1a, 0xc9, 0x32, 0xe5, 0x97,
+ 0x92, 0xb7, 0x11, 0xa7, 0x1f, 0x21, 0xac, 0x96, 0xcb, 0x85,
+ 0x10, 0xcc, 0x23, 0x20, 0x51, 0xdd, 0xaf, 0xbe, 0xf5, 0x23,
+ 0x12, 0x0b, 0x03, 0xe9, 0xf9, 0x61, 0x86, 0x64, 0x82, 0xa4,
+ 0xfd, 0x53, 0x24, 0xdf, 0xc2, 0x96, 0x2e, 0x28, 0xbb, 0x94,
+ 0xfb, 0x2c, 0xaf, 0x9e, 0x07, 0x79, 0x96, 0x48, 0x24, 0xf0,
+ 0x9d, 0xb3, 0x11, 0x3d, 0x4c, 0x2e, 0xd8, 0xc9, 0xf9, 0x69,
+ 0xca, 0xdb, 0x16, 0xbd, 0x4c, 0xc5, 0xce, 0x28, 0x18, 0xdc,
+ 0x88, 0x1b, 0x31, 0x0d, 0x10, 0x6b, 0x5b, 0x10, 0xe9, 0xcc,
+ 0xfe, 0xa1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x24, 0x30,
+ 0x22, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04,
+ 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d,
+ 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x03, 0x81, 0x81, 0x00, 0x22, 0x20, 0xe4, 0xc5, 0x0a, 0xef,
+ 0xae, 0xab, 0xbd, 0xab, 0x96, 0x56, 0x2c, 0x30, 0xeb, 0x06,
+ 0x84, 0xa0, 0x96, 0x37, 0x1a, 0x29, 0x2b, 0xeb, 0x8c, 0xb5,
+ 0x23, 0x22, 0x10, 0xef, 0x81, 0xe8, 0xdc, 0xa9, 0xdd, 0x8e,
+ 0x1d, 0x2c, 0xfc, 0xf5, 0x07, 0x19, 0xb7, 0x94, 0x91, 0xf7,
+ 0x2e, 0x07, 0xa1, 0xbc, 0xc5, 0x17, 0x34, 0xbe, 0x8a, 0x62,
+ 0x05, 0x5e, 0x9f, 0xe3, 0xce, 0xfd, 0x16, 0x42, 0xca, 0x25,
+ 0x2e, 0x0a, 0x03, 0x54, 0xd5, 0x3a, 0x52, 0x7f, 0x99, 0x94,
+ 0x96, 0xc6, 0xf5, 0xf0, 0xe3, 0x09, 0xd6, 0x00, 0x9b, 0x6f,
+ 0x0b, 0xa4, 0x9a, 0x13, 0x70, 0x9e, 0x67, 0xf9, 0x8c, 0x64,
+ 0xab, 0x22, 0x5d, 0xb3, 0xba, 0x2d, 0xe2, 0x70, 0xb8, 0x0c,
+ 0x6d, 0xd3, 0x12, 0x70, 0x5e, 0x04, 0x80, 0xef, 0x5e, 0x42,
+ 0x0a, 0x77, 0x57, 0x79, 0xa2, 0x1d, 0xe5, 0xbd, 0x20, 0xce,
+ 0x45, 0xc3, 0x30, 0x82, 0x02, 0xb3, 0x30, 0x82, 0x02, 0x1c,
+ 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09,
+ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31,
+ 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e,
+ 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73,
+ 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03,
+ 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72,
+ 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53,
+ 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64,
+ 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c,
+ 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31,
+ 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16,
+ 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d,
+ 0x74, 0x65, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20,
+ 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33,
+ 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17,
+ 0x0d, 0x31, 0x34, 0x31, 0x32, 0x31, 0x37, 0x30, 0x30, 0x30,
+ 0x31, 0x33, 0x33, 0x5a, 0x30, 0x81, 0x90, 0x31, 0x0b, 0x30,
+ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42,
+ 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c,
+ 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
+ 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06,
+ 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62,
+ 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06,
+ 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20,
+ 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74,
+ 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b,
+ 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67,
+ 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
+ 0x1e, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66,
+ 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65,
+ 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x43,
+ 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
+ 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00,
+ 0xc9, 0x3a, 0xee, 0xc6, 0x3c, 0xac, 0x4d, 0x81, 0xc6, 0x98,
+ 0x5e, 0xe1, 0x48, 0x66, 0x1a, 0x1e, 0x60, 0x19, 0x41, 0xae,
+ 0xca, 0x14, 0x97, 0xc8, 0x3a, 0x50, 0xb6, 0x48, 0xf5, 0x42,
+ 0xac, 0x0f, 0xe1, 0xe3, 0x47, 0xf0, 0xbf, 0x7c, 0xd0, 0xee,
+ 0x8f, 0xb7, 0xa6, 0x19, 0xad, 0xbb, 0xc5, 0x1b, 0x34, 0x38,
+ 0xc8, 0xbd, 0x55, 0x84, 0x93, 0x72, 0xaf, 0x84, 0xfc, 0x9b,
+ 0x97, 0x1d, 0xb5, 0x54, 0x24, 0xd6, 0x5d, 0xb7, 0x31, 0xf4,
+ 0xbd, 0x3b, 0x40, 0x97, 0xc0, 0xa9, 0x5a, 0x2a, 0xcb, 0x6b,
+ 0x98, 0x07, 0xdb, 0xb5, 0x9f, 0xe8, 0x31, 0x3f, 0x01, 0x46,
+ 0x46, 0x70, 0x05, 0xa2, 0x0f, 0x8c, 0x7a, 0x61, 0xf3, 0xdf,
+ 0xdb, 0xa1, 0x37, 0x2c, 0x88, 0x6a, 0x81, 0x21, 0x12, 0x4c,
+ 0xf5, 0xcd, 0xaf, 0xc9, 0xd2, 0x36, 0x3d, 0x82, 0xd1, 0xca,
+ 0x19, 0xaf, 0x4e, 0xae, 0x50, 0x71, 0x44, 0xbf, 0x02, 0x03,
+ 0x01, 0x00, 0x01, 0xa3, 0x23, 0x30, 0x21, 0x30, 0x0f, 0x06,
+ 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,
+ 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,
+ 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x5d,
+ 0x3c, 0xb3, 0x52, 0x19, 0xa6, 0x9e, 0x4a, 0x44, 0x98, 0xbf,
+ 0x51, 0x20, 0x47, 0x0a, 0xf3, 0x26, 0x1a, 0xcc, 0x35, 0x2f,
+ 0xc9, 0xed, 0xe0, 0x9d, 0x46, 0xeb, 0xbc, 0x7e, 0xc9, 0xb9,
+ 0x1d, 0x76, 0xa4, 0x1d, 0xc2, 0xd9, 0x16, 0x29, 0x77, 0x01,
+ 0x40, 0xdd, 0xe5, 0xcb, 0x28, 0x91, 0x3a, 0x0c, 0x13, 0x01,
+ 0x1b, 0x72, 0x62, 0x45, 0x27, 0xfd, 0xd7, 0x00, 0x47, 0x36,
+ 0x09, 0x1e, 0x7b, 0xd2, 0xcb, 0x95, 0x3d, 0x28, 0x82, 0xce,
+ 0x83, 0x59, 0x32, 0xf9, 0xe6, 0xec, 0x89, 0xac, 0x88, 0x45,
+ 0x22, 0x88, 0x6f, 0x5e, 0xa2, 0x79, 0x95, 0xba, 0xb9, 0xc9,
+ 0xb6, 0x4c, 0x7c, 0xb4, 0x29, 0xa1, 0x02, 0xf5, 0xac, 0x5d,
+ 0x8e, 0x52, 0xeb, 0xe8, 0xb1, 0x56, 0x49, 0xb3, 0x77, 0x62,
+ 0x7d, 0x87, 0x4d, 0x17, 0xf2, 0x62, 0x83, 0x08, 0x59, 0x21,
+ 0x60, 0x0d, 0x84, 0x8e, 0x5a, 0x84, 0xf6, 0x30, 0x82, 0x02,
+ 0xb3, 0x30, 0x82, 0x02, 0x1c, 0xa0, 0x03, 0x02, 0x01, 0x02,
+ 0x02, 0x09, 0x00, 0xc6, 0xb8, 0x9c, 0x58, 0xd2, 0xdc, 0xc9,
+ 0x5d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65,
+ 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x72, 0x6f,
+ 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31,
+ 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33,
+ 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x30, 0x38, 0x30, 0x38,
+ 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x30, 0x81, 0x88,
+ 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,
+ 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12,
+ 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18,
+ 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46,
+ 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
+ 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e,
+ 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73,
+ 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x72,
+ 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x81, 0x9f, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81,
+ 0x89, 0x02, 0x81, 0x81, 0x00, 0xaa, 0x72, 0xb5, 0xc1, 0x73,
+ 0xf4, 0x95, 0x76, 0xa4, 0x27, 0xab, 0x5e, 0xeb, 0x1d, 0x9d,
+ 0xd0, 0x04, 0xb2, 0x93, 0x05, 0xc7, 0xfa, 0x75, 0x84, 0x66,
+ 0xe6, 0x3a, 0x26, 0x1f, 0xbc, 0x2d, 0xfd, 0x8f, 0x59, 0x64,
+ 0xac, 0xcf, 0x65, 0x9d, 0x82, 0x23, 0xc3, 0x72, 0x93, 0xf2,
+ 0x40, 0x68, 0x32, 0xd1, 0xb8, 0xf1, 0x47, 0x61, 0x50, 0xea,
+ 0xbc, 0xcc, 0x3c, 0x6b, 0x74, 0x7a, 0xec, 0x2b, 0x75, 0xa6,
+ 0xc2, 0xa2, 0xb8, 0xbf, 0x23, 0x48, 0x97, 0xd5, 0xaf, 0x77,
+ 0xc1, 0x92, 0x88, 0xd7, 0x38, 0xb7, 0x9e, 0xda, 0xee, 0x72,
+ 0x04, 0xcb, 0x96, 0xe5, 0xdb, 0xfd, 0x9b, 0x5d, 0x99, 0x4e,
+ 0x7a, 0x60, 0x23, 0x34, 0xa4, 0x8d, 0xd7, 0x6c, 0xe7, 0x5d,
+ 0x93, 0x97, 0xe1, 0xab, 0x36, 0x2c, 0x24, 0x16, 0x92, 0x66,
+ 0xf6, 0x6a, 0x14, 0x23, 0x1d, 0x18, 0xb9, 0x44, 0x24, 0x61,
+ 0x6b, 0xd3, 0x75, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x23,
+ 0x30, 0x21, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,
+ 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
+ 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,
+ 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x03, 0x81, 0x81, 0x00, 0x94, 0x9e, 0xea, 0x17, 0x8d, 0x27,
+ 0xa9, 0x17, 0xe5, 0xa9, 0x19, 0xbe, 0x82, 0x36, 0xbd, 0xac,
+ 0x74, 0xf3, 0x6e, 0x75, 0x71, 0x30, 0x1c, 0x05, 0x80, 0x6d,
+ 0x1a, 0x69, 0x37, 0x86, 0x9c, 0x77, 0x75, 0x29, 0xa1, 0xc6,
+ 0xb7, 0x11, 0x0a, 0x63, 0x27, 0xee, 0xb1, 0xc8, 0x94, 0xa9,
+ 0x2e, 0x56, 0x8f, 0xca, 0x9d, 0xbe, 0xf4, 0xdb, 0x63, 0x97,
+ 0x68, 0x3b, 0x13, 0xf8, 0x6a, 0xa5, 0xd1, 0x3d, 0xed, 0xbb,
+ 0x86, 0x9d, 0x42, 0xfc, 0x15, 0x0a, 0x04, 0xf8, 0x3c, 0x0e,
+ 0xc4, 0x86, 0x05, 0x57, 0x56, 0x96, 0xf6, 0xc0, 0x18, 0x53,
+ 0xb0, 0xc5, 0xf0, 0xca, 0x72, 0x77, 0x77, 0xc9, 0x8e, 0x90,
+ 0xa5, 0x4b, 0xb6, 0x80, 0x4a, 0x4c, 0x34, 0x6f, 0xc9, 0xe8,
+ 0x6f, 0xc2, 0x28, 0xdf, 0x93, 0xa9, 0xf5, 0x63, 0x18, 0xc0,
+ 0xec, 0x9e, 0xd5, 0x19, 0x36, 0xc5, 0x94, 0x10, 0xd4, 0x72,
+ 0xd2, 0xb8, 0x30, 0x82, 0x02, 0xb6, 0x30, 0x82, 0x02, 0x1f,
+ 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x30, 0x81, 0x90, 0x31, 0x0b, 0x30, 0x09,
+ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31,
+ 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e,
+ 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73,
+ 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03,
+ 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72,
+ 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53,
+ 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64,
+ 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c,
+ 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31,
+ 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e,
+ 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d,
+ 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72,
+ 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x43, 0x41,
+ 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32,
+ 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x31,
+ 0x34, 0x31, 0x32, 0x31, 0x37, 0x30, 0x30, 0x30, 0x31, 0x33,
+ 0x33, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17,
+ 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68,
+ 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
+ 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55,
+ 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31,
+ 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08,
+ 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f,
+ 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69,
+ 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74,
+ 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x43,
+ 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
+ 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00,
+ 0xc3, 0x55, 0xad, 0xdf, 0x7b, 0xd1, 0x48, 0xc3, 0xd3, 0x02,
+ 0x54, 0x6c, 0x92, 0x45, 0x22, 0x3d, 0x90, 0xd8, 0xc7, 0x13,
+ 0xcd, 0xc1, 0x59, 0xc6, 0xe0, 0xad, 0x0e, 0xe6, 0xdb, 0x3b,
+ 0xe8, 0x63, 0xea, 0x4e, 0xb6, 0xea, 0x50, 0xea, 0x6e, 0x33,
+ 0x9d, 0x28, 0x25, 0x42, 0x49, 0xd0, 0xf0, 0xed, 0xc5, 0x5b,
+ 0x6b, 0x4a, 0xe7, 0x45, 0xfa, 0xd3, 0x3f, 0xae, 0xde, 0x5a,
+ 0x90, 0xab, 0xf1, 0x61, 0x2f, 0x40, 0x5e, 0xcf, 0x8b, 0x0b,
+ 0x10, 0x59, 0xa9, 0xd0, 0x1e, 0x0f, 0x18, 0x6b, 0x92, 0xd8,
+ 0x9f, 0x58, 0x10, 0x84, 0xb6, 0x15, 0xe8, 0x5b, 0xc4, 0xa0,
+ 0x3e, 0x49, 0x8b, 0xea, 0xdd, 0xa9, 0x7e, 0x32, 0x26, 0x9a,
+ 0x68, 0x44, 0xf0, 0x30, 0xca, 0x2a, 0xd6, 0x19, 0x7a, 0x80,
+ 0xfd, 0xd7, 0xfc, 0xc7, 0x5d, 0xe7, 0x61, 0xd2, 0x3f, 0x1f,
+ 0x2c, 0x40, 0x70, 0x7b, 0x34, 0xcb, 0x08, 0xa9, 0x02, 0x03,
+ 0x01, 0x00, 0x01, 0xa3, 0x26, 0x30, 0x24, 0x30, 0x12, 0x06,
+ 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30,
+ 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x0e, 0x06,
+ 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,
+ 0x02, 0x02, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
+ 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81,
+ 0x81, 0x00, 0x40, 0xd2, 0x70, 0x02, 0x08, 0x19, 0xa0, 0xb8,
+ 0x8d, 0x9d, 0x3d, 0x62, 0x41, 0x90, 0x2a, 0x36, 0x4a, 0x8b,
+ 0x21, 0x42, 0x9a, 0xb4, 0xc5, 0xf8, 0x79, 0x17, 0xd7, 0x64,
+ 0x4d, 0xbf, 0x8f, 0x6a, 0x04, 0x54, 0x7a, 0x0b, 0xd4, 0xb5,
+ 0x0e, 0xab, 0xf7, 0xb7, 0x06, 0x2b, 0xf8, 0xde, 0x87, 0xb2,
+ 0x37, 0x3b, 0x95, 0x01, 0xba, 0x9f, 0x8f, 0xec, 0x0a, 0x86,
+ 0xca, 0x51, 0xb6, 0x25, 0x73, 0x2f, 0xa1, 0x66, 0xc8, 0x7a,
+ 0x5e, 0x51, 0xbd, 0x49, 0xb5, 0x75, 0xda, 0xea, 0xe5, 0xeb,
+ 0x5d, 0xe3, 0xb0, 0xad, 0x49, 0x9f, 0x8b, 0xfd, 0x89, 0xb3,
+ 0xb7, 0xb2, 0x4c, 0x7d, 0x8a, 0x29, 0xb2, 0xbe, 0x04, 0xef,
+ 0x9c, 0x73, 0x3c, 0xea, 0xa3, 0x9f, 0x07, 0x66, 0x5a, 0x2f,
+ 0x38, 0xad, 0x1a, 0xeb, 0xe1, 0xb0, 0x62, 0x14, 0x55, 0xdc,
+ 0x8c, 0x83, 0xbb, 0xc7, 0x13, 0x04, 0x41, 0x54, 0xf1, 0x45,
+ 0x31, 0x82, 0x01, 0x33, 0x30, 0x82, 0x01, 0x2f, 0x02, 0x01,
+ 0x01, 0x30, 0x81, 0x8e, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30,
+ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42,
+ 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c,
+ 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
+ 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06,
+ 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62,
+ 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06,
+ 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20,
+ 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74,
+ 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b,
+ 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67,
+ 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
+ 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66,
+ 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x66,
+ 0x20, 0x43, 0x41, 0x02, 0x01, 0x04, 0x30, 0x07, 0x06, 0x05,
+ 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
+ 0x04, 0x81, 0x80, 0x1f, 0x95, 0x53, 0x9c, 0x63, 0xcc, 0x9e,
+ 0xe3, 0x41, 0x30, 0xaf, 0x66, 0xac, 0x7c, 0x39, 0x69, 0xa0,
+ 0x02, 0xe3, 0x28, 0xfa, 0xf6, 0x71, 0xf4, 0xcf, 0x97, 0x2a,
+ 0xbb, 0xe0, 0x1d, 0x71, 0x73, 0x4a, 0xa7, 0xea, 0xb0, 0x72,
+ 0xc3, 0xd2, 0xba, 0x52, 0x42, 0x06, 0x88, 0x4a, 0xa6, 0x41,
+ 0x1d, 0x2f, 0x82, 0xb3, 0x7d, 0x32, 0x59, 0x34, 0x4e, 0x47,
+ 0x1b, 0xaa, 0x5e, 0x90, 0xe2, 0x73, 0x62, 0x2d, 0x6f, 0x6c,
+ 0x47, 0x52, 0x05, 0x90, 0xcb, 0xac, 0x30, 0xa8, 0x20, 0x71,
+ 0x14, 0x39, 0x16, 0x85, 0x3d, 0x32, 0x2f, 0x9d, 0x31, 0x97,
+ 0xa8, 0x96, 0xb9, 0xf2, 0x2b, 0xdc, 0xa6, 0x2f, 0x68, 0xc7,
+ 0xac, 0x46, 0xa2, 0xc7, 0x26, 0xd0, 0xde, 0xac, 0x1d, 0x5d,
+ 0x70, 0x65, 0xc6, 0x26, 0xdd, 0x30, 0x3f, 0x3a, 0xbd, 0x5e,
+ 0x8f, 0x87, 0x64, 0xab, 0xe7, 0xf9, 0x71, 0x64, 0x03, 0x05,
+ 0xbf ) );
+
+/** Signature with a broken certificate chain */
+SIGNATURE ( brokenchain_sig,
+ DATA ( 0x30, 0x82, 0x09, 0x8a, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x09, 0x7b, 0x30,
+ 0x82, 0x09, 0x77, 0x02, 0x01, 0x01, 0x31, 0x09, 0x30, 0x07,
+ 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x30, 0x0b, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01,
+ 0xa0, 0x82, 0x08, 0x21, 0x30, 0x82, 0x02, 0xac, 0x30, 0x82,
+ 0x02, 0x15, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x04,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,
+ 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10,
+ 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e,
+ 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c,
+ 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
+ 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72,
+ 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c,
+ 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61,
+ 0x66, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32,
+ 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x34,
+ 0x5a, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x33, 0x32, 0x32, 0x30,
+ 0x30, 0x30, 0x31, 0x33, 0x34, 0x5a, 0x30, 0x81, 0x88, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x16, 0x63, 0x6f, 0x64, 0x65, 0x73, 0x69, 0x67,
+ 0x6e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x69, 0x70, 0x78,
+ 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89,
+ 0x02, 0x81, 0x81, 0x00, 0xc3, 0x3a, 0xdb, 0x7b, 0x17, 0x24,
+ 0x47, 0xb9, 0xb9, 0x17, 0x02, 0x17, 0xa8, 0xce, 0x21, 0x97,
+ 0x92, 0x2f, 0x65, 0x53, 0x3b, 0x7e, 0x5c, 0x7d, 0x13, 0xab,
+ 0x46, 0xe8, 0x4a, 0x44, 0x6c, 0x5d, 0x8f, 0xa2, 0x0c, 0x1d,
+ 0x69, 0xc1, 0x66, 0x48, 0xc4, 0x1a, 0xc9, 0x32, 0xe5, 0x97,
+ 0x92, 0xb7, 0x11, 0xa7, 0x1f, 0x21, 0xac, 0x96, 0xcb, 0x85,
+ 0x10, 0xcc, 0x23, 0x20, 0x51, 0xdd, 0xaf, 0xbe, 0xf5, 0x23,
+ 0x12, 0x0b, 0x03, 0xe9, 0xf9, 0x61, 0x86, 0x64, 0x82, 0xa4,
+ 0xfd, 0x53, 0x24, 0xdf, 0xc2, 0x96, 0x2e, 0x28, 0xbb, 0x94,
+ 0xfb, 0x2c, 0xaf, 0x9e, 0x07, 0x79, 0x96, 0x48, 0x24, 0xf0,
+ 0x9d, 0xb3, 0x11, 0x3d, 0x4c, 0x2e, 0xd8, 0xc9, 0xf9, 0x69,
+ 0xca, 0xdb, 0x16, 0xbd, 0x4c, 0xc5, 0xce, 0x28, 0x18, 0xdc,
+ 0x88, 0x1b, 0x31, 0x0d, 0x10, 0x6b, 0x5b, 0x10, 0xe9, 0xcc,
+ 0xfe, 0xa1, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x24, 0x30,
+ 0x22, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04,
+ 0x03, 0x02, 0x07, 0x80, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d,
+ 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x03, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x03, 0x81, 0x81, 0x00, 0x22, 0x20, 0xe4, 0xc5, 0x0a, 0xef,
+ 0xae, 0xab, 0xbd, 0xab, 0x96, 0x56, 0x2c, 0x30, 0xeb, 0x06,
+ 0x84, 0xa0, 0x96, 0x37, 0x1a, 0x29, 0x2b, 0xeb, 0x8c, 0xb5,
+ 0x23, 0x22, 0x10, 0xef, 0x81, 0xe8, 0xdc, 0xa9, 0xdd, 0x8e,
+ 0x1d, 0x2c, 0xfc, 0xf5, 0x07, 0x19, 0xb7, 0x94, 0x91, 0xf7,
+ 0x2e, 0x07, 0xa1, 0xbc, 0xc5, 0x17, 0x34, 0xbe, 0x8a, 0x62,
+ 0x05, 0x5e, 0x9f, 0xe3, 0xce, 0xfd, 0x16, 0x42, 0xca, 0x25,
+ 0x2e, 0x0a, 0x03, 0x54, 0xd5, 0x3a, 0x52, 0x7f, 0x99, 0x94,
+ 0x96, 0xc6, 0xf5, 0xf0, 0xe3, 0x09, 0xd6, 0x00, 0x9b, 0x6f,
+ 0x0b, 0xa4, 0x9a, 0x13, 0x70, 0x9e, 0x67, 0xf9, 0x8c, 0x64,
+ 0xab, 0x22, 0x5d, 0xb3, 0xba, 0x2d, 0xe2, 0x70, 0xb8, 0x0c,
+ 0x6d, 0xd3, 0x12, 0x70, 0x5e, 0x04, 0x80, 0xef, 0x5e, 0x42,
+ 0x0a, 0x77, 0x57, 0x79, 0xa2, 0x1d, 0xe5, 0xbd, 0x20, 0xce,
+ 0x45, 0xc3, 0x30, 0x82, 0x02, 0xb3, 0x30, 0x82, 0x02, 0x1c,
+ 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xc6, 0xb8,
+ 0x9c, 0x58, 0xd2, 0xdc, 0xc9, 0x5d, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
+ 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
+ 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30,
+ 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69,
+ 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73,
+ 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69,
+ 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50,
+ 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65,
+ 0x73, 0x74, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41,
+ 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32,
+ 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x33,
+ 0x39, 0x30, 0x38, 0x30, 0x38, 0x30, 0x30, 0x30, 0x31, 0x33,
+ 0x33, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17,
+ 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68,
+ 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
+ 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55,
+ 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31,
+ 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08,
+ 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f,
+ 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69,
+ 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74,
+ 0x65, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43,
+ 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
+ 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00,
+ 0xaa, 0x72, 0xb5, 0xc1, 0x73, 0xf4, 0x95, 0x76, 0xa4, 0x27,
+ 0xab, 0x5e, 0xeb, 0x1d, 0x9d, 0xd0, 0x04, 0xb2, 0x93, 0x05,
+ 0xc7, 0xfa, 0x75, 0x84, 0x66, 0xe6, 0x3a, 0x26, 0x1f, 0xbc,
+ 0x2d, 0xfd, 0x8f, 0x59, 0x64, 0xac, 0xcf, 0x65, 0x9d, 0x82,
+ 0x23, 0xc3, 0x72, 0x93, 0xf2, 0x40, 0x68, 0x32, 0xd1, 0xb8,
+ 0xf1, 0x47, 0x61, 0x50, 0xea, 0xbc, 0xcc, 0x3c, 0x6b, 0x74,
+ 0x7a, 0xec, 0x2b, 0x75, 0xa6, 0xc2, 0xa2, 0xb8, 0xbf, 0x23,
+ 0x48, 0x97, 0xd5, 0xaf, 0x77, 0xc1, 0x92, 0x88, 0xd7, 0x38,
+ 0xb7, 0x9e, 0xda, 0xee, 0x72, 0x04, 0xcb, 0x96, 0xe5, 0xdb,
+ 0xfd, 0x9b, 0x5d, 0x99, 0x4e, 0x7a, 0x60, 0x23, 0x34, 0xa4,
+ 0x8d, 0xd7, 0x6c, 0xe7, 0x5d, 0x93, 0x97, 0xe1, 0xab, 0x36,
+ 0x2c, 0x24, 0x16, 0x92, 0x66, 0xf6, 0x6a, 0x14, 0x23, 0x1d,
+ 0x18, 0xb9, 0x44, 0x24, 0x61, 0x6b, 0xd3, 0x75, 0x02, 0x03,
+ 0x01, 0x00, 0x01, 0xa3, 0x23, 0x30, 0x21, 0x30, 0x0f, 0x06,
+ 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30,
+ 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d,
+ 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x94,
+ 0x9e, 0xea, 0x17, 0x8d, 0x27, 0xa9, 0x17, 0xe5, 0xa9, 0x19,
+ 0xbe, 0x82, 0x36, 0xbd, 0xac, 0x74, 0xf3, 0x6e, 0x75, 0x71,
+ 0x30, 0x1c, 0x05, 0x80, 0x6d, 0x1a, 0x69, 0x37, 0x86, 0x9c,
+ 0x77, 0x75, 0x29, 0xa1, 0xc6, 0xb7, 0x11, 0x0a, 0x63, 0x27,
+ 0xee, 0xb1, 0xc8, 0x94, 0xa9, 0x2e, 0x56, 0x8f, 0xca, 0x9d,
+ 0xbe, 0xf4, 0xdb, 0x63, 0x97, 0x68, 0x3b, 0x13, 0xf8, 0x6a,
+ 0xa5, 0xd1, 0x3d, 0xed, 0xbb, 0x86, 0x9d, 0x42, 0xfc, 0x15,
+ 0x0a, 0x04, 0xf8, 0x3c, 0x0e, 0xc4, 0x86, 0x05, 0x57, 0x56,
+ 0x96, 0xf6, 0xc0, 0x18, 0x53, 0xb0, 0xc5, 0xf0, 0xca, 0x72,
+ 0x77, 0x77, 0xc9, 0x8e, 0x90, 0xa5, 0x4b, 0xb6, 0x80, 0x4a,
+ 0x4c, 0x34, 0x6f, 0xc9, 0xe8, 0x6f, 0xc2, 0x28, 0xdf, 0x93,
+ 0xa9, 0xf5, 0x63, 0x18, 0xc0, 0xec, 0x9e, 0xd5, 0x19, 0x36,
+ 0xc5, 0x94, 0x10, 0xd4, 0x72, 0xd2, 0xb8, 0x30, 0x82, 0x02,
+ 0xb6, 0x30, 0x82, 0x02, 0x1f, 0xa0, 0x03, 0x02, 0x01, 0x02,
+ 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
+ 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81,
+ 0x90, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
+ 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03,
+ 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72,
+ 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31,
+ 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09,
+ 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31,
+ 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f,
+ 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
+ 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06,
+ 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65,
+ 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x69, 0x50, 0x58, 0x45, 0x20,
+ 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20,
+ 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61,
+ 0x74, 0x65, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31,
+ 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33,
+ 0x33, 0x5a, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x32, 0x31, 0x37,
+ 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x30, 0x81, 0x88,
+ 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,
+ 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12,
+ 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18,
+ 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46,
+ 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
+ 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e,
+ 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73,
+ 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c,
+ 0x65, 0x61, 0x66, 0x20, 0x43, 0x41, 0x30, 0x81, 0x9f, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81,
+ 0x89, 0x02, 0x81, 0x81, 0x00, 0xc3, 0x55, 0xad, 0xdf, 0x7b,
+ 0xd1, 0x48, 0xc3, 0xd3, 0x02, 0x54, 0x6c, 0x92, 0x45, 0x22,
+ 0x3d, 0x90, 0xd8, 0xc7, 0x13, 0xcd, 0xc1, 0x59, 0xc6, 0xe0,
+ 0xad, 0x0e, 0xe6, 0xdb, 0x3b, 0xe8, 0x63, 0xea, 0x4e, 0xb6,
+ 0xea, 0x50, 0xea, 0x6e, 0x33, 0x9d, 0x28, 0x25, 0x42, 0x49,
+ 0xd0, 0xf0, 0xed, 0xc5, 0x5b, 0x6b, 0x4a, 0xe7, 0x45, 0xfa,
+ 0xd3, 0x3f, 0xae, 0xde, 0x5a, 0x90, 0xab, 0xf1, 0x61, 0x2f,
+ 0x40, 0x5e, 0xcf, 0x8b, 0x0b, 0x10, 0x59, 0xa9, 0xd0, 0x1e,
+ 0x0f, 0x18, 0x6b, 0x92, 0xd8, 0x9f, 0x58, 0x10, 0x84, 0xb6,
+ 0x15, 0xe8, 0x5b, 0xc4, 0xa0, 0x3e, 0x49, 0x8b, 0xea, 0xdd,
+ 0xa9, 0x7e, 0x32, 0x26, 0x9a, 0x68, 0x44, 0xf0, 0x30, 0xca,
+ 0x2a, 0xd6, 0x19, 0x7a, 0x80, 0xfd, 0xd7, 0xfc, 0xc7, 0x5d,
+ 0xe7, 0x61, 0xd2, 0x3f, 0x1f, 0x2c, 0x40, 0x70, 0x7b, 0x34,
+ 0xcb, 0x08, 0xa9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x26,
+ 0x30, 0x24, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,
+ 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02,
+ 0x01, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,
+ 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x40, 0xd2, 0x70,
+ 0x02, 0x08, 0x19, 0xa0, 0xb8, 0x8d, 0x9d, 0x3d, 0x62, 0x41,
+ 0x90, 0x2a, 0x36, 0x4a, 0x8b, 0x21, 0x42, 0x9a, 0xb4, 0xc5,
+ 0xf8, 0x79, 0x17, 0xd7, 0x64, 0x4d, 0xbf, 0x8f, 0x6a, 0x04,
+ 0x54, 0x7a, 0x0b, 0xd4, 0xb5, 0x0e, 0xab, 0xf7, 0xb7, 0x06,
+ 0x2b, 0xf8, 0xde, 0x87, 0xb2, 0x37, 0x3b, 0x95, 0x01, 0xba,
+ 0x9f, 0x8f, 0xec, 0x0a, 0x86, 0xca, 0x51, 0xb6, 0x25, 0x73,
+ 0x2f, 0xa1, 0x66, 0xc8, 0x7a, 0x5e, 0x51, 0xbd, 0x49, 0xb5,
+ 0x75, 0xda, 0xea, 0xe5, 0xeb, 0x5d, 0xe3, 0xb0, 0xad, 0x49,
+ 0x9f, 0x8b, 0xfd, 0x89, 0xb3, 0xb7, 0xb2, 0x4c, 0x7d, 0x8a,
+ 0x29, 0xb2, 0xbe, 0x04, 0xef, 0x9c, 0x73, 0x3c, 0xea, 0xa3,
+ 0x9f, 0x07, 0x66, 0x5a, 0x2f, 0x38, 0xad, 0x1a, 0xeb, 0xe1,
+ 0xb0, 0x62, 0x14, 0x55, 0xdc, 0x8c, 0x83, 0xbb, 0xc7, 0x13,
+ 0x04, 0x41, 0x54, 0xf1, 0x45, 0x31, 0x82, 0x01, 0x33, 0x30,
+ 0x82, 0x01, 0x2f, 0x02, 0x01, 0x01, 0x30, 0x81, 0x8e, 0x30,
+ 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
+ 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06,
+ 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62,
+ 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65,
+ 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c,
+ 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
+ 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,
+ 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f,
+ 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78,
+ 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45,
+ 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74,
+ 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x43, 0x41, 0x02, 0x01,
+ 0x04, 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x01, 0x05, 0x00, 0x04, 0x81, 0x80, 0x1f, 0x95,
+ 0x53, 0x9c, 0x63, 0xcc, 0x9e, 0xe3, 0x41, 0x30, 0xaf, 0x66,
+ 0xac, 0x7c, 0x39, 0x69, 0xa0, 0x02, 0xe3, 0x28, 0xfa, 0xf6,
+ 0x71, 0xf4, 0xcf, 0x97, 0x2a, 0xbb, 0xe0, 0x1d, 0x71, 0x73,
+ 0x4a, 0xa7, 0xea, 0xb0, 0x72, 0xc3, 0xd2, 0xba, 0x52, 0x42,
+ 0x06, 0x88, 0x4a, 0xa6, 0x41, 0x1d, 0x2f, 0x82, 0xb3, 0x7d,
+ 0x32, 0x59, 0x34, 0x4e, 0x47, 0x1b, 0xaa, 0x5e, 0x90, 0xe2,
+ 0x73, 0x62, 0x2d, 0x6f, 0x6c, 0x47, 0x52, 0x05, 0x90, 0xcb,
+ 0xac, 0x30, 0xa8, 0x20, 0x71, 0x14, 0x39, 0x16, 0x85, 0x3d,
+ 0x32, 0x2f, 0x9d, 0x31, 0x97, 0xa8, 0x96, 0xb9, 0xf2, 0x2b,
+ 0xdc, 0xa6, 0x2f, 0x68, 0xc7, 0xac, 0x46, 0xa2, 0xc7, 0x26,
+ 0xd0, 0xde, 0xac, 0x1d, 0x5d, 0x70, 0x65, 0xc6, 0x26, 0xdd,
+ 0x30, 0x3f, 0x3a, 0xbd, 0x5e, 0x8f, 0x87, 0x64, 0xab, 0xe7,
+ 0xf9, 0x71, 0x64, 0x03, 0x05, 0xbf ) );
+
+/** Signature generated with a non-code-signing certificate */
+SIGNATURE ( genericsigned_sig,
+ DATA ( 0x30, 0x82, 0x0c, 0x2f, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x0c, 0x20, 0x30,
+ 0x82, 0x0c, 0x1c, 0x02, 0x01, 0x01, 0x31, 0x09, 0x30, 0x07,
+ 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x30, 0x0b, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01,
+ 0xa0, 0x82, 0x0a, 0xc6, 0x30, 0x82, 0x02, 0x9a, 0x30, 0x82,
+ 0x02, 0x03, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x05,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,
+ 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10,
+ 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e,
+ 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c,
+ 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
+ 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72,
+ 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c,
+ 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61,
+ 0x66, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32,
+ 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x35,
+ 0x5a, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x33, 0x32, 0x32, 0x30,
+ 0x30, 0x30, 0x31, 0x33, 0x35, 0x5a, 0x30, 0x81, 0x8b, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x19, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63,
+ 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e,
+ 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x81,
+ 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00,
+ 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xc6, 0xfc, 0x96,
+ 0x1e, 0x90, 0x32, 0xed, 0xb8, 0x54, 0xb2, 0xc2, 0x39, 0x66,
+ 0x19, 0xca, 0xd8, 0x45, 0x21, 0xb7, 0x5a, 0x8d, 0x8d, 0x71,
+ 0xef, 0x69, 0x37, 0x40, 0xbb, 0xa4, 0xde, 0x09, 0x1b, 0x17,
+ 0x83, 0x3a, 0x7a, 0xf1, 0x7b, 0x02, 0x31, 0x5d, 0x1f, 0x3a,
+ 0xe5, 0x29, 0x28, 0x9b, 0x7e, 0x7b, 0x5a, 0xc4, 0x18, 0x3e,
+ 0x43, 0xe6, 0xe9, 0x6e, 0xd1, 0x8d, 0x86, 0xcf, 0xb5, 0x9f,
+ 0x7f, 0x50, 0x4e, 0x06, 0x13, 0xf7, 0xb2, 0xee, 0xef, 0x0e,
+ 0xab, 0x50, 0x44, 0x42, 0xfd, 0x3a, 0xa9, 0x47, 0x83, 0x34,
+ 0x17, 0xdf, 0xee, 0x3d, 0x84, 0x1f, 0xed, 0x7e, 0xfa, 0x0f,
+ 0xa8, 0xfc, 0x07, 0xf8, 0xd1, 0x49, 0x99, 0x1a, 0xad, 0x39,
+ 0x16, 0xb3, 0x71, 0x15, 0x2e, 0x82, 0x20, 0x7a, 0x92, 0xed,
+ 0x1e, 0x37, 0xf6, 0x46, 0x5e, 0x7d, 0x9b, 0xa1, 0x53, 0x4d,
+ 0x13, 0x91, 0xcd, 0x7a, 0x77, 0x02, 0x03, 0x01, 0x00, 0x01,
+ 0xa3, 0x0f, 0x30, 0x0d, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d,
+ 0x0f, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
+ 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0xb2, 0x39, 0x0b, 0x02,
+ 0x33, 0xca, 0x48, 0x96, 0x13, 0x53, 0xe9, 0x1b, 0x28, 0xd6,
+ 0x35, 0x4e, 0x0c, 0x9d, 0xd0, 0xe3, 0x79, 0x65, 0x0a, 0xe7,
+ 0xa6, 0x22, 0x61, 0x26, 0xbe, 0xb4, 0x05, 0xec, 0x5f, 0x83,
+ 0xb7, 0x0e, 0xa4, 0xae, 0x50, 0xb1, 0xa9, 0x45, 0x25, 0xf2,
+ 0x52, 0x1a, 0x63, 0x05, 0x50, 0x75, 0x33, 0xca, 0x8a, 0xb1,
+ 0xf2, 0x19, 0xd3, 0x93, 0x84, 0x67, 0x42, 0xe3, 0xb7, 0xa6,
+ 0xf9, 0x4d, 0x90, 0x7e, 0x13, 0x40, 0xd3, 0x22, 0x9f, 0x83,
+ 0xaf, 0x70, 0xb2, 0x7d, 0x4d, 0xcc, 0xae, 0x18, 0x9e, 0xca,
+ 0xc8, 0xcb, 0x82, 0x93, 0xcb, 0xce, 0xc6, 0x32, 0xcf, 0x4e,
+ 0x04, 0x64, 0x18, 0x5b, 0xc2, 0x1a, 0xb6, 0xd1, 0x8a, 0xc4,
+ 0x99, 0xce, 0xdd, 0xd7, 0x7e, 0xec, 0xf5, 0xa9, 0xa7, 0x00,
+ 0xc2, 0xd3, 0x6a, 0xb9, 0xcd, 0x25, 0x88, 0x08, 0x71, 0xf5,
+ 0x6d, 0x44, 0xe7, 0x93, 0x30, 0x82, 0x02, 0xb3, 0x30, 0x82,
+ 0x02, 0x1c, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,
+ 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10,
+ 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e,
+ 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c,
+ 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
+ 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72,
+ 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c,
+ 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x72, 0x6f, 0x6f,
+ 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32,
+ 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33,
+ 0x5a, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x32, 0x31, 0x37, 0x30,
+ 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x30, 0x81, 0x90, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x1e, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65,
+ 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65,
+ 0x20, 0x43, 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
+ 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
+ 0x81, 0x00, 0xc9, 0x3a, 0xee, 0xc6, 0x3c, 0xac, 0x4d, 0x81,
+ 0xc6, 0x98, 0x5e, 0xe1, 0x48, 0x66, 0x1a, 0x1e, 0x60, 0x19,
+ 0x41, 0xae, 0xca, 0x14, 0x97, 0xc8, 0x3a, 0x50, 0xb6, 0x48,
+ 0xf5, 0x42, 0xac, 0x0f, 0xe1, 0xe3, 0x47, 0xf0, 0xbf, 0x7c,
+ 0xd0, 0xee, 0x8f, 0xb7, 0xa6, 0x19, 0xad, 0xbb, 0xc5, 0x1b,
+ 0x34, 0x38, 0xc8, 0xbd, 0x55, 0x84, 0x93, 0x72, 0xaf, 0x84,
+ 0xfc, 0x9b, 0x97, 0x1d, 0xb5, 0x54, 0x24, 0xd6, 0x5d, 0xb7,
+ 0x31, 0xf4, 0xbd, 0x3b, 0x40, 0x97, 0xc0, 0xa9, 0x5a, 0x2a,
+ 0xcb, 0x6b, 0x98, 0x07, 0xdb, 0xb5, 0x9f, 0xe8, 0x31, 0x3f,
+ 0x01, 0x46, 0x46, 0x70, 0x05, 0xa2, 0x0f, 0x8c, 0x7a, 0x61,
+ 0xf3, 0xdf, 0xdb, 0xa1, 0x37, 0x2c, 0x88, 0x6a, 0x81, 0x21,
+ 0x12, 0x4c, 0xf5, 0xcd, 0xaf, 0xc9, 0xd2, 0x36, 0x3d, 0x82,
+ 0xd1, 0xca, 0x19, 0xaf, 0x4e, 0xae, 0x50, 0x71, 0x44, 0xbf,
+ 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x23, 0x30, 0x21, 0x30,
+ 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
+ 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03,
+ 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02,
+ 0x02, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81,
+ 0x00, 0x5d, 0x3c, 0xb3, 0x52, 0x19, 0xa6, 0x9e, 0x4a, 0x44,
+ 0x98, 0xbf, 0x51, 0x20, 0x47, 0x0a, 0xf3, 0x26, 0x1a, 0xcc,
+ 0x35, 0x2f, 0xc9, 0xed, 0xe0, 0x9d, 0x46, 0xeb, 0xbc, 0x7e,
+ 0xc9, 0xb9, 0x1d, 0x76, 0xa4, 0x1d, 0xc2, 0xd9, 0x16, 0x29,
+ 0x77, 0x01, 0x40, 0xdd, 0xe5, 0xcb, 0x28, 0x91, 0x3a, 0x0c,
+ 0x13, 0x01, 0x1b, 0x72, 0x62, 0x45, 0x27, 0xfd, 0xd7, 0x00,
+ 0x47, 0x36, 0x09, 0x1e, 0x7b, 0xd2, 0xcb, 0x95, 0x3d, 0x28,
+ 0x82, 0xce, 0x83, 0x59, 0x32, 0xf9, 0xe6, 0xec, 0x89, 0xac,
+ 0x88, 0x45, 0x22, 0x88, 0x6f, 0x5e, 0xa2, 0x79, 0x95, 0xba,
+ 0xb9, 0xc9, 0xb6, 0x4c, 0x7c, 0xb4, 0x29, 0xa1, 0x02, 0xf5,
+ 0xac, 0x5d, 0x8e, 0x52, 0xeb, 0xe8, 0xb1, 0x56, 0x49, 0xb3,
+ 0x77, 0x62, 0x7d, 0x87, 0x4d, 0x17, 0xf2, 0x62, 0x83, 0x08,
+ 0x59, 0x21, 0x60, 0x0d, 0x84, 0x8e, 0x5a, 0x84, 0xf6, 0x30,
+ 0x82, 0x02, 0xb3, 0x30, 0x82, 0x02, 0x1c, 0xa0, 0x03, 0x02,
+ 0x01, 0x02, 0x02, 0x09, 0x00, 0xc6, 0xb8, 0x9c, 0x58, 0xd2,
+ 0xdc, 0xc9, 0x5d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
+ 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81,
+ 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
+ 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03,
+ 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72,
+ 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31,
+ 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09,
+ 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31,
+ 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f,
+ 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d,
+ 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06,
+ 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65,
+ 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20,
+ 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20,
+ 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17,
+ 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30,
+ 0x31, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x30, 0x38,
+ 0x30, 0x38, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x30,
+ 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
+ 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06,
+ 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62,
+ 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65,
+ 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c,
+ 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
+ 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,
+ 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f,
+ 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78,
+ 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45,
+ 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74,
+ 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x81,
+ 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00,
+ 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xaa, 0x72, 0xb5,
+ 0xc1, 0x73, 0xf4, 0x95, 0x76, 0xa4, 0x27, 0xab, 0x5e, 0xeb,
+ 0x1d, 0x9d, 0xd0, 0x04, 0xb2, 0x93, 0x05, 0xc7, 0xfa, 0x75,
+ 0x84, 0x66, 0xe6, 0x3a, 0x26, 0x1f, 0xbc, 0x2d, 0xfd, 0x8f,
+ 0x59, 0x64, 0xac, 0xcf, 0x65, 0x9d, 0x82, 0x23, 0xc3, 0x72,
+ 0x93, 0xf2, 0x40, 0x68, 0x32, 0xd1, 0xb8, 0xf1, 0x47, 0x61,
+ 0x50, 0xea, 0xbc, 0xcc, 0x3c, 0x6b, 0x74, 0x7a, 0xec, 0x2b,
+ 0x75, 0xa6, 0xc2, 0xa2, 0xb8, 0xbf, 0x23, 0x48, 0x97, 0xd5,
+ 0xaf, 0x77, 0xc1, 0x92, 0x88, 0xd7, 0x38, 0xb7, 0x9e, 0xda,
+ 0xee, 0x72, 0x04, 0xcb, 0x96, 0xe5, 0xdb, 0xfd, 0x9b, 0x5d,
+ 0x99, 0x4e, 0x7a, 0x60, 0x23, 0x34, 0xa4, 0x8d, 0xd7, 0x6c,
+ 0xe7, 0x5d, 0x93, 0x97, 0xe1, 0xab, 0x36, 0x2c, 0x24, 0x16,
+ 0x92, 0x66, 0xf6, 0x6a, 0x14, 0x23, 0x1d, 0x18, 0xb9, 0x44,
+ 0x24, 0x61, 0x6b, 0xd3, 0x75, 0x02, 0x03, 0x01, 0x00, 0x01,
+ 0xa3, 0x23, 0x30, 0x21, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d,
+ 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01,
+ 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01,
+ 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
+ 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x94, 0x9e, 0xea, 0x17,
+ 0x8d, 0x27, 0xa9, 0x17, 0xe5, 0xa9, 0x19, 0xbe, 0x82, 0x36,
+ 0xbd, 0xac, 0x74, 0xf3, 0x6e, 0x75, 0x71, 0x30, 0x1c, 0x05,
+ 0x80, 0x6d, 0x1a, 0x69, 0x37, 0x86, 0x9c, 0x77, 0x75, 0x29,
+ 0xa1, 0xc6, 0xb7, 0x11, 0x0a, 0x63, 0x27, 0xee, 0xb1, 0xc8,
+ 0x94, 0xa9, 0x2e, 0x56, 0x8f, 0xca, 0x9d, 0xbe, 0xf4, 0xdb,
+ 0x63, 0x97, 0x68, 0x3b, 0x13, 0xf8, 0x6a, 0xa5, 0xd1, 0x3d,
+ 0xed, 0xbb, 0x86, 0x9d, 0x42, 0xfc, 0x15, 0x0a, 0x04, 0xf8,
+ 0x3c, 0x0e, 0xc4, 0x86, 0x05, 0x57, 0x56, 0x96, 0xf6, 0xc0,
+ 0x18, 0x53, 0xb0, 0xc5, 0xf0, 0xca, 0x72, 0x77, 0x77, 0xc9,
+ 0x8e, 0x90, 0xa5, 0x4b, 0xb6, 0x80, 0x4a, 0x4c, 0x34, 0x6f,
+ 0xc9, 0xe8, 0x6f, 0xc2, 0x28, 0xdf, 0x93, 0xa9, 0xf5, 0x63,
+ 0x18, 0xc0, 0xec, 0x9e, 0xd5, 0x19, 0x36, 0xc5, 0x94, 0x10,
+ 0xd4, 0x72, 0xd2, 0xb8, 0x30, 0x82, 0x02, 0xb6, 0x30, 0x82,
+ 0x02, 0x1f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01, 0x02,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x90, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,
+ 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10,
+ 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e,
+ 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c,
+ 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
+ 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72,
+ 0x67, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x0c, 0x1e, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c,
+ 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74,
+ 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20,
+ 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33,
+ 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17,
+ 0x0d, 0x31, 0x34, 0x31, 0x32, 0x31, 0x37, 0x30, 0x30, 0x30,
+ 0x31, 0x33, 0x33, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30,
+ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42,
+ 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c,
+ 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
+ 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06,
+ 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62,
+ 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06,
+ 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20,
+ 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74,
+ 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b,
+ 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67,
+ 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c,
+ 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66,
+ 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x66,
+ 0x20, 0x43, 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
+ 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
+ 0x81, 0x00, 0xc3, 0x55, 0xad, 0xdf, 0x7b, 0xd1, 0x48, 0xc3,
+ 0xd3, 0x02, 0x54, 0x6c, 0x92, 0x45, 0x22, 0x3d, 0x90, 0xd8,
+ 0xc7, 0x13, 0xcd, 0xc1, 0x59, 0xc6, 0xe0, 0xad, 0x0e, 0xe6,
+ 0xdb, 0x3b, 0xe8, 0x63, 0xea, 0x4e, 0xb6, 0xea, 0x50, 0xea,
+ 0x6e, 0x33, 0x9d, 0x28, 0x25, 0x42, 0x49, 0xd0, 0xf0, 0xed,
+ 0xc5, 0x5b, 0x6b, 0x4a, 0xe7, 0x45, 0xfa, 0xd3, 0x3f, 0xae,
+ 0xde, 0x5a, 0x90, 0xab, 0xf1, 0x61, 0x2f, 0x40, 0x5e, 0xcf,
+ 0x8b, 0x0b, 0x10, 0x59, 0xa9, 0xd0, 0x1e, 0x0f, 0x18, 0x6b,
+ 0x92, 0xd8, 0x9f, 0x58, 0x10, 0x84, 0xb6, 0x15, 0xe8, 0x5b,
+ 0xc4, 0xa0, 0x3e, 0x49, 0x8b, 0xea, 0xdd, 0xa9, 0x7e, 0x32,
+ 0x26, 0x9a, 0x68, 0x44, 0xf0, 0x30, 0xca, 0x2a, 0xd6, 0x19,
+ 0x7a, 0x80, 0xfd, 0xd7, 0xfc, 0xc7, 0x5d, 0xe7, 0x61, 0xd2,
+ 0x3f, 0x1f, 0x2c, 0x40, 0x70, 0x7b, 0x34, 0xcb, 0x08, 0xa9,
+ 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x26, 0x30, 0x24, 0x30,
+ 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
+ 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30,
+ 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,
+ 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x03, 0x81, 0x81, 0x00, 0x40, 0xd2, 0x70, 0x02, 0x08, 0x19,
+ 0xa0, 0xb8, 0x8d, 0x9d, 0x3d, 0x62, 0x41, 0x90, 0x2a, 0x36,
+ 0x4a, 0x8b, 0x21, 0x42, 0x9a, 0xb4, 0xc5, 0xf8, 0x79, 0x17,
+ 0xd7, 0x64, 0x4d, 0xbf, 0x8f, 0x6a, 0x04, 0x54, 0x7a, 0x0b,
+ 0xd4, 0xb5, 0x0e, 0xab, 0xf7, 0xb7, 0x06, 0x2b, 0xf8, 0xde,
+ 0x87, 0xb2, 0x37, 0x3b, 0x95, 0x01, 0xba, 0x9f, 0x8f, 0xec,
+ 0x0a, 0x86, 0xca, 0x51, 0xb6, 0x25, 0x73, 0x2f, 0xa1, 0x66,
+ 0xc8, 0x7a, 0x5e, 0x51, 0xbd, 0x49, 0xb5, 0x75, 0xda, 0xea,
+ 0xe5, 0xeb, 0x5d, 0xe3, 0xb0, 0xad, 0x49, 0x9f, 0x8b, 0xfd,
+ 0x89, 0xb3, 0xb7, 0xb2, 0x4c, 0x7d, 0x8a, 0x29, 0xb2, 0xbe,
+ 0x04, 0xef, 0x9c, 0x73, 0x3c, 0xea, 0xa3, 0x9f, 0x07, 0x66,
+ 0x5a, 0x2f, 0x38, 0xad, 0x1a, 0xeb, 0xe1, 0xb0, 0x62, 0x14,
+ 0x55, 0xdc, 0x8c, 0x83, 0xbb, 0xc7, 0x13, 0x04, 0x41, 0x54,
+ 0xf1, 0x45, 0x31, 0x82, 0x01, 0x33, 0x30, 0x82, 0x01, 0x2f,
+ 0x02, 0x01, 0x01, 0x30, 0x81, 0x8e, 0x30, 0x81, 0x88, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65,
+ 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65,
+ 0x61, 0x66, 0x20, 0x43, 0x41, 0x02, 0x01, 0x05, 0x30, 0x07,
+ 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ 0x05, 0x00, 0x04, 0x81, 0x80, 0xc5, 0x08, 0x17, 0x23, 0xb9,
+ 0x8d, 0x45, 0x0b, 0x1a, 0x9a, 0x10, 0xa7, 0x16, 0x57, 0x05,
+ 0x86, 0x0c, 0x9a, 0xfd, 0x2d, 0x9c, 0x87, 0x15, 0xb3, 0x0f,
+ 0xd5, 0x3b, 0x7b, 0xa8, 0xce, 0xa2, 0xcc, 0x2a, 0x2a, 0x6a,
+ 0xa0, 0xab, 0x2f, 0x57, 0x8c, 0xb7, 0xc7, 0x4e, 0x2a, 0xbd,
+ 0x72, 0xc5, 0xef, 0x2a, 0xd8, 0xb8, 0xf2, 0x9d, 0xbe, 0xd4,
+ 0xa7, 0x55, 0x3e, 0x06, 0x3b, 0x3f, 0xfa, 0x92, 0x4f, 0x1f,
+ 0x84, 0x84, 0x16, 0xcf, 0x9b, 0x26, 0x71, 0xf7, 0x57, 0x6a,
+ 0x6d, 0xdd, 0x34, 0x6b, 0x12, 0xc4, 0x70, 0x78, 0x59, 0x9b,
+ 0xf7, 0x45, 0xf4, 0xae, 0x30, 0xb0, 0x8c, 0x21, 0xb7, 0xb1,
+ 0x96, 0xda, 0x91, 0x0e, 0x57, 0x7e, 0x1b, 0xe2, 0xef, 0x82,
+ 0xd5, 0xa3, 0xd1, 0xeb, 0x47, 0x5c, 0x33, 0x91, 0xf8, 0x90,
+ 0xf9, 0x99, 0x0c, 0x69, 0x05, 0xee, 0xa1, 0x1a, 0x2d, 0x44,
+ 0x7e, 0x7c, 0x99 ) );
+
+/** Signature generated with a non-signing certificate */
+SIGNATURE ( nonsigned_sig,
+ DATA ( 0x30, 0x82, 0x0c, 0x12, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x07, 0x02, 0xa0, 0x82, 0x0c, 0x03, 0x30,
+ 0x82, 0x0b, 0xff, 0x02, 0x01, 0x01, 0x31, 0x09, 0x30, 0x07,
+ 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x30, 0x0b, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x07, 0x01,
+ 0xa0, 0x82, 0x0a, 0xa9, 0x30, 0x82, 0x02, 0x7d, 0x30, 0x82,
+ 0x01, 0xe6, 0x02, 0x01, 0x03, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15,
+ 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72,
+ 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07,
+ 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30,
+ 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70,
+ 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58,
+ 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73,
+ 0x74, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x43, 0x41, 0x30,
+ 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32, 0x30,
+ 0x30, 0x30, 0x31, 0x33, 0x34, 0x5a, 0x17, 0x0d, 0x31, 0x33,
+ 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x34,
+ 0x5a, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
+ 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30,
+ 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69,
+ 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73,
+ 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69,
+ 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1b, 0x30,
+ 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x12, 0x62, 0x6f,
+ 0x6f, 0x74, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x69, 0x70,
+ 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x81, 0x9f, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81,
+ 0x89, 0x02, 0x81, 0x81, 0x00, 0xbd, 0x43, 0x97, 0x45, 0xa2,
+ 0xe0, 0x1d, 0x38, 0x41, 0xb0, 0xd9, 0x91, 0xf9, 0x77, 0xa9,
+ 0xcb, 0x9c, 0x9c, 0x93, 0xfe, 0x5a, 0xee, 0xbc, 0xd9, 0x0f,
+ 0x39, 0xf6, 0x42, 0xe4, 0x55, 0x21, 0xbb, 0x11, 0xfd, 0xfd,
+ 0xba, 0x25, 0x58, 0xc8, 0xc6, 0xa5, 0x3b, 0x6f, 0x80, 0xba,
+ 0x5b, 0xbc, 0x89, 0xca, 0x7a, 0xdf, 0x6e, 0xb9, 0x81, 0xb6,
+ 0x25, 0x67, 0x0a, 0x38, 0x10, 0xf8, 0x26, 0x43, 0x0c, 0x51,
+ 0x02, 0x14, 0xd6, 0xf2, 0x9d, 0x7c, 0xf5, 0x25, 0x1c, 0x78,
+ 0x4d, 0x47, 0xaf, 0x87, 0x2e, 0x38, 0x49, 0x87, 0xb5, 0x8a,
+ 0xf3, 0xb5, 0xd4, 0x15, 0x69, 0x2a, 0x52, 0xc9, 0x46, 0x97,
+ 0x34, 0x8e, 0x50, 0x4b, 0xc4, 0xf2, 0xfb, 0x39, 0xfd, 0x16,
+ 0x68, 0xdb, 0xa8, 0x17, 0xe2, 0x71, 0x4b, 0xe0, 0xdf, 0x3d,
+ 0xfc, 0xc3, 0x9b, 0x9d, 0x22, 0xc9, 0xd3, 0xf6, 0x02, 0xa6,
+ 0x60, 0xef, 0xf7, 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x7d, 0xff, 0x73,
+ 0xf3, 0x68, 0xe3, 0x75, 0xf1, 0xcf, 0xac, 0x2e, 0x23, 0x73,
+ 0xea, 0xd1, 0x26, 0x33, 0xbf, 0xf9, 0x56, 0xdf, 0xbf, 0x98,
+ 0x20, 0x84, 0x08, 0x78, 0x6b, 0xe6, 0x71, 0x7e, 0x22, 0x68,
+ 0x4d, 0x6c, 0xbb, 0xd5, 0xcc, 0xb4, 0x28, 0x33, 0x5e, 0xbe,
+ 0x4d, 0x10, 0x16, 0x9f, 0x65, 0x3b, 0x68, 0x90, 0xa7, 0xf7,
+ 0x9d, 0x57, 0x71, 0x45, 0x39, 0x86, 0x4c, 0xc0, 0x97, 0x34,
+ 0x03, 0x9c, 0x2b, 0x25, 0x05, 0xb1, 0x5c, 0x0c, 0x4e, 0xf2,
+ 0x14, 0xbf, 0xcf, 0xf0, 0x9a, 0x2d, 0xcf, 0x02, 0x47, 0x60,
+ 0xd2, 0xe9, 0xed, 0xbf, 0x71, 0x5d, 0x07, 0x09, 0x01, 0x87,
+ 0xeb, 0xf7, 0xa8, 0x26, 0x86, 0x24, 0x59, 0xf0, 0x31, 0x3b,
+ 0x42, 0xd1, 0xf1, 0xfd, 0x7c, 0x49, 0x5f, 0x1a, 0xf0, 0x41,
+ 0x67, 0xf0, 0x16, 0x3a, 0xfd, 0xb6, 0xb5, 0xf6, 0x2e, 0x0c,
+ 0x18, 0x1f, 0x09, 0x8e, 0x4d, 0x30, 0x82, 0x02, 0xb3, 0x30,
+ 0x82, 0x02, 0x1c, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01,
+ 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x88, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65,
+ 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x72, 0x6f,
+ 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31,
+ 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33,
+ 0x33, 0x5a, 0x17, 0x0d, 0x31, 0x34, 0x31, 0x32, 0x31, 0x37,
+ 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x30, 0x81, 0x90,
+ 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,
+ 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12,
+ 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18,
+ 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46,
+ 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
+ 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e,
+ 0x6f, 0x72, 0x67, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x0c, 0x1e, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73,
+ 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69,
+ 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74,
+ 0x65, 0x20, 0x43, 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
+ 0x81, 0x81, 0x00, 0xc9, 0x3a, 0xee, 0xc6, 0x3c, 0xac, 0x4d,
+ 0x81, 0xc6, 0x98, 0x5e, 0xe1, 0x48, 0x66, 0x1a, 0x1e, 0x60,
+ 0x19, 0x41, 0xae, 0xca, 0x14, 0x97, 0xc8, 0x3a, 0x50, 0xb6,
+ 0x48, 0xf5, 0x42, 0xac, 0x0f, 0xe1, 0xe3, 0x47, 0xf0, 0xbf,
+ 0x7c, 0xd0, 0xee, 0x8f, 0xb7, 0xa6, 0x19, 0xad, 0xbb, 0xc5,
+ 0x1b, 0x34, 0x38, 0xc8, 0xbd, 0x55, 0x84, 0x93, 0x72, 0xaf,
+ 0x84, 0xfc, 0x9b, 0x97, 0x1d, 0xb5, 0x54, 0x24, 0xd6, 0x5d,
+ 0xb7, 0x31, 0xf4, 0xbd, 0x3b, 0x40, 0x97, 0xc0, 0xa9, 0x5a,
+ 0x2a, 0xcb, 0x6b, 0x98, 0x07, 0xdb, 0xb5, 0x9f, 0xe8, 0x31,
+ 0x3f, 0x01, 0x46, 0x46, 0x70, 0x05, 0xa2, 0x0f, 0x8c, 0x7a,
+ 0x61, 0xf3, 0xdf, 0xdb, 0xa1, 0x37, 0x2c, 0x88, 0x6a, 0x81,
+ 0x21, 0x12, 0x4c, 0xf5, 0xcd, 0xaf, 0xc9, 0xd2, 0x36, 0x3d,
+ 0x82, 0xd1, 0xca, 0x19, 0xaf, 0x4e, 0xae, 0x50, 0x71, 0x44,
+ 0xbf, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x23, 0x30, 0x21,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,
+ 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06,
+ 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,
+ 0x02, 0x02, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
+ 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81,
+ 0x81, 0x00, 0x5d, 0x3c, 0xb3, 0x52, 0x19, 0xa6, 0x9e, 0x4a,
+ 0x44, 0x98, 0xbf, 0x51, 0x20, 0x47, 0x0a, 0xf3, 0x26, 0x1a,
+ 0xcc, 0x35, 0x2f, 0xc9, 0xed, 0xe0, 0x9d, 0x46, 0xeb, 0xbc,
+ 0x7e, 0xc9, 0xb9, 0x1d, 0x76, 0xa4, 0x1d, 0xc2, 0xd9, 0x16,
+ 0x29, 0x77, 0x01, 0x40, 0xdd, 0xe5, 0xcb, 0x28, 0x91, 0x3a,
+ 0x0c, 0x13, 0x01, 0x1b, 0x72, 0x62, 0x45, 0x27, 0xfd, 0xd7,
+ 0x00, 0x47, 0x36, 0x09, 0x1e, 0x7b, 0xd2, 0xcb, 0x95, 0x3d,
+ 0x28, 0x82, 0xce, 0x83, 0x59, 0x32, 0xf9, 0xe6, 0xec, 0x89,
+ 0xac, 0x88, 0x45, 0x22, 0x88, 0x6f, 0x5e, 0xa2, 0x79, 0x95,
+ 0xba, 0xb9, 0xc9, 0xb6, 0x4c, 0x7c, 0xb4, 0x29, 0xa1, 0x02,
+ 0xf5, 0xac, 0x5d, 0x8e, 0x52, 0xeb, 0xe8, 0xb1, 0x56, 0x49,
+ 0xb3, 0x77, 0x62, 0x7d, 0x87, 0x4d, 0x17, 0xf2, 0x62, 0x83,
+ 0x08, 0x59, 0x21, 0x60, 0x0d, 0x84, 0x8e, 0x5a, 0x84, 0xf6,
+ 0x30, 0x82, 0x02, 0xb3, 0x30, 0x82, 0x02, 0x1c, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xc6, 0xb8, 0x9c, 0x58,
+ 0xd2, 0xdc, 0xc9, 0x5d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,
+ 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
+ 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06,
+ 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62,
+ 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65,
+ 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c,
+ 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
+ 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,
+ 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f,
+ 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78,
+ 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45,
+ 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74,
+ 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e,
+ 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30,
+ 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x30,
+ 0x38, 0x30, 0x38, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a,
+ 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15,
+ 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72,
+ 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07,
+ 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30,
+ 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70,
+ 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58,
+ 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73,
+ 0x74, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30,
+ 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d,
+ 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xaa, 0x72,
+ 0xb5, 0xc1, 0x73, 0xf4, 0x95, 0x76, 0xa4, 0x27, 0xab, 0x5e,
+ 0xeb, 0x1d, 0x9d, 0xd0, 0x04, 0xb2, 0x93, 0x05, 0xc7, 0xfa,
+ 0x75, 0x84, 0x66, 0xe6, 0x3a, 0x26, 0x1f, 0xbc, 0x2d, 0xfd,
+ 0x8f, 0x59, 0x64, 0xac, 0xcf, 0x65, 0x9d, 0x82, 0x23, 0xc3,
+ 0x72, 0x93, 0xf2, 0x40, 0x68, 0x32, 0xd1, 0xb8, 0xf1, 0x47,
+ 0x61, 0x50, 0xea, 0xbc, 0xcc, 0x3c, 0x6b, 0x74, 0x7a, 0xec,
+ 0x2b, 0x75, 0xa6, 0xc2, 0xa2, 0xb8, 0xbf, 0x23, 0x48, 0x97,
+ 0xd5, 0xaf, 0x77, 0xc1, 0x92, 0x88, 0xd7, 0x38, 0xb7, 0x9e,
+ 0xda, 0xee, 0x72, 0x04, 0xcb, 0x96, 0xe5, 0xdb, 0xfd, 0x9b,
+ 0x5d, 0x99, 0x4e, 0x7a, 0x60, 0x23, 0x34, 0xa4, 0x8d, 0xd7,
+ 0x6c, 0xe7, 0x5d, 0x93, 0x97, 0xe1, 0xab, 0x36, 0x2c, 0x24,
+ 0x16, 0x92, 0x66, 0xf6, 0x6a, 0x14, 0x23, 0x1d, 0x18, 0xb9,
+ 0x44, 0x24, 0x61, 0x6b, 0xd3, 0x75, 0x02, 0x03, 0x01, 0x00,
+ 0x01, 0xa3, 0x23, 0x30, 0x21, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,
+ 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,
+ 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x94, 0x9e, 0xea,
+ 0x17, 0x8d, 0x27, 0xa9, 0x17, 0xe5, 0xa9, 0x19, 0xbe, 0x82,
+ 0x36, 0xbd, 0xac, 0x74, 0xf3, 0x6e, 0x75, 0x71, 0x30, 0x1c,
+ 0x05, 0x80, 0x6d, 0x1a, 0x69, 0x37, 0x86, 0x9c, 0x77, 0x75,
+ 0x29, 0xa1, 0xc6, 0xb7, 0x11, 0x0a, 0x63, 0x27, 0xee, 0xb1,
+ 0xc8, 0x94, 0xa9, 0x2e, 0x56, 0x8f, 0xca, 0x9d, 0xbe, 0xf4,
+ 0xdb, 0x63, 0x97, 0x68, 0x3b, 0x13, 0xf8, 0x6a, 0xa5, 0xd1,
+ 0x3d, 0xed, 0xbb, 0x86, 0x9d, 0x42, 0xfc, 0x15, 0x0a, 0x04,
+ 0xf8, 0x3c, 0x0e, 0xc4, 0x86, 0x05, 0x57, 0x56, 0x96, 0xf6,
+ 0xc0, 0x18, 0x53, 0xb0, 0xc5, 0xf0, 0xca, 0x72, 0x77, 0x77,
+ 0xc9, 0x8e, 0x90, 0xa5, 0x4b, 0xb6, 0x80, 0x4a, 0x4c, 0x34,
+ 0x6f, 0xc9, 0xe8, 0x6f, 0xc2, 0x28, 0xdf, 0x93, 0xa9, 0xf5,
+ 0x63, 0x18, 0xc0, 0xec, 0x9e, 0xd5, 0x19, 0x36, 0xc5, 0x94,
+ 0x10, 0xd4, 0x72, 0xd2, 0xb8, 0x30, 0x82, 0x02, 0xb6, 0x30,
+ 0x82, 0x02, 0x1f, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x01,
+ 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x90, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x27, 0x30, 0x25, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x1e, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65,
+ 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e,
+ 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65,
+ 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30,
+ 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a,
+ 0x17, 0x0d, 0x31, 0x34, 0x31, 0x32, 0x31, 0x37, 0x30, 0x30,
+ 0x30, 0x31, 0x33, 0x33, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47,
+ 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10,
+ 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e,
+ 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c,
+ 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04,
+ 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72,
+ 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c,
+ 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61,
+ 0x66, 0x20, 0x43, 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
+ 0x81, 0x81, 0x00, 0xc3, 0x55, 0xad, 0xdf, 0x7b, 0xd1, 0x48,
+ 0xc3, 0xd3, 0x02, 0x54, 0x6c, 0x92, 0x45, 0x22, 0x3d, 0x90,
+ 0xd8, 0xc7, 0x13, 0xcd, 0xc1, 0x59, 0xc6, 0xe0, 0xad, 0x0e,
+ 0xe6, 0xdb, 0x3b, 0xe8, 0x63, 0xea, 0x4e, 0xb6, 0xea, 0x50,
+ 0xea, 0x6e, 0x33, 0x9d, 0x28, 0x25, 0x42, 0x49, 0xd0, 0xf0,
+ 0xed, 0xc5, 0x5b, 0x6b, 0x4a, 0xe7, 0x45, 0xfa, 0xd3, 0x3f,
+ 0xae, 0xde, 0x5a, 0x90, 0xab, 0xf1, 0x61, 0x2f, 0x40, 0x5e,
+ 0xcf, 0x8b, 0x0b, 0x10, 0x59, 0xa9, 0xd0, 0x1e, 0x0f, 0x18,
+ 0x6b, 0x92, 0xd8, 0x9f, 0x58, 0x10, 0x84, 0xb6, 0x15, 0xe8,
+ 0x5b, 0xc4, 0xa0, 0x3e, 0x49, 0x8b, 0xea, 0xdd, 0xa9, 0x7e,
+ 0x32, 0x26, 0x9a, 0x68, 0x44, 0xf0, 0x30, 0xca, 0x2a, 0xd6,
+ 0x19, 0x7a, 0x80, 0xfd, 0xd7, 0xfc, 0xc7, 0x5d, 0xe7, 0x61,
+ 0xd2, 0x3f, 0x1f, 0x2c, 0x40, 0x70, 0x7b, 0x34, 0xcb, 0x08,
+ 0xa9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x26, 0x30, 0x24,
+ 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,
+ 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00,
+ 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,
+ 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
+ 0x00, 0x03, 0x81, 0x81, 0x00, 0x40, 0xd2, 0x70, 0x02, 0x08,
+ 0x19, 0xa0, 0xb8, 0x8d, 0x9d, 0x3d, 0x62, 0x41, 0x90, 0x2a,
+ 0x36, 0x4a, 0x8b, 0x21, 0x42, 0x9a, 0xb4, 0xc5, 0xf8, 0x79,
+ 0x17, 0xd7, 0x64, 0x4d, 0xbf, 0x8f, 0x6a, 0x04, 0x54, 0x7a,
+ 0x0b, 0xd4, 0xb5, 0x0e, 0xab, 0xf7, 0xb7, 0x06, 0x2b, 0xf8,
+ 0xde, 0x87, 0xb2, 0x37, 0x3b, 0x95, 0x01, 0xba, 0x9f, 0x8f,
+ 0xec, 0x0a, 0x86, 0xca, 0x51, 0xb6, 0x25, 0x73, 0x2f, 0xa1,
+ 0x66, 0xc8, 0x7a, 0x5e, 0x51, 0xbd, 0x49, 0xb5, 0x75, 0xda,
+ 0xea, 0xe5, 0xeb, 0x5d, 0xe3, 0xb0, 0xad, 0x49, 0x9f, 0x8b,
+ 0xfd, 0x89, 0xb3, 0xb7, 0xb2, 0x4c, 0x7d, 0x8a, 0x29, 0xb2,
+ 0xbe, 0x04, 0xef, 0x9c, 0x73, 0x3c, 0xea, 0xa3, 0x9f, 0x07,
+ 0x66, 0x5a, 0x2f, 0x38, 0xad, 0x1a, 0xeb, 0xe1, 0xb0, 0x62,
+ 0x14, 0x55, 0xdc, 0x8c, 0x83, 0xbb, 0xc7, 0x13, 0x04, 0x41,
+ 0x54, 0xf1, 0x45, 0x31, 0x82, 0x01, 0x33, 0x30, 0x82, 0x01,
+ 0x2f, 0x02, 0x01, 0x01, 0x30, 0x81, 0x8e, 0x30, 0x81, 0x88,
+ 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13,
+ 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55,
+ 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12,
+ 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18,
+ 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46,
+ 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73,
+ 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03,
+ 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e,
+ 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73,
+ 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x6c,
+ 0x65, 0x61, 0x66, 0x20, 0x43, 0x41, 0x02, 0x01, 0x03, 0x30,
+ 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x01, 0x05, 0x00, 0x04, 0x81, 0x80, 0x33, 0x5c, 0xf8, 0xb4,
+ 0xa5, 0x70, 0xb9, 0x0f, 0x05, 0x50, 0x72, 0xdb, 0xa3, 0xba,
+ 0x8e, 0x0d, 0x6d, 0x8a, 0x2a, 0x91, 0x65, 0xb8, 0x76, 0xd0,
+ 0xfc, 0x9e, 0x1a, 0xdb, 0x2b, 0xd2, 0xfc, 0x03, 0xef, 0x8d,
+ 0xef, 0xfe, 0x32, 0x16, 0xad, 0xf8, 0xcb, 0x28, 0xb0, 0x61,
+ 0x15, 0xb8, 0x38, 0x72, 0xfc, 0x5d, 0xa1, 0xd2, 0xae, 0x9d,
+ 0x6a, 0xb0, 0x5e, 0xbb, 0x78, 0xd3, 0x39, 0x24, 0xa3, 0x71,
+ 0xa6, 0x90, 0x64, 0xa5, 0x82, 0xba, 0x3b, 0x85, 0x2d, 0x16,
+ 0x78, 0xf4, 0xcc, 0x9f, 0xfa, 0xc5, 0x68, 0x44, 0x2c, 0x22,
+ 0xb9, 0x4c, 0x07, 0x5c, 0xb4, 0x79, 0x1a, 0x48, 0xc2, 0x66,
+ 0x71, 0x57, 0x6d, 0xdf, 0x33, 0xa2, 0x26, 0x99, 0xdd, 0xe9,
+ 0xb9, 0x1b, 0xe1, 0xa6, 0x4d, 0x53, 0x8e, 0x71, 0x81, 0xa9,
+ 0x5d, 0x70, 0x47, 0x54, 0xbc, 0x15, 0xad, 0x9c, 0xe8, 0x90,
+ 0x52, 0x3e, 0x49, 0x86 ) );
+
+/** iPXE self-test root CA certificate */
+static uint8_t root_crt_fingerprint[] =
+ FINGERPRINT ( 0x71, 0x5d, 0x51, 0x37, 0x5e, 0x18, 0xb3, 0xbc,
+ 0xbb, 0x30, 0x0e, 0x8f, 0x50, 0xc7, 0x55, 0xf5,
+ 0x96, 0xe7, 0xa8, 0x6d, 0x63, 0x2d, 0x32, 0x38,
+ 0xaf, 0x00, 0xc4, 0x1a, 0xfc, 0xd8, 0xac, 0xc3 );
+
+/** Empty certificate store */
+static struct x509_chain empty_store = {
+ .refcnt = REF_INIT ( ref_no_free ),
+ .links = LIST_HEAD_INIT ( empty_store.links ),
+};
+
+/** Root certificate list containing the iPXE self-test root CA */
+static struct x509_root test_root = {
+ .digest = &cms_test_algorithm,
+ .count = 1,
+ .fingerprints = root_crt_fingerprint,
+};
+
+/** Dummy fingerprint (not matching any certificates) */
+static uint8_t dummy_fingerprint[] =
+ FINGERPRINT ( 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff );
+
+/** Certificate store containing a dummy fingerprint */
+static struct x509_root dummy_root = {
+ .digest = &cms_test_algorithm,
+ .count = 1,
+ .fingerprints = dummy_fingerprint,
+};
+
+/** Time at which all test certificates are valid */
+static time_t test_time = 1332374737ULL; /* Thu Mar 22 00:05:37 2012 */
+
+/** Time at which end-entity test certificates are invalid */
+static time_t test_expired = 1375573111ULL; /* Sat Aug 3 23:38:31 2013 */
+
+/**
+ * Report signature parsing test result
+ *
+ * @v sgn Test signature
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void cms_signature_okx ( struct cms_test_signature *sgn,
+ const char *file, unsigned int line ) {
+
+ okx ( cms_signature ( sgn->data, sgn->len, &sgn->sig ) == 0,
+ file, line );
+}
+#define cms_signature_ok( sgn ) \
+ cms_signature_okx ( sgn, __FILE__, __LINE__ )
+
+/**
+ * Report signature verification test result
+ *
+ * @v sgn Test signature
+ * @v code Test signed code
+ * @v name Test verification name
+ * @v time Test verification time
+ * @v store Test certificate store
+ * @v root Test root certificate list
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void cms_verify_okx ( struct cms_test_signature *sgn,
+ struct cms_test_code *code, const char *name,
+ time_t time, struct x509_chain *store,
+ struct x509_root *root, const char *file,
+ unsigned int line ) {
+
+ x509_invalidate_chain ( sgn->sig->certificates );
+ okx ( cms_verify ( sgn->sig, virt_to_user ( code->data ), code->len,
+ name, time, store, root ) == 0, file, line );
+}
+#define cms_verify_ok( sgn, code, name, time, store, root ) \
+ cms_verify_okx ( sgn, code, name, time, store, root, \
+ __FILE__, __LINE__ )
+
+/**
+ * Report signature verification failure test result
+ *
+ * @v sgn Test signature
+ * @v code Test signed code
+ * @v name Test verification name
+ * @v time Test verification time
+ * @v store Test certificate store
+ * @v root Test root certificate list
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void cms_verify_fail_okx ( struct cms_test_signature *sgn,
+ struct cms_test_code *code, const char *name,
+ time_t time, struct x509_chain *store,
+ struct x509_root *root, const char *file,
+ unsigned int line ) {
+
+ x509_invalidate_chain ( sgn->sig->certificates );
+ okx ( cms_verify ( sgn->sig, virt_to_user ( code->data ), code->len,
+ name, time, store, root ) != 0, file, line );
+}
+#define cms_verify_fail_ok( sgn, code, name, time, store, root ) \
+ cms_verify_fail_okx ( sgn, code, name, time, store, root, \
+ __FILE__, __LINE__ )
+
+/**
+ * Perform CMS self-tests
+ *
+ */
+static void cms_test_exec ( void ) {
+
+ /* Check that all signatures can be parsed */
+ cms_signature_ok ( &codesigned_sig );
+ cms_signature_ok ( &brokenchain_sig );
+ cms_signature_ok ( &genericsigned_sig );
+ cms_signature_ok ( &nonsigned_sig );
+
+ /* Check good signature */
+ cms_verify_ok ( &codesigned_sig, &test_code, "codesign.test.ipxe.org",
+ test_time, &empty_store, &test_root );
+ cms_verify_ok ( &codesigned_sig, &test_code,
+ NULL, test_time, &empty_store, &test_root );
+
+ /* Check incorrect signer name */
+ cms_verify_fail_ok ( &codesigned_sig, &test_code,
+ "wrongname.test.ipxe.org", test_time,
+ &empty_store, &test_root );
+
+ /* Check non-code-signing certificate */
+ cms_verify_fail_ok ( &genericsigned_sig, &test_code,
+ NULL, test_time, &empty_store, &test_root );
+
+ /* Check non-signing certificate */
+ cms_verify_fail_ok ( &nonsigned_sig, &test_code,
+ NULL, test_time, &empty_store, &test_root );
+
+ /* Check broken chain */
+ cms_verify_fail_ok ( &brokenchain_sig, &test_code,
+ NULL, test_time, &empty_store, &test_root );
+
+ /* Check untrusted signature */
+ cms_verify_fail_ok ( &codesigned_sig, &test_code,
+ NULL, test_time, &empty_store, &dummy_root );
+
+ /* Check incorrect signed content */
+ cms_verify_fail_ok ( &codesigned_sig, &bad_code,
+ NULL, test_time, &empty_store, &test_root );
+
+ /* Check expired signature */
+ cms_verify_fail_ok ( &codesigned_sig, &test_code,
+ NULL, test_expired, &empty_store, &test_root );
+
+ /* Sanity check */
+ assert ( list_empty ( &empty_store.links ) );
+
+ /* Drop signature references */
+ cms_put ( nonsigned_sig.sig );
+ cms_put ( genericsigned_sig.sig );
+ cms_put ( brokenchain_sig.sig );
+ cms_put ( codesigned_sig.sig );
+}
+
+/** CMS self-test */
+struct self_test cms_test __self_test = {
+ .name = "cms",
+ .exec = cms_test_exec,
+};
+
+/* Drag in algorithms required for tests */
+REQUIRE_OBJECT ( rsa );
+REQUIRE_OBJECT ( md5 );
+REQUIRE_OBJECT ( sha1 );
+REQUIRE_OBJECT ( sha256 );
diff --git a/roms/ipxe/src/tests/comboot/shuffle-simple.asm b/roms/ipxe/src/tests/comboot/shuffle-simple.asm
new file mode 100644
index 00000000..efc7d9b4
--- /dev/null
+++ b/roms/ipxe/src/tests/comboot/shuffle-simple.asm
@@ -0,0 +1,40 @@
+ bits 16
+ org 100h
+
+ jmp start
+
+shuffle_start:
+ push 0xB800
+ pop es
+ mov cx, 80*24*2
+ mov ax, 'AA'
+ xor di, di
+ rep stosw
+.lbl: jmp .lbl
+shuffle_end:
+ nop
+shuffle_len equ (shuffle_end - shuffle_start + 1)
+
+start:
+ ; calculate physical address of shuffled part
+ xor eax, eax
+ push ds
+ pop ax
+ shl eax, 4
+ add ax, shuffle_start
+ mov dword [source], eax
+
+ mov ax, 0012h
+ mov di, shuffle_descriptors
+ mov cx, num_shuffle_descriptors
+ mov ebp, 0x7c00
+ int 22h
+ int3
+
+shuffle_descriptors:
+ dd 0x7C00
+source: dd 0
+ dd shuffle_len
+
+num_shuffle_descriptors equ 1
+
diff --git a/roms/ipxe/src/tests/comboot/version.asm b/roms/ipxe/src/tests/comboot/version.asm
new file mode 100644
index 00000000..01140423
--- /dev/null
+++ b/roms/ipxe/src/tests/comboot/version.asm
@@ -0,0 +1,136 @@
+ bits 16
+ org 100h
+
+_start:
+ ; first check for SYSLINUX
+ mov ah, 30h
+ int 21h
+
+ cmp eax, 59530000h
+ jne .not_syslinux
+ cmp ebx, 4c530000h
+ jne .not_syslinux
+ cmp ecx, 4e490000h
+ jne .not_syslinux
+ cmp edx, 58550000h
+ jne .not_syslinux
+
+ ; now get syslinux version
+ mov ax, 0001h
+ int 22h
+
+ push cx
+ push dx
+ push di
+ push si
+ push es
+
+ ; print version string
+ mov dx, str_version
+ mov ah, 09h
+ int 21h
+
+ pop es
+ pop bx
+ push es
+ mov ax, 0002h
+ int 22h
+
+ ; print copyright string
+ mov dx, str_copyright
+ mov ah, 09h
+ int 21h
+
+ pop es
+ pop bx
+ mov ax, 0002h
+ int 22h
+
+ ; print syslinux derivative id
+ mov dx, str_derivative
+ mov ah, 09h
+ int 21h
+
+ pop ax
+ call print_hex_byte
+
+ ; print version number
+ mov dx, str_version_num
+ mov ah, 09h
+ int 21h
+
+ pop cx
+ push cx
+ mov ax, cx
+ and ax, 0FFh
+ call print_dec_word
+
+ mov dl, '.'
+ mov ah, 02h
+ int 21h
+
+ pop cx
+ mov ax, cx
+ shr ax, 8
+ call print_dec_word
+
+ ret
+
+
+.not_syslinux:
+ mov dx, str_not_syslinux
+ mov ah, 09h
+ int 21h
+ ret
+
+; input: al = byte to print in hex
+print_hex_byte:
+ push ax
+ shr al, 4
+ call print_hex_nybble
+ pop ax
+ call print_hex_nybble
+ ret
+
+; input: bottom half of al = nybble to print in hex
+print_hex_nybble:
+ push ax
+ mov bl, al
+ and bx, 1111b
+ mov dl, [str_hex + bx]
+ mov ah, 02h
+ int 21h
+ pop ax
+ ret
+
+str_hex: db "01234567890abcdef"
+
+; input: ax = word to print
+print_dec_word:
+ mov cx, 10
+ mov word [.count], 0
+.loop:
+ xor dx, dx
+ div cx
+ inc word [.count]
+ push dx
+ test ax, ax
+ jnz .loop
+
+.print:
+ pop dx
+ add dx, '0'
+ mov ah, 02h
+ int 21h
+ dec word [.count]
+ jnz .print
+
+ ret
+
+.count: dw 0
+
+str_not_syslinux: db "Not SYSLINUX or derivative (running on DOS?)$"
+str_version: db "Version: $"
+str_copyright: db 10, "Copyright: $"
+str_derivative: db 10, "Derivative ID: 0x$"
+str_version_num: db 10, "Version number: $"
diff --git a/roms/ipxe/src/tests/crc32_test.c b/roms/ipxe/src/tests/crc32_test.c
new file mode 100644
index 00000000..873f633a
--- /dev/null
+++ b/roms/ipxe/src/tests/crc32_test.c
@@ -0,0 +1,116 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * CRC32 tests
+ *
+ *
+ * Test vectors generated using Perl's Digest::CRC:
+ *
+ * use Digest::CRC qw ( crc );
+ *
+ * printf "%#08x", crc ( $data, 32, $seed, 0, 1, 0x04c11db7, 1 );
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <ipxe/crc32.h>
+#include <ipxe/test.h>
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** A CRC32 test */
+struct crc32_test {
+ /** Test data */
+ const void *data;
+ /** Length of test data */
+ size_t len;
+ /** Seed */
+ uint32_t seed;
+ /** Expected CRC32 */
+ uint32_t crc32;
+};
+
+/**
+ * Define a CRC32 test
+ *
+ * @v name Test name
+ * @v DATA Test data
+ * @v SEED Seed
+ * @v CRC32 Expected CRC32
+ * @ret test CRC32 test
+ */
+#define CRC32_TEST( name, DATA, SEED, CRC32 ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static struct crc32_test name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ .seed = SEED, \
+ .crc32 = CRC32, \
+ };
+
+/**
+ * Report a CRC32 test result
+ *
+ * @v test CRC32 test
+ */
+#define crc32_ok( test ) do { \
+ uint32_t crc32; \
+ crc32 = crc32_le ( (test)->seed, (test)->data, (test)->len ); \
+ ok ( crc32 == (test)->crc32 ); \
+ } while ( 0 )
+
+/* CRC32 tests */
+CRC32_TEST ( empty_test,
+ DATA ( ),
+ 0x12345678UL, 0x12345678UL );
+CRC32_TEST ( hw_test,
+ DATA ( 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd' ),
+ 0xffffffffUL, 0xf2b5ee7aUL );
+CRC32_TEST ( hw_split_part1_test,
+ DATA ( 'h', 'e', 'l', 'l', 'o' ),
+ 0xffffffffUL, 0xc9ef5979UL );
+CRC32_TEST ( hw_split_part2_test,
+ DATA ( ' ', 'w', 'o', 'r', 'l', 'd' ),
+ 0xc9ef5979UL, 0xf2b5ee7aUL );
+
+/**
+ * Perform CRC32 self-tests
+ *
+ */
+static void crc32_test_exec ( void ) {
+
+ crc32_ok ( &empty_test );
+ crc32_ok ( &hw_test );
+ crc32_ok ( &hw_split_part1_test );
+ crc32_ok ( &hw_split_part2_test );
+}
+
+/** CRC32 self-test */
+struct self_test crc32_test __self_test = {
+ .name = "crc32",
+ .exec = crc32_test_exec,
+};
diff --git a/roms/ipxe/src/tests/deflate_test.c b/roms/ipxe/src/tests/deflate_test.c
new file mode 100644
index 00000000..68c1aad9
--- /dev/null
+++ b/roms/ipxe/src/tests/deflate_test.c
@@ -0,0 +1,246 @@
+/*
+ * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * DEFLATE tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ipxe/deflate.h>
+#include <ipxe/test.h>
+
+/** A DEFLATE test */
+struct deflate_test {
+ /** Compression format */
+ enum deflate_format format;
+ /** Compressed data */
+ const void *compressed;
+ /** Length of compressed data */
+ size_t compressed_len;
+ /** Expected uncompressed data */
+ const void *expected;
+ /** Length of expected uncompressed data */
+ size_t expected_len;
+};
+
+/** A DEFLATE fragment list */
+struct deflate_test_fragments {
+ /** Fragment lengths */
+ size_t len[8];
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define a DEFLATE test */
+#define DEFLATE( name, FORMAT, COMPRESSED, EXPECTED ) \
+ static const uint8_t name ## _compressed[] = COMPRESSED; \
+ static const uint8_t name ## _expected[] = EXPECTED; \
+ static struct deflate_test name = { \
+ .format = FORMAT, \
+ .compressed = name ## _compressed, \
+ .compressed_len = sizeof ( name ## _compressed ), \
+ .expected = name ## _expected, \
+ .expected_len = sizeof ( name ## _expected ), \
+ };
+
+/* Empty file, no compression */
+DEFLATE ( empty_literal, DEFLATE_RAW,
+ DATA ( 0x01, 0x00, 0x00, 0xff, 0xff ), DATA() );
+
+/* "iPXE" string, no compression */
+DEFLATE ( literal, DEFLATE_RAW,
+ DATA ( 0x01, 0x04, 0x00, 0xfb, 0xff, 0x69, 0x50, 0x58, 0x45 ),
+ DATA ( 0x69, 0x50, 0x58, 0x45 ) );
+
+/* "iPXE" string, no compression, split into two literals */
+DEFLATE ( split_literal, DEFLATE_RAW,
+ DATA ( 0x00, 0x02, 0x00, 0xfd, 0xff, 0x69, 0x50, 0x01, 0x02, 0x00,
+ 0xfd, 0xff, 0x58, 0x45 ),
+ DATA ( 0x69, 0x50, 0x58, 0x45 ) );
+
+/* Empty file */
+DEFLATE ( empty, DEFLATE_RAW, DATA ( 0x03, 0x00 ), DATA() );
+
+/* "Hello world" */
+DEFLATE ( hello_world, DEFLATE_RAW,
+ DATA ( 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0x28, 0xcf, 0x2f, 0xca,
+ 0x49, 0x01, 0x00 ),
+ DATA ( 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c,
+ 0x64 ) );
+
+/* "Hello hello world" */
+DEFLATE ( hello_hello_world, DEFLATE_RAW,
+ DATA ( 0xf3, 0x48, 0xcd, 0xc9, 0xc9, 0x57, 0xc8, 0x00, 0x93, 0xe5,
+ 0xf9, 0x45, 0x39, 0x29, 0x00 ),
+ DATA ( 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x68, 0x65, 0x6c, 0x6c,
+ 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c, 0x64 ) );
+
+/* "This specification defines a lossless compressed data format" */
+DEFLATE ( rfc_sentence, DEFLATE_RAW,
+ DATA ( 0x0d, 0xc6, 0xdb, 0x09, 0x00, 0x21, 0x0c, 0x04, 0xc0, 0x56,
+ 0xb6, 0x28, 0x1b, 0x08, 0x79, 0x70, 0x01, 0x35, 0xe2, 0xa6,
+ 0x7f, 0xce, 0xf9, 0x9a, 0xf1, 0x25, 0xc1, 0xe3, 0x9a, 0x91,
+ 0x2a, 0x9d, 0xb5, 0x61, 0x1e, 0xb9, 0x9d, 0x10, 0xcc, 0x22,
+ 0xa7, 0x93, 0xd0, 0x5a, 0xe7, 0xbe, 0xb8, 0xc1, 0xa4, 0x05,
+ 0x51, 0x77, 0x49, 0xff ),
+ DATA ( 0x54, 0x68, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x64,
+ 0x65, 0x66, 0x69, 0x6e, 0x65, 0x73, 0x20, 0x61, 0x20, 0x6c,
+ 0x6f, 0x73, 0x73, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x63, 0x6f,
+ 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x64,
+ 0x61, 0x74, 0x61, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74 ) );
+
+/* "ZLIB Compressed Data Format Specification" */
+DEFLATE ( zlib, DEFLATE_ZLIB,
+ DATA ( 0x78, 0x01, 0x8b, 0xf2, 0xf1, 0x74, 0x52, 0x70, 0xce, 0xcf,
+ 0x2d, 0x28, 0x4a, 0x2d, 0x2e, 0x4e, 0x4d, 0x51, 0x70, 0x49,
+ 0x2c, 0x49, 0x54, 0x70, 0xcb, 0x2f, 0xca, 0x4d, 0x2c, 0x51,
+ 0x08, 0x2e, 0x48, 0x4d, 0xce, 0x4c, 0xcb, 0x4c, 0x4e, 0x2c,
+ 0xc9, 0xcc, 0xcf, 0x03, 0x00, 0x2c, 0x0e, 0x0e, 0xeb ),
+ DATA ( 0x5a, 0x4c, 0x49, 0x42, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x72,
+ 0x65, 0x73, 0x73, 0x65, 0x64, 0x20, 0x44, 0x61, 0x74, 0x61,
+ 0x20, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x53, 0x70,
+ 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e ) );
+
+/* "ZLIB Compressed Data Format Specification" fragment list */
+static struct deflate_test_fragments zlib_fragments[] = {
+ { { -1UL, } },
+ { { 0, 1, 5, -1UL, } },
+ { { 0, 0, 1, 0, 0, 1, -1UL } },
+ { { 10, 8, 4, 7, 11, -1UL } },
+ { { 45, -1UL } },
+ { { 48, -1UL } },
+};
+
+/**
+ * Report DEFLATE test result
+ *
+ * @v deflate Decompressor
+ * @v test Deflate test
+ * @v frags Fragment list, or NULL
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void deflate_okx ( struct deflate *deflate,
+ struct deflate_test *test,
+ struct deflate_test_fragments *frags,
+ const char *file, unsigned int line ) {
+ uint8_t data[ test->expected_len ];
+ struct deflate_chunk in;
+ struct deflate_chunk out;
+ size_t frag_len = -1UL;
+ size_t offset = 0;
+ size_t remaining = test->compressed_len;
+ unsigned int i;
+
+ /* Initialise decompressor */
+ deflate_init ( deflate, test->format );
+
+ /* Initialise output chunk */
+ deflate_chunk_init ( &out, virt_to_user ( data ), 0, sizeof ( data ) );
+
+ /* Process input (in fragments, if applicable) */
+ for ( i = 0 ; i < ( sizeof ( frags->len ) /
+ sizeof ( frags->len[0] ) ) ; i++ ) {
+
+ /* Initialise input chunk */
+ if ( frags )
+ frag_len = frags->len[i];
+ if ( frag_len > remaining )
+ frag_len = remaining;
+ deflate_chunk_init ( &in, virt_to_user ( test->compressed ),
+ offset, ( offset + frag_len ) );
+
+ /* Decompress this fragment */
+ okx ( deflate_inflate ( deflate, &in, &out ) == 0, file, line );
+ okx ( in.len == ( offset + frag_len ), file, line );
+ okx ( in.offset == in.len, file, line );
+
+ /* Move to next fragment */
+ offset = in.offset;
+ remaining -= frag_len;
+ if ( ! remaining )
+ break;
+
+ /* Check that decompression has not terminated early */
+ okx ( ! deflate_finished ( deflate ), file, line );
+ }
+
+ /* Check decompression has terminated as expected */
+ okx ( deflate_finished ( deflate ), file, line );
+ okx ( offset == test->compressed_len, file, line );
+ okx ( out.offset == test->expected_len, file, line );
+ okx ( memcmp ( data, test->expected, test->expected_len ) == 0,
+ file, line );
+}
+#define deflate_ok( deflate, test, frags ) \
+ deflate_okx ( deflate, test, frags, __FILE__, __LINE__ )
+
+/**
+ * Perform DEFLATE self-test
+ *
+ */
+static void deflate_test_exec ( void ) {
+ struct deflate *deflate;
+ unsigned int i;
+
+ /* Allocate shared structure */
+ deflate = malloc ( sizeof ( *deflate ) );
+ ok ( deflate != NULL );
+
+ /* Perform self-tests */
+ if ( deflate ) {
+
+ /* Test as a single pass */
+ deflate_ok ( deflate, &empty_literal, NULL );
+ deflate_ok ( deflate, &literal, NULL );
+ deflate_ok ( deflate, &split_literal, NULL );
+ deflate_ok ( deflate, &empty, NULL );
+ deflate_ok ( deflate, &hello_world, NULL );
+ deflate_ok ( deflate, &hello_hello_world, NULL );
+ deflate_ok ( deflate, &rfc_sentence, NULL );
+ deflate_ok ( deflate, &zlib, NULL );
+
+ /* Test fragmentation */
+ for ( i = 0 ; i < ( sizeof ( zlib_fragments ) /
+ sizeof ( zlib_fragments[0] ) ) ; i++ ) {
+ deflate_ok ( deflate, &zlib, &zlib_fragments[i] );
+ }
+ }
+
+ /* Free shared structure */
+ free ( deflate );
+}
+
+/** DEFLATE self-test */
+struct self_test deflate_test __self_test = {
+ .name = "deflate",
+ .exec = deflate_test_exec,
+};
diff --git a/roms/ipxe/src/tests/digest_test.c b/roms/ipxe/src/tests/digest_test.c
new file mode 100644
index 00000000..4df26c09
--- /dev/null
+++ b/roms/ipxe/src/tests/digest_test.c
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Digest self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdlib.h>
+#include <string.h>
+#include <ipxe/crypto.h>
+#include <ipxe/profile.h>
+#include "digest_test.h"
+
+/** Number of sample iterations for profiling */
+#define PROFILE_COUNT 16
+
+/**
+ * Test digest algorithm
+ *
+ * @v digest Digest algorithm
+ * @v fragments Digest test fragment list, or NULL
+ * @v data Test data
+ * @v len Length of test data
+ * @v expected Expected digest value
+ * @ret ok Digest value is as expected
+ */
+int digest_test ( struct digest_algorithm *digest,
+ struct digest_test_fragments *fragments,
+ void *data, size_t len, void *expected ) {
+ uint8_t ctx[digest->ctxsize];
+ uint8_t out[digest->digestsize];
+ size_t frag_len = 0;
+ unsigned int i;
+
+ /* Initialise digest */
+ digest_init ( digest, ctx );
+
+ /* Update digest fragment-by-fragment */
+ for ( i = 0 ; len && ( i < ( sizeof ( fragments->len ) /
+ sizeof ( fragments->len[0] ) ) ) ; i++ ) {
+ if ( fragments )
+ frag_len = fragments->len[i];
+ if ( ( frag_len == 0 ) || ( frag_len < len ) )
+ frag_len = len;
+ digest_update ( digest, ctx, data, frag_len );
+ data += frag_len;
+ len -= frag_len;
+ }
+
+ /* Finalise digest */
+ digest_final ( digest, ctx, out );
+
+ /* 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];
+ struct profiler profiler;
+ unsigned long cost;
+ unsigned int i;
+
+ /* Fill buffer with pseudo-random data */
+ srand ( 0x1234568 );
+ for ( i = 0 ; i < sizeof ( random ) ; i++ )
+ random[i] = rand();
+
+ /* Profile digest calculation */
+ memset ( &profiler, 0, sizeof ( profiler ) );
+ for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
+ profile_start ( &profiler );
+ digest_init ( digest, ctx );
+ digest_update ( digest, ctx, random, sizeof ( random ) );
+ digest_final ( digest, ctx, out );
+ profile_stop ( &profiler );
+ }
+
+ /* Round to nearest whole number of cycles per byte */
+ cost = ( ( profile_mean ( &profiler ) + ( sizeof ( random ) / 2 ) ) /
+ sizeof ( random ) );
+
+ return cost;
+}
diff --git a/roms/ipxe/src/tests/digest_test.h b/roms/ipxe/src/tests/digest_test.h
new file mode 100644
index 00000000..49e06d1c
--- /dev/null
+++ b/roms/ipxe/src/tests/digest_test.h
@@ -0,0 +1,37 @@
+#ifndef _DIGEST_TEST_H
+#define _DIGEST_TEST_H
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdint.h>
+#include <ipxe/crypto.h>
+#include <ipxe/test.h>
+
+/** Maximum number of digest test fragments */
+#define NUM_DIGEST_TEST_FRAG 8
+
+/** A digest test fragment list */
+struct digest_test_fragments {
+ /** Fragment lengths */
+ size_t len[NUM_DIGEST_TEST_FRAG];
+};
+
+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
+ *
+ * @v digest Digest algorithm
+ * @v fragments Digest test fragment list, or NULL
+ * @v data Test data
+ * @v len Length of test data
+ * @v expected Expected digest value
+ */
+#define digest_ok( digest, fragments, data, len, expected ) do { \
+ ok ( digest_test ( digest, fragments, data, len, expected ) ); \
+ } while ( 0 )
+
+#endif /* _DIGEST_TEST_H */
diff --git a/roms/ipxe/src/tests/dns_test.c b/roms/ipxe/src/tests/dns_test.c
new file mode 100644
index 00000000..52f5f19f
--- /dev/null
+++ b/roms/ipxe/src/tests/dns_test.c
@@ -0,0 +1,605 @@
+/*
+ * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * DNS self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <assert.h>
+#include <ipxe/dns.h>
+#include <ipxe/test.h>
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** A DNS encoding test */
+struct dns_encode_test {
+ /** String */
+ const char *string;
+ /** Encoded string */
+ const void *data;
+ /** Length of encoded string */
+ int len;
+};
+
+/**
+ * Define a DNS encoding test
+ *
+ * @v _name Test name
+ * @v _string Test string
+ * @v _data Expected encoded data
+ * @ret test DNS encoding test
+ */
+#define DNS_ENCODE( _name, _string, _data ) \
+ static const uint8_t _name ## __data[] = _data; \
+ static struct dns_encode_test _name = { \
+ .string = _string, \
+ .data = _name ## __data, \
+ .len = sizeof ( _name ## __data ), \
+ }
+
+/**
+ * Report DNS encoding test result
+ *
+ * @v test DNS encoding test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_encode_okx ( struct dns_encode_test *test, const char *file,
+ unsigned int line ) {
+ uint8_t data[ test->len ];
+ struct dns_name name;
+ int len;
+
+ /* Check ability to determine length with no buffer */
+ memset ( &name, 0, sizeof ( name ) );
+ len = dns_encode ( test->string, &name );
+ okx ( len >= 0, file, line );
+ okx ( len == test->len, file, line );
+
+ /* Check encoded name */
+ name.data = data;
+ name.len = sizeof ( data );
+ len = dns_encode ( test->string, &name );
+ okx ( len >= 0, file, line );
+ if ( len >= 0 ) {
+ okx ( len == test->len, file, line );
+ okx ( memcmp ( data, test->data, test->len ) == 0, file, line );
+ DBGC ( test, "DNS encoded \"%s\" to:\n", test->string );
+ DBGC_HDA ( test, 0, data, len );
+ }
+}
+#define dns_encode_ok( test ) dns_encode_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report DNS encoding failure test result
+ *
+ * @v test DNS encoding test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_encode_fail_okx ( struct dns_encode_test *test,
+ const char *file, unsigned int line ) {
+ struct dns_name name = { .data = NULL, .len = 0 };
+ int len;
+
+ len = dns_encode ( test->string, &name );
+ okx ( len < 0, file, line );
+}
+#define dns_encode_fail_ok( test ) \
+ dns_encode_fail_okx ( test, __FILE__, __LINE__ )
+
+/** A DNS decoding test */
+struct dns_decode_test {
+ /** Name */
+ struct dns_name name;
+ /** Expected string */
+ const char *string;
+};
+
+/**
+ * Define a DNS decoding test
+ *
+ * @v _name Test name
+ * @v _data RFC1035-encoded data
+ * @v _offset Starting offset within encoded data
+ * @v _string Expected decoded string
+ * @ret test DNS decoding test
+ */
+#define DNS_DECODE( _name, _data, _offset, _string ) \
+ static uint8_t _name ## __data[] = _data; \
+ static struct dns_decode_test _name = { \
+ .name = { \
+ .data = _name ## __data, \
+ .offset = _offset, \
+ .len = sizeof ( _name ## __data ), \
+ }, \
+ .string = _string, \
+ }
+
+/**
+ * Report DNS decoding test result
+ *
+ * @v test DNS decoding test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_decode_okx ( struct dns_decode_test *test, const char *file,
+ unsigned int line ) {
+ char string[ strlen ( test->string ) + 1 /* NUL */ ];
+ int len;
+
+ /* Check ability to determine length with no buffer */
+ len = dns_decode ( &test->name, NULL, 0 );
+ okx ( len >= 0, file, line );
+ okx ( len == ( ( int ) strlen ( test->string ) ), file, line );
+
+ /* Check decoded string */
+ len = dns_decode ( &test->name, string, sizeof ( string ) );
+ okx ( len >= 0, file, line );
+ if ( len >= 0 ) {
+ okx ( strcmp ( string, test->string ) == 0, file, line );
+ DBGC ( test, "DNS decoded \"%s\" from offset %#zx in:\n",
+ string, test->name.offset );
+ DBGC_HDA ( test, 0, test->name.data, test->name.len );
+ }
+}
+#define dns_decode_ok( test ) dns_decode_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report DNS decoding failure test result
+ *
+ * @v test DNS decoding test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_decode_fail_okx ( struct dns_decode_test *test,
+ const char *file, unsigned int line ) {
+ int len;
+
+ len = dns_decode ( &test->name, NULL, 0 );
+ okx ( len < 0, file, line );
+}
+#define dns_decode_fail_ok( test ) \
+ dns_decode_fail_okx ( test, __FILE__, __LINE__ )
+
+/** A DNS comparison test */
+struct dns_compare_test {
+ /** First name */
+ struct dns_name first;
+ /** Second name */
+ struct dns_name second;
+};
+
+/**
+ * Define a DNS comparison test
+ *
+ * @v _name Test name
+ * @v _first_data First RFC1035-encoded data
+ * @v _first_offset Starting offset within first encoded data
+ * @v _second_data Second RFC1035-encoded data
+ * @v _second_offset Starting offset within second encoded data
+ * @ret test DNS comparison test
+ */
+#define DNS_COMPARE( _name, _first_data, _first_offset, _second_data, \
+ _second_offset ) \
+ static uint8_t _name ## __first_data[] = _first_data; \
+ static uint8_t _name ## __second_data[] = _second_data; \
+ static struct dns_compare_test _name = { \
+ .first = { \
+ .data = _name ## __first_data, \
+ .offset = _first_offset, \
+ .len = sizeof ( _name ## __first_data ), \
+ }, \
+ .second = { \
+ .data = _name ## __second_data, \
+ .offset = _second_offset, \
+ .len = sizeof ( _name ## __second_data ), \
+ }, \
+ }
+
+/**
+ * Report DNS comparison test result
+ *
+ * @v test DNS comparison test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_compare_okx ( struct dns_compare_test *test, const char *file,
+ unsigned int line ) {
+
+ okx ( dns_compare ( &test->first, &test->second ) == 0, file, line );
+}
+#define dns_compare_ok( test ) dns_compare_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report DNS comparison test failure result
+ *
+ * @v test DNS comparison test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_compare_fail_okx ( struct dns_compare_test *test,
+ const char *file, unsigned int line ) {
+
+ okx ( dns_compare ( &test->first, &test->second ) != 0, file, line );
+}
+#define dns_compare_fail_ok( test ) \
+ dns_compare_fail_okx ( test, __FILE__, __LINE__ )
+
+/** A DNS copying test */
+struct dns_copy_test {
+ /** Source name */
+ struct dns_name src;
+ /** Expected copied name */
+ struct dns_name dst;
+};
+
+/**
+ * Define a DNS copying test
+ *
+ * @v _name Test name
+ * @v _src_data Source RFC1035-encoded data
+ * @v _src_offset Starting offset within source encoded data
+ * @v _dst_data Expected copied RFC1035-encoded data
+ * @v _dst_offset Starting offset withint copied encoded data
+ * @ret test DNS copying test
+ */
+#define DNS_COPY( _name, _src_data, _src_offset, _dst_data, \
+ _dst_offset ) \
+ static uint8_t _name ## __src_data[] = _src_data; \
+ static uint8_t _name ## __dst_data[] = _dst_data; \
+ static struct dns_copy_test _name = { \
+ .src = { \
+ .data = _name ## __src_data, \
+ .offset = _src_offset, \
+ .len = sizeof ( _name ## __src_data ), \
+ }, \
+ .dst = { \
+ .data = _name ## __dst_data, \
+ .offset = _dst_offset, \
+ .len = sizeof ( _name ## __dst_data ), \
+ }, \
+ }
+
+/**
+ * Report a DNS copying test result
+ *
+ * @v test DNS copying test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_copy_okx ( struct dns_copy_test *test,
+ const char *file, unsigned int line ) {
+ uint8_t data[ test->dst.len ];
+ struct dns_name dst;
+ int len;
+
+ /* Check ability to determine length with no buffer */
+ memset ( &dst, 0, sizeof ( dst ) );
+ len = dns_copy ( &test->src, &dst );
+ okx ( len >= 0, file, line );
+ okx ( len == ( ( int ) ( test->dst.len - test->dst.offset ) ),
+ file, line );
+
+ /* Check copied name */
+ dst.data = data;
+ dst.offset = test->dst.offset;
+ dst.len = sizeof ( data );
+ memcpy ( dst.data, test->dst.data, test->dst.offset );
+ len = dns_copy ( &test->src, &dst );
+ okx ( len >= 0, file, line );
+ okx ( len == ( ( int ) ( test->dst.len - test->dst.offset ) ),
+ file, line );
+ okx ( memcmp ( data, test->dst.data, sizeof ( data ) ) == 0,
+ file, line );
+ DBGC ( test, "DNS copied:\n" );
+ DBGC_HDA ( test, 0, test->src.data, test->src.len );
+ DBGC_HDA ( test, 0, data, ( test->dst.offset + len ) );
+}
+#define dns_copy_ok( test ) dns_copy_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report a DNS copying failure test result
+ *
+ * @v test DNS copying test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_copy_fail_okx ( struct dns_copy_test *test,
+ const char *file, unsigned int line ) {
+ struct dns_name dst;
+ int len;
+
+ memset ( &dst, 0, sizeof ( dst ) );
+ len = dns_copy ( &test->src, &dst );
+ okx ( len < 0, file, line );
+}
+#define dns_copy_fail_ok( test ) dns_copy_fail_okx ( test, __FILE__, __LINE__ )
+
+/** A DNS search list test */
+struct dns_list_test {
+ /** Search list */
+ struct dns_name list;
+ /** Expected decoded search list */
+ const char **strings;
+ /** Number of expected decoded string */
+ unsigned int count;
+};
+
+/**
+ * Define a DNS search list test
+ *
+ * @v _name Test name
+ * @v _list RFC1035-encoded data
+ * @v _strings Expected decoded strings
+ * @ret test DNS search list test
+ */
+#define DNS_LIST( _name, _list, _strings ) \
+ static uint8_t _name ## __list[] = _list; \
+ static const char * _name ## __strings[] = _strings; \
+ static struct dns_list_test _name = { \
+ .list = { \
+ .data = _name ## __list, \
+ .offset = 0, \
+ .len = sizeof ( _name ## __list ), \
+ }, \
+ .strings = _name ## __strings, \
+ .count = ( sizeof ( _name ## __strings ) / \
+ sizeof ( _name ## __strings[0] ) ), \
+ }
+
+/**
+ * Report DNS search list test result
+ *
+ * @v test DNS search list test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void dns_list_okx ( struct dns_list_test *test, const char *file,
+ unsigned int line ) {
+ struct dns_name name;
+ unsigned int i;
+
+ DBGC ( test, "DNS search list:\n" );
+ DBGC_HDA ( test, 0, test->list.data, test->list.len );
+ memcpy ( &name, &test->list, sizeof ( name ) );
+ for ( i = 0 ; i < test->count ; i++ ) {
+ char buf[ strlen ( test->strings[i] ) + 1 /* NUL */ ];
+ int len;
+ int offset;
+
+ /* Decode this name */
+ len = dns_decode ( &name, buf, sizeof ( buf ) );
+ okx ( len >= 0, file, line );
+ if ( len >= 0 ) {
+ okx ( len == ( ( int ) strlen ( test->strings[i] ) ),
+ file, line );
+ okx ( strcmp ( buf, test->strings[i] ) == 0,
+ file, line );
+ DBGC ( test, "DNS search list found \"%s\" at offset "
+ "%#zx\n", buf, name.offset );
+ }
+
+ /* Skip to next name */
+ offset = dns_skip ( &name );
+ okx ( offset >= 0, file, line );
+ name.offset = offset;
+ }
+
+ /* Check that we have consumed the whole search list */
+ okx ( name.offset == name.len, file, line );
+}
+#define dns_list_ok( test ) dns_list_okx ( test, __FILE__, __LINE__ )
+
+/* Simple encoding test */
+DNS_ENCODE ( encode_simple, "ipxe.org",
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ) );
+
+/* Single-word encoding test */
+DNS_ENCODE ( encode_single, "foo", DATA ( 3, 'f', 'o', 'o', 0 ) );
+
+/* Absolute encoding test */
+DNS_ENCODE ( encode_absolute, "git.ipxe.org.",
+ DATA ( 3, 'g', 'i', 't', 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g',
+ 0 ) );
+
+/* Empty string encoding test */
+DNS_ENCODE ( encode_empty, "", DATA ( 0 ) );
+
+/* Root domain encoding test */
+DNS_ENCODE ( encode_root, ".", DATA ( 0 ) );
+
+/* Invalid initial dot encoding test */
+DNS_ENCODE ( encode_initial_dot, ".foo", DATA() );
+
+/* Invalid double dot encoding test */
+DNS_ENCODE ( encode_double_dot, "ipxe..org", DATA() );
+
+/* Invalid solo double dot encoding test */
+DNS_ENCODE ( encode_solo_double_dot, "..", DATA() );
+
+/* Invalid trailing double dot encoding test */
+DNS_ENCODE ( encode_trailing_double_dot, "ipxe.org..", DATA() );
+
+/* Invalid overlength label encoding test */
+DNS_ENCODE ( encode_overlength,
+ "this-label-is-maliciously-long-in-an-attempt-to-overflow-the-"
+ "length-field-and-generate-a-length-which-looks-like-a-"
+ "compression-pointer", DATA() );
+
+/* Simple decoding test */
+DNS_DECODE ( decode_simple,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0,
+ "ipxe.org" );
+
+/* Compression pointer decoding test */
+DNS_DECODE ( decode_ptr,
+ DATA ( 3, 'o', 'r', 'g', 0, 3, 'g', 'i', 't', 4, 'i', 'p', 'x',
+ 'e', 0xc0, 0x00 ), 5,
+ "git.ipxe.org" );
+
+/* Root decoding test */
+DNS_DECODE ( decode_root,
+ DATA ( 0 ), 0, "" );
+
+/* Incomplete name decoding test */
+DNS_DECODE ( decode_incomplete_name,
+ DATA ( 4, 'i', 'p', 'x', 'e' ), 0, NULL );
+
+/* Incomplete label decoding test */
+DNS_DECODE ( decode_incomplete_label,
+ DATA ( 4, 'i', 'p', 'x' ), 0, NULL );
+
+/* Incomplete compression pointer decoding test */
+DNS_DECODE ( decode_incomplete_ptr,
+ DATA ( 3, 'o', 'r', 'g', 0, 4, 'i', 'p', 'x', 'e', 0xc0 ), 5,
+ NULL );
+
+/* Forward reference decoding test */
+DNS_DECODE ( decode_forward,
+ DATA ( 0xc0, 0x02, 3, 'f', 'o', 'o', 0 ), 0, NULL );
+
+/* Infinite loop decoding test */
+DNS_DECODE ( decode_infinite,
+ DATA ( 4, 'i', 'p', 'x', 'e', 0xc0, 0x00 ), 0, NULL );
+
+/* Empty decoding test */
+DNS_DECODE ( decode_empty,
+ DATA (), 0, NULL );
+
+/* Simple comparison test */
+DNS_COMPARE ( compare_simple,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0 );
+
+/* Compression pointer comparison test */
+DNS_COMPARE ( compare_ptr,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0,
+ DATA ( 3, 'o', 'r', 'g', 0, 4, 'i', 'p', 'x', 'e',
+ 0xc0, 0x00 ), 5 );
+
+/* Case insensitive comparison test */
+DNS_COMPARE ( compare_case,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'O', 'R', 'G', 0 ), 0 );
+
+/* Mismatch comparison test */
+DNS_COMPARE ( compare_mismatch,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0,
+ DATA ( 4, 'g', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0 );
+
+/* Infinite loop comparison test */
+DNS_COMPARE ( compare_infinite,
+ DATA ( 3, 'f', 'o', 'o', 0xc0, 0x00 ), 0,
+ DATA ( 3, 'f', 'o', 'o', 0xc0, 0x00 ), 0 );
+
+/* Simple copying test */
+DNS_COPY ( copy_simple,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0 );
+
+/* Simple copying test with offset */
+DNS_COPY ( copy_offset,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0 ), 0,
+ DATA ( 'f', 'o', 'o', 0, 4, 'i', 'p', 'x', 'e',
+ 3, 'o', 'r', 'g', 0 ), 4 );
+
+/* Compression pointer copying test */
+DNS_COPY ( copy_ptr,
+ DATA ( 3, 'o', 'r', 'g', 0, 3, 'g', 'i', 't', 4, 'i', 'p', 'x', 'e',
+ 0xc0, 0x00 ), 5,
+ DATA ( 3, 'g', 'i', 't', 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g',
+ 0 ), 0 );
+
+/* Infinite loop copying test */
+DNS_COPY ( copy_infinite,
+ DATA ( 4, 'l', 'o', 'o', 'p', 7, 'f', 'o', 'r', 'e', 'v', 'e', 'r',
+ 0xc0, 0x05 ), 0,
+ DATA (), 0 );
+
+/* DNS search list test */
+DNS_LIST ( search,
+ DATA ( 4, 'i', 'p', 'x', 'e', 3, 'o', 'r', 'g', 0,
+ 4, 'b', 'o', 'o', 't', 0xc0, 0x00,
+ 3, 'd', 'e', 'v', 0xc0, 0x0a,
+ 11, 'n', 'e', 't', 'w', 'o', 'r', 'k', 'b', 'o', 'o', 't',
+ 0xc0, 0x05 ),
+ DATA ( "ipxe.org", "boot.ipxe.org", "dev.boot.ipxe.org",
+ "networkboot.org" ) );
+
+/**
+ * Perform DNS self-test
+ *
+ */
+static void dns_test_exec ( void ) {
+
+ /* Encoding tests */
+ dns_encode_ok ( &encode_simple );
+ dns_encode_ok ( &encode_single );
+ dns_encode_ok ( &encode_absolute );
+ dns_encode_ok ( &encode_empty );
+ dns_encode_ok ( &encode_root );
+ dns_encode_fail_ok ( &encode_initial_dot );
+ dns_encode_fail_ok ( &encode_double_dot );
+ dns_encode_fail_ok ( &encode_solo_double_dot );
+ dns_encode_fail_ok ( &encode_trailing_double_dot );
+ dns_encode_fail_ok ( &encode_overlength );
+
+ /* Decoding tests */
+ dns_decode_ok ( &decode_simple );
+ dns_decode_ok ( &decode_ptr );
+ dns_decode_ok ( &decode_root );
+ dns_decode_fail_ok ( &decode_incomplete_name );
+ dns_decode_fail_ok ( &decode_incomplete_label );
+ dns_decode_fail_ok ( &decode_incomplete_ptr );
+ dns_decode_fail_ok ( &decode_forward );
+ dns_decode_fail_ok ( &decode_infinite );
+ dns_decode_fail_ok ( &decode_empty );
+
+ /* Comparison tests */
+ dns_compare_ok ( &compare_simple );
+ dns_compare_ok ( &compare_ptr );
+ dns_compare_ok ( &compare_case );
+ dns_compare_fail_ok ( &compare_mismatch );
+ dns_compare_fail_ok ( &compare_infinite );
+
+ /* Copying tests */
+ dns_copy_ok ( &copy_simple );
+ dns_copy_ok ( &copy_offset );
+ dns_copy_ok ( &copy_ptr );
+ dns_copy_fail_ok ( &copy_infinite );
+
+ /* Search list tets */
+ dns_list_ok ( &search );
+}
+
+/** DNS self-test */
+struct self_test dns_test __self_test = {
+ .name = "dns",
+ .exec = dns_test_exec,
+};
diff --git a/roms/ipxe/src/tests/entropy_sample.c b/roms/ipxe/src/tests/entropy_sample.c
new file mode 100644
index 00000000..95a662e3
--- /dev/null
+++ b/roms/ipxe/src/tests/entropy_sample.c
@@ -0,0 +1,72 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Entropy sampling
+ *
+ */
+
+#include <stdio.h>
+#include <ipxe/entropy.h>
+#include <ipxe/test.h>
+
+/** Total number of test samples */
+#define SAMPLE_COUNT 65536
+
+/** Number of samples per block */
+#define SAMPLE_BLOCKSIZE 256
+
+/**
+ * Generate entropy samples for external testing
+ *
+ */
+static void entropy_sample_test_exec ( void ) {
+ static noise_sample_t samples[SAMPLE_BLOCKSIZE];
+ unsigned int i;
+ unsigned int j;
+ int rc;
+
+ /* Collect and print blocks of samples */
+ for ( i = 0 ; i < ( SAMPLE_COUNT / SAMPLE_BLOCKSIZE ) ; i++ ) {
+
+ /* Collect one block of samples */
+ rc = entropy_enable();
+ ok ( rc == 0 );
+ for ( j = 0 ; j < SAMPLE_BLOCKSIZE ; j++ ) {
+ rc = get_noise ( &samples[j] );
+ ok ( rc == 0 );
+ }
+ entropy_disable();
+
+ /* Print out sample values */
+ for ( j = 0 ; j < SAMPLE_BLOCKSIZE ; j++ ) {
+ printf ( "SAMPLE %d %d\n", ( i * SAMPLE_BLOCKSIZE + j ),
+ samples[j] );
+ }
+ }
+}
+
+/** Entropy sampling self-test */
+struct self_test entropy_sample_test __self_test = {
+ .name = "entropy_sample",
+ .exec = entropy_sample_test_exec,
+};
diff --git a/roms/ipxe/src/tests/gdbstub_test.S b/roms/ipxe/src/tests/gdbstub_test.S
new file mode 100644
index 00000000..739b0527
--- /dev/null
+++ b/roms/ipxe/src/tests/gdbstub_test.S
@@ -0,0 +1,54 @@
+ .arch i386
+
+ .section ".data", "aw", @progbits
+watch_me:
+ .long 0xfeedbeef
+
+ .section ".text", "ax", @progbits
+ .code32
+gdbstub_test:
+ /* 1. Read registers test */
+ movl $0xea010203, %eax
+ movl $0xeb040506, %ebx
+ movl $0xec070809, %ecx
+ movl $0xed0a0b0c, %edx
+ movl $0x510d0e0f, %esi
+ movl $0xd1102030, %edi
+ int $3
+
+ /* 2. Write registers test */
+ int $3
+
+ /* 3. Read memory test */
+ subl $8, %esp
+ movl $0x11223344, 4(%esp)
+ movw $0x5566, 2(%esp)
+ movb $0x77, (%esp)
+ int $3
+
+ /* 4. Write memory test */
+ int $3
+ addl $8, %esp
+
+ /* 5. Step test */
+ int $3
+ nop
+
+ /* 6. Access watch test */
+ movl $0x600d0000, %ecx
+ movl watch_me, %eax
+ movl $0xbad00000, %ecx
+ int $3
+ movl $0x600d0001, %ecx
+ movl %eax, watch_me
+ movl $0xbad00001, %ecx
+ int $3
+
+ /* 7. Write watch test */
+ movl $0x600d0002, %ecx
+ movl %eax, watch_me
+ movl $0xbad00002, %ecx
+ int $3
+
+1:
+ jmp 1b
diff --git a/roms/ipxe/src/tests/gdbstub_test.gdb b/roms/ipxe/src/tests/gdbstub_test.gdb
new file mode 100755
index 00000000..bcfa07da
--- /dev/null
+++ b/roms/ipxe/src/tests/gdbstub_test.gdb
@@ -0,0 +1,116 @@
+#!/usr/bin/gdb -x
+# Test suite for GDB remote debugging
+# Run:
+# make bin/ipxe.hd.tmp
+# make
+# gdb
+# (gdb) target remote :TCPPORT
+# OR
+# (gdb) target remote udp:IP:UDPPORT
+# (gdb) source tests/gdbstub_test.gdb
+
+define ipxe_load_symbols
+ file bin/ipxe.hd.tmp
+end
+
+define ipxe_assert
+ if $arg0 != $arg1
+ echo FAIL $arg2\n
+ else
+ echo PASS $arg2\n
+ end
+end
+
+define ipxe_start_tests
+ jump gdbstub_test
+end
+
+define ipxe_test_regs_read
+ ipxe_assert $eax 0xea010203 "ipxe_test_regs_read eax"
+ ipxe_assert $ebx 0xeb040506 "ipxe_test_regs_read ebx"
+ ipxe_assert $ecx 0xec070809 "ipxe_test_regs_read ecx"
+ ipxe_assert $edx 0xed0a0b0c "ipxe_test_regs_read edx"
+ ipxe_assert $esi 0x510d0e0f "ipxe_test_regs_read esi"
+ ipxe_assert $edi 0xd1102030 "ipxe_test_regs_read edi"
+end
+
+define ipxe_test_regs_write
+ set $eax = 0xea112233
+ set $ebx = 0xeb445566
+ set $ecx = 0xec778899
+ set $edx = 0xedaabbcc
+ set $esi = 0x51ddeeff
+ set $edi = 0xd1010203
+ c
+ ipxe_assert $eax 0xea112233 "ipxe_test_regs_write eax"
+ ipxe_assert $ebx 0xeb445566 "ipxe_test_regs_write ebx"
+ ipxe_assert $ecx 0xec778899 "ipxe_test_regs_write ecx"
+ ipxe_assert $edx 0xedaabbcc "ipxe_test_regs_write edx"
+ ipxe_assert $esi 0x51ddeeff "ipxe_test_regs_write esi"
+ ipxe_assert $edi 0xd1010203 "ipxe_test_regs_write edi"
+
+ # This assumes segment selectors are always 0x10 or 0x8 (for code).
+ ipxe_assert $cs 0x08 "ipxe_test_regs_write cs"
+ ipxe_assert $ds 0x10 "ipxe_test_regs_write ds"
+end
+
+define ipxe_test_mem_read
+ c
+ ipxe_assert ({int}($esp+4)) 0x11223344 "ipxe_test_mem_read int"
+ ipxe_assert ({short}($esp+2)) 0x5566 "ipxe_test_mem_read short"
+ ipxe_assert ({char}($esp)) 0x77 "ipxe_test_mem_read char"
+end
+
+define ipxe_test_mem_write
+ set ({int}($esp+4)) = 0xaabbccdd
+ set ({short}($esp+2)) = 0xeeff
+ set ({char}($esp)) = 0x99
+ c
+ ipxe_assert ({int}($esp+4)) 0xaabbccdd "ipxe_test_mem_write int"
+ ipxe_assert ({short}($esp+2)) (short)0xeeff "ipxe_test_mem_write short"
+ ipxe_assert ({char}($esp)) (char)0x99 "ipxe_test_mem_write char"
+end
+
+define ipxe_test_step
+ c
+ si
+ ipxe_assert ({char}($eip-1)) (char)0x90 "ipxe_test_step" # nop = 0x90
+end
+
+define ipxe_test_awatch
+ awatch watch_me
+
+ c
+ ipxe_assert $ecx 0x600d0000 "ipxe_test_awatch read"
+ if $ecx == 0x600d0000
+ c
+ end
+
+ c
+ ipxe_assert $ecx 0x600d0001 "ipxe_test_awatch write"
+ if $ecx == 0x600d0001
+ c
+ end
+
+ delete
+end
+
+define ipxe_test_watch
+ watch watch_me
+ c
+ ipxe_assert $ecx 0x600d0002 "ipxe_test_watch"
+ if $ecx == 0x600d0002
+ c
+ end
+ delete
+end
+
+ipxe_load_symbols
+ipxe_start_tests
+ipxe_test_regs_read
+ipxe_test_regs_write
+ipxe_test_mem_read
+ipxe_test_mem_write
+ipxe_test_step
+ipxe_test_awatch
+ipxe_test_watch
diff --git a/roms/ipxe/src/tests/hash_df_test.c b/roms/ipxe/src/tests/hash_df_test.c
new file mode 100644
index 00000000..74c8d0f4
--- /dev/null
+++ b/roms/ipxe/src/tests/hash_df_test.c
@@ -0,0 +1,898 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Hash-based derivation function (Hash_df) tests
+ *
+ * These test vectors are provided by NIST as part of the
+ * Cryptographic Toolkit Examples, downloadable from:
+ *
+ * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/Hash_DRBG.pdf
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <assert.h>
+#include <string.h>
+#include <ipxe/hash_df.h>
+#include <ipxe/sha1.h>
+#include <ipxe/sha256.h>
+#include <ipxe/test.h>
+
+/** Define inline input data */
+#define INPUT(...) { __VA_ARGS__ }
+
+/** Define inline expected data */
+#define EXPECT(...) { __VA_ARGS__ }
+
+/** A Hash_df test */
+struct hash_df_test {
+ /** Underlying hash algorithm */
+ struct digest_algorithm *hash;
+ /** Input data */
+ const void *input;
+ /** Length of input data */
+ size_t input_len;
+ /** Expected output data */
+ const void *expected;
+ /** Length of expected output data */
+ size_t expected_len;
+};
+
+/**
+ * Define a Hash_df test
+ *
+ * @v name Test name
+ * @v hash_algorithm Underlying hash algorithm
+ * @v input_array Input data
+ * @v expected_array Expected output data
+ * @ret test Hash_df test
+ */
+#define HASH_DF_TEST( name, hash_algorithm, input_array, expected_array ) \
+ static const uint8_t name ## _input [] = input_array; \
+ static const uint8_t name ## _expected [] = expected_array; \
+ static struct hash_df_test name = { \
+ .hash = &(hash_algorithm), \
+ .input = name ## _input, \
+ .input_len = sizeof ( name ## _input ), \
+ .expected = name ## _expected, \
+ .expected_len = sizeof ( name ## _expected ), \
+ }
+
+/** SHA-1 Test 1 */
+HASH_DF_TEST ( test_sha1_1, sha1_algorithm,
+ INPUT ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
+ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
+ 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x20, 0x21, 0x22, 0x23, 0x24 ),
+ EXPECT ( 0xd0, 0x8f, 0xb4, 0x41, 0xf2, 0xf4, 0xcb, 0x37, 0xcf, 0x6c,
+ 0x24, 0x20, 0xa8, 0x2c, 0x74, 0x27, 0xac, 0xf7, 0xfc, 0xfd,
+ 0x79, 0x90, 0x14, 0x38, 0x34, 0xa5, 0xc2, 0x56, 0xab, 0x28,
+ 0x39, 0x36, 0x6d, 0x96, 0x34, 0x8c, 0xfe, 0x8c, 0x97, 0xab,
+ 0x67, 0x67, 0xb0, 0x5e, 0x83, 0xa9, 0x80, 0x40, 0x6d, 0x94,
+ 0xbe, 0xe3, 0x3c, 0xbb, 0x89 ) );
+
+/** SHA-1 Test 2 */
+HASH_DF_TEST ( test_sha1_2, sha1_algorithm,
+ INPUT ( 0x00, 0xd0, 0x8f, 0xb4, 0x41, 0xf2, 0xf4, 0xcb, 0x37, 0xcf,
+ 0x6c, 0x24, 0x20, 0xa8, 0x2c, 0x74, 0x27, 0xac, 0xf7, 0xfc,
+ 0xfd, 0x79, 0x90, 0x14, 0x38, 0x34, 0xa5, 0xc2, 0x56, 0xab,
+ 0x28, 0x39, 0x36, 0x6d, 0x96, 0x34, 0x8c, 0xfe, 0x8c, 0x97,
+ 0xab, 0x67, 0x67, 0xb0, 0x5e, 0x83, 0xa9, 0x80, 0x40, 0x6d,
+ 0x94, 0xbe, 0xe3, 0x3c, 0xbb, 0x89 ),
+ EXPECT ( 0x54, 0xc5, 0x21, 0x7b, 0x51, 0x02, 0xd8, 0xda, 0x8b, 0xf1,
+ 0x68, 0x6e, 0xdb, 0xab, 0x2b, 0xbc, 0x0c, 0x11, 0xb0, 0xcc,
+ 0xb0, 0xf0, 0xaf, 0x23, 0x4c, 0x24, 0xcf, 0x15, 0xec, 0xc8,
+ 0xcb, 0x39, 0xc2, 0x33, 0xaa, 0xca, 0x48, 0xfc, 0xce, 0xee,
+ 0x86, 0x3d, 0xa8, 0x81, 0xff, 0xcb, 0xb4, 0x34, 0xa6, 0xcc,
+ 0xb7, 0xda, 0x2f, 0xb2, 0x10 ) );
+
+/** SHA-1 Test 3 */
+HASH_DF_TEST ( test_sha1_3, sha1_algorithm,
+ INPUT ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
+ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
+ 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x20, 0x21, 0x22, 0x23, 0x24,
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53,
+ 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d,
+ 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
+ 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71,
+ 0x72, 0x73, 0x74, 0x75, 0x76 ),
+ EXPECT ( 0x99, 0xb9, 0x53, 0x7b, 0x84, 0x27, 0xb8, 0xce, 0x23, 0x21,
+ 0x9a, 0x61, 0x1c, 0xbe, 0x61, 0x06, 0x44, 0xcf, 0x85, 0x03,
+ 0xee, 0xc5, 0xba, 0x22, 0xde, 0x1a, 0xb2, 0x12, 0xc3, 0xd0,
+ 0x85, 0x8e, 0x9e, 0x3b, 0x90, 0x26, 0xd4, 0xe7, 0x7d, 0x58,
+ 0xe0, 0x2e, 0x85, 0xa2, 0x31, 0x4c, 0xe3, 0xd7, 0x4a, 0x93,
+ 0x32, 0x4b, 0x27, 0xbd, 0xe8 ) );
+
+/** SHA-1 Test 4 */
+HASH_DF_TEST ( test_sha1_4, sha1_algorithm,
+ INPUT ( 0x00, 0x99, 0xb9, 0x53, 0x7b, 0x84, 0x27, 0xb8, 0xce, 0x23,
+ 0x21, 0x9a, 0x61, 0x1c, 0xbe, 0x61, 0x06, 0x44, 0xcf, 0x85,
+ 0x03, 0xee, 0xc5, 0xba, 0x22, 0xde, 0x1a, 0xb2, 0x12, 0xc3,
+ 0xd0, 0x85, 0x8e, 0x9e, 0x3b, 0x90, 0x26, 0xd4, 0xe7, 0x7d,
+ 0x58, 0xe0, 0x2e, 0x85, 0xa2, 0x31, 0x4c, 0xe3, 0xd7, 0x4a,
+ 0x93, 0x32, 0x4b, 0x27, 0xbd, 0xe8 ),
+ EXPECT ( 0xa7, 0x02, 0x66, 0xf7, 0xf9, 0x1e, 0xc4, 0xd2, 0x88, 0x73,
+ 0x14, 0x79, 0x34, 0xce, 0xaf, 0x2a, 0x2c, 0xc3, 0x5a, 0x0f,
+ 0xd5, 0xe0, 0x0a, 0xba, 0xe7, 0x9d, 0xc6, 0x60, 0x5f, 0xab,
+ 0xd6, 0xf5, 0xf9, 0x28, 0xe1, 0x8c, 0x63, 0x26, 0x8e, 0x1a,
+ 0xf4, 0x85, 0xda, 0x6c, 0xbf, 0x04, 0x16, 0xdc, 0xdc, 0x5f,
+ 0xb8, 0xbc, 0x9c, 0x94, 0xb6 ) );
+
+/** SHA-1 Test 5 */
+HASH_DF_TEST ( test_sha1_5, sha1_algorithm,
+ INPUT ( 0x01, 0xd0, 0x8f, 0xb4, 0x41, 0xf2, 0xf4, 0xcb, 0x37, 0xcf,
+ 0x6c, 0x24, 0x20, 0xa8, 0x2c, 0x74, 0x27, 0xac, 0xf7, 0xfc,
+ 0xfd, 0x79, 0x90, 0x14, 0x38, 0x34, 0xa5, 0xc2, 0x56, 0xab,
+ 0x28, 0x39, 0x36, 0x6d, 0x96, 0x34, 0x8c, 0xfe, 0x8c, 0x97,
+ 0xab, 0x67, 0x67, 0xb0, 0x5e, 0x83, 0xa9, 0x80, 0x40, 0x6d,
+ 0x94, 0xbe, 0xe3, 0x3c, 0xbb, 0x89, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6 ),
+ EXPECT ( 0x0a, 0x04, 0x41, 0xa5, 0x2b, 0xed, 0xf7, 0x94, 0xf5, 0xaa,
+ 0x62, 0x7b, 0xcb, 0xd8, 0x1f, 0x93, 0xe0, 0x11, 0xd5, 0x1f,
+ 0x34, 0x74, 0x80, 0x2c, 0x37, 0x50, 0x76, 0x75, 0x51, 0xb4,
+ 0x5b, 0x69, 0xf3, 0xd3, 0x59, 0x39, 0xc9, 0x32, 0xae, 0x1c,
+ 0xb7, 0xc9, 0x89, 0x4f, 0xb8, 0x84, 0x65, 0xe0, 0xcf, 0xd1,
+ 0xcc, 0x26, 0x1e, 0x22, 0xc5 ) );
+
+/** SHA-1 Test 6 */
+HASH_DF_TEST ( test_sha1_6, sha1_algorithm,
+ INPUT ( 0x00, 0x0a, 0x04, 0x41, 0xa5, 0x2b, 0xed, 0xf7, 0x94, 0xf5,
+ 0xaa, 0x62, 0x7b, 0xcb, 0xd8, 0x1f, 0x93, 0xe0, 0x11, 0xd5,
+ 0x1f, 0x34, 0x74, 0x80, 0x2c, 0x37, 0x50, 0x76, 0x75, 0x51,
+ 0xb4, 0x5b, 0x69, 0xf3, 0xd3, 0x59, 0x39, 0xc9, 0x32, 0xae,
+ 0x1c, 0xb7, 0xc9, 0x89, 0x4f, 0xb8, 0x84, 0x65, 0xe0, 0xcf,
+ 0xd1, 0xcc, 0x26, 0x1e, 0x22, 0xc5 ),
+ EXPECT ( 0x04, 0x11, 0xc8, 0xb0, 0xdb, 0xa7, 0x56, 0xe8, 0x84, 0x2b,
+ 0x3f, 0xb0, 0x2d, 0x2f, 0xeb, 0x7c, 0xee, 0xa5, 0x67, 0x42,
+ 0xee, 0x93, 0x79, 0xc9, 0x0e, 0x6d, 0x3b, 0x2f, 0x10, 0x10,
+ 0xd4, 0x0f, 0x4f, 0x4d, 0xca, 0xda, 0x61, 0xcf, 0xdf, 0xb4,
+ 0x8a, 0xf8, 0x47, 0xca, 0xcc, 0x4c, 0x92, 0xc6, 0x14, 0x44,
+ 0x85, 0xc2, 0x27, 0xca, 0x05 ) );
+
+/** SHA-1 Test 7 */
+HASH_DF_TEST ( test_sha1_7, sha1_algorithm,
+ INPUT ( 0x01, 0x0e, 0x16, 0x0a, 0x56, 0x07, 0x95, 0x4e, 0x7d, 0x79,
+ 0xd5, 0xa2, 0x2b, 0xf9, 0x08, 0x0b, 0x10, 0xce, 0xb7, 0x3c,
+ 0x62, 0x23, 0x07, 0xf9, 0xf5, 0x45, 0xbd, 0xb1, 0xa4, 0x61,
+ 0xc5, 0x2f, 0x79, 0x43, 0x21, 0x24, 0x3a, 0xac, 0xe2, 0x3f,
+ 0x36, 0x3f, 0xef, 0xb3, 0x5d, 0xc5, 0xbe, 0xa7, 0xe7, 0x31,
+ 0x44, 0x14, 0xcf, 0x78, 0xb3, 0xf9, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6 ),
+ EXPECT ( 0xdc, 0x24, 0xdf, 0x10, 0x2f, 0xa9, 0xf9, 0x6c, 0xc1, 0xcf,
+ 0xf8, 0xc1, 0x16, 0xc7, 0x9d, 0x14, 0x97, 0xd7, 0xc2, 0x7b,
+ 0xba, 0x5b, 0xa8, 0x01, 0xe1, 0x56, 0x21, 0x93, 0x35, 0x3f,
+ 0x31, 0xe3, 0x22, 0x39, 0x57, 0x84, 0x69, 0xb8, 0x0f, 0x2f,
+ 0x51, 0x64, 0x54, 0x37, 0x28, 0x71, 0x7f, 0x17, 0x1f, 0xdb,
+ 0x02, 0xb2, 0xad, 0x57, 0x95 ) );
+
+/** SHA-1 Test 8 */
+HASH_DF_TEST ( test_sha1_8, sha1_algorithm,
+ INPUT ( 0x00, 0xdc, 0x24, 0xdf, 0x10, 0x2f, 0xa9, 0xf9, 0x6c, 0xc1,
+ 0xcf, 0xf8, 0xc1, 0x16, 0xc7, 0x9d, 0x14, 0x97, 0xd7, 0xc2,
+ 0x7b, 0xba, 0x5b, 0xa8, 0x01, 0xe1, 0x56, 0x21, 0x93, 0x35,
+ 0x3f, 0x31, 0xe3, 0x22, 0x39, 0x57, 0x84, 0x69, 0xb8, 0x0f,
+ 0x2f, 0x51, 0x64, 0x54, 0x37, 0x28, 0x71, 0x7f, 0x17, 0x1f,
+ 0xdb, 0x02, 0xb2, 0xad, 0x57, 0x95 ),
+ EXPECT ( 0xff, 0xaf, 0x45, 0x66, 0x5b, 0x11, 0x0c, 0xa1, 0x33, 0x5a,
+ 0x3f, 0xce, 0x73, 0xa7, 0x98, 0x1d, 0x0f, 0xd5, 0xc8, 0xd9,
+ 0x03, 0xf6, 0x5f, 0xaa, 0x46, 0xa3, 0xd5, 0x97, 0xbf, 0x34,
+ 0xc4, 0xe0, 0xcc, 0x16, 0x75, 0x60, 0xab, 0x94, 0xec, 0x10,
+ 0xd6, 0x41, 0x5f, 0x37, 0x83, 0xb0, 0x15, 0x67, 0x89, 0x1b,
+ 0x57, 0x66, 0x2a, 0xbb, 0x39 ) );
+
+/** SHA-1 Test 9 */
+HASH_DF_TEST ( test_sha1_9, sha1_algorithm,
+ INPUT ( 0x01, 0xd0, 0x8f, 0xb4, 0x41, 0xf2, 0xf4, 0xcb, 0x37, 0xcf,
+ 0x6c, 0x24, 0x20, 0xa8, 0x2c, 0x74, 0x27, 0xac, 0xf7, 0xfc,
+ 0xfd, 0x79, 0x90, 0x14, 0x38, 0x34, 0xa5, 0xc2, 0x56, 0xab,
+ 0x28, 0x39, 0x36, 0x6d, 0x96, 0x34, 0x8c, 0xfe, 0x8c, 0x97,
+ 0xab, 0x67, 0x67, 0xb0, 0x5e, 0x83, 0xa9, 0x80, 0x40, 0x6d,
+ 0x94, 0xbe, 0xe3, 0x3c, 0xbb, 0x89, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72,
+ 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c,
+ 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
+ 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
+ 0x91, 0x92, 0x93, 0x94, 0x95, 0x96 ),
+ EXPECT ( 0x8f, 0xde, 0xc9, 0xe6, 0x18, 0x96, 0x36, 0xf0, 0xa5, 0xce,
+ 0x53, 0xe8, 0x1c, 0x13, 0xac, 0x93, 0x84, 0xfa, 0xfb, 0xa0,
+ 0xee, 0x50, 0xc1, 0xe2, 0xc8, 0xa0, 0x99, 0xde, 0x41, 0xd8,
+ 0xcc, 0x7a, 0x31, 0x42, 0x9e, 0x8c, 0x8c, 0x88, 0x80, 0xe3,
+ 0xb4, 0x5d, 0x89, 0xdb, 0x61, 0x2c, 0xd9, 0xd2, 0x8a, 0x55,
+ 0xc0, 0xf0, 0xd1, 0xf8, 0xf9 ) );
+
+/** SHA-1 Test 10 */
+HASH_DF_TEST ( test_sha1_10, sha1_algorithm,
+ INPUT ( 0x00, 0x8f, 0xde, 0xc9, 0xe6, 0x18, 0x96, 0x36, 0xf0, 0xa5,
+ 0xce, 0x53, 0xe8, 0x1c, 0x13, 0xac, 0x93, 0x84, 0xfa, 0xfb,
+ 0xa0, 0xee, 0x50, 0xc1, 0xe2, 0xc8, 0xa0, 0x99, 0xde, 0x41,
+ 0xd8, 0xcc, 0x7a, 0x31, 0x42, 0x9e, 0x8c, 0x8c, 0x88, 0x80,
+ 0xe3, 0xb4, 0x5d, 0x89, 0xdb, 0x61, 0x2c, 0xd9, 0xd2, 0x8a,
+ 0x55, 0xc0, 0xf0, 0xd1, 0xf8, 0xf9 ),
+ EXPECT ( 0x97, 0xd0, 0x76, 0x31, 0xb2, 0x2f, 0x7c, 0x95, 0x7f, 0x19,
+ 0xf8, 0x44, 0xf4, 0xdc, 0x2a, 0xfa, 0x6f, 0xf9, 0x7c, 0x35,
+ 0x66, 0x18, 0x98, 0x21, 0x69, 0x91, 0xd1, 0x5b, 0xda, 0x75,
+ 0xbb, 0xd0, 0x5e, 0xdf, 0x8a, 0x0f, 0xa8, 0x0c, 0xca, 0xb9,
+ 0x51, 0x95, 0xf4, 0x79, 0xcd, 0x76, 0x20, 0x22, 0x35, 0x10,
+ 0x2e, 0xf6, 0x27, 0x29, 0x19 ) );
+
+/** SHA-1 Test 11 */
+HASH_DF_TEST ( test_sha1_11, sha1_algorithm,
+ INPUT ( 0x01, 0x27, 0xaf, 0x40, 0x17, 0xca, 0xc5, 0xb3, 0x86, 0x24,
+ 0xe8, 0x4c, 0x2d, 0x10, 0xef, 0xd7, 0x8d, 0xf4, 0xf4, 0x77,
+ 0xd6, 0x54, 0x69, 0x5a, 0x04, 0x32, 0x32, 0x6b, 0x3a, 0x1c,
+ 0x4e, 0x88, 0x4a, 0x90, 0x22, 0x28, 0xe8, 0x9e, 0xaa, 0x90,
+ 0x36, 0xcd, 0x2a, 0xf7, 0x05, 0x66, 0x81, 0x26, 0x23, 0x72,
+ 0xc7, 0x13, 0x71, 0xd4, 0x53, 0x3d, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
+ 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc,
+ 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+ 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+ 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6 ),
+ EXPECT ( 0x2c, 0x9c, 0x0d, 0x80, 0x03, 0xe3, 0x40, 0x23, 0xbe, 0x5b,
+ 0x63, 0xfd, 0xb9, 0xd2, 0x24, 0xb4, 0x25, 0x0c, 0xc8, 0x15,
+ 0x5b, 0xd1, 0xee, 0xd8, 0xe5, 0x5d, 0x91, 0x06, 0x2f, 0xdd,
+ 0x27, 0x64, 0xb8, 0xae, 0xa9, 0xc8, 0x2f, 0x84, 0x7e, 0x09,
+ 0xa3, 0xfe, 0xa1, 0xc7, 0x11, 0x7d, 0x6f, 0x7d, 0xd2, 0xef,
+ 0x77, 0x7d, 0x7c, 0xf3, 0xeb ) );
+
+/** SHA-1 Test 12 */
+HASH_DF_TEST ( test_sha1_12, sha1_algorithm,
+ INPUT ( 0x00, 0x2c, 0x9c, 0x0d, 0x80, 0x03, 0xe3, 0x40, 0x23, 0xbe,
+ 0x5b, 0x63, 0xfd, 0xb9, 0xd2, 0x24, 0xb4, 0x25, 0x0c, 0xc8,
+ 0x15, 0x5b, 0xd1, 0xee, 0xd8, 0xe5, 0x5d, 0x91, 0x06, 0x2f,
+ 0xdd, 0x27, 0x64, 0xb8, 0xae, 0xa9, 0xc8, 0x2f, 0x84, 0x7e,
+ 0x09, 0xa3, 0xfe, 0xa1, 0xc7, 0x11, 0x7d, 0x6f, 0x7d, 0xd2,
+ 0xef, 0x77, 0x7d, 0x7c, 0xf3, 0xeb ),
+ EXPECT ( 0x7e, 0x8a, 0xa4, 0x93, 0x42, 0x72, 0xf2, 0xa2, 0x8b, 0xbf,
+ 0xd7, 0xaf, 0xcc, 0x88, 0xce, 0x1c, 0x80, 0x6a, 0x38, 0xea,
+ 0x7b, 0x89, 0x45, 0xc8, 0xd1, 0xb6, 0xf1, 0x75, 0x03, 0x78,
+ 0x54, 0x6a, 0xb1, 0xa2, 0x96, 0x00, 0xd6, 0x44, 0xec, 0x52,
+ 0x0e, 0x8b, 0xff, 0xf6, 0x0c, 0xb7, 0x7f, 0xa5, 0x4b, 0xb1,
+ 0x1a, 0x83, 0x31, 0xcb, 0x24 ) );
+
+/** SHA-1 Test 13 */
+HASH_DF_TEST ( test_sha1_13, sha1_algorithm,
+ INPUT ( 0x01, 0x99, 0xb9, 0x53, 0x7b, 0x84, 0x27, 0xb8, 0xce, 0x23,
+ 0x21, 0x9a, 0x61, 0x1c, 0xbe, 0x61, 0x06, 0x44, 0xcf, 0x85,
+ 0x03, 0xee, 0xc5, 0xba, 0x22, 0xde, 0x1a, 0xb2, 0x12, 0xc3,
+ 0xd0, 0x85, 0x8e, 0x9e, 0x3b, 0x90, 0x26, 0xd4, 0xe7, 0x7d,
+ 0x58, 0xe0, 0x2e, 0x85, 0xa2, 0x31, 0x4c, 0xe3, 0xd7, 0x4a,
+ 0x93, 0x32, 0x4b, 0x27, 0xbd, 0xe8, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6 ),
+ EXPECT ( 0xe5, 0x04, 0x3d, 0x1b, 0x95, 0x4b, 0x34, 0xba, 0x60, 0xd2,
+ 0x48, 0xe8, 0x83, 0xef, 0x49, 0x8c, 0x5c, 0x52, 0x36, 0xb8,
+ 0x26, 0x0e, 0x23, 0x8e, 0x02, 0xc8, 0xd4, 0xfc, 0x5f, 0xfe,
+ 0x90, 0xfa, 0x40, 0x13, 0x44, 0x70, 0x75, 0xbb, 0x54, 0x3e,
+ 0xf0, 0x0c, 0x3b, 0xda, 0x59, 0x6b, 0x10, 0x88, 0x61, 0xf0,
+ 0x6b, 0xf9, 0x1b, 0x45, 0xd6 ) );
+
+/** SHA-1 Test 14 */
+HASH_DF_TEST ( test_sha1_14, sha1_algorithm,
+ INPUT ( 0x00, 0xe5, 0x04, 0x3d, 0x1b, 0x95, 0x4b, 0x34, 0xba, 0x60,
+ 0xd2, 0x48, 0xe8, 0x83, 0xef, 0x49, 0x8c, 0x5c, 0x52, 0x36,
+ 0xb8, 0x26, 0x0e, 0x23, 0x8e, 0x02, 0xc8, 0xd4, 0xfc, 0x5f,
+ 0xfe, 0x90, 0xfa, 0x40, 0x13, 0x44, 0x70, 0x75, 0xbb, 0x54,
+ 0x3e, 0xf0, 0x0c, 0x3b, 0xda, 0x59, 0x6b, 0x10, 0x88, 0x61,
+ 0xf0, 0x6b, 0xf9, 0x1b, 0x45, 0xd6 ),
+ EXPECT ( 0x1f, 0x3f, 0x63, 0x10, 0xed, 0x10, 0xfc, 0x9f, 0x93, 0x8c,
+ 0x43, 0x22, 0x61, 0xaf, 0x42, 0xe9, 0xe9, 0x17, 0x5f, 0x08,
+ 0x0f, 0x32, 0x22, 0xdc, 0x11, 0x8b, 0xa7, 0xcf, 0x88, 0x8c,
+ 0xdc, 0x3f, 0x36, 0x0d, 0xd2, 0x8f, 0x5e, 0xcb, 0x7c, 0x80,
+ 0xa6, 0xbc, 0xfc, 0xfc, 0x0f, 0x51, 0xfe, 0x2f, 0x77, 0xc1,
+ 0xc9, 0x9d, 0xf0, 0xa2, 0x09 ) );
+
+/** SHA-1 Test 15 */
+HASH_DF_TEST ( test_sha1_15, sha1_algorithm,
+ INPUT ( 0x01, 0x04, 0x43, 0xa0, 0x2c, 0x82, 0x5c, 0x31, 0x59, 0xf4,
+ 0x5e, 0x8c, 0x0a, 0xe5, 0x9e, 0x8c, 0x76, 0x45, 0x69, 0x95,
+ 0xc0, 0x35, 0x40, 0x46, 0x6a, 0x14, 0x54, 0x7c, 0xcb, 0xe8,
+ 0x8b, 0x6d, 0x39, 0x76, 0x21, 0x17, 0x32, 0x84, 0x72, 0xf5,
+ 0x2b, 0x84, 0x57, 0x5a, 0xaf, 0xe8, 0x8b, 0x2d, 0x1e, 0x50,
+ 0x4f, 0x21, 0xec, 0x4e, 0x31, 0x35, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6 ),
+ EXPECT ( 0x9d, 0xc3, 0x52, 0x08, 0xee, 0x2b, 0x8c, 0x58, 0x1e, 0xa3,
+ 0x0b, 0xaa, 0xcb, 0x5d, 0x74, 0x31, 0x7a, 0x87, 0x94, 0x54,
+ 0x10, 0x71, 0x7e, 0x58, 0xd3, 0x70, 0x5f, 0xbd, 0xc7, 0x60,
+ 0xbe, 0x0c, 0xc9, 0x0e, 0xd1, 0xcc, 0xbb, 0x89, 0x7d, 0x47,
+ 0xd2, 0x7e, 0x2b, 0x2e, 0x42, 0x2b, 0x32, 0xb9, 0x7f, 0x05,
+ 0x0d, 0x1b, 0xd2, 0xb4, 0x90 ) );
+
+/** SHA-1 Test 16 */
+HASH_DF_TEST ( test_sha1_16, sha1_algorithm,
+ INPUT ( 0x00, 0x9d, 0xc3, 0x52, 0x08, 0xee, 0x2b, 0x8c, 0x58, 0x1e,
+ 0xa3, 0x0b, 0xaa, 0xcb, 0x5d, 0x74, 0x31, 0x7a, 0x87, 0x94,
+ 0x54, 0x10, 0x71, 0x7e, 0x58, 0xd3, 0x70, 0x5f, 0xbd, 0xc7,
+ 0x60, 0xbe, 0x0c, 0xc9, 0x0e, 0xd1, 0xcc, 0xbb, 0x89, 0x7d,
+ 0x47, 0xd2, 0x7e, 0x2b, 0x2e, 0x42, 0x2b, 0x32, 0xb9, 0x7f,
+ 0x05, 0x0d, 0x1b, 0xd2, 0xb4, 0x90 ),
+ EXPECT ( 0x1a, 0x5a, 0xd6, 0xce, 0xa3, 0xd1, 0x5d, 0xa5, 0xfb, 0x47,
+ 0x42, 0x13, 0x13, 0x09, 0xf0, 0xed, 0x88, 0xcf, 0x4c, 0x90,
+ 0xa6, 0xc1, 0xcc, 0xee, 0x35, 0xa8, 0x76, 0xeb, 0xfc, 0xcc,
+ 0x82, 0x67, 0x29, 0xb6, 0x63, 0x9f, 0x81, 0x19, 0x65, 0xb0,
+ 0xef, 0x85, 0x76, 0xe7, 0x5c, 0xb3, 0xcf, 0xe8, 0x22, 0x07,
+ 0x68, 0xb2, 0x6c, 0xe7, 0x7a ) );
+
+/** SHA-1 Test 17 */
+HASH_DF_TEST ( test_sha1_17, sha1_algorithm,
+ INPUT ( 0x01, 0x99, 0xb9, 0x53, 0x7b, 0x84, 0x27, 0xb8, 0xce, 0x23,
+ 0x21, 0x9a, 0x61, 0x1c, 0xbe, 0x61, 0x06, 0x44, 0xcf, 0x85,
+ 0x03, 0xee, 0xc5, 0xba, 0x22, 0xde, 0x1a, 0xb2, 0x12, 0xc3,
+ 0xd0, 0x85, 0x8e, 0x9e, 0x3b, 0x90, 0x26, 0xd4, 0xe7, 0x7d,
+ 0x58, 0xe0, 0x2e, 0x85, 0xa2, 0x31, 0x4c, 0xe3, 0xd7, 0x4a,
+ 0x93, 0x32, 0x4b, 0x27, 0xbd, 0xe8, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72,
+ 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c,
+ 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
+ 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
+ 0x91, 0x92, 0x93, 0x94, 0x95, 0x96 ),
+ EXPECT ( 0x56, 0x3a, 0x5d, 0x20, 0x7d, 0x37, 0x70, 0x7b, 0xf5, 0xf2,
+ 0x4d, 0x0b, 0xd4, 0x93, 0x5d, 0xc3, 0x8d, 0xbe, 0x04, 0x36,
+ 0x37, 0xb3, 0xff, 0x8a, 0xb6, 0x8c, 0xfc, 0xe2, 0xf2, 0x90,
+ 0xd1, 0x69, 0x95, 0x20, 0x55, 0x24, 0x19, 0x0f, 0xd2, 0x91,
+ 0xaa, 0x8a, 0x6e, 0x6b, 0x8e, 0x6d, 0x56, 0xa4, 0x31, 0x33,
+ 0x3b, 0x40, 0x8e, 0x6f, 0xa8 ) );
+
+/** SHA-1 Test 18 */
+HASH_DF_TEST ( test_sha1_18, sha1_algorithm,
+ INPUT ( 0x00, 0x56, 0x3a, 0x5d, 0x20, 0x7d, 0x37, 0x70, 0x7b, 0xf5,
+ 0xf2, 0x4d, 0x0b, 0xd4, 0x93, 0x5d, 0xc3, 0x8d, 0xbe, 0x04,
+ 0x36, 0x37, 0xb3, 0xff, 0x8a, 0xb6, 0x8c, 0xfc, 0xe2, 0xf2,
+ 0x90, 0xd1, 0x69, 0x95, 0x20, 0x55, 0x24, 0x19, 0x0f, 0xd2,
+ 0x91, 0xaa, 0x8a, 0x6e, 0x6b, 0x8e, 0x6d, 0x56, 0xa4, 0x31,
+ 0x33, 0x3b, 0x40, 0x8e, 0x6f, 0xa8 ),
+ EXPECT ( 0xc5, 0xd3, 0xe9, 0x55, 0x1e, 0x00, 0xe4, 0xee, 0x32, 0xb2,
+ 0x11, 0x6f, 0xaf, 0x4d, 0xef, 0xf4, 0xd4, 0xcf, 0xad, 0x2b,
+ 0xdc, 0x2d, 0xba, 0xa2, 0xe0, 0xe7, 0xf9, 0xdd, 0xb9, 0xd8,
+ 0x1e, 0xed, 0x45, 0xe0, 0xa5, 0x0d, 0xa5, 0xaf, 0xd5, 0xc1,
+ 0xf6, 0xbc, 0xda, 0xf8, 0x1d, 0x28, 0x9c, 0xf4, 0xbd, 0x3c,
+ 0x91, 0xb7, 0x00, 0x5c, 0x18 ) );
+
+/** SHA-1 Test 19 */
+HASH_DF_TEST ( test_sha1_19, sha1_algorithm,
+ INPUT ( 0x01, 0x1c, 0x0e, 0x46, 0x75, 0x9b, 0x38, 0x55, 0x6a, 0x28,
+ 0xa4, 0x5e, 0x7b, 0x83, 0xe1, 0x4d, 0xb8, 0x62, 0x8d, 0xb1,
+ 0x62, 0x13, 0xe1, 0xba, 0x2d, 0x97, 0x74, 0xf6, 0xc0, 0xac,
+ 0x68, 0xf0, 0x56, 0xdb, 0x00, 0xfb, 0x12, 0xe1, 0x5b, 0xf4,
+ 0xde, 0x95, 0x50, 0xb7, 0x33, 0x1e, 0x2d, 0xbd, 0x66, 0x4c,
+ 0x3a, 0xb7, 0x76, 0xe8, 0x25, 0x51, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
+ 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc,
+ 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+ 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+ 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6 ),
+ EXPECT ( 0x60, 0x01, 0x93, 0xc8, 0xf6, 0x03, 0x1a, 0x2d, 0x49, 0x37,
+ 0x2a, 0x8b, 0x0f, 0x60, 0xf6, 0x8c, 0x1d, 0xfd, 0xac, 0xd4,
+ 0xf8, 0xea, 0x01, 0x37, 0x47, 0xd7, 0x14, 0x82, 0x33, 0x3d,
+ 0xf5, 0x25, 0x2e, 0x95, 0xb8, 0x22, 0x57, 0x39, 0x1b, 0xf1,
+ 0x0a, 0xb0, 0x7d, 0x12, 0x08, 0xb6, 0xbd, 0x66, 0x5b, 0x30,
+ 0x0a, 0xa4, 0xdb, 0x9c, 0x3e ) );
+
+/** SHA-1 Test 20 */
+HASH_DF_TEST ( test_sha1_20, sha1_algorithm,
+ INPUT ( 0x00, 0x60, 0x01, 0x93, 0xc8, 0xf6, 0x03, 0x1a, 0x2d, 0x49,
+ 0x37, 0x2a, 0x8b, 0x0f, 0x60, 0xf6, 0x8c, 0x1d, 0xfd, 0xac,
+ 0xd4, 0xf8, 0xea, 0x01, 0x37, 0x47, 0xd7, 0x14, 0x82, 0x33,
+ 0x3d, 0xf5, 0x25, 0x2e, 0x95, 0xb8, 0x22, 0x57, 0x39, 0x1b,
+ 0xf1, 0x0a, 0xb0, 0x7d, 0x12, 0x08, 0xb6, 0xbd, 0x66, 0x5b,
+ 0x30, 0x0a, 0xa4, 0xdb, 0x9c, 0x3e ),
+ EXPECT ( 0x6b, 0x71, 0x82, 0x3b, 0x18, 0x20, 0x07, 0x71, 0xca, 0xae,
+ 0x5d, 0x12, 0x55, 0xc1, 0x40, 0x3e, 0xdf, 0xe3, 0x8b, 0x4d,
+ 0x18, 0xc7, 0x87, 0xbb, 0x44, 0xcd, 0x17, 0x18, 0x61, 0x52,
+ 0xef, 0xea, 0xd6, 0xfd, 0xc4, 0xb8, 0x94, 0xf9, 0x20, 0x02,
+ 0xc0, 0x72, 0x09, 0x55, 0x5d, 0x7e, 0x35, 0x54, 0xf9, 0xd1,
+ 0x2f, 0xc5, 0x59, 0x7f, 0x22 ) );
+
+/** SHA-256 Test 1 */
+HASH_DF_TEST ( test_sha256_1, sha256_algorithm,
+ INPUT ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
+ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
+ 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x20, 0x21, 0x22, 0x23, 0x24,
+ 0x25, 0x26, 0x27 ),
+ EXPECT ( 0xab, 0x41, 0xcd, 0xe4, 0x37, 0xab, 0x8b, 0x09, 0x1c, 0xa7,
+ 0xc5, 0x75, 0x5d, 0x10, 0xf0, 0x11, 0x0c, 0x1d, 0xbd, 0x46,
+ 0x2f, 0x22, 0x6c, 0xfd, 0xab, 0xfb, 0xb0, 0x4a, 0x8b, 0xcd,
+ 0xef, 0x95, 0x16, 0x7d, 0x84, 0xaf, 0x64, 0x12, 0x8c, 0x0d,
+ 0x71, 0xf4, 0xd5, 0xb8, 0xc0, 0xed, 0xfb, 0xbe, 0x3d, 0xf4,
+ 0x04, 0x48, 0xd2, 0xd8, 0xe1 ) );
+
+/** SHA-256 Test 2 */
+HASH_DF_TEST ( test_sha256_2, sha256_algorithm,
+ INPUT ( 0x00, 0xab, 0x41, 0xcd, 0xe4, 0x37, 0xab, 0x8b, 0x09, 0x1c,
+ 0xa7, 0xc5, 0x75, 0x5d, 0x10, 0xf0, 0x11, 0x0c, 0x1d, 0xbd,
+ 0x46, 0x2f, 0x22, 0x6c, 0xfd, 0xab, 0xfb, 0xb0, 0x4a, 0x8b,
+ 0xcd, 0xef, 0x95, 0x16, 0x7d, 0x84, 0xaf, 0x64, 0x12, 0x8c,
+ 0x0d, 0x71, 0xf4, 0xd5, 0xb8, 0xc0, 0xed, 0xfb, 0xbe, 0x3d,
+ 0xf4, 0x04, 0x48, 0xd2, 0xd8, 0xe1 ),
+ EXPECT ( 0xe1, 0x5d, 0xe4, 0xa8, 0xe3, 0xb1, 0x41, 0x9b, 0x61, 0xd5,
+ 0x34, 0xf1, 0x5d, 0xbd, 0x31, 0xee, 0x19, 0xec, 0x59, 0x5f,
+ 0x8b, 0x98, 0x11, 0x1a, 0x94, 0xf5, 0x22, 0x37, 0xad, 0x5d,
+ 0x66, 0xf0, 0xcf, 0xaa, 0xfd, 0xdc, 0x90, 0x19, 0x59, 0x02,
+ 0xe9, 0x79, 0xf7, 0x9b, 0x65, 0x35, 0x7f, 0xea, 0x85, 0x99,
+ 0x8e, 0x4e, 0x37, 0xd2, 0xc1 ) );
+
+/** SHA-256 Test 3 */
+HASH_DF_TEST ( test_sha256_3, sha256_algorithm,
+ INPUT ( 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
+ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
+ 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27,
+ 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31,
+ 0x32, 0x33, 0x34, 0x35, 0x36, 0x20, 0x21, 0x22, 0x23, 0x24,
+ 0x25, 0x26, 0x27, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46,
+ 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50,
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
+ 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64,
+ 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e,
+ 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76 ),
+ EXPECT ( 0xa3, 0xe9, 0x4e, 0x39, 0x26, 0xfd, 0xa1, 0x69, 0xc3, 0x03,
+ 0xd6, 0x64, 0x38, 0x39, 0x05, 0xe0, 0xd7, 0x99, 0x62, 0xd1,
+ 0x65, 0x44, 0x6d, 0x63, 0xbd, 0xa6, 0x54, 0xd1, 0x32, 0xf7,
+ 0x2d, 0xb4, 0x71, 0x56, 0x4b, 0x45, 0x6f, 0xf2, 0xee, 0xc8,
+ 0x36, 0x42, 0x2a, 0xcc, 0x5a, 0x02, 0x99, 0x35, 0xa7, 0x99,
+ 0x29, 0x90, 0x94, 0xa1, 0xca ) );
+
+/** SHA-256 Test 4 */
+HASH_DF_TEST ( test_sha256_4, sha256_algorithm,
+ INPUT ( 0x00, 0xa3, 0xe9, 0x4e, 0x39, 0x26, 0xfd, 0xa1, 0x69, 0xc3,
+ 0x03, 0xd6, 0x64, 0x38, 0x39, 0x05, 0xe0, 0xd7, 0x99, 0x62,
+ 0xd1, 0x65, 0x44, 0x6d, 0x63, 0xbd, 0xa6, 0x54, 0xd1, 0x32,
+ 0xf7, 0x2d, 0xb4, 0x71, 0x56, 0x4b, 0x45, 0x6f, 0xf2, 0xee,
+ 0xc8, 0x36, 0x42, 0x2a, 0xcc, 0x5a, 0x02, 0x99, 0x35, 0xa7,
+ 0x99, 0x29, 0x90, 0x94, 0xa1, 0xca ),
+ EXPECT ( 0x44, 0x74, 0x8a, 0x78, 0xb1, 0x6e, 0x75, 0x55, 0x9f, 0x88,
+ 0x1d, 0x51, 0xc1, 0x5d, 0xfe, 0x6c, 0x52, 0xcf, 0xb0, 0xbb,
+ 0x71, 0x62, 0x01, 0x69, 0xc7, 0x93, 0x34, 0x27, 0x67, 0xe7,
+ 0xf8, 0x87, 0x5f, 0x42, 0xcb, 0x6a, 0x20, 0xc8, 0x9d, 0x7c,
+ 0x6e, 0xf3, 0xdc, 0x61, 0x0d, 0x8f, 0xf2, 0x03, 0xd6, 0x76,
+ 0x6c, 0xed, 0x19, 0x19, 0xd0 ) );
+
+/** SHA-256 Test 5 */
+HASH_DF_TEST ( test_sha256_5, sha256_algorithm,
+ INPUT ( 0x01, 0xab, 0x41, 0xcd, 0xe4, 0x37, 0xab, 0x8b, 0x09, 0x1c,
+ 0xa7, 0xc5, 0x75, 0x5d, 0x10, 0xf0, 0x11, 0x0c, 0x1d, 0xbd,
+ 0x46, 0x2f, 0x22, 0x6c, 0xfd, 0xab, 0xfb, 0xb0, 0x4a, 0x8b,
+ 0xcd, 0xef, 0x95, 0x16, 0x7d, 0x84, 0xaf, 0x64, 0x12, 0x8c,
+ 0x0d, 0x71, 0xf4, 0xd5, 0xb8, 0xc0, 0xed, 0xfb, 0xbe, 0x3d,
+ 0xf4, 0x04, 0x48, 0xd2, 0xd8, 0xe1, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6 ),
+ EXPECT ( 0x3c, 0x40, 0xe8, 0xdc, 0x71, 0x72, 0xfd, 0xa2, 0x32, 0x55,
+ 0x0a, 0x1d, 0x8e, 0x14, 0x47, 0xc1, 0x1f, 0x47, 0x48, 0x88,
+ 0xf9, 0x6c, 0xd8, 0x5c, 0x38, 0x63, 0xd5, 0xe4, 0x84, 0x26,
+ 0x67, 0x56, 0x28, 0xd0, 0x88, 0x85, 0x34, 0x7c, 0x3e, 0xfd,
+ 0x62, 0x92, 0xfd, 0xdc, 0xd1, 0xa1, 0x42, 0x1e, 0xed, 0x51,
+ 0xb7, 0x13, 0xab, 0x09, 0x0f ) );
+
+/** SHA-256 Test 6 */
+HASH_DF_TEST ( test_sha256_6, sha256_algorithm,
+ INPUT ( 0x00, 0x3c, 0x40, 0xe8, 0xdc, 0x71, 0x72, 0xfd, 0xa2, 0x32,
+ 0x55, 0x0a, 0x1d, 0x8e, 0x14, 0x47, 0xc1, 0x1f, 0x47, 0x48,
+ 0x88, 0xf9, 0x6c, 0xd8, 0x5c, 0x38, 0x63, 0xd5, 0xe4, 0x84,
+ 0x26, 0x67, 0x56, 0x28, 0xd0, 0x88, 0x85, 0x34, 0x7c, 0x3e,
+ 0xfd, 0x62, 0x92, 0xfd, 0xdc, 0xd1, 0xa1, 0x42, 0x1e, 0xed,
+ 0x51, 0xb7, 0x13, 0xab, 0x09, 0x0f ),
+ EXPECT ( 0xe7, 0x56, 0x83, 0x84, 0xf2, 0x64, 0xe4, 0xa7, 0xe7, 0xae,
+ 0x85, 0x0d, 0x9d, 0x50, 0x1f, 0xd6, 0x31, 0x83, 0x56, 0x4f,
+ 0xd7, 0xd3, 0x90, 0x44, 0x6f, 0x5b, 0xe5, 0xf6, 0x7b, 0x50,
+ 0x19, 0x5b, 0x52, 0x84, 0x69, 0x2a, 0xd4, 0xb7, 0x6d, 0xfd,
+ 0x4f, 0x52, 0x4b, 0xcf, 0xcc, 0xab, 0x62, 0xc1, 0x30, 0x9f,
+ 0x25, 0x15, 0x17, 0xdf, 0xfd ) );
+
+/** SHA-256 Test 7 */
+HASH_DF_TEST ( test_sha256_7, sha256_algorithm,
+ INPUT ( 0x01, 0x23, 0x97, 0x6c, 0x61, 0x63, 0xd7, 0xe2, 0x4a, 0x1a,
+ 0x03, 0x8f, 0x2b, 0x2b, 0x64, 0x67, 0x97, 0x50, 0xca, 0x9e,
+ 0xd8, 0xd1, 0x40, 0x69, 0x8d, 0x64, 0x22, 0x39, 0x7b, 0x02,
+ 0x96, 0x9e, 0x6e, 0xcd, 0xd2, 0x9d, 0xac, 0xc5, 0x76, 0x7e,
+ 0x2c, 0xc2, 0xd0, 0xa1, 0x56, 0xc8, 0x7a, 0xd0, 0xb3, 0x57,
+ 0x89, 0x05, 0x07, 0xe0, 0x37, 0x77, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6 ),
+ EXPECT ( 0xe9, 0x83, 0xb1, 0x66, 0xa9, 0x2a, 0x99, 0x7e, 0xab, 0xcc,
+ 0x96, 0x6c, 0x6a, 0xa3, 0xd3, 0xb3, 0xa1, 0x68, 0x1f, 0xc5,
+ 0x8f, 0x58, 0x29, 0x40, 0x3b, 0x48, 0x60, 0x1e, 0xc1, 0x77,
+ 0x54, 0x94, 0x2e, 0x11, 0xc1, 0xcd, 0x46, 0x5b, 0x7d, 0xbe,
+ 0x2a, 0x78, 0xca, 0x04, 0x2c, 0xf9, 0xb3, 0x05, 0x71, 0xff,
+ 0x12, 0xe3, 0xb9, 0xf6, 0xc9 ) );
+
+/** SHA-256 Test 8 */
+HASH_DF_TEST ( test_sha256_8, sha256_algorithm,
+ INPUT ( 0x00, 0xe9, 0x83, 0xb1, 0x66, 0xa9, 0x2a, 0x99, 0x7e, 0xab,
+ 0xcc, 0x96, 0x6c, 0x6a, 0xa3, 0xd3, 0xb3, 0xa1, 0x68, 0x1f,
+ 0xc5, 0x8f, 0x58, 0x29, 0x40, 0x3b, 0x48, 0x60, 0x1e, 0xc1,
+ 0x77, 0x54, 0x94, 0x2e, 0x11, 0xc1, 0xcd, 0x46, 0x5b, 0x7d,
+ 0xbe, 0x2a, 0x78, 0xca, 0x04, 0x2c, 0xf9, 0xb3, 0x05, 0x71,
+ 0xff, 0x12, 0xe3, 0xb9, 0xf6, 0xc9 ),
+ EXPECT ( 0xa9, 0x77, 0x5c, 0xe1, 0x65, 0x5b, 0xff, 0x95, 0x1b, 0xe0,
+ 0xaf, 0x5b, 0x79, 0x59, 0x72, 0x5c, 0x76, 0x7d, 0x86, 0xf1,
+ 0xe1, 0x9b, 0x11, 0xb8, 0x90, 0x04, 0xf6, 0x97, 0x4d, 0xbf,
+ 0xa0, 0x46, 0x04, 0x45, 0x8e, 0x5c, 0x52, 0x8e, 0x7e, 0x1d,
+ 0xfa, 0xb3, 0x88, 0x7b, 0xa4, 0xaa, 0xdb, 0xd6, 0xfb, 0xde,
+ 0x0b, 0x31, 0x6f, 0x1d, 0x91 ) );
+
+/** SHA-256 Test 9 */
+HASH_DF_TEST ( test_sha256_9, sha256_algorithm,
+ INPUT ( 0x01, 0xab, 0x41, 0xcd, 0xe4, 0x37, 0xab, 0x8b, 0x09, 0x1c,
+ 0xa7, 0xc5, 0x75, 0x5d, 0x10, 0xf0, 0x11, 0x0c, 0x1d, 0xbd,
+ 0x46, 0x2f, 0x22, 0x6c, 0xfd, 0xab, 0xfb, 0xb0, 0x4a, 0x8b,
+ 0xcd, 0xef, 0x95, 0x16, 0x7d, 0x84, 0xaf, 0x64, 0x12, 0x8c,
+ 0x0d, 0x71, 0xf4, 0xd5, 0xb8, 0xc0, 0xed, 0xfb, 0xbe, 0x3d,
+ 0xf4, 0x04, 0x48, 0xd2, 0xd8, 0xe1, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72,
+ 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c,
+ 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
+ 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
+ 0x91, 0x92, 0x93, 0x94, 0x95, 0x96 ),
+ EXPECT ( 0x57, 0xb2, 0xcf, 0x00, 0xb5, 0x42, 0x97, 0x46, 0x0b, 0x08,
+ 0x7e, 0x52, 0x75, 0xd7, 0xdd, 0x74, 0x23, 0xb6, 0xe3, 0xb6,
+ 0x5e, 0x35, 0x16, 0xd2, 0x48, 0x11, 0x99, 0xa0, 0x17, 0xb5,
+ 0x3a, 0x22, 0x20, 0x33, 0xfe, 0x68, 0xa6, 0x0b, 0xd0, 0xbd,
+ 0x70, 0x40, 0x26, 0xcd, 0x5a, 0x3e, 0x79, 0x55, 0xdb, 0x01,
+ 0xdc, 0xb2, 0x84, 0x48, 0xd1 ) );
+
+/** SHA-256 Test 10 */
+HASH_DF_TEST ( test_sha256_10, sha256_algorithm,
+ INPUT ( 0x00, 0x57, 0xb2, 0xcf, 0x00, 0xb5, 0x42, 0x97, 0x46, 0x0b,
+ 0x08, 0x7e, 0x52, 0x75, 0xd7, 0xdd, 0x74, 0x23, 0xb6, 0xe3,
+ 0xb6, 0x5e, 0x35, 0x16, 0xd2, 0x48, 0x11, 0x99, 0xa0, 0x17,
+ 0xb5, 0x3a, 0x22, 0x20, 0x33, 0xfe, 0x68, 0xa6, 0x0b, 0xd0,
+ 0xbd, 0x70, 0x40, 0x26, 0xcd, 0x5a, 0x3e, 0x79, 0x55, 0xdb,
+ 0x01, 0xdc, 0xb2, 0x84, 0x48, 0xd1 ),
+ EXPECT ( 0x5b, 0xc1, 0xc6, 0x45, 0xcc, 0x8d, 0x32, 0x15, 0x82, 0xaf,
+ 0xbb, 0x00, 0x16, 0x99, 0x2b, 0x0f, 0x3a, 0xfe, 0x0f, 0x54,
+ 0x7a, 0xe7, 0xa7, 0x4c, 0x9c, 0x05, 0xa1, 0x44, 0x02, 0xfb,
+ 0xb1, 0xd5, 0x40, 0xe6, 0x80, 0x9d, 0x8b, 0xee, 0xf5, 0x99,
+ 0xed, 0x4c, 0x39, 0x16, 0x47, 0x40, 0xed, 0xa0, 0xd9, 0xc3,
+ 0x79, 0x5d, 0xe5, 0x52, 0xc5 ) );
+
+/** SHA-256 Test 11 */
+HASH_DF_TEST ( test_sha256_11, sha256_algorithm,
+ INPUT ( 0x01, 0xb3, 0x74, 0x95, 0x46, 0x81, 0xcf, 0xc9, 0x5b, 0x8d,
+ 0xb8, 0x39, 0x52, 0x8c, 0x71, 0x08, 0x83, 0x5e, 0xb4, 0xf3,
+ 0x0a, 0xd9, 0x1c, 0xbe, 0x9e, 0xa0, 0xd5, 0x45, 0xcc, 0xfd,
+ 0x18, 0x13, 0x2a, 0xf1, 0xd3, 0x76, 0x8f, 0x47, 0x02, 0x77,
+ 0x2b, 0x69, 0x15, 0x9f, 0x2c, 0xc0, 0x7f, 0x48, 0x74, 0x1e,
+ 0xb5, 0xb2, 0xb1, 0x22, 0x11, 0x25, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
+ 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc,
+ 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+ 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+ 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6 ),
+ EXPECT ( 0x5d, 0xc1, 0xc5, 0xf4, 0xb4, 0x11, 0x50, 0xce, 0xe0, 0xef,
+ 0xc1, 0x29, 0xb8, 0x37, 0xb3, 0x1c, 0x84, 0xd7, 0x91, 0xff,
+ 0x2e, 0x7e, 0xda, 0xc2, 0x9c, 0x2c, 0x50, 0xcf, 0x8a, 0x40,
+ 0x70, 0x9b, 0x98, 0x64, 0x0f, 0x7b, 0xbd, 0x32, 0xbc, 0xf0,
+ 0xfc, 0xb6, 0x13, 0xf9, 0x6d, 0x55, 0xd1, 0x60, 0x56, 0xbb,
+ 0x3c, 0xa6, 0xa7, 0x74, 0x05 ) );
+
+/** SHA-256 Test 12 */
+HASH_DF_TEST ( test_sha256_12, sha256_algorithm,
+ INPUT ( 0x00, 0x5d, 0xc1, 0xc5, 0xf4, 0xb4, 0x11, 0x50, 0xce, 0xe0,
+ 0xef, 0xc1, 0x29, 0xb8, 0x37, 0xb3, 0x1c, 0x84, 0xd7, 0x91,
+ 0xff, 0x2e, 0x7e, 0xda, 0xc2, 0x9c, 0x2c, 0x50, 0xcf, 0x8a,
+ 0x40, 0x70, 0x9b, 0x98, 0x64, 0x0f, 0x7b, 0xbd, 0x32, 0xbc,
+ 0xf0, 0xfc, 0xb6, 0x13, 0xf9, 0x6d, 0x55, 0xd1, 0x60, 0x56,
+ 0xbb, 0x3c, 0xa6, 0xa7, 0x74, 0x05 ),
+ EXPECT ( 0x62, 0x22, 0x10, 0x8c, 0xed, 0xfe, 0x6d, 0x6a, 0x22, 0x9f,
+ 0x8c, 0x3c, 0xbf, 0x44, 0x68, 0xc8, 0xf5, 0x17, 0x22, 0x86,
+ 0x4c, 0xc4, 0x16, 0xa4, 0x29, 0x26, 0xd9, 0x9b, 0xa6, 0xf0,
+ 0x45, 0xc1, 0xf6, 0x21, 0x11, 0x56, 0x94, 0x6c, 0x6e, 0x79,
+ 0x37, 0x29, 0x97, 0x4e, 0xb4, 0xc5, 0xa6, 0x07, 0x8f, 0x9a,
+ 0x1d, 0x4d, 0x1c, 0xd7, 0x49 ) );
+
+/** SHA-256 Test 13 */
+HASH_DF_TEST ( test_sha256_13, sha256_algorithm,
+ INPUT ( 0x01, 0xa3, 0xe9, 0x4e, 0x39, 0x26, 0xfd, 0xa1, 0x69, 0xc3,
+ 0x03, 0xd6, 0x64, 0x38, 0x39, 0x05, 0xe0, 0xd7, 0x99, 0x62,
+ 0xd1, 0x65, 0x44, 0x6d, 0x63, 0xbd, 0xa6, 0x54, 0xd1, 0x32,
+ 0xf7, 0x2d, 0xb4, 0x71, 0x56, 0x4b, 0x45, 0x6f, 0xf2, 0xee,
+ 0xc8, 0x36, 0x42, 0x2a, 0xcc, 0x5a, 0x02, 0x99, 0x35, 0xa7,
+ 0x99, 0x29, 0x90, 0x94, 0xa1, 0xca, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6 ),
+ EXPECT ( 0xe0, 0x26, 0xa5, 0xc2, 0xe7, 0x62, 0x3e, 0x62, 0xb7, 0x1a,
+ 0x2e, 0x04, 0xc2, 0x5f, 0x0b, 0x08, 0x58, 0x2b, 0xe2, 0x16,
+ 0x36, 0x34, 0xc0, 0x49, 0x6d, 0x2b, 0x65, 0xda, 0x7e, 0xaa,
+ 0x03, 0xb5, 0xc3, 0xb6, 0xb5, 0x10, 0xbb, 0x3f, 0xe4, 0x74,
+ 0x34, 0x07, 0x1f, 0x70, 0x7a, 0xc7, 0xfe, 0x4c, 0x39, 0x6a,
+ 0xaa, 0xee, 0x76, 0x4c, 0x90 ) );
+
+/** SHA-256 Test 14 */
+HASH_DF_TEST ( test_sha256_14, sha256_algorithm,
+ INPUT ( 0x00, 0xe0, 0x26, 0xa5, 0xc2, 0xe7, 0x62, 0x3e, 0x62, 0xb7,
+ 0x1a, 0x2e, 0x04, 0xc2, 0x5f, 0x0b, 0x08, 0x58, 0x2b, 0xe2,
+ 0x16, 0x36, 0x34, 0xc0, 0x49, 0x6d, 0x2b, 0x65, 0xda, 0x7e,
+ 0xaa, 0x03, 0xb5, 0xc3, 0xb6, 0xb5, 0x10, 0xbb, 0x3f, 0xe4,
+ 0x74, 0x34, 0x07, 0x1f, 0x70, 0x7a, 0xc7, 0xfe, 0x4c, 0x39,
+ 0x6a, 0xaa, 0xee, 0x76, 0x4c, 0x90 ),
+ EXPECT ( 0xc9, 0xea, 0x75, 0x4b, 0xee, 0x0a, 0xb6, 0x44, 0x15, 0xca,
+ 0x7f, 0xe3, 0x2e, 0xbb, 0xfb, 0x07, 0xed, 0x93, 0x2e, 0x7c,
+ 0x95, 0x7e, 0xce, 0xae, 0xf0, 0xcd, 0x2f, 0xa7, 0x7a, 0x46,
+ 0xf9, 0xe8, 0x59, 0x62, 0x78, 0x97, 0x54, 0xc6, 0xd2, 0x98,
+ 0xf9, 0xb5, 0xe4, 0x59, 0x6b, 0x4e, 0x0e, 0x6d, 0xf4, 0xf4,
+ 0xb8, 0x23, 0x60, 0xda, 0x33 ) );
+
+/** SHA-256 Test 15 */
+HASH_DF_TEST ( test_sha256_15, sha256_algorithm,
+ INPUT ( 0x01, 0xaa, 0x11, 0x1b, 0x0e, 0xd5, 0x6c, 0xf4, 0xa6, 0xcc,
+ 0xe4, 0xad, 0xe7, 0xf1, 0x1b, 0x06, 0x10, 0x45, 0xbf, 0x10,
+ 0x92, 0xcb, 0xb3, 0x8f, 0xf3, 0x23, 0x95, 0xea, 0x62, 0xd2,
+ 0x6b, 0x27, 0xc8, 0x86, 0x89, 0x45, 0xc5, 0x93, 0xba, 0x70,
+ 0xc3, 0x84, 0xad, 0xad, 0x45, 0x77, 0x1c, 0x93, 0xb0, 0x9c,
+ 0x27, 0x69, 0x07, 0x52, 0xd1, 0xd8, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6 ),
+ EXPECT ( 0xfc, 0x5f, 0x56, 0x48, 0xed, 0xc4, 0xfc, 0x30, 0x7b, 0x5c,
+ 0x5a, 0x53, 0xd5, 0x12, 0x89, 0xb5, 0x0e, 0x73, 0xdc, 0xec,
+ 0x4a, 0xa1, 0xcb, 0x47, 0xa3, 0xba, 0xd8, 0x46, 0xbb, 0x57,
+ 0xc3, 0xc4, 0x80, 0x49, 0x1d, 0xf5, 0x21, 0xc4, 0x66, 0x9b,
+ 0xff, 0xf3, 0x7a, 0x41, 0x8b, 0xaf, 0x6e, 0x9b, 0xea, 0xec,
+ 0x34, 0x96, 0xd0, 0xf1, 0xa6 ) );
+
+/** SHA-256 Test 16 */
+HASH_DF_TEST ( test_sha256_16, sha256_algorithm,
+ INPUT ( 0x00, 0xfc, 0x5f, 0x56, 0x48, 0xed, 0xc4, 0xfc, 0x30, 0x7b,
+ 0x5c, 0x5a, 0x53, 0xd5, 0x12, 0x89, 0xb5, 0x0e, 0x73, 0xdc,
+ 0xec, 0x4a, 0xa1, 0xcb, 0x47, 0xa3, 0xba, 0xd8, 0x46, 0xbb,
+ 0x57, 0xc3, 0xc4, 0x80, 0x49, 0x1d, 0xf5, 0x21, 0xc4, 0x66,
+ 0x9b, 0xff, 0xf3, 0x7a, 0x41, 0x8b, 0xaf, 0x6e, 0x9b, 0xea,
+ 0xec, 0x34, 0x96, 0xd0, 0xf1, 0xa6 ),
+ EXPECT ( 0x62, 0xb0, 0x7d, 0xc3, 0x9e, 0xbd, 0xf3, 0x10, 0x87, 0xb8,
+ 0x5d, 0xdc, 0xec, 0xfd, 0x43, 0x35, 0x62, 0xe5, 0x3b, 0xae,
+ 0x9f, 0x72, 0x1c, 0x5a, 0xfa, 0xb8, 0xf1, 0xcf, 0x01, 0x61,
+ 0xc8, 0x8e, 0x45, 0x50, 0x3e, 0x15, 0xb2, 0x6e, 0x7b, 0x80,
+ 0xd5, 0x1d, 0xb0, 0xb9, 0x24, 0x52, 0x36, 0x2d, 0xc3, 0xdc,
+ 0x57, 0x0d, 0xfe, 0x6e, 0x17 ) );
+
+/** SHA-256 Test 17 */
+HASH_DF_TEST ( test_sha256_17, sha256_algorithm,
+ INPUT ( 0x01, 0xa3, 0xe9, 0x4e, 0x39, 0x26, 0xfd, 0xa1, 0x69, 0xc3,
+ 0x03, 0xd6, 0x64, 0x38, 0x39, 0x05, 0xe0, 0xd7, 0x99, 0x62,
+ 0xd1, 0x65, 0x44, 0x6d, 0x63, 0xbd, 0xa6, 0x54, 0xd1, 0x32,
+ 0xf7, 0x2d, 0xb4, 0x71, 0x56, 0x4b, 0x45, 0x6f, 0xf2, 0xee,
+ 0xc8, 0x36, 0x42, 0x2a, 0xcc, 0x5a, 0x02, 0x99, 0x35, 0xa7,
+ 0x99, 0x29, 0x90, 0x94, 0xa1, 0xca, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d,
+ 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1,
+ 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5,
+ 0xb6, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
+ 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72,
+ 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c,
+ 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86,
+ 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90,
+ 0x91, 0x92, 0x93, 0x94, 0x95, 0x96 ),
+ EXPECT ( 0x98, 0x75, 0xbb, 0x7c, 0x7a, 0x0b, 0x23, 0x6b, 0xf4, 0x6f,
+ 0x4e, 0xa6, 0x6f, 0x67, 0xc7, 0xb4, 0x4f, 0x80, 0xef, 0x70,
+ 0x61, 0x4b, 0xef, 0xe8, 0xb0, 0x85, 0xcc, 0xaf, 0x55, 0x89,
+ 0xa7, 0x6f, 0x85, 0xfd, 0x96, 0x69, 0x53, 0xe2, 0x0a, 0x55,
+ 0xd2, 0xf3, 0x5b, 0xa5, 0x81, 0xef, 0x51, 0x11, 0xbf, 0xbf,
+ 0x05, 0x65, 0x3a, 0xf7, 0xe7 ) );
+
+/** SHA-256 Test 18 */
+HASH_DF_TEST ( test_sha256_18, sha256_algorithm,
+ INPUT ( 0x00, 0x98, 0x75, 0xbb, 0x7c, 0x7a, 0x0b, 0x23, 0x6b, 0xf4,
+ 0x6f, 0x4e, 0xa6, 0x6f, 0x67, 0xc7, 0xb4, 0x4f, 0x80, 0xef,
+ 0x70, 0x61, 0x4b, 0xef, 0xe8, 0xb0, 0x85, 0xcc, 0xaf, 0x55,
+ 0x89, 0xa7, 0x6f, 0x85, 0xfd, 0x96, 0x69, 0x53, 0xe2, 0x0a,
+ 0x55, 0xd2, 0xf3, 0x5b, 0xa5, 0x81, 0xef, 0x51, 0x11, 0xbf,
+ 0xbf, 0x05, 0x65, 0x3a, 0xf7, 0xe7 ),
+ EXPECT ( 0x12, 0x80, 0xfe, 0x1f, 0x05, 0x79, 0x8c, 0xca, 0xed, 0x5d,
+ 0x6d, 0xf6, 0xe7, 0xd2, 0x6f, 0x04, 0x6e, 0x53, 0x8c, 0xc5,
+ 0x2a, 0x6a, 0x03, 0x0d, 0xa8, 0x26, 0xb2, 0xb4, 0x79, 0x82,
+ 0xd6, 0xee, 0x8a, 0x68, 0x67, 0x58, 0x07, 0x06, 0x93, 0x9e,
+ 0xcc, 0x03, 0xfc, 0x11, 0xb0, 0x05, 0x9f, 0xe2, 0xae, 0xad,
+ 0xea, 0x0a, 0x46, 0x98, 0x5c ) );
+
+/** SHA-256 Test 19 */
+HASH_DF_TEST ( test_sha256_19, sha256_algorithm,
+ INPUT ( 0x01, 0xaa, 0xf6, 0xb9, 0x9b, 0x7f, 0x84, 0xb0, 0x36, 0xe1,
+ 0xcc, 0xbc, 0x9d, 0x57, 0x3a, 0x36, 0xb8, 0xbd, 0xd4, 0x7c,
+ 0x35, 0x8b, 0xb5, 0xf3, 0xc1, 0xd6, 0xe7, 0x90, 0x3a, 0xaa,
+ 0x29, 0xf1, 0xc8, 0x7a, 0xe6, 0x66, 0xb8, 0x86, 0x93, 0xbe,
+ 0xf4, 0x6c, 0x51, 0xc2, 0x4c, 0x47, 0xbe, 0xfe, 0x4b, 0x35,
+ 0x75, 0x4d, 0xcb, 0xfa, 0x1e, 0x7d, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd,
+ 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1,
+ 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb,
+ 0xec, 0xed, 0xee, 0xef, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8,
+ 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2,
+ 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbb, 0xbc,
+ 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+ 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 0xd0,
+ 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6 ),
+ EXPECT ( 0xb0, 0x6d, 0xbf, 0xb1, 0x4e, 0x7f, 0x4e, 0x01, 0x25, 0x62,
+ 0x94, 0x2f, 0xe4, 0xf2, 0xa9, 0x60, 0x17, 0x07, 0x55, 0x9d,
+ 0x7d, 0xd1, 0x90, 0x89, 0x8b, 0xc8, 0x06, 0x24, 0xe5, 0xc8,
+ 0xc1, 0xbb, 0x9b, 0x90, 0xfb, 0x2e, 0xef, 0x12, 0xed, 0x24,
+ 0xbe, 0xbd, 0x8d, 0xf7, 0x1e, 0xf6, 0x5c, 0x70, 0xfa, 0x4e,
+ 0x91, 0x86, 0x3a, 0x31, 0xbe ) );
+
+/** SHA-256 Test 20 */
+HASH_DF_TEST ( test_sha256_20, sha256_algorithm,
+ INPUT ( 0x00, 0xb0, 0x6d, 0xbf, 0xb1, 0x4e, 0x7f, 0x4e, 0x01, 0x25,
+ 0x62, 0x94, 0x2f, 0xe4, 0xf2, 0xa9, 0x60, 0x17, 0x07, 0x55,
+ 0x9d, 0x7d, 0xd1, 0x90, 0x89, 0x8b, 0xc8, 0x06, 0x24, 0xe5,
+ 0xc8, 0xc1, 0xbb, 0x9b, 0x90, 0xfb, 0x2e, 0xef, 0x12, 0xed,
+ 0x24, 0xbe, 0xbd, 0x8d, 0xf7, 0x1e, 0xf6, 0x5c, 0x70, 0xfa,
+ 0x4e, 0x91, 0x86, 0x3a, 0x31, 0xbe ),
+ EXPECT ( 0x5c, 0x07, 0xb7, 0x9c, 0x12, 0x83, 0x1b, 0xac, 0x36, 0x52,
+ 0x17, 0x8b, 0x2f, 0x90, 0x7a, 0x69, 0x61, 0x98, 0x39, 0xd8,
+ 0xa7, 0xfa, 0xa2, 0xb6, 0x95, 0xef, 0xb3, 0x10, 0x82, 0x38,
+ 0x01, 0x35, 0x85, 0x19, 0x1f, 0x59, 0x9c, 0x99, 0x07, 0xc7,
+ 0x21, 0x92, 0xed, 0x25, 0x7e, 0x9f, 0x6c, 0xd3, 0x77, 0xdd,
+ 0x6b, 0xac, 0x33, 0x7c, 0x19 ) );
+
+/**
+ * Report Hash_df test result
+ *
+ * @v test Hash_df test
+ */
+#define hash_df_ok( test ) do { \
+ uint8_t output[ (test)->expected_len ]; \
+ hash_df ( (test)->hash, (test)->input, (test)->input_len, \
+ output, sizeof ( output ) ); \
+ ok ( memcmp ( (test)->expected, output, \
+ sizeof ( output ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Perform Hash_df self-test
+ *
+ */
+static void hash_df_test_exec ( void ) {
+
+ hash_df_ok ( &test_sha1_1 );
+ hash_df_ok ( &test_sha1_2 );
+ hash_df_ok ( &test_sha1_3 );
+ hash_df_ok ( &test_sha1_4 );
+ hash_df_ok ( &test_sha1_5 );
+ hash_df_ok ( &test_sha1_6 );
+ hash_df_ok ( &test_sha1_7 );
+ hash_df_ok ( &test_sha1_8 );
+ hash_df_ok ( &test_sha1_9 );
+ hash_df_ok ( &test_sha1_10 );
+ hash_df_ok ( &test_sha1_11 );
+ hash_df_ok ( &test_sha1_12 );
+ hash_df_ok ( &test_sha1_13 );
+ hash_df_ok ( &test_sha1_14 );
+ hash_df_ok ( &test_sha1_15 );
+ hash_df_ok ( &test_sha1_16 );
+ hash_df_ok ( &test_sha1_17 );
+ hash_df_ok ( &test_sha1_18 );
+ hash_df_ok ( &test_sha1_19 );
+ hash_df_ok ( &test_sha1_20 );
+
+ hash_df_ok ( &test_sha256_1 );
+ hash_df_ok ( &test_sha256_2 );
+ hash_df_ok ( &test_sha256_3 );
+ hash_df_ok ( &test_sha256_4 );
+ hash_df_ok ( &test_sha256_5 );
+ hash_df_ok ( &test_sha256_6 );
+ hash_df_ok ( &test_sha256_7 );
+ hash_df_ok ( &test_sha256_8 );
+ hash_df_ok ( &test_sha256_9 );
+ hash_df_ok ( &test_sha256_10 );
+ hash_df_ok ( &test_sha256_11 );
+ hash_df_ok ( &test_sha256_12 );
+ hash_df_ok ( &test_sha256_13 );
+ hash_df_ok ( &test_sha256_14 );
+ hash_df_ok ( &test_sha256_15 );
+ hash_df_ok ( &test_sha256_16 );
+ hash_df_ok ( &test_sha256_17 );
+ hash_df_ok ( &test_sha256_18 );
+ hash_df_ok ( &test_sha256_19 );
+ hash_df_ok ( &test_sha256_20 );
+}
+
+/** Hash_df self-test */
+struct self_test hash_df_test __self_test = {
+ .name = "hash_df",
+ .exec = hash_df_test_exec,
+};
diff --git a/roms/ipxe/src/tests/hmac_drbg_test.c b/roms/ipxe/src/tests/hmac_drbg_test.c
new file mode 100644
index 00000000..8cbf1cc8
--- /dev/null
+++ b/roms/ipxe/src/tests/hmac_drbg_test.c
@@ -0,0 +1,1386 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * HMAC_DRBG tests
+ *
+ * These test vectors are provided by NIST as part of the
+ * Cryptographic Toolkit Examples, downloadable from:
+ *
+ * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/HMAC_DRBG.pdf
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <assert.h>
+#include <string.h>
+#include <ipxe/hmac_drbg.h>
+#include <ipxe/sha1.h>
+#include <ipxe/sha256.h>
+#include <ipxe/test.h>
+
+/** Define inline expected data */
+#define EXPECT(...) { __VA_ARGS__ }
+
+/** An HMAC_DRBG instantiation test */
+struct hmac_drbg_test_instantiate {
+ /** Underlying hash algorithm */
+ struct digest_algorithm *hash;
+ /** Output block length */
+ size_t out_len;
+ /** Entropy */
+ const void *entropy;
+ /** Length of entropy */
+ size_t entropy_len;
+ /** Nonce */
+ const void *nonce;
+ /** Length of nonce */
+ size_t nonce_len;
+ /** Personalisation string */
+ const void *personal;
+ /** Length of personalisation string */
+ size_t personal_len;
+ /** Expected key */
+ const void *expected_key;
+ /** Length of expected key */
+ size_t expected_key_len;
+ /** Expected value */
+ const void *expected_value;
+ /** Length of expected value */
+ size_t expected_value_len;
+};
+
+/**
+ * Define an HMAC_DRBG instantiation test
+ *
+ * @v name Test name
+ * @v hmac_drbg HMAC_DRBG algorithm
+ * @v entropy_array Entropy input
+ * @v nonce_array Nonce
+ * @v personal_array Personalisation string
+ * @v key Expected key
+ * @v value Expected value
+ * @ret test Instantiation test
+ */
+#define HMAC_DRBG_TEST_INSTANTIATE( name, hmac_drbg, entropy_array, \
+ nonce_array, personal_array, \
+ key, value ) \
+ static const uint8_t name ## _key [] = key; \
+ static const uint8_t name ## _value [] = value; \
+ static struct hmac_drbg_test_instantiate name = { \
+ .hash = HMAC_DRBG_HASH ( hmac_drbg ), \
+ .out_len = HMAC_DRBG_OUTLEN_BYTES ( hmac_drbg ), \
+ .entropy = entropy_array, \
+ .entropy_len = sizeof ( entropy_array ), \
+ .nonce = nonce_array, \
+ .nonce_len = sizeof ( nonce_array ), \
+ .personal = personal_array, \
+ .personal_len = sizeof ( personal_array ), \
+ .expected_key = name ## _key, \
+ .expected_key_len = sizeof ( name ## _key ), \
+ .expected_value = name ## _value, \
+ .expected_value_len = sizeof ( name ## _value ), \
+ }
+
+/**
+ * Report instantiation test result
+ *
+ * @v state HMAC_DRBG internal state
+ * @v test Instantiation test
+ */
+#define instantiate_ok( state, test ) do { \
+ struct { \
+ uint8_t entropy[(test)->entropy_len]; \
+ uint8_t nonce[(test)->nonce_len]; \
+ } __attribute__ (( packed )) entropy_nonce; \
+ \
+ assert ( (test)->expected_key_len == (test)->out_len ); \
+ assert ( (test)->expected_value_len == (test)->out_len ); \
+ memcpy ( entropy_nonce.entropy, (test)->entropy, \
+ sizeof ( entropy_nonce.entropy ) ); \
+ memcpy ( entropy_nonce.nonce, (test)->nonce, \
+ sizeof ( entropy_nonce.nonce ) ); \
+ hmac_drbg_instantiate ( (test)->hash, (state), &entropy_nonce, \
+ sizeof ( entropy_nonce ), \
+ (test)->personal, \
+ (test)->personal_len ); \
+ ok ( memcmp ( (state)->key, (test)->expected_key, \
+ (test)->expected_key_len ) == 0 ); \
+ ok ( memcmp ( (state)->value, (test)->expected_value, \
+ (test)->expected_value_len ) == 0 ); \
+ } while ( 0 )
+
+/** An HMAC_DRBG reseed test */
+struct hmac_drbg_test_reseed {
+ /** Underlying hash algorithm */
+ struct digest_algorithm *hash;
+ /** Output block length */
+ size_t out_len;
+ /** Entropy */
+ const void *entropy;
+ /** Length of entropy */
+ size_t entropy_len;
+ /** Additional input */
+ const void *additional;
+ /** Length of additional_input */
+ size_t additional_len;
+ /** Expected key */
+ const void *expected_key;
+ /** Length of expected key */
+ size_t expected_key_len;
+ /** Expected value */
+ const void *expected_value;
+ /** Length of expected value */
+ size_t expected_value_len;
+};
+
+/**
+ * Define an HMAC_DRBG reseed test
+ *
+ * @v name Test name
+ * @v hmac_drbg HMAC_DRBG algorithm
+ * @v entropy_array Entropy input
+ * @v additional_array Additional input
+ * @v key Expected key
+ * @v value Expected value
+ * @ret test Reseed test
+ */
+#define HMAC_DRBG_TEST_RESEED( name, hmac_drbg, entropy_array, \
+ additional_array, key, value ) \
+ static const uint8_t name ## _key [] = key; \
+ static const uint8_t name ## _value [] = value; \
+ static struct hmac_drbg_test_reseed name = { \
+ .hash = HMAC_DRBG_HASH ( hmac_drbg ), \
+ .out_len = HMAC_DRBG_OUTLEN_BYTES ( hmac_drbg ), \
+ .entropy = entropy_array, \
+ .entropy_len = sizeof ( entropy_array ), \
+ .additional = additional_array, \
+ .additional_len = sizeof ( additional_array ), \
+ .expected_key = name ## _key, \
+ .expected_key_len = sizeof ( name ## _key ), \
+ .expected_value = name ## _value, \
+ .expected_value_len = sizeof ( name ## _value ), \
+ }
+
+/**
+ * Report reseed test result
+ *
+ * @v state HMAC_DRBG internal state
+ * @v test Reseed test
+ */
+#define reseed_ok( state, test ) do { \
+ assert ( (test)->expected_key_len == (test)->out_len ); \
+ assert ( (test)->expected_value_len == (test)->out_len ); \
+ hmac_drbg_reseed ( (test)->hash, (state), (test)->entropy, \
+ (test)->entropy_len, (test)->additional, \
+ (test)->additional_len ); \
+ ok ( memcmp ( (state)->key, (test)->expected_key, \
+ (test)->expected_key_len ) == 0 ); \
+ ok ( memcmp ( (state)->value, (test)->expected_value, \
+ (test)->expected_value_len ) == 0 ); \
+ } while ( 0 )
+
+/** An HMAC_DRBG generation test */
+struct hmac_drbg_test_generate {
+ /** Underlying hash algorithm */
+ struct digest_algorithm *hash;
+ /** Output block length */
+ size_t out_len;
+ /** Additional input */
+ const void *additional;
+ /** Length of additional_input */
+ size_t additional_len;
+ /** Expected key */
+ const void *expected_key;
+ /** Length of expected key */
+ size_t expected_key_len;
+ /** Expected value */
+ const void *expected_value;
+ /** Length of expected value */
+ size_t expected_value_len;
+ /** Expected pseudorandom data */
+ const void *expected_data;
+ /** Length of data */
+ size_t expected_data_len;
+};
+
+/**
+ * Define an HMAC_DRBG generation test
+ *
+ * @v name Test name
+ * @v hmac_drbg HMAC_DRBG algorithm
+ * @v additional_array Additional input
+ * @v key Expected key
+ * @v value Expected value
+ * @v data Expected pseudorandom data
+ * @ret test Generation test
+ */
+#define HMAC_DRBG_TEST_GENERATE( name, hmac_drbg, additional_array, \
+ key, value, data ) \
+ static const uint8_t name ## _key [] = key; \
+ static const uint8_t name ## _value [] = value; \
+ static const uint8_t name ## _data [] = data; \
+ static struct hmac_drbg_test_generate name = { \
+ .hash = HMAC_DRBG_HASH ( hmac_drbg ), \
+ .out_len = HMAC_DRBG_OUTLEN_BYTES ( hmac_drbg ), \
+ .additional = additional_array, \
+ .additional_len = sizeof ( additional_array ), \
+ .expected_key = name ## _key, \
+ .expected_key_len = sizeof ( name ## _key ), \
+ .expected_value = name ## _value, \
+ .expected_value_len = sizeof ( name ## _value ), \
+ .expected_data = name ## _data, \
+ .expected_data_len = sizeof ( name ## _data ), \
+ }
+
+/**
+ * Report generation test result
+ *
+ * @v state HMAC_DRBG internal state
+ * @v test Generation test
+ */
+#define generate_ok( state, test ) do { \
+ uint8_t data[ (test)->expected_data_len ]; \
+ int rc; \
+ \
+ assert ( (test)->expected_key_len == (test)->out_len ); \
+ assert ( (test)->expected_value_len == (test)->out_len ); \
+ rc = hmac_drbg_generate ( (test)->hash, (state), \
+ (test)->additional, \
+ (test)->additional_len, \
+ data, sizeof ( data ) ); \
+ ok ( rc == 0 ); \
+ ok ( memcmp ( (state)->key, (test)->expected_key, \
+ (test)->expected_key_len ) == 0 ); \
+ ok ( memcmp ( (state)->value, (test)->expected_value, \
+ (test)->expected_value_len ) == 0 ); \
+ ok ( memcmp ( data, (test)->expected_data, \
+ (test)->expected_data_len ) == 0 ); \
+ } while ( 0 )
+
+/** An HMAC_DRBG generation failure test */
+struct hmac_drbg_test_generate_fail {
+ /** Underlying hash algorithm */
+ struct digest_algorithm *hash;
+ /** Additional input */
+ const void *additional;
+ /** Length of additional_input */
+ size_t additional_len;
+ /** Length of requested data */
+ size_t requested_len;
+};
+
+/**
+ * Define an HMAC_DRBG generation failure test
+ *
+ * @v name Test name
+ * @v hmac_drbg HMAC_DRBG algorithm
+ * @v additional_array Additional input
+ * @ret test Generation failure test
+ */
+#define HMAC_DRBG_TEST_GENERATE_FAIL( name, hmac_drbg, \
+ additional_array, len ) \
+ static struct hmac_drbg_test_generate_fail name = { \
+ .hash = HMAC_DRBG_HASH ( hmac_drbg ), \
+ .additional = additional_array, \
+ .additional_len = sizeof ( additional_array ), \
+ .requested_len = len, \
+ }
+
+/**
+ * Report generation failure test result
+ *
+ * @v state HMAC_DRBG internal state
+ * @v test Generation failure test
+ */
+#define generate_fail_ok( state, test ) do { \
+ uint8_t data[ (test)->requested_len ]; \
+ int rc; \
+ \
+ rc = hmac_drbg_generate ( (test)->hash, (state), \
+ (test)->additional, \
+ (test)->additional_len, data, \
+ sizeof ( data ) ); \
+ ok ( rc != 0 ); \
+ } while ( 0 )
+
+/** "EntropyInput" */
+static const uint8_t entropy_input[] = {
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
+ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
+ 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,
+ 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36
+};
+
+/** "Nonce" for SHA-1 */
+static const uint8_t nonce_sha1[] = {
+ 0x20, 0x21, 0x22, 0x23, 0x24
+};
+
+/** "Nonce" for SHA-256 */
+static const uint8_t nonce_sha256[] = {
+ 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27
+};
+
+/** "EntropyInput1 (for Reseed1) */
+static const uint8_t entropy_input_1[] = {
+ 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b,
+ 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97,
+ 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3,
+ 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf,
+ 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6
+};
+
+/** "EntropyInput2 (for Reseed2) */
+static const uint8_t entropy_input_2[] = {
+ 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb,
+ 0xcc, 0xcd, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7,
+ 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe1, 0xe2, 0xe3,
+ 0xe4, 0xe5, 0xe6, 0xe7, 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
+ 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6
+};
+
+/** "PersonalizationString = <empty>" */
+static const uint8_t personalisation_string_empty[] = {};
+
+/** "PersonalizationString" */
+static const uint8_t personalisation_string[] = {
+ 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b,
+ 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
+ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
+ 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
+ 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76
+};
+
+/** "AdditionalInput = <empty>" */
+static const uint8_t additional_input_empty[] = {};
+
+/** "AdditionalInput1" */
+static const uint8_t additional_input_1[] = {
+ 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b,
+ 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
+ 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83,
+ 0x84, 0x85, 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f,
+ 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96
+};
+
+/** "AdditionalInput2" */
+static const uint8_t additional_input_2[] = {
+ 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xaa, 0xab,
+ 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7,
+ 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc1, 0xc2, 0xc3,
+ 0xc4, 0xc5, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
+ 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6
+};
+
+/** SHA-1 Test 1 : Instantiation */
+HMAC_DRBG_TEST_INSTANTIATE ( sha1_instantiate_1, HMAC_DRBG_SHA1,
+ entropy_input, nonce_sha1, personalisation_string_empty,
+ EXPECT ( 0xab, 0x16, 0x0d, 0xd2, 0x1c, 0x30, 0x98, 0x0c, 0xa3, 0xca,
+ 0x5a, 0x9c, 0x77, 0xb7, 0xbd, 0xf0, 0x50, 0xe6, 0x4e, 0xe9 ),
+ EXPECT ( 0x61, 0x44, 0x99, 0xea, 0x98, 0x0c, 0xfb, 0x3d, 0xaa, 0x2c,
+ 0xa8, 0x6d, 0x65, 0xa4, 0x6b, 0xf4, 0x48, 0x8d, 0x8c, 0xc5 ) );
+
+/** SHA-1 Test 1.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_1_1, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x7b, 0xb1, 0x80, 0x28, 0xe0, 0x1d, 0x03, 0x42, 0xdf, 0x4f,
+ 0x54, 0xda, 0x51, 0x22, 0xfa, 0x5f, 0x2c, 0x3a, 0x05, 0xe4 ),
+ EXPECT ( 0x2f, 0x89, 0x4f, 0x28, 0xcc, 0x2f, 0x53, 0x82, 0x96, 0x40,
+ 0x64, 0x3a, 0xd1, 0x7b, 0x84, 0xb0, 0xcd, 0x3c, 0x79, 0x79 ),
+ EXPECT ( 0x5a, 0x7d, 0x3b, 0x44, 0x9f, 0x48, 0x1c, 0xb3, 0x8d, 0xf7,
+ 0x9a, 0xd2, 0xb1, 0xfc, 0xc0, 0x1e, 0x57, 0xf8, 0x13, 0x5e,
+ 0x8c, 0x0b, 0x22, 0xcd, 0x06, 0x30, 0xbf, 0xb0, 0x12, 0x7f,
+ 0xb5, 0x40, 0x8c, 0x8e, 0xfc, 0x17, 0xa9, 0x29, 0x89, 0x6e ) );
+
+/** SHA-1 Test 1.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_1_2, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x3d, 0x4d, 0x73, 0x77, 0xe9, 0x17, 0x2a, 0xaf, 0xa7, 0x76,
+ 0xb0, 0xdd, 0xcb, 0x89, 0x42, 0x00, 0x4a, 0x44, 0xb7, 0xfd ),
+ EXPECT ( 0x1a, 0x26, 0xbd, 0x9b, 0xfc, 0x97, 0x44, 0xbd, 0x29, 0xf6,
+ 0xae, 0xbe, 0x24, 0x37, 0xe2, 0x09, 0xf1, 0xf7, 0x16, 0x25 ),
+ EXPECT ( 0x82, 0xcf, 0x77, 0x2e, 0xc3, 0xe8, 0x4b, 0x00, 0xfc, 0x74,
+ 0xf5, 0xdf, 0x10, 0x4e, 0xfb, 0xfb, 0x24, 0x28, 0x55, 0x4e,
+ 0x9c, 0xe3, 0x67, 0xd0, 0x3a, 0xea, 0xde, 0x37, 0x82, 0x7f,
+ 0xa8, 0xe9, 0xcb, 0x6a, 0x08, 0x19, 0x61, 0x15, 0xd9, 0x48 ) );
+
+/** SHA-1 Test 2 : Instantiation */
+#define sha1_instantiate_2 sha1_instantiate_1
+
+/** SHA-1 Test 2.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_2_1, HMAC_DRBG_SHA1,
+ additional_input_1,
+ EXPECT ( 0x3a, 0x06, 0x2e, 0x6b, 0x79, 0xfe, 0x70, 0xdb, 0xff, 0xeb,
+ 0x3a, 0x2b, 0x6b, 0xe8, 0x03, 0x23, 0xf7, 0xd6, 0x74, 0xc5 ),
+ EXPECT ( 0xbd, 0x36, 0x31, 0x28, 0xbf, 0x58, 0x0d, 0x7a, 0x54, 0x42,
+ 0x9d, 0xdd, 0x58, 0xe8, 0x19, 0x3b, 0x98, 0x43, 0xbd, 0x2b ),
+ EXPECT ( 0xc7, 0xaa, 0xac, 0x58, 0x3c, 0x6e, 0xf6, 0x30, 0x07, 0x14,
+ 0xc2, 0xcc, 0x5d, 0x06, 0xc1, 0x48, 0xcf, 0xfb, 0x40, 0x44,
+ 0x9a, 0xd0, 0xbb, 0x26, 0xfa, 0xc0, 0x49, 0x7b, 0x5c, 0x57,
+ 0xe1, 0x61, 0xe3, 0x66, 0x81, 0xbc, 0xc9, 0x30, 0xce, 0x80 ) );
+
+/** SHA-1 Test 2.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_2_2, HMAC_DRBG_SHA1,
+ additional_input_2,
+ EXPECT ( 0x8a, 0xd7, 0xe3, 0x47, 0x72, 0xb5, 0xfc, 0x7c, 0x3b, 0x3b,
+ 0x27, 0x62, 0x4f, 0x0b, 0x91, 0x77, 0x6a, 0x8a, 0x71, 0x12 ),
+ EXPECT ( 0xd7, 0x13, 0x76, 0xa4, 0x6d, 0x76, 0x4b, 0x17, 0xc3, 0xb7,
+ 0x39, 0x34, 0x7b, 0x38, 0x4e, 0x51, 0x51, 0xe8, 0x7e, 0x88 ),
+ EXPECT ( 0x6e, 0xbd, 0x2b, 0x7b, 0x5e, 0x0a, 0x2a, 0xd7, 0xa2, 0x4b,
+ 0x1b, 0xf9, 0xa1, 0xdb, 0xa4, 0x7d, 0x43, 0x27, 0x17, 0x19,
+ 0xb9, 0xc3, 0x7b, 0x7f, 0xe8, 0x1b, 0xa9, 0x40, 0x45, 0xa1,
+ 0x4a, 0x7c, 0xb5, 0x14, 0xb4, 0x46, 0x66, 0x6e, 0xa5, 0xa7 ) );
+
+/** SHA-1 Test 3 : Instantiation */
+HMAC_DRBG_TEST_INSTANTIATE ( sha1_instantiate_3, HMAC_DRBG_SHA1,
+ entropy_input, nonce_sha1, personalisation_string,
+ EXPECT ( 0xb7, 0xd9, 0x66, 0xd7, 0x0d, 0x4e, 0x27, 0xa7, 0xfa, 0x83,
+ 0x8f, 0x7d, 0x61, 0x12, 0x6c, 0x0e, 0xdc, 0x84, 0x76, 0x1c ),
+ EXPECT ( 0xda, 0xb2, 0xa7, 0x18, 0x83, 0xf1, 0x00, 0x5c, 0x5d, 0xd0,
+ 0x39, 0x32, 0x4d, 0x3c, 0x36, 0x4d, 0x6e, 0x18, 0xf9, 0x54 ) );
+
+/** SHA-1 Test 3.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_3_1, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x87, 0xd3, 0x82, 0x8b, 0xe0, 0x3a, 0x80, 0x7d, 0xd3, 0x40,
+ 0x29, 0x41, 0xbe, 0xd6, 0xde, 0x98, 0x6e, 0xe7, 0xa2, 0x86 ),
+ EXPECT ( 0x6a, 0xe1, 0xd0, 0x08, 0x6f, 0x53, 0xb1, 0xb7, 0x63, 0xa4,
+ 0x51, 0x5b, 0x19, 0x06, 0xfe, 0xe4, 0x76, 0x61, 0xfd, 0x47 ),
+ EXPECT ( 0xb3, 0xbd, 0x05, 0x24, 0x6c, 0xba, 0x12, 0xa6, 0x47, 0x35,
+ 0xa4, 0xe3, 0xfd, 0xe5, 0x99, 0xbc, 0x1b, 0xe3, 0x0f, 0x43,
+ 0x9b, 0xd0, 0x60, 0x20, 0x8e, 0xea, 0x7d, 0x71, 0xf9, 0xd1,
+ 0x23, 0xdf, 0x47, 0xb3, 0xce, 0x06, 0x9d, 0x98, 0xed, 0xe6 ) );
+
+/** SHA-1 Test 3.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_3_2, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x26, 0xab, 0xbf, 0x54, 0xb2, 0x8b, 0x93, 0xff, 0x90, 0x08,
+ 0x67, 0x0e, 0xbf, 0xee, 0x86, 0xcd, 0xd7, 0x22, 0x8e, 0xd5 ),
+ EXPECT ( 0xe9, 0x25, 0x47, 0x29, 0xe0, 0x02, 0x04, 0xa1, 0xb6, 0xc0,
+ 0x21, 0x58, 0xa6, 0xc7, 0x27, 0x86, 0x47, 0x14, 0xf1, 0xf7 ),
+ EXPECT ( 0xb5, 0xda, 0xda, 0x38, 0x0e, 0x28, 0x72, 0xdf, 0x93, 0x5b,
+ 0xca, 0x55, 0xb8, 0x82, 0xc8, 0xc9, 0x37, 0x69, 0x02, 0xab,
+ 0x63, 0x97, 0x65, 0x47, 0x2b, 0x71, 0xac, 0xeb, 0xe2, 0xea,
+ 0x8b, 0x1b, 0x6b, 0x49, 0x62, 0x9c, 0xb6, 0x73, 0x17, 0xe0 ) );
+
+/** SHA-1 Test 4 : Instantiation */
+#define sha1_instantiate_4 sha1_instantiate_3
+
+/** SHA-1 Test 4.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_4_1, HMAC_DRBG_SHA1,
+ additional_input_1,
+ EXPECT ( 0x17, 0xa5, 0xd7, 0x9f, 0x07, 0x67, 0x87, 0x6f, 0x3a, 0x45,
+ 0xe0, 0xc9, 0xc3, 0x3e, 0xc8, 0x8b, 0x03, 0xce, 0xea, 0x13 ),
+ EXPECT ( 0x4d, 0x2f, 0x3b, 0xc7, 0x77, 0x50, 0x5c, 0x45, 0xf7, 0xe1,
+ 0x7d, 0xcd, 0x3d, 0x86, 0xbf, 0x37, 0x9c, 0xb6, 0x02, 0x5e ),
+ EXPECT ( 0x1f, 0x8f, 0xec, 0x7b, 0xc7, 0xcf, 0xa9, 0xa8, 0x80, 0x34,
+ 0x5d, 0x28, 0x0b, 0x13, 0xc6, 0x32, 0xb8, 0x52, 0x77, 0x0a,
+ 0x6d, 0xfc, 0x30, 0x2e, 0xad, 0x4c, 0xe3, 0xf5, 0x54, 0xc7,
+ 0x9b, 0x0d, 0x44, 0x23, 0x9e, 0xba, 0x56, 0xa7, 0xea, 0x2d ) );
+
+/** SHA-1 Test 4.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_4_2, HMAC_DRBG_SHA1,
+ additional_input_2,
+ EXPECT ( 0x07, 0x9b, 0x57, 0xd9, 0x40, 0x6e, 0x11, 0xc2, 0xf8, 0x7c,
+ 0x8c, 0x82, 0x8c, 0x8c, 0x6f, 0xa7, 0x6e, 0x40, 0xea, 0x01 ),
+ EXPECT ( 0xa6, 0x54, 0xfe, 0x72, 0xf8, 0xa7, 0x7b, 0xb8, 0xf0, 0x3d,
+ 0xff, 0x07, 0xc7, 0x9a, 0x51, 0x53, 0x00, 0x9e, 0xdd, 0xda ),
+ EXPECT ( 0xaf, 0x97, 0xcd, 0xe1, 0xe8, 0xab, 0x32, 0x2a, 0x2e, 0xac,
+ 0xa8, 0xe6, 0xf4, 0xe5, 0xbf, 0x78, 0xa1, 0x1b, 0xde, 0xf7,
+ 0xdc, 0x91, 0x21, 0x5d, 0x44, 0xb1, 0x07, 0xb4, 0xd5, 0xa7,
+ 0x79, 0x01, 0x59, 0x25, 0x09, 0x76, 0x52, 0x80, 0xf9, 0x69 ) );
+
+/** SHA-1 Test 5 : Instantiation */
+#define sha1_instantiate_5 sha1_instantiate_1
+
+/** SHA-1 Test 5.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_5_1, HMAC_DRBG_SHA1,
+ additional_input_empty, ( 320 / 8 ) );
+
+/** SHA-1 Test 5.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_5_2, HMAC_DRBG_SHA1,
+ entropy_input_1, additional_input_empty,
+ EXPECT ( 0xcd, 0x4c, 0xab, 0x38, 0xc8, 0xad, 0x65, 0x71, 0x22, 0xbf,
+ 0x5d, 0x3d, 0x00, 0xd0, 0xac, 0x9b, 0x13, 0xd6, 0x29, 0xbb ),
+ EXPECT ( 0xf6, 0x60, 0xe2, 0x3e, 0x91, 0x00, 0x6b, 0x62, 0xc6, 0x54,
+ 0x3a, 0xb1, 0x34, 0x4d, 0x23, 0xa3, 0x1a, 0xb4, 0xcf, 0x2c ) );
+
+/** SHA-1 Test 5.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_5_3, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x58, 0x7f, 0xd8, 0x21, 0xef, 0x6c, 0x9d, 0xa4, 0xa8, 0x3c,
+ 0x19, 0x21, 0x1f, 0x10, 0x56, 0xca, 0xcd, 0x23, 0xfc, 0x1a ),
+ EXPECT ( 0x84, 0x8f, 0xd1, 0x4c, 0x13, 0xb7, 0xea, 0x93, 0x72, 0x0c,
+ 0xcf, 0xde, 0x71, 0xf2, 0xf6, 0x44, 0x39, 0xdb, 0x79, 0x5d ),
+ EXPECT ( 0xfe, 0xc4, 0x59, 0x7f, 0x06, 0xa3, 0xa8, 0xcc, 0x85, 0x29,
+ 0xd5, 0x95, 0x57, 0xb9, 0xe6, 0x61, 0x05, 0x38, 0x09, 0xc0,
+ 0xbc, 0x0e, 0xfc, 0x28, 0x2a, 0xbd, 0x87, 0x60, 0x5c, 0xc9,
+ 0x0c, 0xba, 0x9b, 0x86, 0x33, 0xdc, 0xb1, 0xda, 0xe0, 0x2e ) );
+
+/** SHA-1 Test 5.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_5_4, HMAC_DRBG_SHA1,
+ additional_input_empty, ( 320 / 8 ) );
+
+/** SHA-1 Test 5.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_5_5, HMAC_DRBG_SHA1,
+ entropy_input_2, additional_input_empty,
+ EXPECT ( 0xdb, 0xa1, 0xcf, 0xf4, 0x87, 0x95, 0x46, 0xa0, 0x38, 0xa5,
+ 0x59, 0xb2, 0xa2, 0x4d, 0xf2, 0xc0, 0x30, 0x08, 0x9a, 0x41 ),
+ EXPECT ( 0x2f, 0x88, 0x3c, 0x46, 0x48, 0xe1, 0x31, 0xe8, 0x6d, 0xdf,
+ 0x9d, 0xca, 0x0d, 0x74, 0xf3, 0x0c, 0xa1, 0xce, 0x6e, 0xfb ) );
+
+/** SHA-1 Test 5.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_5_6, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0xf9, 0x39, 0xa5, 0xab, 0x08, 0xa3, 0x9f, 0x23, 0x10, 0x70,
+ 0xb0, 0xd4, 0xc9, 0x6d, 0xc2, 0x37, 0x90, 0xba, 0x01, 0x53 ),
+ EXPECT ( 0xce, 0x6d, 0x08, 0xb4, 0xae, 0x2c, 0xe3, 0x83, 0xfd, 0xab,
+ 0xb0, 0x1e, 0xaa, 0xfc, 0x9c, 0x8e, 0x76, 0xa0, 0xd4, 0x72 ),
+ EXPECT ( 0x84, 0xad, 0xd5, 0xe2, 0xd2, 0x04, 0x1c, 0x01, 0x72, 0x3a,
+ 0x4d, 0xe4, 0x33, 0x5b, 0x13, 0xef, 0xdf, 0x16, 0xb0, 0xe5,
+ 0x1a, 0x0a, 0xd3, 0x9b, 0xd1, 0x5e, 0x86, 0x2e, 0x64, 0x4f,
+ 0x31, 0xe4, 0xa2, 0xd7, 0xd8, 0x43, 0xe5, 0x7c, 0x59, 0x68 ) );
+
+/** SHA-1 Test 6 : Instantiate */
+#define sha1_instantiate_6 sha1_instantiate_1
+
+/** SHA-1 Test 6.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_6_1, HMAC_DRBG_SHA1,
+ additional_input_1, ( 320 / 8 ) );
+
+/** SHA-1 Test 6.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_6_2, HMAC_DRBG_SHA1,
+ entropy_input_1, additional_input_1,
+ EXPECT ( 0x52, 0x28, 0xa4, 0xb6, 0xa4, 0x46, 0x92, 0x90, 0x5e, 0xc0,
+ 0x44, 0xbf, 0xf0, 0xbb, 0x4e, 0x25, 0xa3, 0x87, 0xca, 0xc1 ),
+ EXPECT ( 0x24, 0x77, 0x32, 0xd0, 0x4c, 0xb8, 0x4e, 0xd4, 0x1a, 0xdd,
+ 0x95, 0xa4, 0xb7, 0x8b, 0x50, 0xcd, 0x9b, 0x3d, 0x3f, 0x32 ) );
+
+/** SHA-1 Test 6.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_6_3, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0xab, 0x3d, 0xd4, 0x89, 0x5b, 0xc8, 0xcd, 0x22, 0x71, 0xde,
+ 0xba, 0x5f, 0x3c, 0x13, 0x63, 0x52, 0x6b, 0x8b, 0x74, 0x52 ),
+ EXPECT ( 0xa8, 0x66, 0xc5, 0xef, 0xf2, 0xaf, 0x04, 0x2b, 0x11, 0x86,
+ 0x44, 0x94, 0x45, 0x23, 0x7f, 0x9c, 0x02, 0x44, 0x98, 0x64 ),
+ EXPECT ( 0xa1, 0xba, 0x8f, 0xa5, 0x8b, 0xb5, 0x01, 0x3f, 0x43, 0xf7,
+ 0xb6, 0xed, 0x52, 0xb4, 0x53, 0x9f, 0xa1, 0x6d, 0xc7, 0x79,
+ 0x57, 0xae, 0xe8, 0x15, 0xb9, 0xc0, 0x70, 0x04, 0xc7, 0xe9,
+ 0x92, 0xeb, 0x8c, 0x7e, 0x59, 0x19, 0x64, 0xaf, 0xee, 0xa2 ) );
+
+/** SHA-1 Test 6.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_6_4, HMAC_DRBG_SHA1,
+ additional_input_2, ( 320 / 8 ) );
+
+/** SHA-1 Test 6.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_6_5, HMAC_DRBG_SHA1,
+ entropy_input_2, additional_input_2,
+ EXPECT ( 0xe5, 0x73, 0x9f, 0x9c, 0xf7, 0xff, 0x43, 0x84, 0xd1, 0x27,
+ 0x3e, 0x02, 0x6b, 0x45, 0x31, 0x21, 0x36, 0x49, 0x4f, 0x41 ),
+ EXPECT ( 0x30, 0xc3, 0x43, 0x05, 0xc2, 0xc6, 0x48, 0xb0, 0x57, 0xa6,
+ 0x40, 0x22, 0x1b, 0x5c, 0x56, 0x57, 0x26, 0xcd, 0x32, 0xb2 ) );
+
+/** SHA-1 Test 6.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_6_6, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x61, 0x91, 0xca, 0x9b, 0xf0, 0x00, 0xd1, 0x0a, 0x71, 0x69,
+ 0x0a, 0xc1, 0x0e, 0x09, 0xff, 0xc8, 0x92, 0xab, 0xde, 0x9a ),
+ EXPECT ( 0x1e, 0xc0, 0x49, 0x0f, 0xa0, 0xb7, 0x65, 0x52, 0x7e, 0x5e,
+ 0xa1, 0x8b, 0x53, 0x22, 0xb2, 0x8b, 0xdd, 0x0e, 0x7b, 0xc0 ),
+ EXPECT ( 0x84, 0x26, 0x4a, 0x73, 0xa8, 0x18, 0xc9, 0x5c, 0x2f, 0x42,
+ 0x4b, 0x37, 0xd3, 0xcc, 0x99, 0x0b, 0x04, 0x6f, 0xb5, 0x0c,
+ 0x2d, 0xc6, 0x4a, 0x16, 0x42, 0x11, 0x88, 0x9a, 0x01, 0x0f,
+ 0x24, 0x71, 0xa0, 0x91, 0x2f, 0xfe, 0xa1, 0xbf, 0x01, 0x95 ) );
+
+/** SHA-1 Test 7 : Instantiation */
+#define sha1_instantiate_7 sha1_instantiate_3
+
+/** SHA-1 Test 7.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_7_1, HMAC_DRBG_SHA1,
+ additional_input_empty, ( 320 / 8 ) );
+
+/** SHA-1 Test 7.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_7_2, HMAC_DRBG_SHA1,
+ entropy_input_1, additional_input_empty,
+ EXPECT ( 0xb9, 0x25, 0x4d, 0x8a, 0xac, 0xba, 0x43, 0xfb, 0xda, 0xe6,
+ 0x39, 0x4f, 0x2b, 0x3a, 0xfc, 0x5d, 0x58, 0x08, 0x00, 0xbf ),
+ EXPECT ( 0x28, 0x40, 0x3b, 0x60, 0x36, 0x38, 0xd0, 0x7d, 0x79, 0x66,
+ 0x66, 0x1e, 0xf6, 0x7b, 0x9d, 0x39, 0x05, 0xf4, 0x6d, 0xb9 ) );
+
+/** SHA-1 Test 7.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_7_3, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x64, 0xfe, 0x07, 0x4a, 0x6e, 0x77, 0x97, 0xd1, 0xa4, 0x35,
+ 0xda, 0x89, 0x64, 0x48, 0x4d, 0x6c, 0xf8, 0xbd, 0xc0, 0x1b ),
+ EXPECT ( 0x43, 0xe0, 0xc0, 0x52, 0x15, 0x86, 0xe9, 0x47, 0x3b, 0x06,
+ 0x0d, 0x87, 0xd0, 0x8a, 0x23, 0x25, 0xfa, 0xe1, 0x49, 0xd1 ),
+ EXPECT ( 0x6c, 0x37, 0xfd, 0xd7, 0x29, 0xaa, 0x40, 0xf8, 0x0b, 0xc6,
+ 0xab, 0x08, 0xca, 0x7c, 0xc6, 0x49, 0x79, 0x4f, 0x69, 0x98,
+ 0xb5, 0x70, 0x81, 0xe4, 0x22, 0x0f, 0x22, 0xc5, 0xc2, 0x83,
+ 0xe2, 0xc9, 0x1b, 0x8e, 0x30, 0x5a, 0xb8, 0x69, 0xc6, 0x25 ) );
+
+/** SHA-1 Test 7.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_7_4, HMAC_DRBG_SHA1,
+ additional_input_empty, ( 320 / 8 ) );
+
+/** SHA-1 Test 7.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_7_5, HMAC_DRBG_SHA1,
+ entropy_input_2, additional_input_empty,
+ EXPECT ( 0x02, 0xbc, 0x57, 0x7f, 0xd1, 0x0e, 0xf7, 0x19, 0x3c, 0x1d,
+ 0xb0, 0x98, 0xbd, 0x5b, 0x75, 0xc7, 0xc4, 0xb6, 0x79, 0x59 ),
+ EXPECT ( 0xbc, 0xbd, 0xf0, 0x52, 0xe0, 0xe0, 0x2a, 0xe8, 0x9a, 0x77,
+ 0x67, 0x94, 0x3f, 0x98, 0x65, 0xb8, 0xb7, 0x22, 0x90, 0x2d ) );
+
+/** SHA-1 Test 7.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_7_6, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x1a, 0xa4, 0x24, 0x1c, 0x69, 0x5e, 0x29, 0xc0, 0xa5, 0x9a,
+ 0xd1, 0x8a, 0x60, 0x70, 0xe3, 0x38, 0xa5, 0x48, 0xbe, 0x92 ),
+ EXPECT ( 0x03, 0x47, 0x35, 0x9b, 0xc9, 0xc7, 0xf8, 0x8c, 0xc8, 0x33,
+ 0x0d, 0x4f, 0x59, 0xfb, 0xc7, 0x70, 0xb0, 0xb7, 0x7b, 0x03 ),
+ EXPECT ( 0xca, 0xf5, 0x7d, 0xcf, 0xea, 0x39, 0x3b, 0x92, 0x36, 0xbf,
+ 0x69, 0x1f, 0xa4, 0x56, 0xfe, 0xa7, 0xfd, 0xf1, 0xdf, 0x83,
+ 0x61, 0x48, 0x2c, 0xa5, 0x4d, 0x5f, 0xa7, 0x23, 0xf4, 0xc8,
+ 0x8b, 0x4f, 0xa5, 0x04, 0xbf, 0x03, 0x27, 0x7f, 0xa7, 0x83 ) );
+
+/** SHA-1 Test 8 : Instantiate */
+#define sha1_instantiate_8 sha1_instantiate_3
+
+/** SHA-1 Test 8.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_8_1, HMAC_DRBG_SHA1,
+ additional_input_1, ( 320 / 8 ) );
+
+/** SHA-1 Test 8.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_8_2, HMAC_DRBG_SHA1,
+ entropy_input_1, additional_input_1,
+ EXPECT ( 0xc0, 0x95, 0x48, 0xc0, 0xd3, 0xc8, 0x61, 0xd7, 0x40, 0xf2,
+ 0x83, 0x7d, 0x72, 0xb5, 0x07, 0x23, 0x5c, 0x26, 0xdb, 0x82 ),
+ EXPECT ( 0x17, 0x4b, 0x3f, 0x84, 0xc3, 0x53, 0x1f, 0x7c, 0x0a, 0x2e,
+ 0x54, 0x21, 0x23, 0x4e, 0xa1, 0x6b, 0x70, 0x8d, 0xdf, 0x0d ) );
+
+/** SHA-1 Test 8.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_8_3, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0x60, 0x3f, 0x09, 0x49, 0x27, 0x9c, 0x70, 0xe8, 0xc6, 0x6c,
+ 0x0f, 0x56, 0x37, 0xc0, 0xf3, 0x75, 0x60, 0x07, 0xe5, 0xac ),
+ EXPECT ( 0xf2, 0xb3, 0x3b, 0x21, 0x15, 0x1f, 0xaf, 0x61, 0x20, 0x01,
+ 0x83, 0x10, 0xf4, 0x4e, 0x4c, 0xd0, 0xbf, 0xe3, 0x68, 0xea ),
+ EXPECT ( 0xbd, 0x07, 0xc2, 0x5c, 0xfd, 0x7c, 0x5e, 0x3a, 0x4e, 0xaa,
+ 0x6e, 0x2e, 0xdc, 0x5a, 0xb7, 0xea, 0x49, 0x42, 0xa0, 0x91,
+ 0x34, 0x71, 0xfd, 0xa5, 0x5c, 0x6d, 0xdd, 0x2c, 0x03, 0xef,
+ 0xa3, 0xb9, 0x64, 0x3a, 0xb3, 0xbb, 0x22, 0xf6, 0xc9, 0xf2 ) );
+
+/** SHA-1 Test 8.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha1_generate_fail_8_4, HMAC_DRBG_SHA1,
+ additional_input_2, ( 320 / 8 ) );
+
+/** SHA-1 Test 8.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha1_reseed_8_5, HMAC_DRBG_SHA1,
+ entropy_input_2, additional_input_2,
+ EXPECT ( 0x89, 0x42, 0xa5, 0x4f, 0x34, 0x9e, 0x28, 0x1b, 0x84, 0xaa,
+ 0x46, 0x95, 0x87, 0xfb, 0xdd, 0xaf, 0x9d, 0x11, 0x40, 0x82 ),
+ EXPECT ( 0x07, 0x73, 0x0e, 0x3c, 0xbf, 0xfd, 0x3c, 0xaf, 0xd7, 0xa8,
+ 0xaa, 0xe2, 0xbf, 0x01, 0xd6, 0x01, 0x43, 0x01, 0xe2, 0x4d ) );
+
+/** SHA-1 Test 8.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha1_generate_8_6, HMAC_DRBG_SHA1,
+ additional_input_empty,
+ EXPECT ( 0xbd, 0xe1, 0xb4, 0x6c, 0xdc, 0x54, 0x13, 0xb3, 0xd9, 0xf7,
+ 0x35, 0xac, 0xdb, 0x80, 0xb1, 0x3c, 0x57, 0xbf, 0xe4, 0x73 ),
+ EXPECT ( 0x72, 0x5a, 0x3c, 0x78, 0x20, 0xde, 0x1a, 0x06, 0xd0, 0x95,
+ 0x81, 0x9c, 0xcf, 0x6f, 0x2c, 0x9b, 0x3a, 0x67, 0xf2, 0xce ),
+ EXPECT ( 0xd1, 0xa9, 0xc1, 0xa2, 0x2c, 0x84, 0xfc, 0x23, 0xff, 0x22,
+ 0x27, 0xef, 0x98, 0xec, 0x8b, 0xa9, 0xdf, 0x2a, 0x20, 0x9b,
+ 0xa1, 0xdb, 0x09, 0x80, 0x9f, 0x57, 0xbf, 0xea, 0xe5, 0xb3,
+ 0xe5, 0xf1, 0x46, 0xc7, 0x5f, 0x2d, 0x8d, 0xbb, 0x5e, 0x4a ) );
+
+/** SHA-256 Test 1 : Instantiation */
+HMAC_DRBG_TEST_INSTANTIATE ( sha256_instantiate_1, HMAC_DRBG_SHA256,
+ entropy_input, nonce_sha256, personalisation_string_empty,
+ EXPECT ( 0x3d, 0xda, 0x54, 0x3e, 0x7e, 0xef, 0x14, 0xf9, 0x36, 0x23,
+ 0x7b, 0xe6, 0x5d, 0x09, 0x4b, 0x4d, 0xdc, 0x96, 0x9c, 0x0b,
+ 0x2b, 0x5e, 0xaf, 0xb5, 0xd8, 0x05, 0xe8, 0x6c, 0xfa, 0x64,
+ 0xd7, 0x41 ),
+ EXPECT ( 0x2d, 0x02, 0xc2, 0xf8, 0x22, 0x51, 0x7d, 0x54, 0xb8, 0x17,
+ 0x27, 0x9a, 0x59, 0x49, 0x1c, 0x41, 0xa1, 0x98, 0x9b, 0x3e,
+ 0x38, 0x2d, 0xeb, 0xe8, 0x0d, 0x2c, 0x7f, 0x66, 0x0f, 0x44,
+ 0x76, 0xc4 ) );
+
+/** SHA-256 Test 1.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_1_1, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0xdd, 0x30, 0x95, 0x79, 0x35, 0x38, 0x02, 0xcc, 0xdd, 0x43,
+ 0x99, 0xc3, 0x69, 0x1c, 0x9d, 0xd9, 0x09, 0xdd, 0x3b, 0x2d,
+ 0xd0, 0x03, 0xcc, 0xd5, 0x9d, 0x6f, 0x08, 0xd8, 0x5f, 0x2e,
+ 0x35, 0x09 ),
+ EXPECT ( 0xa1, 0xc2, 0x0f, 0xf2, 0x70, 0xa3, 0x9d, 0x2b, 0x8d, 0x03,
+ 0xd6, 0x59, 0xb9, 0xdd, 0xd0, 0x11, 0xc2, 0xcc, 0xdf, 0x24,
+ 0x48, 0x55, 0x7e, 0xf6, 0xa1, 0xa9, 0x15, 0xd1, 0x89, 0x40,
+ 0xa6, 0x88 ),
+ EXPECT ( 0xd6, 0x7b, 0x8c, 0x17, 0x34, 0xf4, 0x6f, 0xa3, 0xf7, 0x63,
+ 0xcf, 0x57, 0xc6, 0xf9, 0xf4, 0xf2, 0xdc, 0x10, 0x89, 0xbd,
+ 0x8b, 0xc1, 0xf6, 0xf0, 0x23, 0x95, 0x0b, 0xfc, 0x56, 0x17,
+ 0x63, 0x52, 0x08, 0xc8, 0x50, 0x12, 0x38, 0xad, 0x7a, 0x44,
+ 0x00, 0xde, 0xfe, 0xe4, 0x6c, 0x64, 0x0b, 0x61, 0xaf, 0x77,
+ 0xc2, 0xd1, 0xa3, 0xbf, 0xaa, 0x90, 0xed, 0xe5, 0xd2, 0x07,
+ 0x40, 0x6e, 0x54, 0x03 ) );
+
+/** SHA-256 Test 1.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_1_2, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0x5c, 0xd5, 0xe5, 0x0a, 0x3e, 0x44, 0x8a, 0x07, 0xc3, 0xd2,
+ 0xf2, 0xa3, 0xf9, 0xde, 0xbc, 0xc0, 0x46, 0x5f, 0x9c, 0xf1,
+ 0x1c, 0xa1, 0x36, 0xe9, 0xb5, 0x04, 0xb4, 0xd3, 0x1c, 0x7f,
+ 0xf1, 0xb8 ),
+ EXPECT ( 0x33, 0xb3, 0x09, 0xf2, 0xff, 0x01, 0xce, 0x10, 0x4b, 0x44,
+ 0x29, 0xb6, 0x75, 0xfa, 0xfa, 0x19, 0x01, 0x1e, 0x34, 0x8b,
+ 0x28, 0x12, 0x71, 0x5a, 0x76, 0x37, 0xf6, 0xa6, 0xe6, 0x3b,
+ 0x5d, 0x57 ),
+ EXPECT ( 0x8f, 0xda, 0xec, 0x20, 0xf8, 0xb4, 0x21, 0x40, 0x70, 0x59,
+ 0xe3, 0x58, 0x89, 0x20, 0xda, 0x7e, 0xda, 0x9d, 0xce, 0x3c,
+ 0xf8, 0x27, 0x4d, 0xfa, 0x1c, 0x59, 0xc1, 0x08, 0xc1, 0xd0,
+ 0xaa, 0x9b, 0x0f, 0xa3, 0x8d, 0xa5, 0xc7, 0x92, 0x03, 0x7c,
+ 0x4d, 0x33, 0xcd, 0x07, 0x0c, 0xa7, 0xcd, 0x0c, 0x56, 0x08,
+ 0xdb, 0xa8, 0xb8, 0x85, 0x65, 0x46, 0x39, 0xde, 0x21, 0x87,
+ 0xb7, 0x4c, 0xb2, 0x63 ) );
+
+/** SHA-256 Test 2 : Instantiation */
+#define sha256_instantiate_2 sha256_instantiate_1
+
+/** SHA-256 Test 2.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_2_1, HMAC_DRBG_SHA256,
+ additional_input_1,
+ EXPECT ( 0x79, 0x1d, 0x31, 0x44, 0xb3, 0x02, 0xad, 0x6c, 0xe4, 0x32,
+ 0x41, 0x34, 0x42, 0x10, 0xaa, 0xd0, 0xd3, 0x99, 0xed, 0xb7,
+ 0xb5, 0x90, 0x6f, 0xb2, 0x51, 0xdb, 0x1c, 0xb6, 0x00, 0x04,
+ 0xea, 0x51 ),
+ EXPECT ( 0x58, 0xfd, 0x96, 0x5f, 0x4f, 0x99, 0x89, 0x3c, 0x17, 0xe6,
+ 0xa3, 0x3c, 0xb8, 0xe9, 0x04, 0x15, 0xb5, 0x16, 0xd0, 0x06,
+ 0x14, 0xa4, 0x49, 0xd4, 0x06, 0xe0, 0x3c, 0x68, 0x5b, 0xd8,
+ 0x59, 0xbd ),
+ EXPECT ( 0x41, 0x87, 0x87, 0x35, 0x81, 0x35, 0x41, 0x9b, 0x93, 0x81,
+ 0x33, 0x53, 0x53, 0x06, 0x17, 0x6a, 0xfb, 0x25, 0x1c, 0xdd,
+ 0x2b, 0xa3, 0x79, 0x88, 0x59, 0xb5, 0x66, 0xa0, 0x5c, 0xfb,
+ 0x1d, 0x68, 0x0e, 0xa9, 0x25, 0x85, 0x6d, 0x5b, 0x84, 0xd5,
+ 0x6a, 0xda, 0xe8, 0x70, 0x45, 0xa6, 0xba, 0x28, 0xd2, 0xc9,
+ 0x08, 0xab, 0x75, 0xb7, 0xcc, 0x41, 0x43, 0x1f, 0xac, 0x59,
+ 0xf3, 0x89, 0x18, 0xa3 ) );
+
+/** SHA-256 Test 2.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_2_2, HMAC_DRBG_SHA256,
+ additional_input_2,
+ EXPECT ( 0xe7, 0x45, 0x8f, 0xb4, 0x4a, 0x36, 0x9a, 0x65, 0x3f, 0x2f,
+ 0x8f, 0x57, 0x7b, 0xf9, 0x75, 0xc4, 0xb3, 0x62, 0xc4, 0xfe,
+ 0x61, 0x8b, 0x2f, 0x1f, 0xf6, 0x76, 0x9b, 0x13, 0xc9, 0x4d,
+ 0xec, 0xf4 ),
+ EXPECT ( 0x19, 0x33, 0x4b, 0x8c, 0x31, 0xb7, 0x49, 0x32, 0xdd, 0xd7,
+ 0xb2, 0xa4, 0x68, 0xf6, 0x43, 0x6d, 0xf9, 0x2e, 0x10, 0x0d,
+ 0x39, 0xd3, 0xac, 0xb3, 0x68, 0xc7, 0x02, 0x9c, 0xb8, 0x83,
+ 0xec, 0x89 ),
+ EXPECT ( 0x7c, 0x06, 0x7b, 0xdd, 0xca, 0x81, 0x72, 0x48, 0x23, 0xd6,
+ 0x4c, 0x69, 0x82, 0x92, 0x85, 0xbd, 0xbf, 0xf5, 0x37, 0x71,
+ 0x61, 0x02, 0xc1, 0x88, 0x2e, 0x20, 0x22, 0x50, 0xe0, 0xfa,
+ 0x5e, 0xf3, 0xa3, 0x84, 0xcd, 0x34, 0xa2, 0x0f, 0xfd, 0x1f,
+ 0xbc, 0x91, 0xe0, 0xc5, 0x32, 0xa8, 0xa4, 0x21, 0xbc, 0x4a,
+ 0xfe, 0x3c, 0xd4, 0x7f, 0x22, 0x32, 0x3e, 0xb4, 0xba, 0xe1,
+ 0xa0, 0x07, 0x89, 0x81 ) );
+
+/** SHA-256 Test 3 : Instantiation */
+HMAC_DRBG_TEST_INSTANTIATE ( sha256_instantiate_3, HMAC_DRBG_SHA256,
+ entropy_input, nonce_sha256, personalisation_string,
+ EXPECT ( 0x65, 0x67, 0x3c, 0x34, 0x8e, 0x51, 0xcf, 0xac, 0xc4, 0x10,
+ 0xbd, 0x20, 0x02, 0x49, 0xa5, 0x9a, 0x9d, 0x6b, 0xae, 0x77,
+ 0x69, 0x04, 0x27, 0x1b, 0xb1, 0xf7, 0x18, 0xda, 0x1d, 0x18,
+ 0x20, 0x42 ),
+ EXPECT ( 0xe0, 0xf9, 0x1a, 0xc9, 0x96, 0x30, 0xee, 0xe6, 0x7c, 0xf8,
+ 0x30, 0xcf, 0xd5, 0x04, 0x4f, 0xeb, 0xf5, 0x5c, 0x0c, 0x11,
+ 0x50, 0x07, 0x99, 0x7a, 0xda, 0x11, 0x29, 0x6f, 0xc4, 0x16,
+ 0x4a, 0x9a ) );
+
+/** SHA-256 Test 3.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_3_1, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0xf0, 0xb2, 0xf2, 0x42, 0xca, 0xd9, 0x92, 0xa7, 0x24, 0xf7,
+ 0xe5, 0x59, 0x1d, 0x2f, 0x3b, 0x0c, 0x21, 0x57, 0xae, 0x70,
+ 0xd5, 0x32, 0x78, 0x99, 0x40, 0xf1, 0x64, 0x45, 0x9b, 0x00,
+ 0xc7, 0x49 ),
+ EXPECT ( 0x1a, 0x03, 0xf9, 0x1c, 0x51, 0x20, 0xba, 0xca, 0x2b, 0xf6,
+ 0xc6, 0x4d, 0xd7, 0x3a, 0xb1, 0x1d, 0xf6, 0xfd, 0x3f, 0xf1,
+ 0xac, 0x3b, 0x57, 0x20, 0xa3, 0xf7, 0xfb, 0xe3, 0x9e, 0x7e,
+ 0x7f, 0xe9 ),
+ EXPECT ( 0x0d, 0xd9, 0xc8, 0x55, 0x89, 0xf3, 0x57, 0xc3, 0x89, 0xd6,
+ 0xaf, 0x8d, 0xe9, 0xd7, 0x34, 0xa9, 0x17, 0xc7, 0x71, 0xef,
+ 0x2d, 0x88, 0x16, 0xb9, 0x82, 0x59, 0x6e, 0xd1, 0x2d, 0xb4,
+ 0x5d, 0x73, 0x4a, 0x62, 0x68, 0x08, 0x35, 0xc0, 0x2f, 0xda,
+ 0x66, 0xb0, 0x8e, 0x1a, 0x36, 0x9a, 0xe2, 0x18, 0xf2, 0x6d,
+ 0x52, 0x10, 0xad, 0x56, 0x42, 0x48, 0x87, 0x2d, 0x7a, 0x28,
+ 0x78, 0x41, 0x59, 0xc3 ) );
+
+/** SHA-256 Test 3.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_3_2, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0x5c, 0x0d, 0xec, 0x09, 0x37, 0x08, 0xc1, 0x7c, 0xa7, 0x6b,
+ 0x57, 0xc0, 0xcb, 0x60, 0xcf, 0x88, 0x9d, 0xcc, 0x47, 0xad,
+ 0x10, 0xbd, 0x64, 0xbc, 0x6a, 0x14, 0xb2, 0x3f, 0x20, 0x26,
+ 0x07, 0x8a ),
+ EXPECT ( 0x45, 0x67, 0x52, 0xa5, 0x11, 0xb8, 0x48, 0xbd, 0x05, 0xf1,
+ 0x81, 0x9b, 0x9f, 0x6b, 0x15, 0x42, 0xc7, 0xd5, 0xec, 0xf9,
+ 0x32, 0x73, 0x39, 0x26, 0x7a, 0x0c, 0x77, 0x23, 0x5b, 0x87,
+ 0xdc, 0x5a ),
+ EXPECT ( 0x46, 0xb4, 0xf4, 0x75, 0x6a, 0xe7, 0x15, 0xe0, 0xe5, 0x16,
+ 0x81, 0xab, 0x29, 0x32, 0xde, 0x15, 0x23, 0xbe, 0x5d, 0x13,
+ 0xba, 0xf0, 0xf4, 0x58, 0x8b, 0x11, 0xfe, 0x37, 0x2f, 0xda,
+ 0x37, 0xab, 0xe3, 0x68, 0x31, 0x73, 0x41, 0xbc, 0x8b, 0xa9,
+ 0x1f, 0xc5, 0xd8, 0x5b, 0x7f, 0xb8, 0xca, 0x8f, 0xbc, 0x30,
+ 0x9a, 0x75, 0x8f, 0xd6, 0xfc, 0xa9, 0xdf, 0x43, 0xc7, 0x66,
+ 0x0b, 0x22, 0x13, 0x22 ) );
+
+/** SHA-256 Test 4 : Instantiation */
+#define sha256_instantiate_4 sha256_instantiate_3
+
+/** SHA-256 Test 4.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_4_1, HMAC_DRBG_SHA256,
+ additional_input_1,
+ EXPECT ( 0x57, 0x2c, 0x03, 0x74, 0xc1, 0xa1, 0x01, 0x25, 0xbf, 0xa6,
+ 0xae, 0xcd, 0x7c, 0xeb, 0xfe, 0x32, 0xf7, 0x52, 0xc3, 0xfb,
+ 0x31, 0x67, 0x31, 0xb7, 0xcf, 0xdb, 0xde, 0xc2, 0x63, 0x56,
+ 0x93, 0x2b ),
+ EXPECT ( 0xd6, 0x8b, 0xf0, 0x41, 0xf3, 0xeb, 0x50, 0x88, 0x08, 0x8d,
+ 0x8b, 0x8e, 0x71, 0x2c, 0x36, 0xae, 0x95, 0x83, 0xbb, 0x08,
+ 0xfd, 0x1f, 0x90, 0x34, 0xa4, 0xe9, 0x42, 0xe9, 0xa6, 0x74,
+ 0x7c, 0xe7 ),
+ EXPECT ( 0x14, 0x78, 0xf2, 0x9e, 0x94, 0xb0, 0x2c, 0xb4, 0x0d, 0x3a,
+ 0xab, 0x86, 0x24, 0x55, 0x57, 0xce, 0x13, 0xa8, 0xca, 0x2f,
+ 0xdb, 0x65, 0x7d, 0x98, 0xef, 0xc1, 0x92, 0x34, 0x6b, 0x9f,
+ 0xac, 0x33, 0xea, 0x58, 0xad, 0xa2, 0xcc, 0xa4, 0x32, 0xcc,
+ 0xde, 0xfb, 0xcd, 0xaa, 0x8b, 0x82, 0xf5, 0x53, 0xef, 0x96,
+ 0x61, 0x34, 0xe2, 0xcd, 0x13, 0x9f, 0x15, 0xf0, 0x1c, 0xad,
+ 0x56, 0x85, 0x65, 0xa8 ) );
+
+/** SHA-256 Test 4.2 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_4_2, HMAC_DRBG_SHA256,
+ additional_input_2,
+ EXPECT ( 0x28, 0x2e, 0x07, 0x34, 0x80, 0x80, 0x93, 0x75, 0x58, 0xb1,
+ 0x39, 0x2e, 0x95, 0xab, 0x91, 0xe7, 0xc1, 0xf6, 0x22, 0xb2,
+ 0x4f, 0xfb, 0x87, 0x20, 0xa5, 0xf0, 0xa5, 0xe0, 0x75, 0x50,
+ 0xc7, 0xc2 ),
+ EXPECT ( 0xdf, 0xc3, 0xbd, 0xb5, 0xf3, 0xbc, 0xf1, 0xaa, 0x68, 0x29,
+ 0x8e, 0x79, 0x0d, 0x72, 0x0a, 0x67, 0xa7, 0x6e, 0x31, 0xb9,
+ 0x2b, 0x9b, 0x35, 0xa8, 0xe5, 0x47, 0x1b, 0xb1, 0x7e, 0x30,
+ 0x3c, 0x6b ),
+ EXPECT ( 0x49, 0x7c, 0x7a, 0x16, 0xe8, 0x8a, 0x64, 0x11, 0xf8, 0xfc,
+ 0xe1, 0x0e, 0xf5, 0x67, 0x63, 0xc6, 0x10, 0x25, 0x80, 0x1d,
+ 0x8f, 0x51, 0xa7, 0x43, 0x52, 0xd6, 0x82, 0xcc, 0x23, 0xa0,
+ 0xa8, 0xe6, 0x73, 0xca, 0xe0, 0x32, 0x28, 0x93, 0x90, 0x64,
+ 0x7d, 0xc6, 0x83, 0xb7, 0x34, 0x28, 0x85, 0xd6, 0xb7, 0x6a,
+ 0xb1, 0xda, 0x69, 0x6d, 0x3e, 0x97, 0xe2, 0x2d, 0xff, 0xdd,
+ 0xff, 0xfd, 0x8d, 0xf0 ) );
+
+/** SHA-256 Test 5 : Instantiation */
+#define sha256_instantiate_5 sha256_instantiate_1
+
+/** SHA-256 Test 5.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_5_1, HMAC_DRBG_SHA256,
+ additional_input_empty, ( 512 / 8 ) );
+
+/** SHA-256 Test 5.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_5_2, HMAC_DRBG_SHA256,
+ entropy_input_1, additional_input_empty,
+ EXPECT ( 0xb8, 0x40, 0x07, 0xe3, 0xe2, 0x7f, 0x34, 0xf9, 0xa7, 0x82,
+ 0x0b, 0x7a, 0xb5, 0x9b, 0xbe, 0xfc, 0xd0, 0xc4, 0xac, 0xae,
+ 0xde, 0x4b, 0x0b, 0x36, 0xb1, 0x47, 0xb8, 0x97, 0x79, 0xfd,
+ 0x74, 0x9d ),
+ EXPECT ( 0xa7, 0x2b, 0x8f, 0xee, 0x92, 0x39, 0x2f, 0x0a, 0x9d, 0x2d,
+ 0x61, 0xbf, 0x09, 0xa4, 0xdf, 0xcc, 0x9d, 0xe6, 0x9a, 0x16,
+ 0xa5, 0xf1, 0x50, 0x22, 0x4c, 0x3e, 0xf6, 0x04, 0x2d, 0x15,
+ 0x21, 0xfc ) );
+
+/** SHA-256 Test 5.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_5_3, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0x43, 0x48, 0xaf, 0x84, 0x20, 0x84, 0x2f, 0xa0, 0x77, 0xb9,
+ 0xd3, 0xdb, 0xa8, 0xdc, 0xe9, 0xb3, 0xe1, 0xdf, 0x73, 0x4f,
+ 0xfc, 0xe1, 0xbe, 0xa5, 0xb9, 0xe2, 0xb1, 0x54, 0xdc, 0x5e,
+ 0xc6, 0x15 ),
+ EXPECT ( 0xd2, 0xc1, 0xac, 0x27, 0x88, 0x5d, 0x43, 0x32, 0x76, 0x71,
+ 0x31, 0x46, 0x32, 0xea, 0x60, 0x43, 0x3c, 0xca, 0x72, 0x73,
+ 0x04, 0x56, 0x9e, 0xa7, 0xd4, 0x71, 0xfe, 0xa7, 0xdb, 0x7d,
+ 0x31, 0x5d ),
+ EXPECT ( 0xfa, 0xbd, 0x0a, 0xe2, 0x5c, 0x69, 0xdc, 0x2e, 0xfd, 0xef,
+ 0xb7, 0xf2, 0x0c, 0x5a, 0x31, 0xb5, 0x7a, 0xc9, 0x38, 0xab,
+ 0x77, 0x1a, 0xa1, 0x9b, 0xf8, 0xf5, 0xf1, 0x46, 0x8f, 0x66,
+ 0x5c, 0x93, 0x8c, 0x9a, 0x1a, 0x5d, 0xf0, 0x62, 0x8a, 0x56,
+ 0x90, 0xf1, 0x5a, 0x1a, 0xd8, 0xa6, 0x13, 0xf3, 0x1b, 0xbd,
+ 0x65, 0xee, 0xad, 0x54, 0x57, 0xd5, 0xd2, 0x69, 0x47, 0xf2,
+ 0x9f, 0xe9, 0x1a, 0xa7 ) );
+
+/** SHA-256 Test 5.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_5_4, HMAC_DRBG_SHA256,
+ additional_input_empty, ( 512 / 8 ) );
+
+/** SHA-256 Test 5.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_5_5, HMAC_DRBG_SHA256,
+ entropy_input_2, additional_input_empty,
+ EXPECT ( 0xbf, 0xa0, 0x2c, 0xe7, 0xe9, 0x2d, 0xe9, 0x2b, 0x18, 0x24,
+ 0x28, 0x86, 0x89, 0x0e, 0x58, 0x6f, 0x83, 0x69, 0x06, 0xac,
+ 0xe9, 0xe5, 0x54, 0xf1, 0xb0, 0xed, 0x63, 0x57, 0x3c, 0xb8,
+ 0xb5, 0x03 ),
+ EXPECT ( 0xd3, 0x24, 0x03, 0xee, 0xa9, 0xdc, 0xe1, 0x61, 0x6e, 0x4e,
+ 0x11, 0x55, 0xb9, 0x23, 0xd8, 0x84, 0x2c, 0xc6, 0xe7, 0x84,
+ 0xc6, 0x7a, 0x93, 0x85, 0xb2, 0xa6, 0x37, 0xf1, 0x02, 0xfa,
+ 0x45, 0xd5 ) );
+
+/** SHA-256 Test 5.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_5_6, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0x81, 0x21, 0xf7, 0x76, 0x4c, 0x08, 0x1e, 0xe9, 0xd1, 0x17,
+ 0x1e, 0xd1, 0x87, 0xba, 0xe0, 0x88, 0x95, 0xca, 0xe2, 0x30,
+ 0xd0, 0xa2, 0x5e, 0x37, 0x39, 0xc5, 0x7d, 0x54, 0x16, 0x10,
+ 0x9b, 0x82 ),
+ EXPECT ( 0x37, 0x84, 0x97, 0x7c, 0xc0, 0xe5, 0x9f, 0xbc, 0x9c, 0xda,
+ 0x4e, 0x11, 0x92, 0x47, 0x5c, 0x6e, 0xfa, 0xf8, 0x07, 0x20,
+ 0x19, 0x86, 0x21, 0x22, 0xcb, 0x6b, 0xce, 0xaa, 0xcc, 0x4a,
+ 0x17, 0x5e ),
+ EXPECT ( 0x6b, 0xd9, 0x25, 0xb0, 0xe1, 0xc2, 0x32, 0xef, 0xd6, 0x7c,
+ 0xcd, 0x84, 0xf7, 0x22, 0xe9, 0x27, 0xec, 0xb4, 0x6a, 0xb2,
+ 0xb7, 0x40, 0x01, 0x47, 0x77, 0xaf, 0x14, 0xba, 0x0b, 0xbf,
+ 0x53, 0xa4, 0x5b, 0xdb, 0xb6, 0x2b, 0x3f, 0x7d, 0x0b, 0x9c,
+ 0x8e, 0xea, 0xd0, 0x57, 0xc0, 0xec, 0x75, 0x4e, 0xf8, 0xb5,
+ 0x3e, 0x60, 0xa1, 0xf4, 0x34, 0xf0, 0x59, 0x46, 0xa8, 0xb6,
+ 0x86, 0xaf, 0xbc, 0x7a ) );
+
+/** SHA-256 Test 6 : Instantiate */
+#define sha256_instantiate_6 sha256_instantiate_1
+
+/** SHA-256 Test 6.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_6_1, HMAC_DRBG_SHA256,
+ additional_input_1, ( 512 / 8 ) );
+
+/** SHA-256 Test 6.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_6_2, HMAC_DRBG_SHA256,
+ entropy_input_1, additional_input_1,
+ EXPECT ( 0xc1, 0x25, 0xea, 0x99, 0x75, 0x8e, 0xbb, 0x9a, 0x6f, 0x69,
+ 0xae, 0x31, 0x2a, 0xc2, 0x04, 0xb5, 0x94, 0xc0, 0x0a, 0xb6,
+ 0x8b, 0x81, 0x6e, 0x3a, 0x52, 0x12, 0x8e, 0x02, 0x78, 0xa5,
+ 0x84, 0xac ),
+ EXPECT ( 0xb2, 0xcb, 0x2b, 0x89, 0x12, 0x3f, 0x5b, 0x4a, 0xf5, 0x87,
+ 0xb8, 0xf6, 0xbd, 0xc5, 0x42, 0x7a, 0x99, 0x14, 0x19, 0xd3,
+ 0x53, 0x07, 0x7c, 0x68, 0x5e, 0x70, 0x7a, 0xcd, 0xf8, 0xe9,
+ 0xfd, 0xa9 ) );
+
+/** SHA-256 Test 6.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_6_3, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0xc6, 0xed, 0x8f, 0xed, 0x71, 0x57, 0xa4, 0xd0, 0x9e, 0xa1,
+ 0xdd, 0xe8, 0x94, 0x6b, 0x54, 0x43, 0x3e, 0xcc, 0x54, 0x49,
+ 0xa4, 0xa3, 0x52, 0xaf, 0x45, 0x76, 0x4e, 0xe6, 0x73, 0x4b,
+ 0xbb, 0x04 ),
+ EXPECT ( 0xeb, 0xc7, 0x75, 0x25, 0x6b, 0xb7, 0x81, 0x24, 0x1e, 0x9c,
+ 0x70, 0xbb, 0xcf, 0x73, 0x2b, 0xdc, 0x90, 0xad, 0x10, 0xd9,
+ 0xdd, 0x3a, 0x89, 0x6e, 0xcc, 0x12, 0xb9, 0x2f, 0xfb, 0x63,
+ 0x45, 0xab ),
+ EXPECT ( 0x08, 0x5d, 0x57, 0xaf, 0x6b, 0xab, 0xcf, 0x2b, 0x9a, 0xee,
+ 0xf3, 0x87, 0xd5, 0x31, 0x65, 0x0e, 0x6a, 0x50, 0x5c, 0x54,
+ 0x40, 0x6a, 0xb3, 0x7a, 0x52, 0x89, 0x9e, 0x0e, 0xca, 0xb3,
+ 0x63, 0x2b, 0x7a, 0x06, 0x8a, 0x28, 0x14, 0xc6, 0xdf, 0x6a,
+ 0xe5, 0x32, 0xb6, 0x58, 0xd0, 0xd9, 0x74, 0x1c, 0x84, 0x77,
+ 0x5f, 0xee, 0x45, 0xb6, 0x84, 0xcd, 0xbd, 0xc2, 0x5f, 0xbc,
+ 0xb4, 0xd8, 0xf3, 0x10 ) );
+
+/** SHA-256 Test 6.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_6_4, HMAC_DRBG_SHA256,
+ additional_input_2, ( 512 / 8 ) );
+
+/** SHA-256 Test 6.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_6_5, HMAC_DRBG_SHA256,
+ entropy_input_2, additional_input_2,
+ EXPECT ( 0xfc, 0x51, 0xda, 0x84, 0xf9, 0x69, 0x6b, 0xcc, 0x84, 0xc8,
+ 0xf2, 0xac, 0xb9, 0x24, 0xbc, 0xdf, 0x72, 0xf8, 0x2e, 0xa2,
+ 0xca, 0x64, 0x3f, 0x08, 0x3b, 0x0c, 0x16, 0xc3, 0x63, 0x4e,
+ 0xfc, 0x62 ),
+ EXPECT ( 0xb9, 0x74, 0xe4, 0x37, 0x0a, 0xd5, 0x76, 0xbb, 0x99, 0xc4,
+ 0xe4, 0x9e, 0xa6, 0x80, 0xbf, 0xf9, 0x8d, 0xe9, 0xe1, 0x2f,
+ 0xec, 0xd0, 0x13, 0xde, 0xd4, 0x3c, 0x80, 0xf6, 0x9a, 0x7a,
+ 0xde, 0x8a ) );
+
+/** SHA-256 Test 6.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_6_6, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0x56, 0xa2, 0xb4, 0x46, 0x32, 0xcb, 0x8f, 0xc3, 0xa6, 0x40,
+ 0x09, 0xbf, 0xd6, 0xec, 0x95, 0xe5, 0x6c, 0xef, 0x8e, 0x7c,
+ 0x91, 0x2a, 0xa8, 0x2b, 0x16, 0xf6, 0x14, 0x91, 0x5d, 0x9c,
+ 0xd6, 0xe3 ),
+ EXPECT ( 0xb5, 0xb3, 0x96, 0xa0, 0x15, 0x76, 0xb0, 0xfe, 0x42, 0xf4,
+ 0x08, 0x44, 0x55, 0x6c, 0x4c, 0xf4, 0xb6, 0x80, 0x4c, 0x94,
+ 0xde, 0x9d, 0x62, 0x38, 0xf1, 0xf7, 0xe7, 0xaf, 0x5c, 0x72,
+ 0x57, 0xf3 ),
+ EXPECT ( 0x9b, 0x21, 0x9f, 0xd9, 0x0d, 0xe2, 0xa0, 0x8e, 0x49, 0x34,
+ 0x05, 0xcf, 0x87, 0x44, 0x17, 0xb5, 0x82, 0x67, 0x70, 0xf3,
+ 0x94, 0x48, 0x15, 0x55, 0xdc, 0x66, 0x8a, 0xcd, 0x96, 0xb9,
+ 0xa3, 0xe5, 0x6f, 0x9d, 0x2c, 0x32, 0x5e, 0x26, 0xd4, 0x7c,
+ 0x1d, 0xfc, 0xfc, 0x8f, 0xbf, 0x86, 0x12, 0x6f, 0x40, 0xa1,
+ 0xe6, 0x39, 0x60, 0xf6, 0x27, 0x49, 0x34, 0x2e, 0xcd, 0xb7,
+ 0x1b, 0x24, 0x0d, 0xc6 ) );
+
+/** SHA-256 Test 7 : Instantiation */
+#define sha256_instantiate_7 sha256_instantiate_3
+
+/** SHA-256 Test 7.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_7_1, HMAC_DRBG_SHA256,
+ additional_input_empty, ( 512 / 8 ) );
+
+/** SHA-256 Test 7.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_7_2, HMAC_DRBG_SHA256,
+ entropy_input_1, additional_input_empty,
+ EXPECT ( 0x44, 0x76, 0xc6, 0xd1, 0x1f, 0xc3, 0x5d, 0x44, 0x09, 0xd9,
+ 0x03, 0x2e, 0x45, 0x3b, 0x0f, 0x0d, 0xc3, 0x31, 0x4d, 0xb8,
+ 0x62, 0xcb, 0xdb, 0x60, 0x9c, 0x56, 0x02, 0x20, 0x8d, 0x4c,
+ 0x88, 0xd8 ),
+ EXPECT ( 0x95, 0xef, 0x78, 0x5a, 0x61, 0xc2, 0xf7, 0xb3, 0x6b, 0xc5,
+ 0x96, 0xba, 0x4b, 0xa2, 0x08, 0xa5, 0x2c, 0x6d, 0xc2, 0x03,
+ 0x63, 0x6d, 0x8f, 0x17, 0x87, 0x45, 0x3b, 0x85, 0x2b, 0x7e,
+ 0x49, 0xec ) );
+
+/** SHA-256 Test 7.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_7_3, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0x0d, 0xf9, 0x11, 0x0e, 0x2f, 0x22, 0x58, 0x98, 0x24, 0xa9,
+ 0x47, 0x6c, 0x8e, 0x32, 0x08, 0x8e, 0x51, 0xa0, 0xda, 0x36,
+ 0x63, 0x3f, 0x8c, 0xd1, 0xf7, 0x54, 0x7d, 0xff, 0x69, 0x6e,
+ 0x4b, 0x29 ),
+ EXPECT ( 0xc0, 0xe3, 0xc8, 0xed, 0x5a, 0x8b, 0x57, 0x9e, 0x3f, 0xef,
+ 0x9d, 0xf3, 0xb7, 0xc2, 0xc2, 0x12, 0x98, 0x07, 0x17, 0xcc,
+ 0x91, 0xae, 0x18, 0x66, 0x45, 0xfa, 0xbb, 0x2c, 0xc7, 0x84,
+ 0xd5, 0xd7 ),
+ EXPECT ( 0xd8, 0xb6, 0x71, 0x30, 0x71, 0x41, 0x94, 0xff, 0xe5, 0xb2,
+ 0xa3, 0x5d, 0xbc, 0xd5, 0xe1, 0xa2, 0x99, 0x42, 0xad, 0x5c,
+ 0x68, 0xf3, 0xde, 0xb9, 0x4a, 0xdd, 0x9e, 0x9e, 0xba, 0xd8,
+ 0x60, 0x67, 0xed, 0xf0, 0x49, 0x15, 0xfb, 0x40, 0xc3, 0x91,
+ 0xea, 0xe7, 0x0c, 0x65, 0x9e, 0xaa, 0xe7, 0xef, 0x11, 0xa3,
+ 0xd4, 0x6a, 0x5b, 0x08, 0x5e, 0xdd, 0x90, 0xcc, 0x72, 0xce,
+ 0xa9, 0x89, 0x21, 0x0b ) );
+
+/** SHA-256 Test 7.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_7_4, HMAC_DRBG_SHA256,
+ additional_input_empty, ( 512 / 8 ) );
+
+/** SHA-256 Test 7.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_7_5, HMAC_DRBG_SHA256,
+ entropy_input_2, additional_input_empty,
+ EXPECT ( 0x3d, 0x77, 0x63, 0xe5, 0x30, 0x3d, 0xb5, 0x4b, 0xe2, 0x05,
+ 0x44, 0xa8, 0x1e, 0x9f, 0x00, 0xca, 0xdc, 0xfc, 0x1c, 0xb2,
+ 0x8d, 0xec, 0xb9, 0xcf, 0xc6, 0x99, 0xf6, 0x1d, 0xba, 0xf8,
+ 0x80, 0x21 ),
+ EXPECT ( 0xfe, 0xbc, 0x02, 0x79, 0xb7, 0x71, 0x0d, 0xec, 0x5c, 0x06,
+ 0x7e, 0xbe, 0xfa, 0x06, 0x8e, 0x4b, 0x59, 0x67, 0x49, 0x1b,
+ 0x7e, 0xef, 0x94, 0x75, 0x83, 0x50, 0x6d, 0x04, 0x97, 0xce,
+ 0x67, 0xba ) );
+
+/** SHA-256 Test 7.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_7_6, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0x2d, 0x21, 0xac, 0x94, 0x99, 0x2f, 0xd8, 0x2b, 0x09, 0x80,
+ 0xd3, 0xd5, 0x95, 0x51, 0xb9, 0xd0, 0x7c, 0x8d, 0x54, 0xb2,
+ 0x52, 0xb6, 0x16, 0x28, 0x93, 0x44, 0xf8, 0xac, 0x86, 0x9e,
+ 0xd3, 0x5b ),
+ EXPECT ( 0x61, 0x0c, 0x34, 0xcd, 0xbf, 0x6f, 0x75, 0x33, 0x54, 0x7f,
+ 0x23, 0x32, 0xea, 0xc5, 0x7e, 0xe3, 0x1e, 0x72, 0x4f, 0xb2,
+ 0x92, 0x55, 0x56, 0x6b, 0x59, 0x78, 0x33, 0x16, 0x6c, 0xd0,
+ 0x39, 0x9f ),
+ EXPECT ( 0x8b, 0xba, 0x71, 0xc2, 0x58, 0x3f, 0x25, 0x30, 0xc2, 0x59,
+ 0xc9, 0x07, 0x84, 0xa5, 0x9a, 0xc4, 0x4d, 0x1c, 0x80, 0x56,
+ 0x91, 0x7c, 0xcf, 0x38, 0x87, 0x88, 0x10, 0x2d, 0x73, 0x82,
+ 0x4c, 0x6c, 0x11, 0xd5, 0xd6, 0x3b, 0xe1, 0xf0, 0x10, 0x17,
+ 0xd8, 0x84, 0xcd, 0x69, 0xd9, 0x33, 0x4b, 0x9e, 0xbc, 0x01,
+ 0xe7, 0xbd, 0x8f, 0xdf, 0x2a, 0x8e, 0x52, 0x57, 0x22, 0x93,
+ 0xdc, 0x21, 0xc0, 0xe1 ) );
+
+/** SHA-256 Test 8 : Instantiate */
+#define sha256_instantiate_8 sha256_instantiate_3
+
+/** SHA-256 Test 8.1 : First call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_8_1, HMAC_DRBG_SHA256,
+ additional_input_1, ( 512 / 8 ) );
+
+/** SHA-256 Test 8.2 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_8_2, HMAC_DRBG_SHA256,
+ entropy_input_1, additional_input_1,
+ EXPECT ( 0xb3, 0x81, 0x38, 0x8c, 0x1d, 0x7c, 0xfd, 0x56, 0x59, 0x30,
+ 0x99, 0x3b, 0xd9, 0x26, 0x90, 0x66, 0x50, 0x88, 0xd9, 0xb8,
+ 0x39, 0x96, 0x9b, 0x87, 0xf1, 0x6d, 0xb6, 0xdf, 0x4e, 0x43,
+ 0x00, 0xd7 ),
+ EXPECT ( 0xfa, 0x04, 0x25, 0x64, 0x00, 0xe3, 0x42, 0xe6, 0x55, 0xf4,
+ 0x33, 0x26, 0x94, 0xe3, 0xb2, 0x4c, 0x04, 0xfb, 0x85, 0xbf,
+ 0x87, 0x80, 0x21, 0xe4, 0x52, 0xe7, 0x3b, 0x8f, 0x46, 0xd4,
+ 0xbd, 0xc6 ) );
+
+/** SHA-256 Test 8.3 : Retried first call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_8_3, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0xd4, 0x1f, 0x6f, 0x33, 0x65, 0x82, 0x21, 0x70, 0x50, 0xb1,
+ 0xf6, 0x59, 0x28, 0xfd, 0x6e, 0x94, 0xcb, 0xc9, 0x45, 0x68,
+ 0xfe, 0x3b, 0x6b, 0x53, 0x38, 0x9e, 0x1e, 0x3a, 0x5b, 0x49,
+ 0xe1, 0x01 ),
+ EXPECT ( 0xa6, 0x55, 0xc9, 0xe7, 0xd1, 0x33, 0xf1, 0xcd, 0x8b, 0x11,
+ 0x61, 0xf2, 0x7d, 0x54, 0xe7, 0x5a, 0x7e, 0x7c, 0x80, 0x42,
+ 0xbf, 0x74, 0xd4, 0x7f, 0x9f, 0xfd, 0x60, 0xe2, 0x45, 0xeb,
+ 0xa5, 0x7e ),
+ EXPECT ( 0x44, 0xd7, 0x8b, 0xbc, 0x3e, 0xb6, 0x7c, 0x59, 0xc2, 0x2f,
+ 0x6c, 0x31, 0x00, 0x3d, 0x21, 0x2a, 0x78, 0x37, 0xcc, 0xd8,
+ 0x4c, 0x43, 0x8b, 0x55, 0x15, 0x0f, 0xd0, 0x13, 0xa8, 0xa7,
+ 0x8f, 0xe8, 0xed, 0xea, 0x81, 0xc6, 0x72, 0xe4, 0xb8, 0xdd,
+ 0xc8, 0x18, 0x38, 0x86, 0xe6, 0x9c, 0x2e, 0x17, 0x7d, 0xf5,
+ 0x74, 0xc1, 0xf1, 0x90, 0xdf, 0x27, 0x18, 0x50, 0xf8, 0xce,
+ 0x55, 0xef, 0x20, 0xb8 ) );
+
+/** SHA-256 Test 8.4 : Second call to Generate */
+HMAC_DRBG_TEST_GENERATE_FAIL ( sha256_generate_fail_8_4, HMAC_DRBG_SHA256,
+ additional_input_2, ( 512 / 8 ) );
+
+/** SHA-256 Test 8.5 : Reseed */
+HMAC_DRBG_TEST_RESEED ( sha256_reseed_8_5, HMAC_DRBG_SHA256,
+ entropy_input_2, additional_input_2,
+ EXPECT ( 0xfb, 0xa8, 0x05, 0x45, 0x3e, 0x3c, 0x9a, 0x73, 0x64, 0x58,
+ 0x5c, 0xed, 0xbc, 0xd2, 0x92, 0x30, 0xfb, 0xc9, 0x3d, 0x6f,
+ 0x12, 0x9d, 0x21, 0xed, 0xdd, 0xf6, 0x61, 0x3b, 0x3a, 0x8f,
+ 0xf2, 0x83 ),
+ EXPECT ( 0x83, 0x64, 0x7a, 0x33, 0x8c, 0x15, 0x3c, 0xba, 0xf0, 0xe4,
+ 0x9a, 0x54, 0xa4, 0x4f, 0xea, 0x66, 0x70, 0xcf, 0xd7, 0xc1,
+ 0x71, 0x4d, 0x4a, 0xb3, 0x5f, 0x11, 0x12, 0x3d, 0xf2, 0x7b,
+ 0x69, 0xcf ) );
+
+/** SHA-256 Test 8.6 : Retried second call to Generate */
+HMAC_DRBG_TEST_GENERATE ( sha256_generate_8_6, HMAC_DRBG_SHA256,
+ additional_input_empty,
+ EXPECT ( 0xae, 0x59, 0xc7, 0x0a, 0x7c, 0x60, 0xed, 0x49, 0x83, 0x78,
+ 0xea, 0x84, 0x5b, 0xe9, 0x7d, 0x8f, 0xf8, 0x81, 0xe0, 0xea,
+ 0x37, 0x2e, 0x26, 0x5f, 0xa6, 0x72, 0x84, 0x29, 0x3e, 0x1a,
+ 0x46, 0xac ),
+ EXPECT ( 0xe2, 0xf0, 0x4d, 0xe3, 0xce, 0x21, 0x79, 0x61, 0xae, 0x2b,
+ 0x2d, 0x20, 0xa7, 0xba, 0x7c, 0x6c, 0x82, 0x0b, 0x5b, 0x14,
+ 0x92, 0x6e, 0x59, 0x56, 0xae, 0x6d, 0xfa, 0x2e, 0xd1, 0xd6,
+ 0x39, 0x93 ),
+ EXPECT ( 0x91, 0x77, 0x80, 0xdc, 0x0c, 0xe9, 0x98, 0x9f, 0xee, 0x6c,
+ 0x08, 0x06, 0xd6, 0xda, 0x12, 0x3a, 0x18, 0x25, 0x29, 0x47,
+ 0x58, 0xd4, 0xe1, 0xb5, 0x82, 0x68, 0x72, 0x31, 0x78, 0x0a,
+ 0x2a, 0x9c, 0x33, 0xf1, 0xd1, 0x56, 0xcc, 0xad, 0x32, 0x77,
+ 0x64, 0xb2, 0x9a, 0x4c, 0xb2, 0x69, 0x01, 0x77, 0xae, 0x96,
+ 0xef, 0x9e, 0xe9, 0x2a, 0xd0, 0xc3, 0x40, 0xba, 0x0f, 0xd1,
+ 0x20, 0x3c, 0x02, 0xc6 ) );
+
+/**
+ * Force a "reseed required" state
+ *
+ * @v state HMAC_DRBG internal state
+ */
+static inline void force_reseed_required ( struct hmac_drbg_state *state ) {
+ state->reseed_counter = ( HMAC_DRBG_RESEED_INTERVAL + 1 );
+}
+
+/**
+ * Perform HMAC_DRBG self-test
+ *
+ */
+static void hmac_drbg_test_exec ( void ) {
+ struct hmac_drbg_state state;
+
+ /*
+ * IMPORTANT NOTE
+ *
+ * The NIST test vector set includes several calls to
+ * HMAC_DRBG_Generate() that are expected to fail with a
+ * status of "Reseed required". The pattern seems to be that
+ * when prediction resistance is requested, any call to
+ * HMAC_DRBG_Generate() is at first expected to fail. After
+ * an explicit reseeding, the call to HMAC_DRBG_Generate() is
+ * retried, and on this second time it is expected to succeed.
+ *
+ * This pattern does not match the specifications for
+ * HMAC_DRBG_Generate(): neither HMAC_DRBG_Generate_algorithm
+ * (defined in ANS X9.82 Part 3-2007 Section 10.2.2.2.5 (NIST
+ * SP 800-90 Section 10.1.2.5)) nor the higher-level wrapper
+ * Generate_function defined in ANS X9.82 Part 3-2007 Section
+ * 9.4 (NIST SP 800-90 Section 9.3)) can possibly exhibit this
+ * behaviour:
+ *
+ * a) HMAC_DRBG_Generate_algorithm can return a "reseed
+ * required" status only as a result of the test
+ *
+ * "1. If reseed_counter > reseed_interval, then return
+ * an indication that a reseed is required."
+ *
+ * Since the reseed interval is independent of any request
+ * for prediction resistance, and since the reseed interval
+ * is not specified as part of the NIST test vector set,
+ * then this cannot be the source of the "Reseed required"
+ * failure expected by the NIST test vector set.
+ *
+ * b) Generate_function cannot return a "reseed required"
+ * status under any circumstances. If the underlying
+ * HMAC_DRBG_Generate_algorithm call returns "reseed
+ * required", then Generate_function will automatically
+ * reseed and try again.
+ *
+ * To produce the behaviour expected by the NIST test vector
+ * set, we therefore contrive to produce a "reseed required"
+ * state where necessary by setting the reseed_counter to
+ * greater than the reseed_interval.
+ */
+
+ /* SHA-1 Test 1 */
+ instantiate_ok ( &state, &sha1_instantiate_1 );
+ generate_ok ( &state, &sha1_generate_1_1 );
+ generate_ok ( &state, &sha1_generate_1_2 );
+
+ /* SHA-1 Test 2 */
+ instantiate_ok ( &state, &sha1_instantiate_2 );
+ generate_ok ( &state, &sha1_generate_2_1 );
+ generate_ok ( &state, &sha1_generate_2_2 );
+
+ /* SHA-1 Test 3 */
+ instantiate_ok ( &state, &sha1_instantiate_3 );
+ generate_ok ( &state, &sha1_generate_3_1 );
+ generate_ok ( &state, &sha1_generate_3_2 );
+
+ /* SHA-1 Test 4 */
+ instantiate_ok ( &state, &sha1_instantiate_4 );
+ generate_ok ( &state, &sha1_generate_4_1 );
+ generate_ok ( &state, &sha1_generate_4_2 );
+
+ /* SHA-1 Test 5 */
+ instantiate_ok ( &state, &sha1_instantiate_5 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_5_1 );
+ reseed_ok ( &state, &sha1_reseed_5_2 );
+ generate_ok ( &state, &sha1_generate_5_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_5_4 );
+ reseed_ok ( &state, &sha1_reseed_5_5 );
+ generate_ok ( &state, &sha1_generate_5_6 );
+
+ /* SHA-1 Test 6 */
+ instantiate_ok ( &state, &sha1_instantiate_6 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_6_1 );
+ reseed_ok ( &state, &sha1_reseed_6_2 );
+ generate_ok ( &state, &sha1_generate_6_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_6_4 );
+ reseed_ok ( &state, &sha1_reseed_6_5 );
+ generate_ok ( &state, &sha1_generate_6_6 );
+
+ /* SHA-1 Test 7 */
+ instantiate_ok ( &state, &sha1_instantiate_7 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_7_1 );
+ reseed_ok ( &state, &sha1_reseed_7_2 );
+ generate_ok ( &state, &sha1_generate_7_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_7_4 );
+ reseed_ok ( &state, &sha1_reseed_7_5 );
+ generate_ok ( &state, &sha1_generate_7_6 );
+
+ /* SHA-1 Test 8 */
+ instantiate_ok ( &state, &sha1_instantiate_8 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_8_1 );
+ reseed_ok ( &state, &sha1_reseed_8_2 );
+ generate_ok ( &state, &sha1_generate_8_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha1_generate_fail_8_4 );
+ reseed_ok ( &state, &sha1_reseed_8_5 );
+ generate_ok ( &state, &sha1_generate_8_6 );
+
+ /* SHA-256 Test 1 */
+ instantiate_ok ( &state, &sha256_instantiate_1 );
+ generate_ok ( &state, &sha256_generate_1_1 );
+ generate_ok ( &state, &sha256_generate_1_2 );
+
+ /* SHA-256 Test 2 */
+ instantiate_ok ( &state, &sha256_instantiate_2 );
+ generate_ok ( &state, &sha256_generate_2_1 );
+ generate_ok ( &state, &sha256_generate_2_2 );
+
+ /* SHA-256 Test 3 */
+ instantiate_ok ( &state, &sha256_instantiate_3 );
+ generate_ok ( &state, &sha256_generate_3_1 );
+ generate_ok ( &state, &sha256_generate_3_2 );
+
+ /* SHA-256 Test 4 */
+ instantiate_ok ( &state, &sha256_instantiate_4 );
+ generate_ok ( &state, &sha256_generate_4_1 );
+ generate_ok ( &state, &sha256_generate_4_2 );
+
+ /* SHA-256 Test 5 */
+ instantiate_ok ( &state, &sha256_instantiate_5 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_5_1 );
+ reseed_ok ( &state, &sha256_reseed_5_2 );
+ generate_ok ( &state, &sha256_generate_5_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_5_4 );
+ reseed_ok ( &state, &sha256_reseed_5_5 );
+ generate_ok ( &state, &sha256_generate_5_6 );
+
+ /* SHA-256 Test 6 */
+ instantiate_ok ( &state, &sha256_instantiate_6 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_6_1 );
+ reseed_ok ( &state, &sha256_reseed_6_2 );
+ generate_ok ( &state, &sha256_generate_6_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_6_4 );
+ reseed_ok ( &state, &sha256_reseed_6_5 );
+ generate_ok ( &state, &sha256_generate_6_6 );
+
+ /* SHA-256 Test 7 */
+ instantiate_ok ( &state, &sha256_instantiate_7 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_7_1 );
+ reseed_ok ( &state, &sha256_reseed_7_2 );
+ generate_ok ( &state, &sha256_generate_7_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_7_4 );
+ reseed_ok ( &state, &sha256_reseed_7_5 );
+ generate_ok ( &state, &sha256_generate_7_6 );
+
+ /* SHA-256 Test 8 */
+ instantiate_ok ( &state, &sha256_instantiate_8 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_8_1 );
+ reseed_ok ( &state, &sha256_reseed_8_2 );
+ generate_ok ( &state, &sha256_generate_8_3 );
+ force_reseed_required ( &state ); /* See above comments */
+ generate_fail_ok ( &state, &sha256_generate_fail_8_4 );
+ reseed_ok ( &state, &sha256_reseed_8_5 );
+ generate_ok ( &state, &sha256_generate_8_6 );
+}
+
+/** HMAC_DRBG self-test */
+struct self_test hmac_drbg_test __self_test = {
+ .name = "hmac_drbg",
+ .exec = hmac_drbg_test_exec,
+};
diff --git a/roms/ipxe/src/tests/ipv6_test.c b/roms/ipxe/src/tests/ipv6_test.c
new file mode 100644
index 00000000..e16fc7c3
--- /dev/null
+++ b/roms/ipxe/src/tests/ipv6_test.c
@@ -0,0 +1,219 @@
+/*
+ * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * IPv6 tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <string.h>
+#include <byteswap.h>
+#include <ipxe/ipv6.h>
+#include <ipxe/test.h>
+
+/** Define inline IPv6 address */
+#define IPV6(...) { __VA_ARGS__ }
+
+/** The unspecified IPv6 address */
+static const struct in6_addr sample_unspecified = {
+ .s6_addr = IPV6 ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),
+};
+
+/** A sample link-local IPv6 address */
+static const struct in6_addr sample_link_local = {
+ .s6_addr = IPV6 ( 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x69, 0xff, 0xfe, 0x50, 0x58, 0x45 ),
+};
+
+/** A sample global IPv6 address */
+static const struct in6_addr sample_global = {
+ .s6_addr = IPV6 ( 0x20, 0x01, 0x0b, 0xa8, 0x00, 0x00, 0x01, 0xd4,
+ 0x00, 0x00, 0x00, 0x00, 0x69, 0x50, 0x58, 0x45 ),
+};
+
+/** A sample multicast IPv6 address */
+static const struct in6_addr sample_multicast = {
+ .s6_addr = IPV6 ( 0xff, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 ),
+};
+
+/**
+ * Report an inet6_ntoa() test result
+ *
+ * @v addr IPv6 address
+ * @v text Expected textual representation
+ */
+#define inet6_ntoa_ok( addr, text ) do { \
+ static const struct in6_addr in = { \
+ .s6_addr = addr, \
+ }; \
+ static const char expected[] = text; \
+ char *actual; \
+ \
+ actual = inet6_ntoa ( &in ); \
+ DBG ( "inet6_ntoa ( %04x:%04x:%04x:%04x:%04x:%04x:%04x:%04x ) " \
+ "= %s\n", ntohs ( in.s6_addr16[0] ), \
+ ntohs ( in.s6_addr16[1] ), ntohs ( in.s6_addr16[2] ), \
+ ntohs ( in.s6_addr16[3] ), ntohs ( in.s6_addr16[4] ), \
+ ntohs ( in.s6_addr16[5] ), ntohs ( in.s6_addr16[6] ), \
+ ntohs ( in.s6_addr16[7] ), actual ); \
+ ok ( strcmp ( actual, expected ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report an inet6_aton() test result
+ *
+ * @v text Textual representation
+ * @v addr Expected IPv6 address
+ */
+#define inet6_aton_ok( text, addr ) do { \
+ static const char string[] = text; \
+ static const struct in6_addr expected = { \
+ .s6_addr = addr, \
+ }; \
+ struct in6_addr actual; \
+ \
+ ok ( inet6_aton ( string, &actual ) == 0 ); \
+ DBG ( "inet6_aton ( \"%s\" ) = %s\n", string, \
+ inet6_ntoa ( &actual ) ); \
+ ok ( memcmp ( &actual, &expected, sizeof ( actual ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report an inet6_aton() failure test result
+ *
+ * @v text Textual representation
+ */
+#define inet6_aton_fail_ok( text ) do { \
+ static const char string[] = text; \
+ struct in6_addr dummy; \
+ \
+ ok ( inet6_aton ( string, &dummy ) != 0 ); \
+ } while ( 0 )
+
+/**
+ * Perform IPv6 self-tests
+ *
+ */
+static void ipv6_test_exec ( void ) {
+
+ /* Address testing macros */
+ ok ( IN6_IS_ADDR_UNSPECIFIED ( &sample_unspecified ) );
+ ok ( ! IN6_IS_ADDR_UNSPECIFIED ( &sample_link_local ) );
+ ok ( ! IN6_IS_ADDR_UNSPECIFIED ( &sample_global ) );
+ ok ( ! IN6_IS_ADDR_UNSPECIFIED ( &sample_multicast ) );
+ ok ( ! IN6_IS_ADDR_MULTICAST ( &sample_unspecified ) );
+ ok ( ! IN6_IS_ADDR_MULTICAST ( &sample_link_local ) );
+ ok ( ! IN6_IS_ADDR_MULTICAST ( &sample_global ) );
+ ok ( IN6_IS_ADDR_MULTICAST ( &sample_multicast ) );
+ ok ( ! IN6_IS_ADDR_LINKLOCAL ( &sample_unspecified ) );
+ ok ( IN6_IS_ADDR_LINKLOCAL ( &sample_link_local ) );
+ ok ( ! IN6_IS_ADDR_LINKLOCAL ( &sample_global ) );
+ ok ( ! IN6_IS_ADDR_LINKLOCAL ( &sample_multicast ) );
+
+ /* inet6_ntoa() tests */
+ inet6_ntoa_ok ( IPV6 ( 0x20, 0x01, 0x0b, 0xa8, 0x00, 0x00, 0x01, 0xd4,
+ 0x00, 0x00, 0x00, 0x00, 0x69, 0x50, 0x58, 0x45 ),
+ "2001:ba8:0:1d4::6950:5845" );
+ /* No zeros */
+ inet6_ntoa_ok ( IPV6 ( 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01 ),
+ "2001:db8:1:1:1:1:1:1" );
+ /* Run of zeros */
+ inet6_ntoa_ok ( IPV6 ( 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 ),
+ "2001:db8::1" );
+ /* No "::" for single zero */
+ inet6_ntoa_ok ( IPV6 ( 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01 ),
+ "2001:db8:0:1:1:1:1:1" );
+ /* Use "::" for longest run of zeros */
+ inet6_ntoa_ok ( IPV6 ( 0x20, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 ),
+ "2001:0:0:1::1" );
+ /* Use "::" for leftmost equal-length run of zeros */
+ inet6_ntoa_ok ( IPV6 ( 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 ),
+ "2001:db8::1:0:0:1" );
+ /* Trailing run of zeros */
+ inet6_ntoa_ok ( IPV6 ( 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),
+ "fe80::" );
+ /* Leading run of zeros */
+ inet6_ntoa_ok ( IPV6 ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 ),
+ "::1" );
+ /* All zeros */
+ inet6_ntoa_ok ( IPV6 ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 ),
+ "::" );
+ /* Maximum length */
+ inet6_ntoa_ok ( IPV6 ( 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff ),
+ "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff" );
+
+ /* inet6_aton() tests */
+ inet6_aton_ok ( "2001:ba8:0:1d4::6950:5845",
+ IPV6 ( 0x20, 0x01, 0x0b, 0xa8, 0x00, 0x00, 0x01, 0xd4,
+ 0x00, 0x00, 0x00, 0x00, 0x69, 0x50, 0x58, 0x45));
+ /* No zeros */
+ inet6_aton_ok ( "2001:db8:1:1:1:1:1:1",
+ IPV6 ( 0x20, 0x01, 0x0d, 0xb8, 0x00, 0x01, 0x00, 0x01,
+ 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01));
+ /* All intervening zeros */
+ inet6_aton_ok ( "fe80::1",
+ IPV6 ( 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01));
+ /* Trailing run of zeros */
+ inet6_aton_ok ( "fe80::",
+ IPV6 ( 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00));
+ /* Leading run of zeros */
+ inet6_aton_ok ( "::1",
+ IPV6 ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01));
+ /* All zeros */
+ inet6_aton_ok ( "::",
+ IPV6 ( 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00));
+
+ /* inet6_aton() failure tests */
+ inet6_aton_fail_ok ( "20012:ba8:0:1d4::6950:5845" );
+ inet6_aton_fail_ok ( "200z:ba8:0:1d4::6950:5845" );
+ inet6_aton_fail_ok ( "2001.ba8:0:1d4::6950:5845" );
+ inet6_aton_fail_ok ( "2001:db8:1:1:1:1:1" );
+ inet6_aton_fail_ok ( "2001:db8:1:1:1:1:1:1:2" );
+ inet6_aton_fail_ok ( "2001:db8::1::2" );
+ inet6_aton_fail_ok ( "2001:ba8:0:1d4:::6950:5845" );
+ inet6_aton_fail_ok ( ":::" );
+}
+
+/** IPv6 self-test */
+struct self_test ipv6_test __self_test = {
+ .name = "ipv6",
+ .exec = ipv6_test_exec,
+};
diff --git a/roms/ipxe/src/tests/linebuf_test.c b/roms/ipxe/src/tests/linebuf_test.c
new file mode 100644
index 00000000..e06ac7d8
--- /dev/null
+++ b/roms/ipxe/src/tests/linebuf_test.c
@@ -0,0 +1,35 @@
+#include <stdint.h>
+#include <string.h>
+#include <stdio.h>
+#include <ipxe/linebuf.h>
+
+static const char data1[] =
+"Hello world\r\n"
+"This is a reasonably nice set of lines\n"
+"with not many different terminators\r\n\r\n"
+"There should be exactly one blank line above\n"
+"and this line should never appear at all since it has no terminator";
+
+void linebuf_test ( void ) {
+ struct line_buffer linebuf;
+ const char *data = data1;
+ size_t len = ( sizeof ( data1 ) - 1 /* be mean; strip the NUL */ );
+ ssize_t frag_len;
+ char *line;
+
+ memset ( &linebuf, 0, sizeof ( linebuf ) );
+ while ( len ) {
+ frag_len = line_buffer ( &linebuf, data, len );
+ if ( frag_len < 0 ) {
+ printf ( "line_buffer() failed: %s\n",
+ strerror ( frag_len ) );
+ return;
+ }
+ data += frag_len;
+ len -= frag_len;
+ if ( ( line = buffered_line ( &linebuf ) ) )
+ printf ( "\"%s\"\n", line );
+ }
+
+ empty_line_buffer ( &linebuf );
+}
diff --git a/roms/ipxe/src/tests/list_test.c b/roms/ipxe/src/tests/list_test.c
new file mode 100644
index 00000000..35cbd5e5
--- /dev/null
+++ b/roms/ipxe/src/tests/list_test.c
@@ -0,0 +1,483 @@
+/*
+ * Copyright (C) 2011 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * List function tests
+ *
+ */
+
+/* Forcibly enable assertions for list_check() */
+#undef NDEBUG
+
+#include <assert.h>
+#include <string.h>
+#include <stdio.h>
+#include <ipxe/list.h>
+#include <ipxe/test.h>
+
+/** A list test structure */
+struct list_test {
+ /** List element */
+ struct list_head list;
+ /** Label */
+ char label;
+};
+
+/** List test elements */
+static struct list_test list_tests[] = {
+ { .label = '0' },
+ { .label = '1' },
+ { .label = '2' },
+ { .label = '3' },
+ { .label = '4' },
+ { .label = '5' },
+ { .label = '6' },
+ { .label = '7' },
+ { .label = '8' },
+ { .label = '9' },
+};
+
+/** Test list */
+static LIST_HEAD ( test_list );
+
+/**
+ * Check list contents are as expected
+ *
+ * @v list Test list
+ * @v expected Expected contents
+ * @v ok List contents are as expected
+ */
+static int list_check_contents ( struct list_head *list,
+ const char *expected ) {
+ struct list_test *entry;
+ size_t num_entries = 0;
+
+ /* Determine size of list */
+ list_for_each_entry ( entry, list, list )
+ num_entries++;
+
+ {
+ char found[ num_entries + 1 ];
+ char found_rev[ num_entries + 1 ];
+ char *tmp;
+
+ /* Build up list content string */
+ tmp = found;
+ list_for_each_entry ( entry, list, list )
+ *(tmp++) = entry->label;
+ *tmp = '\0';
+
+ /* Sanity check reversed list */
+ tmp = &found_rev[ sizeof ( found_rev ) - 1 ];
+ *tmp = '\0';
+ list_for_each_entry_reverse ( entry, list, list )
+ *(--tmp) = entry->label;
+ if ( strcmp ( found, found_rev ) != 0 ) {
+ printf ( "FAILURE: list reversal mismatch (forward "
+ "\"%s\", reverse \"%s\")\n",
+ found, found_rev );
+ return 0;
+ }
+
+ /* Compare against expected content */
+ if ( strcmp ( found, expected ) == 0 ) {
+ return 1;
+ } else {
+ printf ( "FAILURE: expected \"%s\", got \"%s\"\n",
+ expected, found );
+ return 0;
+ }
+ }
+}
+
+/**
+ * Report list test result
+ *
+ * @v list Test list
+ * @v expected Expected contents
+ */
+#define list_contents_ok( list, expected ) do { \
+ ok ( list_check_contents ( (list), (expected) ) ); \
+ } while ( 0 )
+
+/**
+ * Report list iteration test result
+ *
+ * @v macro Iterator macro
+ * @v expected Expected contents
+ * @v pos Iterator
+ * @v ... Arguments to iterator macro
+ */
+#define list_iterate_ok( macro, expected, pos, ... ) do { \
+ const char *check = expected; \
+ macro ( pos, __VA_ARGS__ ) { \
+ struct list_test *entry = \
+ list_entry ( pos, struct list_test, \
+ list ); \
+ ok ( entry->label == *(check++) ); \
+ } \
+ ok ( *check == '\0' ); \
+ } while ( 0 )
+
+/**
+ * Report list entry iteration test result
+ *
+ * @v macro Iterator macro
+ * @v expected Expected contents
+ * @v pos Iterator
+ * @v ... Arguments to iterator macro
+ */
+#define list_iterate_entry_ok( macro, expected, pos, ... ) do { \
+ const char *check = expected; \
+ macro ( pos, __VA_ARGS__ ) { \
+ ok ( (pos)->label == *(check++) ); \
+ } \
+ ok ( *check == '\0' ); \
+ } while ( 0 )
+
+/**
+ * Perform list self-test
+ *
+ */
+static void list_test_exec ( void ) {
+ struct list_head *list = &test_list;
+ struct list_head target_list;
+ struct list_head *target = &target_list;
+ struct list_head *raw_pos;
+ struct list_test *pos;
+ struct list_test *tmp;
+
+ /* Test initialiser and list_empty() */
+ ok ( list_empty ( list ) );
+ list_contents_ok ( list, "" );
+
+ /* Test list_add(), list_add_tail() and list_del() */
+ INIT_LIST_HEAD ( list );
+ list_contents_ok ( list, "" );
+ list_add ( &list_tests[4].list, list ); /* prepend */
+ list_contents_ok ( list, "4" );
+ list_add ( &list_tests[2].list, list ); /* prepend */
+ list_contents_ok ( list, "24" );
+ list_add_tail ( &list_tests[7].list, list ); /* append */
+ list_contents_ok ( list, "247" );
+ list_add ( &list_tests[1].list, &list_tests[4].list ); /* after */
+ list_contents_ok ( list, "2417" );
+ list_add_tail ( &list_tests[8].list, &list_tests[7].list ); /* before */
+ list_contents_ok ( list, "24187" );
+ list_del ( &list_tests[4].list ); /* delete middle */
+ list_contents_ok ( list, "2187" );
+ list_del ( &list_tests[2].list ); /* delete first */
+ list_contents_ok ( list, "187" );
+ list_del ( &list_tests[7].list ); /* delete last */
+ list_contents_ok ( list, "18" );
+ list_del ( &list_tests[1].list ); /* delete all */
+ list_del ( &list_tests[8].list ); /* delete all */
+ list_contents_ok ( list, "" );
+ ok ( list_empty ( list ) );
+
+ /* Test list_is_singular() */
+ INIT_LIST_HEAD ( list );
+ ok ( ! list_is_singular ( list ) );
+ list_add ( &list_tests[1].list, list );
+ ok ( list_is_singular ( list ) );
+ list_add ( &list_tests[3].list, list );
+ ok ( ! list_is_singular ( list ) );
+ list_del ( &list_tests[1].list );
+ ok ( list_is_singular ( list ) );
+
+ /* Test list_is_last() */
+ INIT_LIST_HEAD ( list );
+ list_add_tail ( &list_tests[6].list, list );
+ ok ( list_is_last ( &list_tests[6].list, list ) );
+ list_add_tail ( &list_tests[4].list, list );
+ ok ( list_is_last ( &list_tests[4].list, list ) );
+ ok ( ! list_is_last ( &list_tests[6].list, list ) );
+
+ /* Test list_cut_position() - empty list */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_cut_position ( target, list, list );
+ list_contents_ok ( list, "" );
+ list_contents_ok ( target, "" );
+
+ /* Test list_cut_position() - singular list, move nothing */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[4].list, list );
+ list_cut_position ( target, list, list );
+ list_contents_ok ( list, "4" );
+ list_contents_ok ( target, "" );
+
+ /* Test list_cut_position() - singular list, move singular entry */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[9].list, list );
+ list_cut_position ( target, list, &list_tests[9].list );
+ list_contents_ok ( list, "" );
+ list_contents_ok ( target, "9" );
+
+ /* Test list_cut_position() - multi-entry list, move nothing */
+ INIT_LIST_HEAD ( list );
+ list_add_tail ( &list_tests[3].list, list );
+ list_add_tail ( &list_tests[2].list, list );
+ list_add_tail ( &list_tests[7].list, list );
+ INIT_LIST_HEAD ( target );
+ list_cut_position ( target, list, list );
+ list_contents_ok ( list, "327" );
+ list_contents_ok ( target, "" );
+
+ /* Test list_cut_position() - multi-entry list, move some */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[8].list, list );
+ list_add_tail ( &list_tests[0].list, list );
+ list_add_tail ( &list_tests[9].list, list );
+ list_add_tail ( &list_tests[3].list, list );
+ list_add_tail ( &list_tests[2].list, list );
+ list_cut_position ( target, list, &list_tests[0].list );
+ list_contents_ok ( list, "932" );
+ list_contents_ok ( target, "80" );
+
+ /* Test list_cut_position() - multi-entry list, move everything */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[3].list, list );
+ list_add_tail ( &list_tests[5].list, list );
+ list_add_tail ( &list_tests[4].list, list );
+ list_add_tail ( &list_tests[7].list, list );
+ list_add_tail ( &list_tests[1].list, list );
+ list_cut_position ( target, list, &list_tests[1].list );
+ list_contents_ok ( list, "" );
+ list_contents_ok ( target, "35471" );
+
+ /* Test list_splice() - empty list */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_splice ( list, target );
+ list_contents_ok ( list, "" );
+ list_contents_ok ( target, "" );
+
+ /* Test list_splice() - both lists empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_splice ( list, target );
+ list_contents_ok ( target, "" );
+
+ /* Test list_splice() - source list empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[1].list, target );
+ list_add_tail ( &list_tests[3].list, target );
+ list_splice ( list, &list_tests[1].list );
+ list_contents_ok ( target, "13" );
+
+ /* Test list_splice() - destination list empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[6].list, list );
+ list_add_tail ( &list_tests[5].list, list );
+ list_add_tail ( &list_tests[2].list, list );
+ list_splice ( list, target );
+ list_contents_ok ( target, "652" );
+
+ /* Test list_splice() - both lists non-empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[8].list, list );
+ list_add_tail ( &list_tests[4].list, list );
+ list_add_tail ( &list_tests[5].list, list );
+ list_add_tail ( &list_tests[1].list, target );
+ list_add_tail ( &list_tests[9].list, target );
+ list_splice ( list, &list_tests[1].list );
+ list_contents_ok ( target, "18459" );
+
+ /* Test list_splice_tail() - both lists empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_splice_tail ( list, target );
+ list_contents_ok ( target, "" );
+
+ /* Test list_splice_tail() - source list empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[5].list, target );
+ list_splice_tail ( list, &list_tests[5].list );
+ list_contents_ok ( target, "5" );
+
+ /* Test list_splice_tail() - destination list empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[2].list, list );
+ list_add_tail ( &list_tests[1].list, list );
+ list_add_tail ( &list_tests[0].list, list );
+ list_splice_tail ( list, target );
+ list_contents_ok ( target, "210" );
+
+ /* Test list_splice_tail() - both lists non-empty */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[9].list, list );
+ list_add_tail ( &list_tests[5].list, list );
+ list_add_tail ( &list_tests[7].list, list );
+ list_add_tail ( &list_tests[2].list, target );
+ list_add_tail ( &list_tests[4].list, target );
+ list_splice_tail ( list, &list_tests[2].list );
+ list_contents_ok ( target, "95724" );
+
+ /* Test list_splice_init() */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[4].list, list );
+ list_add_tail ( &list_tests[1].list, target );
+ list_splice_init ( list, target );
+ ok ( list_empty ( list ) );
+ list_contents_ok ( list, "" );
+ list_contents_ok ( target, "41" );
+
+ /* Test list_splice_tail_init() */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( target );
+ list_add_tail ( &list_tests[3].list, list );
+ list_add_tail ( &list_tests[2].list, list );
+ list_add_tail ( &list_tests[5].list, target );
+ list_splice_tail_init ( list, &list_tests[5].list );
+ ok ( list_empty ( list ) );
+ list_contents_ok ( list, "" );
+ list_contents_ok ( target, "325" );
+
+ /* Test list_entry() */
+ INIT_LIST_HEAD ( &list_tests[3].list ); // for list_check()
+ ok ( list_entry ( &list_tests[3].list, struct list_test, list )
+ == &list_tests[3] );
+
+ /* Test list_first_entry() and list_last_entry() */
+ INIT_LIST_HEAD ( list );
+ list_add_tail ( &list_tests[9].list, list );
+ list_add_tail ( &list_tests[5].list, list );
+ list_add_tail ( &list_tests[6].list, list );
+ ok ( list_first_entry ( list, struct list_test, list )
+ == &list_tests[9] );
+ ok ( list_last_entry ( list, struct list_test, list )
+ == &list_tests[6] );
+ list_del ( &list_tests[9].list );
+ ok ( list_first_entry ( list, struct list_test, list )
+ == &list_tests[5] );
+ ok ( list_last_entry ( list, struct list_test, list )
+ == &list_tests[6] );
+ list_del ( &list_tests[6].list );
+ ok ( list_first_entry ( list, struct list_test, list )
+ == &list_tests[5] );
+ ok ( list_last_entry ( list, struct list_test, list )
+ == &list_tests[5] );
+ list_del ( &list_tests[5].list );
+ ok ( list_first_entry ( list, struct list_test, list ) == NULL );
+ ok ( list_last_entry ( list, struct list_test, list ) == NULL );
+
+ /* Test list_for_each() */
+ INIT_LIST_HEAD ( list );
+ list_add_tail ( &list_tests[6].list, list );
+ list_add_tail ( &list_tests[7].list, list );
+ list_add_tail ( &list_tests[3].list, list );
+ list_iterate_ok ( list_for_each, "673", raw_pos, list );
+
+ /* Test list_for_each_entry() and list_for_each_entry_reverse() */
+ INIT_LIST_HEAD ( list );
+ list_add_tail ( &list_tests[3].list, list );
+ list_add_tail ( &list_tests[2].list, list );
+ list_add_tail ( &list_tests[6].list, list );
+ list_add_tail ( &list_tests[9].list, list );
+ list_iterate_entry_ok ( list_for_each_entry, "3269",
+ pos, list, list );
+ list_iterate_entry_ok ( list_for_each_entry_reverse, "9623",
+ pos, list, list );
+
+ /* Test list_for_each_entry_safe() */
+ INIT_LIST_HEAD ( list );
+ list_add_tail ( &list_tests[2].list, list );
+ list_add_tail ( &list_tests[4].list, list );
+ list_add_tail ( &list_tests[1].list, list );
+ {
+ char *expected = "241";
+ list_for_each_entry_safe ( pos, tmp, list, list ) {
+ list_contents_ok ( list, expected );
+ list_del ( &pos->list );
+ expected++;
+ list_contents_ok ( list, expected );
+ }
+ }
+ ok ( list_empty ( list ) );
+
+ /* Test list_for_each_entry_continue() and
+ * list_for_each_entry_continue_reverse()
+ */
+ INIT_LIST_HEAD ( list );
+ list_add_tail ( &list_tests[4].list, list );
+ list_add_tail ( &list_tests[7].list, list );
+ list_add_tail ( &list_tests[2].list, list );
+ list_add_tail ( &list_tests[9].list, list );
+ list_add_tail ( &list_tests[3].list, list );
+ pos = &list_tests[7];
+ list_iterate_entry_ok ( list_for_each_entry_continue, "293",
+ pos, list, list );
+ ok ( pos == list_entry ( list, struct list_test, list ) );
+ list_iterate_entry_ok ( list_for_each_entry_continue, "47293",
+ pos, list, list );
+ pos = &list_tests[3];
+ list_iterate_entry_ok ( list_for_each_entry_continue, "",
+ pos, list, list );
+ pos = &list_tests[2];
+ list_iterate_entry_ok ( list_for_each_entry_continue_reverse, "74",
+ pos, list, list );
+ ok ( pos == list_entry ( list, struct list_test, list ) );
+ list_iterate_entry_ok ( list_for_each_entry_continue_reverse, "39274",
+ pos, list, list );
+ pos = &list_tests[4];
+ list_iterate_entry_ok ( list_for_each_entry_continue_reverse, "",
+ pos, list, list );
+
+ /* Test list_contains() and list_contains_entry() */
+ INIT_LIST_HEAD ( list );
+ INIT_LIST_HEAD ( &list_tests[3].list );
+ list_add ( &list_tests[8].list, list );
+ list_add ( &list_tests[5].list, list );
+ ok ( list_contains ( &list_tests[8].list, list ) );
+ ok ( list_contains_entry ( &list_tests[8], list, list ) );
+ ok ( list_contains ( &list_tests[5].list, list ) );
+ ok ( list_contains_entry ( &list_tests[5], list, list ) );
+ ok ( ! list_contains ( &list_tests[3].list, list ) );
+ ok ( ! list_contains_entry ( &list_tests[3], list, list ) );
+
+ /* Test list_check_contains_entry() */
+ INIT_LIST_HEAD ( list );
+ list_add ( &list_tests[4].list, list );
+ list_add ( &list_tests[0].list, list );
+ list_add ( &list_tests[3].list, list );
+ list_check_contains_entry ( &list_tests[4], list, list );
+ list_check_contains_entry ( &list_tests[0], list, list );
+ list_check_contains_entry ( &list_tests[3], list, list );
+}
+
+/** List self-test */
+struct self_test list_test __self_test = {
+ .name = "list",
+ .exec = list_test_exec,
+};
diff --git a/roms/ipxe/src/tests/math_test.c b/roms/ipxe/src/tests/math_test.c
new file mode 100644
index 00000000..e12b7939
--- /dev/null
+++ b/roms/ipxe/src/tests/math_test.c
@@ -0,0 +1,326 @@
+/*
+ * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Mathematical self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <strings.h>
+#include <assert.h>
+#include <ipxe/test.h>
+#include <ipxe/isqrt.h>
+
+/**
+ * Force a call to the non-constant implementation of flsl()
+ *
+ * @v value Value
+ * @ret msb Most significant bit set in value (LSB=1), or zero
+ */
+__attribute__ (( noinline )) int flsl_var ( long value ) {
+ return flsl ( value );
+}
+
+/**
+ * Force a call to the non-constant implementation of flsll()
+ *
+ * @v value Value
+ * @ret msb Most significant bit set in value (LSB=1), or zero
+ */
+__attribute__ (( noinline )) int flsll_var ( long long value ) {
+ return flsll ( value );
+}
+
+/**
+ * Check current stack pointer
+ *
+ * @ret stack A value at a fixed offset from the current stack pointer
+ *
+ * Used by check_divmod()
+ */
+static __attribute__ (( noinline )) void * stack_check ( void ) {
+ int a;
+ void *ret;
+
+ /* Hide the fact that we are returning the address of a local
+ * variable, to prevent a compiler warning.
+ */
+ __asm__ ( "\n" : "=g" ( ret ) : "0" ( &a ) );
+
+ return ret;
+}
+
+/**
+ * Check division/modulus operation
+ *
+ * One aspect of the calling convention for the implicit arithmetic
+ * functions (__udivmoddi4() etc) is whether the caller or the callee
+ * is expected to pop any stack-based arguments. This distinction can
+ * be masked if the compiler chooses to uses a frame pointer in the
+ * caller, since the caller will then reload the stack pointer from
+ * the frame pointer and so can mask an error in the value of the
+ * stack pointer.
+ *
+ * We run the division operation in a loop, and check that the stack
+ * pointer does not change value on the second iteration. To prevent
+ * the compiler from performing various optimisations which might
+ * invalidate our intended test (such as unrolling the loop, or moving
+ * the division operation outside the loop), we include some dummy
+ * inline assembly code.
+ */
+#define check_divmod( dividend, divisor, OP ) ( { \
+ uint64_t result; \
+ int count = 2; \
+ void *check = NULL; \
+ \
+ /* Prevent compiler from unrolling the loop */ \
+ __asm__ ( "\n" : "=g" ( count ) : "0" ( count ) ); \
+ \
+ do { \
+ /* Check that stack pointer does not change between \
+ * loop iterations. \
+ */ \
+ if ( check ) { \
+ assert ( check == stack_check() ); \
+ } else { \
+ check = stack_check(); \
+ } \
+ \
+ /* Perform division, preventing the compiler from \
+ * moving the division out of the loop. \
+ */ \
+ __asm__ ( "\n" : "=g" ( dividend ), "=g" ( divisor ) \
+ : "0" ( dividend ), "1" ( divisor ) ); \
+ result = ( dividend OP divisor ); \
+ __asm__ ( "\n" : "=g" ( result ) : "0" ( result ) ); \
+ \
+ } while ( --count ); \
+ result; } )
+
+/**
+ * Force a use of runtime 64-bit unsigned integer division
+ *
+ * @v dividend Dividend
+ * @v divisor Divisor
+ * @ret quotient Quotient
+ */
+__attribute__ (( noinline )) uint64_t u64div_var ( uint64_t dividend,
+ uint64_t divisor ) {
+
+ return check_divmod ( dividend, divisor, / );
+}
+
+/**
+ * Force a use of runtime 64-bit unsigned integer modulus
+ *
+ * @v dividend Dividend
+ * @v divisor Divisor
+ * @ret remainder Remainder
+ */
+__attribute__ (( noinline )) uint64_t u64mod_var ( uint64_t dividend,
+ uint64_t divisor ) {
+
+ return check_divmod ( dividend, divisor, % );
+}
+
+/**
+ * Force a use of runtime 64-bit signed integer division
+ *
+ * @v dividend Dividend
+ * @v divisor Divisor
+ * @ret quotient Quotient
+ */
+__attribute__ (( noinline )) int64_t s64div_var ( int64_t dividend,
+ int64_t divisor ) {
+
+ return check_divmod ( dividend, divisor, / );
+}
+
+/**
+ * Force a use of runtime 64-bit unsigned integer modulus
+ *
+ * @v dividend Dividend
+ * @v divisor Divisor
+ * @ret remainder Remainder
+ */
+__attribute__ (( noinline )) int64_t s64mod_var ( int64_t dividend,
+ int64_t divisor ) {
+
+ return check_divmod ( dividend, divisor, % );
+}
+
+/**
+ * Report a flsl() test result
+ *
+ * @v value Value
+ * @v msb Expected MSB
+ * @v file Test code file
+ * @v line Test code line
+ */
+static inline __attribute__ (( always_inline )) void
+flsl_okx ( long value, int msb, const char *file, unsigned int line ) {
+
+ /* Verify as a constant (requires to be inlined) */
+ okx ( flsl ( value ) == msb, file, line );
+
+ /* Verify as a non-constant */
+ okx ( flsl_var ( value ) == msb, file, line );
+}
+#define flsl_ok( value, msb ) flsl_okx ( value, msb, __FILE__, __LINE__ )
+
+/**
+ * Report a flsll() test result
+ *
+ * @v value Value
+ * @v msb Expected MSB
+ * @v file Test code file
+ * @v line Test code line
+ */
+static inline __attribute__ (( always_inline )) void
+flsll_okx ( long long value, int msb, const char *file, unsigned int line ) {
+
+ /* Verify as a constant (requires to be inlined) */
+ okx ( flsll ( value ) == msb, file, line );
+
+ /* Verify as a non-constant */
+ okx ( flsll_var ( value ) == msb, file, line );
+}
+#define flsll_ok( value, msb ) flsll_okx ( value, msb, __FILE__, __LINE__ )
+
+/**
+ * Report a 64-bit unsigned integer division test result
+ *
+ * @v dividend Dividend
+ * @v divisor Divisor
+ * @v quotient Quotient
+ * @v remainder Remainder
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void u64divmod_okx ( uint64_t dividend, uint64_t divisor,
+ uint64_t quotient, uint64_t remainder,
+ const char *file, unsigned int line ) {
+
+ /* Sanity check */
+ okx ( ( ( divisor * quotient ) + remainder ) == dividend, file, line );
+
+ /* Check division */
+ okx ( u64div_var ( dividend, divisor ) == quotient, file, line );
+
+ /* Check modulus */
+ okx ( u64mod_var ( dividend, divisor ) == remainder, file, line );
+}
+#define u64divmod_ok( dividend, divisor, quotient, remainder ) \
+ u64divmod_okx ( dividend, divisor, quotient, remainder, \
+ __FILE__, __LINE__ )
+
+/**
+ * Report a 64-bit signed integer division test result
+ *
+ * @v dividend Dividend
+ * @v divisor Divisor
+ * @v quotient Quotient
+ * @v remainder Remainder
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void s64divmod_okx ( int64_t dividend, int64_t divisor,
+ int64_t quotient, int64_t remainder,
+ const char *file, unsigned int line ) {
+
+ /* Sanity check */
+ okx ( ( ( divisor * quotient ) + remainder ) == dividend, file, line );
+
+ /* Check division */
+ okx ( s64div_var ( dividend, divisor ) == quotient, file, line );
+
+ /* Check modulus */
+ okx ( s64mod_var ( dividend, divisor ) == remainder, file, line );
+}
+#define s64divmod_ok( dividend, divisor, quotient, remainder ) \
+ s64divmod_okx ( dividend, divisor, quotient, remainder, \
+ __FILE__, __LINE__ )
+
+/**
+ * Perform mathematical self-tests
+ *
+ */
+static void math_test_exec ( void ) {
+
+ /* Test flsl() */
+ flsl_ok ( 0, 0 );
+ flsl_ok ( 1, 1 );
+ flsl_ok ( 255, 8 );
+ flsl_ok ( 256, 9 );
+ flsl_ok ( 257, 9 );
+ flsl_ok ( 0x69505845, 31 );
+ flsl_ok ( -1U, ( 8 * sizeof ( int ) ) );
+ flsl_ok ( -1UL, ( 8 * sizeof ( long ) ) );
+
+ /* Test flsll() */
+ flsll_ok ( 0, 0 );
+ flsll_ok ( 1, 1 );
+ flsll_ok ( 0x6d63623330ULL, 39 );
+ flsll_ok ( -1U, ( 8 * sizeof ( int ) ) );
+ flsll_ok ( -1UL, ( 8 * sizeof ( long ) ) );
+ flsll_ok ( -1ULL, ( 8 * sizeof ( long long ) ) );
+
+ /* Test 64-bit arithmetic
+ *
+ * On a 64-bit machine, these tests are fairly meaningless.
+ *
+ * On a 32-bit machine, these tests verify the correct
+ * operation of our libgcc functions __udivmoddi4()
+ * etc. (including checking that the implicit calling
+ * convention assumed by gcc matches our expectations).
+ */
+ u64divmod_ok ( 0x2b90ddccf699f765ULL, 0xed9f5e73ULL,
+ 0x2eef6ab4ULL, 0x0e12f089ULL );
+ s64divmod_ok ( 0x2b90ddccf699f765ULL, 0xed9f5e73ULL,
+ 0x2eef6ab4ULL, 0x0e12f089ULL );
+ u64divmod_ok ( 0xc09e00dcb9e34b54ULL, 0x35968185cdc744f3ULL,
+ 3, 0x1fda7c4b508d7c7bULL );
+ s64divmod_ok ( -0x3f61ff23461cb4acLL, 0x35968185cdc744f3ULL,
+ -1LL, -0x9cb7d9d78556fb9LL );
+ u64divmod_ok ( 0, 0x5b2f2737f4ffULL, 0, 0 );
+ s64divmod_ok ( 0, 0xbb00ded72766207fULL, 0, 0 );
+
+ /* Test integer square root */
+ ok ( isqrt ( 0 ) == 0 );
+ ok ( isqrt ( 1 ) == 1 );
+ ok ( isqrt ( 255 ) == 15 );
+ ok ( isqrt ( 256 ) == 16 );
+ ok ( isqrt ( 257 ) == 16 );
+ ok ( isqrt ( 0xa53df2adUL ) == 52652 );
+ ok ( isqrt ( 0x123793c6UL ) == 17482 );
+ ok ( isqrt ( -1UL ) == ( -1UL >> ( 8 * sizeof ( unsigned long ) / 2 )));
+}
+
+/** Mathematical self-tests */
+struct self_test math_test __self_test = {
+ .name = "math",
+ .exec = math_test_exec,
+};
diff --git a/roms/ipxe/src/tests/md5_test.c b/roms/ipxe/src/tests/md5_test.c
new file mode 100644
index 00000000..ba5f24c3
--- /dev/null
+++ b/roms/ipxe/src/tests/md5_test.c
@@ -0,0 +1,100 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * MD5 tests
+ *
+ */
+
+#include <stdint.h>
+#include <ipxe/md5.h>
+#include <ipxe/test.h>
+#include "digest_test.h"
+
+/** An MD5 test vector */
+struct md5_test_vector {
+ /** Test data */
+ void *data;
+ /** Test data length */
+ size_t len;
+ /** Expected digest */
+ uint8_t digest[MD5_DIGEST_SIZE];
+};
+
+/** MD5 test vectors */
+static struct md5_test_vector md5_test_vectors[] = {
+ /* Test inputs borrowed from SHA-1 tests, with results
+ * calculated using md5sum.
+ */
+ { NULL, 0,
+ { 0xd4, 0x1d, 0x8c, 0xd9, 0x8f, 0x00, 0xb2, 0x04,
+ 0xe9, 0x80, 0x09, 0x98, 0xec, 0xf8, 0x42, 0x7e } },
+ { "abc", 3,
+ { 0x90, 0x01, 0x50, 0x98, 0x3c, 0xd2, 0x4f, 0xb0,
+ 0xd6, 0x96, 0x3f, 0x7d, 0x28, 0xe1, 0x7f, 0x72 } },
+ { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
+ { 0x82, 0x15, 0xef, 0x07, 0x96, 0xa2, 0x0b, 0xca,
+ 0xaa, 0xe1, 0x16, 0xd3, 0x87, 0x6c, 0x66, 0x4a } },
+};
+
+/** MD5 test fragment lists */
+static struct digest_test_fragments md5_test_fragments[] = {
+ { { 0, -1UL, } },
+ { { 1, 1, 1, 1, 1, 1, 1, 1 } },
+ { { 2, 0, 23, 4, 6, 1, 0 } },
+};
+
+/**
+ * Perform MD5 self-test
+ *
+ */
+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];
+ /* Test with a single pass */
+ digest_ok ( digest, NULL, test->data, test->len, test->digest );
+ /* Test with fragment lists */
+ for ( j = 0 ; j < ( sizeof ( md5_test_fragments ) /
+ sizeof ( md5_test_fragments[0] ) ) ; j++ ){
+ digest_ok ( digest, &md5_test_fragments[j],
+ test->data, test->len, test->digest );
+ }
+ }
+
+ /* Speed test */
+ cost = digest_cost ( digest );
+ DBG ( "MD5 required %ld cycles per byte\n", cost );
+}
+
+/** MD5 self-test */
+struct self_test md5_test __self_test = {
+ .name = "md5",
+ .exec = md5_test_exec,
+};
diff --git a/roms/ipxe/src/tests/memcpy_test.c b/roms/ipxe/src/tests/memcpy_test.c
new file mode 100644
index 00000000..f1e5503a
--- /dev/null
+++ b/roms/ipxe/src/tests/memcpy_test.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * memcpy() self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ipxe/test.h>
+#include <ipxe/profile.h>
+
+/** Number of sample iterations for profiling */
+#define PROFILE_COUNT 16
+
+/* Provide global functions to allow inspection of generated code */
+
+void memcpy_0 ( void *dest, void *src ) { memcpy ( dest, src, 0 ); }
+void memcpy_1 ( void *dest, void *src ) { memcpy ( dest, src, 1 ); }
+void memcpy_2 ( void *dest, void *src ) { memcpy ( dest, src, 2 ); }
+void memcpy_3 ( void *dest, void *src ) { memcpy ( dest, src, 3 ); }
+void memcpy_4 ( void *dest, void *src ) { memcpy ( dest, src, 4 ); }
+void memcpy_5 ( void *dest, void *src ) { memcpy ( dest, src, 5 ); }
+void memcpy_6 ( void *dest, void *src ) { memcpy ( dest, src, 6 ); }
+void memcpy_7 ( void *dest, void *src ) { memcpy ( dest, src, 7 ); }
+void memcpy_8 ( void *dest, void *src ) { memcpy ( dest, src, 8 ); }
+void memcpy_9 ( void *dest, void *src ) { memcpy ( dest, src, 9 ); }
+void memcpy_10 ( void *dest, void *src ) { memcpy ( dest, src, 10 ); }
+void memcpy_11 ( void *dest, void *src ) { memcpy ( dest, src, 11 ); }
+void memcpy_12 ( void *dest, void *src ) { memcpy ( dest, src, 12 ); }
+void memcpy_13 ( void *dest, void *src ) { memcpy ( dest, src, 13 ); }
+void memcpy_14 ( void *dest, void *src ) { memcpy ( dest, src, 14 ); }
+void memcpy_15 ( void *dest, void *src ) { memcpy ( dest, src, 15 ); }
+void memcpy_16 ( void *dest, void *src ) { memcpy ( dest, src, 16 ); }
+void memcpy_17 ( void *dest, void *src ) { memcpy ( dest, src, 17 ); }
+void memcpy_18 ( void *dest, void *src ) { memcpy ( dest, src, 18 ); }
+void memcpy_19 ( void *dest, void *src ) { memcpy ( dest, src, 19 ); }
+void memcpy_20 ( void *dest, void *src ) { memcpy ( dest, src, 20 ); }
+void memcpy_21 ( void *dest, void *src ) { memcpy ( dest, src, 21 ); }
+void memcpy_22 ( void *dest, void *src ) { memcpy ( dest, src, 22 ); }
+void memcpy_23 ( void *dest, void *src ) { memcpy ( dest, src, 23 ); }
+void memcpy_24 ( void *dest, void *src ) { memcpy ( dest, src, 24 ); }
+void memcpy_25 ( void *dest, void *src ) { memcpy ( dest, src, 25 ); }
+void memcpy_26 ( void *dest, void *src ) { memcpy ( dest, src, 26 ); }
+void memcpy_27 ( void *dest, void *src ) { memcpy ( dest, src, 27 ); }
+void memcpy_28 ( void *dest, void *src ) { memcpy ( dest, src, 28 ); }
+void memcpy_29 ( void *dest, void *src ) { memcpy ( dest, src, 29 ); }
+void memcpy_30 ( void *dest, void *src ) { memcpy ( dest, src, 30 ); }
+void memcpy_31 ( void *dest, void *src ) { memcpy ( dest, src, 31 ); }
+
+/**
+ * Force a call to the variable-length implementation of memcpy()
+ *
+ * @v dest Destination address
+ * @v src Source address
+ * @v len Length of data
+ * @ret dest Destination address
+ */
+__attribute__ (( noinline )) void * memcpy_var ( void *dest, const void *src,
+ size_t len ) {
+ return memcpy ( dest, src, len );
+}
+
+/**
+ * Perform a constant-length memcpy() test
+ *
+ * ... Data to copy
+ */
+#define MEMCPY_TEST_CONSTANT( ... ) do { \
+ static const uint8_t src[] = { __VA_ARGS__ }; \
+ uint8_t dest_const[ 1 + sizeof ( src ) + 1 ]; \
+ uint8_t dest_var[ 1 + sizeof ( src ) + 1 ]; \
+ \
+ dest_const[0] = 0x33; \
+ dest_const[ sizeof ( dest_const ) - 1 ] = 0x44; \
+ memcpy ( ( dest_const + 1 ), src, \
+ ( sizeof ( dest_const ) - 2 ) ); \
+ ok ( dest_const[0] == 0x33 ); \
+ ok ( dest_const[ sizeof ( dest_const ) - 1 ] == 0x44 ); \
+ ok ( memcmp ( ( dest_const + 1 ), src, \
+ ( sizeof ( dest_const ) - 2 ) ) == 0 ); \
+ \
+ dest_var[0] = 0x55; \
+ dest_var[ sizeof ( dest_var ) - 1 ] = 0x66; \
+ memcpy_var ( ( dest_var + 1 ), src, \
+ ( sizeof ( dest_var ) - 2 ) ); \
+ ok ( dest_var[0] == 0x55 ); \
+ ok ( dest_var[ sizeof ( dest_var ) - 1 ] == 0x66 ); \
+ ok ( memcmp ( ( dest_var + 1 ), src, \
+ ( sizeof ( dest_var ) - 2 ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Test memcpy() speed
+ *
+ * @v dest_offset Destination alignment offset
+ * @v src_offset Source alignment offset
+ * @v len Length of data to copy
+ */
+static void memcpy_test_speed ( unsigned int dest_offset,
+ unsigned int src_offset, size_t len ) {
+ struct profiler profiler;
+ uint8_t *dest;
+ uint8_t *src;
+ unsigned int i;
+
+ /* Allocate blocks */
+ dest = malloc ( len + dest_offset );
+ assert ( dest != NULL );
+ src = malloc ( len + src_offset );
+ assert ( src != NULL );
+
+ /* Generate random source data */
+ for ( i = 0 ; i < len ; i++ )
+ src[ src_offset + i ] = random();
+
+ /* Check correctness of copied data */
+ memcpy ( ( dest + dest_offset ), ( src + src_offset ), len );
+ ok ( memcmp ( ( dest + dest_offset ), ( src + src_offset ),
+ len ) == 0 );
+
+ /* Profile memcpy() */
+ memset ( &profiler, 0, sizeof ( profiler ) );
+ for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
+ profile_start ( &profiler );
+ memcpy ( ( dest + dest_offset ), ( src + src_offset ), len );
+ profile_stop ( &profiler );
+ }
+
+ /* Free blocks */
+ free ( dest );
+ free ( src );
+
+ DBG ( "MEMCPY copied %zd bytes (+%d => +%d) in %ld +/- %ld ticks\n",
+ len, src_offset, dest_offset, profile_mean ( &profiler ),
+ profile_stddev ( &profiler ) );
+}
+
+/**
+ * Perform memcpy() self-tests
+ *
+ */
+static void memcpy_test_exec ( void ) {
+ unsigned int dest_offset;
+ unsigned int src_offset;
+
+ /* Constant-length tests */
+ MEMCPY_TEST_CONSTANT ( );
+ MEMCPY_TEST_CONSTANT ( 0x86 );
+ MEMCPY_TEST_CONSTANT ( 0x8c, 0xd3 );
+ MEMCPY_TEST_CONSTANT ( 0x4e, 0x08, 0xed );
+ MEMCPY_TEST_CONSTANT ( 0xcc, 0x61, 0x8f, 0x70 );
+ MEMCPY_TEST_CONSTANT ( 0x6d, 0x28, 0xe0, 0x9e, 0x6d );
+ MEMCPY_TEST_CONSTANT ( 0x7d, 0x13, 0x4f, 0xef, 0x17, 0xb3 );
+ MEMCPY_TEST_CONSTANT ( 0x38, 0xa7, 0xd4, 0x8d, 0x44, 0x01, 0xfd );
+ MEMCPY_TEST_CONSTANT ( 0x45, 0x9f, 0xf4, 0xf9, 0xf3, 0x0f, 0x99, 0x43 );
+ MEMCPY_TEST_CONSTANT ( 0x69, 0x8c, 0xf6, 0x12, 0x79, 0x70, 0xd8, 0x1e,
+ 0x9d );
+ MEMCPY_TEST_CONSTANT ( 0xbe, 0x53, 0xb4, 0xb7, 0xdd, 0xe6, 0x35, 0x10,
+ 0x3c, 0xe7 );
+ MEMCPY_TEST_CONSTANT ( 0xaf, 0x41, 0x8a, 0x88, 0xb1, 0x4e, 0x52, 0xd4,
+ 0xe6, 0xc3, 0x76 );
+ MEMCPY_TEST_CONSTANT ( 0xdf, 0x43, 0xe4, 0x5d, 0xad, 0x17, 0x35, 0x38,
+ 0x1a, 0x1d, 0x57, 0x58 );
+ MEMCPY_TEST_CONSTANT ( 0x20, 0x52, 0x83, 0x92, 0xb9, 0x85, 0xa4, 0x06,
+ 0x94, 0xe0, 0x3d, 0x57, 0xd4 );
+ MEMCPY_TEST_CONSTANT ( 0xf1, 0x67, 0x31, 0x9e, 0x32, 0x98, 0x27, 0xe9,
+ 0x8e, 0x62, 0xb4, 0x82, 0x7e, 0x02 );
+ MEMCPY_TEST_CONSTANT ( 0x93, 0xc1, 0x55, 0xe3, 0x60, 0xce, 0xac, 0x1e,
+ 0xae, 0x9d, 0xca, 0xec, 0x92, 0xb3, 0x38 );
+ MEMCPY_TEST_CONSTANT ( 0xb3, 0xc1, 0xfa, 0xe7, 0x8a, 0x1c, 0xe4, 0xce,
+ 0x85, 0xe6, 0x3c, 0xab, 0x1c, 0xa2, 0xaf, 0x7a );
+ MEMCPY_TEST_CONSTANT ( 0x9b, 0x6e, 0x1c, 0x48, 0x82, 0xd3, 0x6e, 0x58,
+ 0xa7, 0xb0, 0xe6, 0xea, 0x6d, 0xee, 0xc8, 0xf8,
+ 0xaf );
+ MEMCPY_TEST_CONSTANT ( 0x86, 0x6d, 0xb0, 0xf5, 0xf2, 0xc9, 0xcd, 0xfe,
+ 0xfb, 0x38, 0x67, 0xbc, 0x51, 0x9d, 0x25, 0xbc,
+ 0x09, 0x88 );
+ MEMCPY_TEST_CONSTANT ( 0x58, 0xa4, 0x96, 0x9e, 0x98, 0x36, 0xdb, 0xae,
+ 0x8a, 0x08, 0x7c, 0x64, 0xf9, 0xfb, 0x25, 0xb4,
+ 0x8e, 0xf3, 0xed );
+ MEMCPY_TEST_CONSTANT ( 0xc6, 0x3b, 0x84, 0x3c, 0x76, 0x24, 0x8e, 0x42,
+ 0x11, 0x1f, 0x09, 0x2e, 0x24, 0xbb, 0x67, 0x71,
+ 0x3a, 0xca, 0x60, 0xdd );
+ MEMCPY_TEST_CONSTANT ( 0x8e, 0x2d, 0xa9, 0x58, 0x87, 0xe2, 0xac, 0x4b,
+ 0xc8, 0xbf, 0xa2, 0x4e, 0xee, 0x3a, 0xa6, 0x71,
+ 0x76, 0xee, 0x42, 0x05, 0x6e );
+ MEMCPY_TEST_CONSTANT ( 0x8a, 0xda, 0xdf, 0x7b, 0x55, 0x41, 0x8c, 0xcd,
+ 0x42, 0x40, 0x18, 0xe2, 0x60, 0xc4, 0x7d, 0x64,
+ 0x00, 0xd5, 0xef, 0xa1, 0x7b, 0x31 );
+ MEMCPY_TEST_CONSTANT ( 0xd9, 0x25, 0xcb, 0xbb, 0x9c, 0x1d, 0xdd, 0xcd,
+ 0xde, 0x96, 0xd9, 0x74, 0x13, 0x95, 0xfe, 0x68,
+ 0x0b, 0x3d, 0x30, 0x8d, 0x0c, 0x1e, 0x6d );
+ MEMCPY_TEST_CONSTANT ( 0x2d, 0x0d, 0x02, 0x33, 0xd6, 0xbe, 0x6c, 0xa6,
+ 0x0a, 0xab, 0xe5, 0xda, 0xe2, 0xab, 0x78, 0x3c,
+ 0xd3, 0xdd, 0xea, 0xfa, 0x1a, 0xe4, 0xf4, 0xb3 );
+ MEMCPY_TEST_CONSTANT ( 0x6a, 0x34, 0x39, 0xea, 0x29, 0x5f, 0xa6, 0x18,
+ 0xc1, 0x53, 0x39, 0x78, 0xdb, 0x40, 0xf2, 0x98,
+ 0x78, 0xcf, 0xee, 0xfd, 0xcd, 0xf8, 0x56, 0xf8,
+ 0x30 );
+ MEMCPY_TEST_CONSTANT ( 0xe4, 0xe5, 0x5a, 0x8d, 0xcf, 0x04, 0x29, 0x7c,
+ 0xa7, 0xd8, 0x43, 0xbf, 0x0b, 0xbf, 0xe7, 0x68,
+ 0xf7, 0x8c, 0x81, 0xf9, 0x3f, 0xad, 0xa4, 0x40,
+ 0x38, 0x82 );
+ MEMCPY_TEST_CONSTANT ( 0x71, 0xcd, 0x3d, 0x26, 0xde, 0x11, 0x23, 0xd5,
+ 0x42, 0x6e, 0x63, 0x72, 0x53, 0xfc, 0x28, 0x06,
+ 0x4b, 0xe0, 0x2c, 0x07, 0x6b, 0xe8, 0xd9, 0x5f,
+ 0xf8, 0x74, 0xed );
+ MEMCPY_TEST_CONSTANT ( 0x05, 0xb2, 0xae, 0x81, 0x91, 0xc9, 0xa2, 0x5f,
+ 0xa9, 0x1b, 0x25, 0x7f, 0x32, 0x0c, 0x04, 0x00,
+ 0xf1, 0x46, 0xab, 0x77, 0x1e, 0x12, 0x27, 0xe7,
+ 0xf6, 0x1e, 0x0c, 0x29 );
+ MEMCPY_TEST_CONSTANT ( 0x0e, 0xca, 0xa5, 0x56, 0x3d, 0x99, 0x99, 0xf9,
+ 0x6e, 0xdd, 0x93, 0x98, 0xec, 0x8b, 0x5c, 0x71,
+ 0x0c, 0xb0, 0xe6, 0x12, 0xf2, 0x10, 0x1a, 0xbe,
+ 0x4a, 0xe0, 0xe3, 0x00, 0xf8 );
+ MEMCPY_TEST_CONSTANT ( 0x40, 0xa8, 0x28, 0x5b, 0x12, 0x0d, 0x80, 0x8e,
+ 0x8a, 0xd9, 0x92, 0x7a, 0x6e, 0x48, 0x8d, 0x14,
+ 0x4b, 0xc6, 0xce, 0x21, 0x2f, 0x0e, 0x47, 0xbd,
+ 0xf1, 0xca, 0x0e, 0x1f, 0x65, 0xc4 );
+ MEMCPY_TEST_CONSTANT ( 0x84, 0x83, 0x44, 0xe8, 0x1c, 0xbf, 0x23, 0x05,
+ 0xdf, 0xed, 0x3b, 0xb7, 0x0b, 0x4a, 0x05, 0xec,
+ 0xb7, 0x6f, 0x1c, 0xfe, 0x05, 0x05, 0x4e, 0xd1,
+ 0x50, 0x88, 0x81, 0x87, 0x68, 0xf6, 0x66 );
+ MEMCPY_TEST_CONSTANT ( 0x0d, 0x1d, 0xcf, 0x3e, 0x7c, 0xf8, 0x12, 0x1b,
+ 0x96, 0x7f, 0xff, 0x27, 0xca, 0xfe, 0xd3, 0x8b,
+ 0x10, 0xb9, 0x5d, 0x05, 0xad, 0x50, 0xed, 0x35,
+ 0x32, 0x9c, 0xe6, 0x3b, 0x73, 0xe0, 0x7d );
+
+ /* Speed tests */
+ memcpy_test_speed ( 0, 0, 64 );
+ memcpy_test_speed ( 0, 0, 128 );
+ memcpy_test_speed ( 0, 0, 256 );
+ for ( dest_offset = 0 ; dest_offset < 4 ; dest_offset++ ) {
+ for ( src_offset = 0 ; src_offset < 4 ; src_offset++ ) {
+ memcpy_test_speed ( dest_offset, src_offset, 4096 );
+ }
+ }
+}
+
+/** memcpy() self-test */
+struct self_test memcpy_test __self_test = {
+ .name = "memcpy",
+ .exec = memcpy_test_exec,
+};
diff --git a/roms/ipxe/src/tests/ocsp_test.c b/roms/ipxe/src/tests/ocsp_test.c
new file mode 100644
index 00000000..a318c185
--- /dev/null
+++ b/roms/ipxe/src/tests/ocsp_test.c
@@ -0,0 +1,1861 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * OCSP tests
+ *
+ *
+ * Test vectors generated using OpenSSL:
+ *
+ * openssl ocsp -no_nonce -issuer issuer.crt -cert cert.crt \
+ * -url http://ocsp.server.address \
+ * -reqout request.der -respout response.der
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ipxe/x509.h>
+#include <ipxe/ocsp.h>
+#include <ipxe/test.h>
+
+/** An OCSP test certificate */
+struct ocsp_test_certificate {
+ /** Data */
+ const void *data;
+ /** Length of data */
+ size_t len;
+ /** Parsed certificate */
+ struct x509_certificate *cert;
+};
+
+/** An OCSP test */
+struct ocsp_test {
+ /** Certificate */
+ struct ocsp_test_certificate *cert;
+ /** Issuing certificate */
+ struct ocsp_test_certificate *issuer;
+ /** Request */
+ const void *request;
+ /** Length of request */
+ size_t request_len;
+ /** Response */
+ const void *response;
+ /** Length of response */
+ size_t response_len;
+ /* OCSP check */
+ struct ocsp_check *ocsp;
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define a test certificate */
+#define CERTIFICATE( name, DATA, FINGERPRINT ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static struct ocsp_test_certificate name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ }
+
+/** Define an OCSP test */
+#define OCSP( name, CERT, ISSUER, REQUEST, RESPONSE ) \
+ static const uint8_t name ## _request[] = REQUEST; \
+ static const uint8_t name ## _response[] = RESPONSE; \
+ static struct ocsp_test name = { \
+ .cert = CERT, \
+ .issuer = ISSUER, \
+ .request = name ## _request, \
+ .request_len = sizeof ( name ## _request ), \
+ .response = name ## _response, \
+ .response_len = sizeof ( name ## _response ), \
+ }
+
+/**
+ * Prepare an OCSP test
+ *
+ * @v test OCSP test
+ */
+static void ocsp_prepare_test ( struct ocsp_test *test ) {
+ struct x509_certificate *cert = test->cert->cert;
+ struct x509_certificate *issuer = test->issuer->cert;
+
+ /* Invalidate certificate being checked */
+ x509_invalidate ( cert );
+
+ /* Force-validate issuer certificate */
+ issuer->valid = 1;
+ issuer->path_remaining = ( issuer->extensions.basic.path_len + 1 );
+}
+
+/*
+ * subject bank.barclays.co.uk
+ * issuer VeriSign Class 3 International Server CA - G3
+ */
+CERTIFICATE ( barclays_crt,
+ DATA ( 0x30, 0x82, 0x05, 0x7b, 0x30, 0x82, 0x04, 0x63, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x10, 0x49, 0x83, 0xfc, 0x05, 0x76,
+ 0xdf, 0x36, 0x91, 0x7c, 0x64, 0x2a, 0x27, 0xc1, 0xf1, 0x48,
+ 0xe3, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xbc, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
+ 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65,
+ 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75,
+ 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,
+ 0x32, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74,
+ 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76,
+ 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x72, 0x70, 0x61, 0x20, 0x28, 0x63, 0x29, 0x31,
+ 0x30, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x13, 0x2d, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e,
+ 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x49,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
+ 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17,
+ 0x0d, 0x31, 0x31, 0x31, 0x32, 0x30, 0x35, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x32, 0x31, 0x32,
+ 0x30, 0x34, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30,
+ 0x7f, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
+ 0x13, 0x02, 0x47, 0x42, 0x31, 0x10, 0x30, 0x0e, 0x06, 0x03,
+ 0x55, 0x04, 0x08, 0x13, 0x07, 0x45, 0x6e, 0x67, 0x6c, 0x61,
+ 0x6e, 0x64, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x14, 0x0a, 0x47, 0x6c, 0x6f, 0x75, 0x63, 0x65, 0x73,
+ 0x74, 0x65, 0x72, 0x31, 0x1a, 0x30, 0x18, 0x06, 0x03, 0x55,
+ 0x04, 0x0a, 0x14, 0x11, 0x42, 0x61, 0x72, 0x63, 0x6c, 0x61,
+ 0x79, 0x73, 0x20, 0x42, 0x61, 0x6e, 0x6b, 0x20, 0x50, 0x6c,
+ 0x63, 0x31, 0x0f, 0x30, 0x0d, 0x06, 0x03, 0x55, 0x04, 0x0b,
+ 0x14, 0x06, 0x47, 0x4c, 0x4f, 0x2d, 0x4c, 0x32, 0x31, 0x1c,
+ 0x30, 0x1a, 0x06, 0x03, 0x55, 0x04, 0x03, 0x14, 0x13, 0x62,
+ 0x61, 0x6e, 0x6b, 0x2e, 0x62, 0x61, 0x72, 0x63, 0x6c, 0x61,
+ 0x79, 0x73, 0x2e, 0x63, 0x6f, 0x2e, 0x75, 0x6b, 0x30, 0x82,
+ 0x01, 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01,
+ 0x0f, 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01,
+ 0x00, 0x99, 0x4c, 0x2e, 0x00, 0xa0, 0xaf, 0xe2, 0xbc, 0x52,
+ 0x43, 0x83, 0x34, 0x03, 0x58, 0xdf, 0xd3, 0xea, 0x43, 0xa2,
+ 0xfd, 0x2c, 0x4c, 0x3c, 0x32, 0x9c, 0x60, 0x40, 0xe5, 0xa1,
+ 0x07, 0x8d, 0x32, 0x21, 0xc1, 0xbd, 0xf1, 0x04, 0x2e, 0x90,
+ 0xf3, 0x05, 0x30, 0xd4, 0x6f, 0x81, 0x3e, 0x08, 0xb6, 0xc3,
+ 0xc1, 0xcf, 0xc4, 0x59, 0x7c, 0x56, 0x27, 0xea, 0x74, 0xe7,
+ 0x8f, 0x50, 0xd1, 0xa9, 0x13, 0x57, 0x3a, 0x05, 0x5a, 0xd7,
+ 0x7f, 0xfc, 0xc5, 0xc6, 0x66, 0xec, 0xa4, 0x03, 0xec, 0x97,
+ 0x1a, 0x4b, 0x28, 0xf9, 0xc9, 0xf4, 0xea, 0xc6, 0x89, 0x68,
+ 0xc1, 0x42, 0xcd, 0x80, 0xfc, 0xeb, 0x86, 0x6d, 0x1c, 0xd6,
+ 0xa1, 0x05, 0x16, 0xa4, 0xcf, 0x82, 0x1d, 0x07, 0x67, 0x7c,
+ 0xeb, 0xa1, 0x69, 0xf3, 0xf2, 0x21, 0xa7, 0x79, 0xf5, 0xf2,
+ 0xdc, 0xb6, 0x0b, 0x6e, 0x19, 0xcc, 0x50, 0x53, 0xf3, 0xbd,
+ 0xb9, 0x71, 0xdc, 0x2b, 0x15, 0x78, 0x6d, 0xd4, 0xd3, 0x82,
+ 0xce, 0x37, 0x0c, 0xb5, 0x5e, 0x24, 0x8d, 0x80, 0x40, 0x71,
+ 0x4e, 0x7b, 0x0a, 0x6e, 0x30, 0x4b, 0xb6, 0x2c, 0x23, 0x9e,
+ 0xd5, 0x08, 0x7d, 0x8a, 0x72, 0x46, 0xf6, 0x52, 0x98, 0xcb,
+ 0x03, 0x79, 0x61, 0xfe, 0xc1, 0x97, 0x15, 0x4b, 0x05, 0x36,
+ 0x0c, 0x11, 0xe9, 0x95, 0x4b, 0xef, 0xf3, 0x2d, 0xf3, 0xef,
+ 0x33, 0x6c, 0xc6, 0x98, 0xb9, 0x65, 0xe3, 0x3c, 0x26, 0x86,
+ 0xb5, 0x87, 0x9e, 0x20, 0x92, 0x7b, 0x8f, 0x13, 0x66, 0x5e,
+ 0x26, 0x09, 0xd6, 0x83, 0xee, 0x56, 0x72, 0x08, 0x6c, 0x2a,
+ 0x4c, 0xf2, 0x5b, 0xf1, 0x08, 0x4b, 0x91, 0x9e, 0x67, 0x37,
+ 0x2f, 0xc5, 0xcf, 0x1a, 0xa8, 0xa1, 0x1c, 0xb6, 0x2d, 0xd0,
+ 0x81, 0xf4, 0xf7, 0x37, 0xb9, 0xa3, 0x37, 0x3f, 0x6b, 0x2f,
+ 0x62, 0x82, 0xa7, 0x17, 0xc1, 0x8c, 0x69, 0x02, 0x03, 0x01,
+ 0x00, 0x01, 0xa3, 0x82, 0x01, 0xb3, 0x30, 0x82, 0x01, 0xaf,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30,
+ 0x00, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04,
+ 0x03, 0x02, 0x05, 0xa0, 0x30, 0x41, 0x06, 0x03, 0x55, 0x1d,
+ 0x1f, 0x04, 0x3a, 0x30, 0x38, 0x30, 0x36, 0xa0, 0x34, 0xa0,
+ 0x32, 0x86, 0x30, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x53, 0x56, 0x52, 0x49, 0x6e, 0x74, 0x6c, 0x2d, 0x47, 0x33,
+ 0x2d, 0x63, 0x72, 0x6c, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73,
+ 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x56,
+ 0x52, 0x49, 0x6e, 0x74, 0x6c, 0x47, 0x33, 0x2e, 0x63, 0x72,
+ 0x6c, 0x30, 0x44, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3d,
+ 0x30, 0x3b, 0x30, 0x39, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01,
+ 0x86, 0xf8, 0x45, 0x01, 0x07, 0x17, 0x03, 0x30, 0x2a, 0x30,
+ 0x28, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02,
+ 0x01, 0x16, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f,
+ 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73,
+ 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x70,
+ 0x61, 0x30, 0x28, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x21,
+ 0x30, 0x1f, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
+ 0x42, 0x04, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
+ 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
+ 0x07, 0x03, 0x02, 0x30, 0x72, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x66, 0x30, 0x64, 0x30,
+ 0x24, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30,
+ 0x01, 0x86, 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73,
+ 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x3c, 0x06,
+ 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86,
+ 0x30, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x53, 0x56,
+ 0x52, 0x49, 0x6e, 0x74, 0x6c, 0x2d, 0x47, 0x33, 0x2d, 0x61,
+ 0x69, 0x61, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67,
+ 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x53, 0x56, 0x52, 0x49,
+ 0x6e, 0x74, 0x6c, 0x47, 0x33, 0x2e, 0x63, 0x65, 0x72, 0x30,
+ 0x6e, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01,
+ 0x0c, 0x04, 0x62, 0x30, 0x60, 0xa1, 0x5e, 0xa0, 0x5c, 0x30,
+ 0x5a, 0x30, 0x58, 0x30, 0x56, 0x16, 0x09, 0x69, 0x6d, 0x61,
+ 0x67, 0x65, 0x2f, 0x67, 0x69, 0x66, 0x30, 0x21, 0x30, 0x1f,
+ 0x30, 0x07, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04,
+ 0x14, 0x4b, 0x6b, 0xb9, 0x28, 0x96, 0x06, 0x0c, 0xbb, 0xd0,
+ 0x52, 0x38, 0x9b, 0x29, 0xac, 0x4b, 0x07, 0x8b, 0x21, 0x05,
+ 0x18, 0x30, 0x26, 0x16, 0x24, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x6c, 0x6f, 0x67, 0x6f, 0x2e, 0x76, 0x65, 0x72,
+ 0x69, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+ 0x76, 0x73, 0x6c, 0x6f, 0x67, 0x6f, 0x31, 0x2e, 0x67, 0x69,
+ 0x66, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,
+ 0x00, 0x49, 0xf3, 0x7c, 0x15, 0xb0, 0x50, 0x97, 0xb7, 0xcd,
+ 0x87, 0x75, 0x85, 0xcc, 0x55, 0x7c, 0x62, 0x97, 0x97, 0x04,
+ 0xbd, 0xc2, 0x22, 0xfc, 0xf5, 0x2c, 0x75, 0xdc, 0x25, 0x6d,
+ 0xed, 0xcd, 0x22, 0x2e, 0xa4, 0xcd, 0x88, 0x95, 0xe8, 0x52,
+ 0x45, 0x7a, 0xa0, 0x85, 0xcc, 0x6d, 0x1c, 0xcb, 0xd8, 0xc3,
+ 0x26, 0x2c, 0xee, 0xb5, 0xe1, 0x38, 0x3f, 0xb6, 0x96, 0x10,
+ 0xa3, 0xb3, 0x1e, 0x2d, 0xdc, 0xe8, 0x07, 0x2f, 0xc2, 0xb7,
+ 0x50, 0xd5, 0x60, 0x73, 0x0d, 0x43, 0xb1, 0xaf, 0xd9, 0xcb,
+ 0x39, 0x00, 0xc7, 0x00, 0xb3, 0x1f, 0xa4, 0xaf, 0xf8, 0xed,
+ 0x9b, 0x6a, 0x7a, 0x10, 0xcc, 0x81, 0x92, 0xc2, 0x58, 0x7e,
+ 0x42, 0xe4, 0xbf, 0xcf, 0x8c, 0x91, 0x7f, 0xde, 0xe6, 0xac,
+ 0x37, 0x31, 0x58, 0x90, 0xee, 0x51, 0xf5, 0x0e, 0xe5, 0x84,
+ 0xd8, 0x51, 0x89, 0x50, 0xfe, 0xfa, 0xad, 0xc9, 0xbb, 0x19,
+ 0xb3, 0x4a, 0xc8, 0x6b, 0x26, 0x98, 0x4b, 0x63, 0x41, 0x81,
+ 0xe1, 0x12, 0xab, 0xcc, 0x89, 0xbe, 0xdf, 0xa8, 0x7e, 0xf5,
+ 0x0e, 0x07, 0xf6, 0x92, 0x89, 0x64, 0x3b, 0xc2, 0x64, 0xa2,
+ 0x4b, 0xd1, 0x6b, 0x9b, 0x4e, 0x6a, 0xf2, 0x63, 0xf7, 0xc3,
+ 0xe0, 0x9f, 0xc5, 0x4e, 0xb6, 0x77, 0x0a, 0xad, 0x6d, 0x0f,
+ 0x30, 0x87, 0x6b, 0xfb, 0x66, 0xb3, 0x90, 0x87, 0xa3, 0x48,
+ 0xbe, 0xa4, 0x34, 0x9c, 0x5a, 0x93, 0xa3, 0x74, 0x0e, 0x36,
+ 0x8e, 0xf6, 0x3b, 0x6c, 0xae, 0xa0, 0x6a, 0xa1, 0x1a, 0x12,
+ 0x78, 0x99, 0x75, 0x50, 0xb1, 0x72, 0xed, 0x22, 0x34, 0x0f,
+ 0xe1, 0x89, 0xfe, 0x81, 0x0a, 0xcc, 0x2a, 0xd0, 0xf3, 0x25,
+ 0xe6, 0xd9, 0x19, 0x06, 0x20, 0x2d, 0x29, 0x8b, 0xdd, 0xb5,
+ 0x60, 0xf4, 0x0d, 0x08, 0x97, 0x7b, 0x81, 0x4a, 0xfb, 0x20,
+ 0xfb, 0x83, 0xa3, 0xc8, 0x1d, 0x79, 0xb9 ),
+ FINGERPRINT ( 0x7e, 0x54, 0x41, 0x60, 0x21, 0xca, 0x3e, 0x63,
+ 0xce, 0x5a, 0x41, 0x6c, 0xbe, 0x52, 0x01, 0x88,
+ 0xcf, 0x41, 0x36, 0x48, 0xdb, 0xe3, 0xdf, 0x8e,
+ 0x79, 0x73, 0x5f, 0xcf, 0x8e, 0x8e, 0xac, 0xd8 ) );
+
+/*
+ * subject www.google.com
+ * issuer Thawte SGC CA
+ */
+CERTIFICATE ( google_crt,
+ DATA ( 0x30, 0x82, 0x03, 0x21, 0x30, 0x82, 0x02, 0x8a, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x10, 0x4f, 0x9d, 0x96, 0xd9, 0x66,
+ 0xb0, 0x99, 0x2b, 0x54, 0xc2, 0x95, 0x7c, 0xb4, 0x15, 0x7d,
+ 0x4d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x4c, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x5a,
+ 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x13, 0x1c, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43,
+ 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20,
+ 0x28, 0x50, 0x74, 0x79, 0x29, 0x20, 0x4c, 0x74, 0x64, 0x2e,
+ 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x0d, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x53, 0x47,
+ 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x31,
+ 0x31, 0x30, 0x32, 0x36, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30,
+ 0x5a, 0x17, 0x0d, 0x31, 0x33, 0x30, 0x39, 0x33, 0x30, 0x32,
+ 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30, 0x68, 0x31, 0x0b,
+ 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55,
+ 0x53, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x08,
+ 0x13, 0x0a, 0x43, 0x61, 0x6c, 0x69, 0x66, 0x6f, 0x72, 0x6e,
+ 0x69, 0x61, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x14, 0x0d, 0x4d, 0x6f, 0x75, 0x6e, 0x74, 0x61, 0x69,
+ 0x6e, 0x20, 0x56, 0x69, 0x65, 0x77, 0x31, 0x13, 0x30, 0x11,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x14, 0x0a, 0x47, 0x6f, 0x6f,
+ 0x67, 0x6c, 0x65, 0x20, 0x49, 0x6e, 0x63, 0x31, 0x17, 0x30,
+ 0x15, 0x06, 0x03, 0x55, 0x04, 0x03, 0x14, 0x0e, 0x77, 0x77,
+ 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
+ 0x6f, 0x6d, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
+ 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81,
+ 0x00, 0xde, 0xb7, 0x26, 0x43, 0xa6, 0x99, 0x85, 0xcd, 0x38,
+ 0xa7, 0x15, 0x09, 0xb9, 0xcf, 0x0f, 0xc9, 0xc3, 0x55, 0x8c,
+ 0x88, 0xee, 0x8c, 0x8d, 0x28, 0x27, 0x24, 0x4b, 0x2a, 0x5e,
+ 0xa0, 0xd8, 0x16, 0xfa, 0x61, 0x18, 0x4b, 0xcf, 0x6d, 0x60,
+ 0x80, 0xd3, 0x35, 0x40, 0x32, 0x72, 0xc0, 0x8f, 0x12, 0xd8,
+ 0xe5, 0x4e, 0x8f, 0xb9, 0xb2, 0xf6, 0xd9, 0x15, 0x5e, 0x5a,
+ 0x86, 0x31, 0xa3, 0xba, 0x86, 0xaa, 0x6b, 0xc8, 0xd9, 0x71,
+ 0x8c, 0xcc, 0xcd, 0x27, 0x13, 0x1e, 0x9d, 0x42, 0x5d, 0x38,
+ 0xf6, 0xa7, 0xac, 0xef, 0xfa, 0x62, 0xf3, 0x18, 0x81, 0xd4,
+ 0x24, 0x46, 0x7f, 0x01, 0x77, 0x7c, 0xc6, 0x2a, 0x89, 0x14,
+ 0x99, 0xbb, 0x98, 0x39, 0x1d, 0xa8, 0x19, 0xfb, 0x39, 0x00,
+ 0x44, 0x7d, 0x1b, 0x94, 0x6a, 0x78, 0x2d, 0x69, 0xad, 0xc0,
+ 0x7a, 0x2c, 0xfa, 0xd0, 0xda, 0x20, 0x12, 0x98, 0xd3, 0x02,
+ 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xe7, 0x30, 0x81, 0xe4,
+ 0x30, 0x0c, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,
+ 0x04, 0x02, 0x30, 0x00, 0x30, 0x36, 0x06, 0x03, 0x55, 0x1d,
+ 0x1f, 0x04, 0x2f, 0x30, 0x2d, 0x30, 0x2b, 0xa0, 0x29, 0xa0,
+ 0x27, 0x86, 0x25, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x63, 0x72, 0x6c, 0x2e, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x54, 0x68, 0x61, 0x77, 0x74,
+ 0x65, 0x53, 0x47, 0x43, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x6c,
+ 0x30, 0x28, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x21, 0x30,
+ 0x1f, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03,
+ 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03,
+ 0x02, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42,
+ 0x04, 0x01, 0x30, 0x72, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05,
+ 0x05, 0x07, 0x01, 0x01, 0x04, 0x66, 0x30, 0x64, 0x30, 0x22,
+ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01,
+ 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f,
+ 0x63, 0x73, 0x70, 0x2e, 0x74, 0x68, 0x61, 0x77, 0x74, 0x65,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x3e, 0x06, 0x08, 0x2b, 0x06,
+ 0x01, 0x05, 0x05, 0x07, 0x30, 0x02, 0x86, 0x32, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x74,
+ 0x68, 0x61, 0x77, 0x74, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x2f,
+ 0x72, 0x65, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x6f, 0x72, 0x79,
+ 0x2f, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x5f, 0x53, 0x47,
+ 0x43, 0x5f, 0x43, 0x41, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x21, 0xac, 0xd5,
+ 0xae, 0xca, 0x34, 0x89, 0x5a, 0xc2, 0xab, 0x52, 0xd2, 0xb2,
+ 0x34, 0x66, 0x9d, 0x7a, 0xab, 0xee, 0xe6, 0x7c, 0xd5, 0x7e,
+ 0xc2, 0x5c, 0x28, 0xbb, 0x74, 0x00, 0xc9, 0x10, 0x1f, 0x42,
+ 0x13, 0xfc, 0x69, 0x8a, 0x1e, 0x24, 0xa0, 0x02, 0x00, 0xe9,
+ 0xba, 0x5b, 0xca, 0x19, 0x04, 0xb2, 0xd3, 0xaf, 0x01, 0xb2,
+ 0x7e, 0x5f, 0x14, 0xdb, 0xa6, 0xdb, 0x52, 0xb9, 0x9a, 0xf3,
+ 0x12, 0x7f, 0x7c, 0xa2, 0x9c, 0x3b, 0x6f, 0x99, 0x7d, 0xea,
+ 0x50, 0x0d, 0x76, 0x23, 0x12, 0xff, 0xf7, 0x66, 0x73, 0x29,
+ 0xb7, 0x95, 0x0a, 0xad, 0xd8, 0x8b, 0xb2, 0xde, 0x20, 0xe9,
+ 0x0a, 0x70, 0x64, 0x11, 0x08, 0xc8, 0x5a, 0xf1, 0x7d, 0x9e,
+ 0xec, 0x69, 0xa5, 0xa5, 0xd5, 0x82, 0xd7, 0x27, 0x1e, 0x9e,
+ 0x56, 0xcd, 0xd2, 0x76, 0xd5, 0x79, 0x2b, 0xf7, 0x25, 0x43,
+ 0x1c, 0x69, 0xf0, 0xb8, 0xf9 ),
+ FINGERPRINT ( 0xec, 0x6a, 0x6b, 0x15, 0x6b, 0x30, 0x62, 0xfa,
+ 0x99, 0x49, 0x9d, 0x1e, 0x15, 0x15, 0xcf, 0x6c,
+ 0x50, 0x48, 0xaf, 0x17, 0x94, 0x57, 0x48, 0x39,
+ 0x6b, 0xd2, 0xec, 0xf1, 0x2b, 0x8d, 0xe2, 0x2c ) );
+
+/*
+ * subject VeriSign Class 3 International Server CA - G3
+ * issuer VeriSign Class 3 Public Primary Certification Authority - G5
+ */
+CERTIFICATE ( verisign_crt,
+ DATA ( 0x30, 0x82, 0x06, 0x29, 0x30, 0x82, 0x05, 0x11, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x10, 0x64, 0x1b, 0xe8, 0x20, 0xce,
+ 0x02, 0x08, 0x13, 0xf3, 0x2d, 0x4d, 0x2d, 0x95, 0xd6, 0x7e,
+ 0x67, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xca, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
+ 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65,
+ 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75,
+ 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x31, 0x3a, 0x30, 0x38, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,
+ 0x31, 0x28, 0x63, 0x29, 0x20, 0x32, 0x30, 0x30, 0x36, 0x20,
+ 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20,
+ 0x49, 0x6e, 0x63, 0x2e, 0x20, 0x2d, 0x20, 0x46, 0x6f, 0x72,
+ 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65,
+ 0x64, 0x20, 0x75, 0x73, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79,
+ 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x3c, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20,
+ 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x50, 0x75,
+ 0x62, 0x6c, 0x69, 0x63, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61,
+ 0x72, 0x79, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69,
+ 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74,
+ 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x20, 0x2d, 0x20, 0x47,
+ 0x35, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x30, 0x30, 0x32, 0x30,
+ 0x38, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d,
+ 0x32, 0x30, 0x30, 0x32, 0x30, 0x37, 0x32, 0x33, 0x35, 0x39,
+ 0x35, 0x39, 0x5a, 0x30, 0x81, 0xbc, 0x31, 0x0b, 0x30, 0x09,
+ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,
+ 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e,
+ 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20,
+ 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03,
+ 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65, 0x72, 0x69, 0x53,
+ 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20,
+ 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x31, 0x3b, 0x30,
+ 0x39, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x32, 0x54, 0x65,
+ 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x75, 0x73, 0x65,
+ 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76, 0x65, 0x72, 0x69,
+ 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72,
+ 0x70, 0x61, 0x20, 0x28, 0x63, 0x29, 0x31, 0x30, 0x31, 0x36,
+ 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x2d, 0x56,
+ 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x43, 0x6c,
+ 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x49, 0x6e, 0x74, 0x65,
+ 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20,
+ 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43, 0x41, 0x20,
+ 0x2d, 0x20, 0x47, 0x33, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82,
+ 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x99, 0xd6, 0x9c,
+ 0x62, 0xf0, 0x15, 0xf4, 0x81, 0x9a, 0x41, 0x08, 0x59, 0x8f,
+ 0x13, 0x9d, 0x17, 0xc9, 0x9f, 0x51, 0xdc, 0xda, 0xb1, 0x52,
+ 0xef, 0xff, 0xe3, 0x41, 0xdd, 0xe0, 0xdf, 0xc4, 0x28, 0xc6,
+ 0xe3, 0xad, 0x79, 0x1f, 0x27, 0x10, 0x98, 0xb8, 0xbb, 0x20,
+ 0x97, 0xc1, 0x28, 0x44, 0x41, 0x0f, 0xea, 0xa9, 0xa8, 0x52,
+ 0xcf, 0x4d, 0x4e, 0x1b, 0x8b, 0xbb, 0xb5, 0xc4, 0x76, 0xd9,
+ 0xcc, 0x56, 0x06, 0xee, 0xb3, 0x55, 0x20, 0x2a, 0xde, 0x15,
+ 0x8d, 0x71, 0xcb, 0x54, 0xc8, 0x6f, 0x17, 0xcd, 0x89, 0x00,
+ 0xe4, 0xdc, 0xff, 0xe1, 0xc0, 0x1f, 0x68, 0x71, 0xe9, 0xc7,
+ 0x29, 0x2e, 0x7e, 0xbc, 0x3b, 0xfc, 0xe5, 0xbb, 0xab, 0x26,
+ 0x54, 0x8b, 0x66, 0x90, 0xcd, 0xf6, 0x92, 0xb9, 0x31, 0x24,
+ 0x80, 0xbc, 0x9e, 0x6c, 0xd5, 0xfc, 0x7e, 0xd2, 0xe1, 0x4b,
+ 0x8c, 0xdc, 0x42, 0xfa, 0x44, 0x4b, 0x5f, 0xf8, 0x18, 0xb5,
+ 0x2e, 0x30, 0xf4, 0x3d, 0x12, 0x98, 0xd3, 0x62, 0x05, 0x73,
+ 0x54, 0xa6, 0x9c, 0xa2, 0x1d, 0xbe, 0x52, 0x83, 0x3a, 0x07,
+ 0x46, 0xc4, 0x3b, 0x02, 0x56, 0x21, 0xbf, 0xf2, 0x51, 0x4f,
+ 0xd0, 0xa6, 0x99, 0x39, 0xe9, 0xae, 0xa5, 0x3f, 0x89, 0x9b,
+ 0x9c, 0x7d, 0xfe, 0x4d, 0x60, 0x07, 0x25, 0x20, 0xf7, 0xbb,
+ 0xd7, 0x69, 0x83, 0x2b, 0x82, 0x93, 0x43, 0x37, 0xd9, 0x83,
+ 0x41, 0x1b, 0x6b, 0x0b, 0xab, 0x4a, 0x66, 0x84, 0x4f, 0x4a,
+ 0x8e, 0xde, 0x7e, 0x34, 0x99, 0x8e, 0x68, 0xd6, 0xca, 0x39,
+ 0x06, 0x9b, 0x4c, 0xb3, 0x9a, 0x48, 0x4d, 0x13, 0x46, 0xb4,
+ 0x58, 0x21, 0x04, 0xc4, 0xfb, 0xa0, 0x4d, 0xac, 0x2e, 0x4b,
+ 0x62, 0x12, 0xe3, 0xfb, 0x4d, 0xf6, 0xc9, 0x51, 0x00, 0x01,
+ 0x1f, 0xfc, 0x1e, 0x6a, 0x81, 0x2a, 0x38, 0xe0, 0xb9, 0x4f,
+ 0xd6, 0x2d, 0x45, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82,
+ 0x02, 0x15, 0x30, 0x82, 0x02, 0x11, 0x30, 0x12, 0x06, 0x03,
+ 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06,
+ 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x70, 0x06, 0x03,
+ 0x55, 0x1d, 0x20, 0x04, 0x69, 0x30, 0x67, 0x30, 0x65, 0x06,
+ 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x45, 0x01, 0x07,
+ 0x17, 0x03, 0x30, 0x56, 0x30, 0x28, 0x06, 0x08, 0x2b, 0x06,
+ 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1c, 0x68, 0x74,
+ 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e,
+ 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63,
+ 0x6f, 0x6d, 0x2f, 0x63, 0x70, 0x73, 0x30, 0x2a, 0x06, 0x08,
+ 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x02, 0x30, 0x1e,
+ 0x1a, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69,
+ 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x70, 0x61,
+ 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff,
+ 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x6d, 0x06, 0x08,
+ 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x0c, 0x04, 0x61,
+ 0x30, 0x5f, 0xa1, 0x5d, 0xa0, 0x5b, 0x30, 0x59, 0x30, 0x57,
+ 0x30, 0x55, 0x16, 0x09, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f,
+ 0x67, 0x69, 0x66, 0x30, 0x21, 0x30, 0x1f, 0x30, 0x07, 0x06,
+ 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x04, 0x14, 0x8f, 0xe5,
+ 0xd3, 0x1a, 0x86, 0xac, 0x8d, 0x8e, 0x6b, 0xc3, 0xcf, 0x80,
+ 0x6a, 0xd4, 0x48, 0x18, 0x2c, 0x7b, 0x19, 0x2e, 0x30, 0x25,
+ 0x16, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c,
+ 0x6f, 0x67, 0x6f, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69,
+ 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x76, 0x73, 0x6c,
+ 0x6f, 0x67, 0x6f, 0x2e, 0x67, 0x69, 0x66, 0x30, 0x34, 0x06,
+ 0x03, 0x55, 0x1d, 0x25, 0x04, 0x2d, 0x30, 0x2b, 0x06, 0x08,
+ 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08,
+ 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x06, 0x09,
+ 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x04, 0x01, 0x06,
+ 0x0a, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x45, 0x01, 0x08,
+ 0x01, 0x30, 0x34, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
+ 0x07, 0x01, 0x01, 0x04, 0x28, 0x30, 0x26, 0x30, 0x24, 0x06,
+ 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86,
+ 0x18, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6f, 0x63,
+ 0x73, 0x70, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67,
+ 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x34, 0x06, 0x03, 0x55,
+ 0x1d, 0x1f, 0x04, 0x2d, 0x30, 0x2b, 0x30, 0x29, 0xa0, 0x27,
+ 0xa0, 0x25, 0x86, 0x23, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x63, 0x72, 0x6c, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73,
+ 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x63,
+ 0x61, 0x33, 0x2d, 0x67, 0x35, 0x2e, 0x63, 0x72, 0x6c, 0x30,
+ 0x28, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x21, 0x30, 0x1f,
+ 0xa4, 0x1d, 0x30, 0x1b, 0x31, 0x19, 0x30, 0x17, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x13, 0x10, 0x56, 0x65, 0x72, 0x69, 0x53,
+ 0x69, 0x67, 0x6e, 0x4d, 0x50, 0x4b, 0x49, 0x2d, 0x32, 0x2d,
+ 0x37, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,
+ 0x04, 0x14, 0xd7, 0x9b, 0x7c, 0xd8, 0x22, 0xa0, 0x15, 0xf7,
+ 0xdd, 0xad, 0x5f, 0xce, 0x29, 0x9b, 0x58, 0xc3, 0xbc, 0x46,
+ 0x00, 0xb5, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04,
+ 0x18, 0x30, 0x16, 0x80, 0x14, 0x7f, 0xd3, 0x65, 0xa7, 0xc2,
+ 0xdd, 0xec, 0xbb, 0xf0, 0x30, 0x09, 0xf3, 0x43, 0x39, 0xfa,
+ 0x02, 0xaf, 0x33, 0x31, 0x33, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x03, 0x82, 0x01, 0x01, 0x00, 0x71, 0xb5, 0x7d, 0x73, 0x52,
+ 0x4a, 0xdd, 0xd7, 0x4d, 0x34, 0x2b, 0x2e, 0xaf, 0x94, 0x46,
+ 0xa5, 0x49, 0x50, 0x02, 0x4f, 0xf8, 0x2f, 0x17, 0x70, 0xf2,
+ 0x13, 0xdc, 0x1f, 0x21, 0x86, 0xaa, 0xc2, 0x4f, 0x7c, 0x37,
+ 0x3c, 0xd4, 0x46, 0x78, 0xae, 0x5d, 0x78, 0x6f, 0xd1, 0xba,
+ 0x5a, 0xbc, 0x10, 0xab, 0x58, 0x36, 0xc5, 0x8c, 0x62, 0x15,
+ 0x45, 0x60, 0x17, 0x21, 0xe2, 0xd5, 0x42, 0xa8, 0x77, 0xa1,
+ 0x55, 0xd8, 0x43, 0x04, 0x51, 0xf6, 0x6e, 0xba, 0x48, 0xe6,
+ 0x5d, 0x4c, 0xb7, 0x44, 0xd3, 0x3e, 0xa4, 0xd5, 0xd6, 0x33,
+ 0x9a, 0x9f, 0x0d, 0xe6, 0xd7, 0x4e, 0x96, 0x44, 0x95, 0x5a,
+ 0x6c, 0xd6, 0xa3, 0x16, 0x53, 0x0e, 0x98, 0x43, 0xce, 0xa4,
+ 0xb8, 0xc3, 0x66, 0x7a, 0x05, 0x5c, 0x62, 0x10, 0xe8, 0x1b,
+ 0x12, 0xdb, 0x7d, 0x2e, 0x76, 0x50, 0xff, 0xdf, 0xd7, 0x6b,
+ 0x1b, 0xcc, 0x8a, 0xcc, 0x71, 0xfa, 0xb3, 0x40, 0x56, 0x7c,
+ 0x33, 0x7a, 0x77, 0x94, 0x5b, 0xf5, 0x0b, 0x53, 0xfb, 0x0e,
+ 0x5f, 0xbc, 0x68, 0xfb, 0xaf, 0x2a, 0xee, 0x30, 0x37, 0x79,
+ 0x16, 0x93, 0x25, 0x7f, 0x4d, 0x10, 0xff, 0x57, 0xfb, 0xbf,
+ 0x6e, 0x3b, 0x33, 0x21, 0xde, 0x79, 0xdc, 0x86, 0x17, 0x59,
+ 0x2d, 0x43, 0x64, 0xb7, 0xa6, 0x66, 0x87, 0xea, 0xbc, 0x96,
+ 0x46, 0x19, 0x1a, 0x86, 0x8b, 0x6f, 0xd7, 0xb7, 0x49, 0x00,
+ 0x5b, 0xdb, 0xa3, 0xbf, 0x29, 0x9a, 0xee, 0xf7, 0xd3, 0x33,
+ 0xae, 0xa3, 0xf4, 0x9e, 0x4c, 0xca, 0x5e, 0x69, 0xd4, 0x1b,
+ 0xad, 0xb7, 0x90, 0x77, 0x6a, 0xd8, 0x59, 0x6f, 0x79, 0xab,
+ 0x01, 0xfa, 0x55, 0xf0, 0x8a, 0x21, 0x66, 0xe5, 0x65, 0x6e,
+ 0xfd, 0x7c, 0xd3, 0xdf, 0x1e, 0xeb, 0x7e, 0x3f, 0x06, 0x90,
+ 0xfb, 0x19, 0x0b, 0xd3, 0x06, 0x02, 0x1b, 0x78, 0x43, 0x99,
+ 0xa8 ),
+ FINGERPRINT ( 0x6e, 0x21, 0x87, 0x6c, 0xf1, 0x63, 0x47, 0x20,
+ 0x1f, 0x63, 0x7a, 0x17, 0x8c, 0xb4, 0x2b, 0x17,
+ 0x1d, 0x52, 0x37, 0x9a, 0xf7, 0xe5, 0xf5, 0xb6,
+ 0xf6, 0x75, 0x5b, 0x3e, 0xe9, 0xbb, 0x2e, 0xd4 ) );
+
+/*
+ * subject Thawte SGC CA
+issuer= /C=US/O=VeriSign, Inc./OU=Class 3 Public Primary Certification Authority
+ */
+CERTIFICATE ( thawte_crt,
+ DATA ( 0x30, 0x82, 0x03, 0x23, 0x30, 0x82, 0x02, 0x8c, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x04, 0x30, 0x00, 0x00, 0x02, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x05, 0x05, 0x00, 0x30, 0x5f, 0x31, 0x0b, 0x30, 0x09,
+ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31,
+ 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e,
+ 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20,
+ 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x37, 0x30, 0x35, 0x06, 0x03,
+ 0x55, 0x04, 0x0b, 0x13, 0x2e, 0x43, 0x6c, 0x61, 0x73, 0x73,
+ 0x20, 0x33, 0x20, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x20,
+ 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20, 0x43, 0x65,
+ 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,
+ 0x79, 0x30, 0x1e, 0x17, 0x0d, 0x30, 0x34, 0x30, 0x35, 0x31,
+ 0x33, 0x30, 0x30, 0x30, 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d,
+ 0x31, 0x34, 0x30, 0x35, 0x31, 0x32, 0x32, 0x33, 0x35, 0x39,
+ 0x35, 0x39, 0x5a, 0x30, 0x4c, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x5a, 0x41, 0x31, 0x25,
+ 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x54,
+ 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73,
+ 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x50, 0x74,
+ 0x79, 0x29, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x16, 0x30,
+ 0x14, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0d, 0x54, 0x68,
+ 0x61, 0x77, 0x74, 0x65, 0x20, 0x53, 0x47, 0x43, 0x20, 0x43,
+ 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03,
+ 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00,
+ 0xd4, 0xd3, 0x67, 0xd0, 0x8d, 0x15, 0x7f, 0xae, 0xcd, 0x31,
+ 0xfe, 0x7d, 0x1d, 0x91, 0xa1, 0x3f, 0x0b, 0x71, 0x3c, 0xac,
+ 0xcc, 0xc8, 0x64, 0xfb, 0x63, 0xfc, 0x32, 0x4b, 0x07, 0x94,
+ 0xbd, 0x6f, 0x80, 0xba, 0x2f, 0xe1, 0x04, 0x93, 0xc0, 0x33,
+ 0xfc, 0x09, 0x33, 0x23, 0xe9, 0x0b, 0x74, 0x2b, 0x71, 0xc4,
+ 0x03, 0xc6, 0xd2, 0xcd, 0xe2, 0x2f, 0xf5, 0x09, 0x63, 0xcd,
+ 0xff, 0x48, 0xa5, 0x00, 0xbf, 0xe0, 0xe7, 0xf3, 0x88, 0xb7,
+ 0x2d, 0x32, 0xde, 0x98, 0x36, 0xe6, 0x0a, 0xad, 0x00, 0x7b,
+ 0xc4, 0x64, 0x4a, 0x3b, 0x84, 0x75, 0x03, 0xf2, 0x70, 0x92,
+ 0x7d, 0x0e, 0x62, 0xf5, 0x21, 0xab, 0x69, 0x36, 0x84, 0x31,
+ 0x75, 0x90, 0xf8, 0xbf, 0xc7, 0x6c, 0x88, 0x1b, 0x06, 0x95,
+ 0x7c, 0xc9, 0xe5, 0xa8, 0xde, 0x75, 0xa1, 0x2c, 0x7a, 0x68,
+ 0xdf, 0xd5, 0xca, 0x1c, 0x87, 0x58, 0x60, 0x19, 0x02, 0x03,
+ 0x01, 0x00, 0x01, 0xa3, 0x81, 0xfe, 0x30, 0x81, 0xfb, 0x30,
+ 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04,
+ 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02, 0x01, 0x00, 0x30,
+ 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02,
+ 0x01, 0x06, 0x30, 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01,
+ 0x86, 0xf8, 0x42, 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x01,
+ 0x06, 0x30, 0x28, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x21,
+ 0x30, 0x1f, 0xa4, 0x1d, 0x30, 0x1b, 0x31, 0x19, 0x30, 0x17,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x10, 0x50, 0x72, 0x69,
+ 0x76, 0x61, 0x74, 0x65, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x33,
+ 0x2d, 0x31, 0x35, 0x30, 0x31, 0x06, 0x03, 0x55, 0x1d, 0x1f,
+ 0x04, 0x2a, 0x30, 0x28, 0x30, 0x26, 0xa0, 0x24, 0xa0, 0x22,
+ 0x86, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63,
+ 0x72, 0x6c, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69, 0x67,
+ 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x63, 0x61, 0x33,
+ 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x32, 0x06, 0x08, 0x2b, 0x06,
+ 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x26, 0x30, 0x24,
+ 0x30, 0x22, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
+ 0x30, 0x01, 0x86, 0x16, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x6f, 0x63, 0x73, 0x70, 0x2e, 0x74, 0x68, 0x61, 0x77,
+ 0x74, 0x65, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x34, 0x06, 0x03,
+ 0x55, 0x1d, 0x25, 0x04, 0x2d, 0x30, 0x2b, 0x06, 0x08, 0x2b,
+ 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b,
+ 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x02, 0x06, 0x09, 0x60,
+ 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x04, 0x01, 0x06, 0x0a,
+ 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x45, 0x01, 0x08, 0x01,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x55,
+ 0xac, 0x63, 0xea, 0xde, 0xa1, 0xdd, 0xd2, 0x90, 0x5f, 0x9f,
+ 0x0b, 0xce, 0x76, 0xbe, 0x13, 0x51, 0x8f, 0x93, 0xd9, 0x05,
+ 0x2b, 0xc8, 0x1b, 0x77, 0x4b, 0xad, 0x69, 0x50, 0xa1, 0xee,
+ 0xde, 0xdc, 0xfd, 0xdb, 0x07, 0xe9, 0xe8, 0x39, 0x94, 0xdc,
+ 0xab, 0x72, 0x79, 0x2f, 0x06, 0xbf, 0xab, 0x81, 0x70, 0xc4,
+ 0xa8, 0xed, 0xea, 0x53, 0x34, 0xed, 0xef, 0x1e, 0x53, 0xd9,
+ 0x06, 0xc7, 0x56, 0x2b, 0xd1, 0x5c, 0xf4, 0xd1, 0x8a, 0x8e,
+ 0xb4, 0x2b, 0xb1, 0x37, 0x90, 0x48, 0x08, 0x42, 0x25, 0xc5,
+ 0x3e, 0x8a, 0xcb, 0x7f, 0xeb, 0x6f, 0x04, 0xd1, 0x6d, 0xc5,
+ 0x74, 0xa2, 0xf7, 0xa2, 0x7c, 0x7b, 0x60, 0x3c, 0x77, 0xcd,
+ 0x0e, 0xce, 0x48, 0x02, 0x7f, 0x01, 0x2f, 0xb6, 0x9b, 0x37,
+ 0xe0, 0x2a, 0x2a, 0x36, 0xdc, 0xd5, 0x85, 0xd6, 0xac, 0xe5,
+ 0x3f, 0x54, 0x6f, 0x96, 0x1e, 0x05, 0xaf ),
+ FINGERPRINT ( 0x10, 0x85, 0xa6, 0xf4, 0x54, 0xd0, 0xc9, 0x11,
+ 0x98, 0xfd, 0xda, 0xb1, 0x1a, 0x31, 0xc7, 0x16,
+ 0xd5, 0xdc, 0xd6, 0x8d, 0xf9, 0x1c, 0x03, 0x9c,
+ 0xe1, 0x8d, 0xca, 0x9b, 0xeb, 0x3c, 0xde, 0x3d ) );
+
+/*
+ * subject StartCom Class 2 Primary Intermediate Server CA
+ * issuer StartCom Certification Authority
+ */
+CERTIFICATE ( startssl_crt,
+ DATA ( 0x30, 0x82, 0x07, 0xe3, 0x30, 0x82, 0x05, 0xcb, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x01, 0x0b, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
+ 0x00, 0x30, 0x7d, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c, 0x31, 0x16, 0x30, 0x14,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x53, 0x74, 0x61,
+ 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x4c, 0x74, 0x64, 0x2e,
+ 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,
+ 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x44, 0x69,
+ 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x69,
+ 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x31, 0x29, 0x30, 0x27, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x53, 0x74, 0x61, 0x72,
+ 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x65, 0x72, 0x74, 0x69,
+ 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x41,
+ 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x30, 0x1e,
+ 0x17, 0x0d, 0x30, 0x37, 0x31, 0x30, 0x32, 0x34, 0x32, 0x30,
+ 0x35, 0x37, 0x30, 0x38, 0x5a, 0x17, 0x0d, 0x31, 0x32, 0x31,
+ 0x30, 0x32, 0x32, 0x32, 0x30, 0x35, 0x37, 0x30, 0x38, 0x5a,
+ 0x30, 0x81, 0x8c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c, 0x31, 0x16, 0x30, 0x14,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x53, 0x74, 0x61,
+ 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x4c, 0x74, 0x64, 0x2e,
+ 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,
+ 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x44, 0x69,
+ 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x69,
+ 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x31, 0x38, 0x30, 0x36, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x13, 0x2f, 0x53, 0x74, 0x61, 0x72,
+ 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73,
+ 0x20, 0x32, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,
+ 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69,
+ 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x20, 0x43, 0x41, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,
+ 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xe2, 0x4f, 0x39, 0x2f,
+ 0xa1, 0x8c, 0x9a, 0x85, 0xad, 0x08, 0x0e, 0x08, 0x3e, 0x57,
+ 0xf2, 0x88, 0x01, 0x21, 0x1b, 0x94, 0xa9, 0x6c, 0xe2, 0xb8,
+ 0xdb, 0xaa, 0x19, 0x18, 0x46, 0x3a, 0x52, 0xa1, 0xf5, 0x0f,
+ 0xf4, 0x6e, 0x8c, 0xea, 0x96, 0x8c, 0x96, 0x87, 0x79, 0x13,
+ 0x40, 0x51, 0x2f, 0x22, 0xf2, 0x0c, 0x8b, 0x87, 0x0f, 0x65,
+ 0xdf, 0x71, 0x74, 0x34, 0x43, 0x55, 0xb1, 0x35, 0x09, 0x9b,
+ 0xd9, 0xbc, 0x1f, 0xfa, 0xeb, 0x42, 0xd0, 0x97, 0x40, 0x72,
+ 0xb7, 0x43, 0x96, 0x3d, 0xba, 0x96, 0x9d, 0x5d, 0x50, 0x02,
+ 0x1c, 0x9b, 0x91, 0x8d, 0x9c, 0xc0, 0xac, 0xd7, 0xbb, 0x2f,
+ 0x17, 0xd7, 0xcb, 0x3e, 0x82, 0x9d, 0x73, 0xeb, 0x07, 0x42,
+ 0x92, 0xb2, 0xcd, 0x64, 0xb3, 0x74, 0x55, 0x1b, 0xb4, 0x4b,
+ 0x86, 0x21, 0x2c, 0xf7, 0x78, 0x87, 0x32, 0xe0, 0x16, 0xe4,
+ 0xda, 0xbd, 0x4c, 0x95, 0xea, 0xa4, 0x0a, 0x7e, 0xb6, 0x0a,
+ 0x0d, 0x2e, 0x8a, 0xcf, 0x55, 0xab, 0xc3, 0xe5, 0xdd, 0x41,
+ 0x8a, 0x4e, 0xe6, 0x6f, 0x65, 0x6c, 0xb2, 0x40, 0xcf, 0x17,
+ 0x5d, 0xb9, 0xc3, 0x6a, 0x0b, 0x27, 0x11, 0x84, 0x77, 0x61,
+ 0xf6, 0xc2, 0x7c, 0xed, 0xc0, 0x8d, 0x78, 0x14, 0x18, 0x99,
+ 0x81, 0x99, 0x75, 0x63, 0xb7, 0xe8, 0x53, 0xd3, 0xba, 0x61,
+ 0xe9, 0x0e, 0xfa, 0xa2, 0x30, 0xf3, 0x46, 0xa2, 0xb9, 0xc9,
+ 0x1f, 0x6c, 0x80, 0x5a, 0x40, 0xac, 0x27, 0xed, 0x48, 0x47,
+ 0x33, 0xb0, 0x54, 0xc6, 0x46, 0x1a, 0xf3, 0x35, 0x61, 0xc1,
+ 0x02, 0x29, 0x90, 0x54, 0x7e, 0x64, 0x4d, 0xc4, 0x30, 0x52,
+ 0x02, 0x82, 0xd7, 0xdf, 0xce, 0x21, 0x6e, 0x18, 0x91, 0xd7,
+ 0xb8, 0xab, 0x8c, 0x27, 0x17, 0xb5, 0xf0, 0xa3, 0x01, 0x2f,
+ 0x8e, 0xd2, 0x2e, 0x87, 0x3a, 0x3d, 0xb4, 0x29, 0x67, 0x8a,
+ 0xc4, 0x03, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x03,
+ 0x5c, 0x30, 0x82, 0x03, 0x58, 0x30, 0x0c, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30,
+ 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02,
+ 0x01, 0xa6, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04,
+ 0x16, 0x04, 0x14, 0x11, 0xdb, 0x23, 0x45, 0xfd, 0x54, 0xcc,
+ 0x6a, 0x71, 0x6f, 0x84, 0x8a, 0x03, 0xd7, 0xbe, 0xf7, 0x01,
+ 0x2f, 0x26, 0x86, 0x30, 0x81, 0xa8, 0x06, 0x03, 0x55, 0x1d,
+ 0x23, 0x04, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x80, 0x14, 0x4e,
+ 0x0b, 0xef, 0x1a, 0xa4, 0x40, 0x5b, 0xa5, 0x17, 0x69, 0x87,
+ 0x30, 0xca, 0x34, 0x68, 0x43, 0xd0, 0x41, 0xae, 0xf2, 0xa1,
+ 0x81, 0x81, 0xa4, 0x7f, 0x30, 0x7d, 0x31, 0x0b, 0x30, 0x09,
+ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c, 0x31,
+ 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d,
+ 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x4c,
+ 0x74, 0x64, 0x2e, 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x13, 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65,
+ 0x20, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43,
+ 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
+ 0x20, 0x53, 0x69, 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x31, 0x29,
+ 0x30, 0x27, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x20, 0x53,
+ 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x65,
+ 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x74,
+ 0x79, 0x82, 0x01, 0x01, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d,
+ 0x12, 0x04, 0x02, 0x30, 0x00, 0x30, 0x3d, 0x06, 0x08, 0x2b,
+ 0x06, 0x01, 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x31, 0x30,
+ 0x2f, 0x30, 0x2d, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05,
+ 0x07, 0x30, 0x02, 0x86, 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a,
+ 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x73, 0x74, 0x61, 0x72,
+ 0x74, 0x73, 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73,
+ 0x66, 0x73, 0x63, 0x61, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x60,
+ 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x59, 0x30, 0x57, 0x30,
+ 0x2c, 0xa0, 0x2a, 0xa0, 0x28, 0x86, 0x26, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x73, 0x66, 0x73, 0x63, 0x61, 0x2d, 0x63, 0x72,
+ 0x6c, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x27, 0xa0, 0x25, 0xa0,
+ 0x23, 0x86, 0x21, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x63, 0x72, 0x6c, 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73,
+ 0x73, 0x6c, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x73, 0x66, 0x73,
+ 0x63, 0x61, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x82, 0x01, 0x5d,
+ 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x82, 0x01, 0x54, 0x30,
+ 0x82, 0x01, 0x50, 0x30, 0x82, 0x01, 0x4c, 0x06, 0x0b, 0x2b,
+ 0x06, 0x01, 0x04, 0x01, 0x81, 0xb5, 0x37, 0x01, 0x01, 0x04,
+ 0x30, 0x82, 0x01, 0x3b, 0x30, 0x2f, 0x06, 0x08, 0x2b, 0x06,
+ 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x23, 0x68, 0x74,
+ 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x2e,
+ 0x73, 0x74, 0x61, 0x72, 0x74, 0x63, 0x6f, 0x6d, 0x2e, 0x6f,
+ 0x72, 0x67, 0x2f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e,
+ 0x70, 0x64, 0x66, 0x30, 0x35, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x29, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x73,
+ 0x74, 0x61, 0x72, 0x74, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72,
+ 0x67, 0x2f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64,
+ 0x69, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x64, 0x66, 0x30, 0x81,
+ 0xd0, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02,
+ 0x02, 0x30, 0x81, 0xc3, 0x30, 0x27, 0x16, 0x20, 0x53, 0x74,
+ 0x61, 0x72, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72,
+ 0x63, 0x69, 0x61, 0x6c, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72,
+ 0x74, 0x43, 0x6f, 0x6d, 0x29, 0x20, 0x4c, 0x74, 0x64, 0x2e,
+ 0x30, 0x03, 0x02, 0x01, 0x01, 0x1a, 0x81, 0x97, 0x4c, 0x69,
+ 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x4c, 0x69, 0x61, 0x62,
+ 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2c, 0x20, 0x72, 0x65, 0x61,
+ 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x65, 0x63, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x4c, 0x65, 0x67, 0x61, 0x6c,
+ 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f,
+ 0x6e, 0x73, 0x2a, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65,
+ 0x20, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20,
+ 0x43, 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74,
+ 0x69, 0x6f, 0x6e, 0x20, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72,
+ 0x69, 0x74, 0x79, 0x20, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79,
+ 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65,
+ 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f,
+ 0x2f, 0x63, 0x65, 0x72, 0x74, 0x2e, 0x73, 0x74, 0x61, 0x72,
+ 0x74, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x70,
+ 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x2e, 0x70, 0x64, 0x66, 0x30,
+ 0x11, 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42,
+ 0x01, 0x01, 0x04, 0x04, 0x03, 0x02, 0x00, 0x07, 0x30, 0x51,
+ 0x06, 0x09, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8, 0x42, 0x01,
+ 0x0d, 0x04, 0x44, 0x16, 0x42, 0x53, 0x74, 0x61, 0x72, 0x74,
+ 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20,
+ 0x32, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x20,
+ 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61,
+ 0x74, 0x65, 0x20, 0x46, 0x72, 0x65, 0x65, 0x20, 0x53, 0x53,
+ 0x4c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43,
+ 0x65, 0x72, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65,
+ 0x73, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x02, 0x01,
+ 0x00, 0x64, 0x82, 0x4c, 0x59, 0x5c, 0x0c, 0x6c, 0x16, 0xb6,
+ 0xa2, 0x39, 0x45, 0x11, 0x87, 0x98, 0xdf, 0x10, 0x33, 0xae,
+ 0x42, 0x9e, 0x25, 0xd1, 0xfd, 0x70, 0x53, 0x45, 0x5e, 0xf4,
+ 0x35, 0xc0, 0xe4, 0x30, 0x77, 0xe0, 0x9c, 0xf7, 0xef, 0x27,
+ 0xe5, 0x6e, 0x28, 0xef, 0xac, 0xd7, 0xf3, 0x16, 0xcc, 0xc1,
+ 0x6c, 0x53, 0x9c, 0x8f, 0x2d, 0x82, 0x6f, 0x94, 0xf7, 0x14,
+ 0x36, 0x17, 0xae, 0xb2, 0xe5, 0xa2, 0x3f, 0xa2, 0x83, 0x73,
+ 0xa4, 0xdf, 0xa8, 0xbb, 0xca, 0x01, 0x31, 0x6c, 0x9a, 0x43,
+ 0x08, 0xdd, 0x1a, 0x5d, 0xad, 0x4b, 0x6d, 0x7f, 0xf4, 0x7e,
+ 0xf0, 0x12, 0x3a, 0x05, 0xbf, 0xa7, 0x44, 0x10, 0x07, 0x17,
+ 0x44, 0x93, 0x50, 0xe3, 0x95, 0x29, 0xb3, 0xf4, 0x13, 0xd2,
+ 0x40, 0xe0, 0x3e, 0xdf, 0x3d, 0x3d, 0x39, 0x5e, 0x81, 0x48,
+ 0x0f, 0x32, 0xba, 0x48, 0xd5, 0x03, 0x1b, 0xf5, 0xf7, 0x4e,
+ 0x0a, 0x8e, 0x03, 0x8d, 0xfc, 0xca, 0x87, 0xe6, 0xc9, 0xdf,
+ 0x26, 0xdf, 0x84, 0x3a, 0x49, 0xb1, 0x99, 0x55, 0x3f, 0xd4,
+ 0x2c, 0xab, 0x78, 0x0d, 0x62, 0x03, 0x15, 0x9f, 0xb1, 0x45,
+ 0x4b, 0x23, 0x78, 0x62, 0x2a, 0xee, 0xeb, 0x7b, 0x60, 0x2d,
+ 0x77, 0x72, 0x1e, 0x61, 0x24, 0x69, 0x62, 0xe8, 0xe1, 0x35,
+ 0x3c, 0x82, 0x02, 0x40, 0x15, 0x32, 0x4b, 0x57, 0xcd, 0x97,
+ 0xb9, 0x29, 0x8f, 0xa4, 0xd7, 0x84, 0xdb, 0x09, 0xe5, 0x35,
+ 0x5b, 0x2f, 0x60, 0x59, 0x49, 0xe9, 0xd6, 0x59, 0xf5, 0xfa,
+ 0x5d, 0xc8, 0xcd, 0x4d, 0x94, 0x70, 0xc4, 0xe8, 0x3c, 0x35,
+ 0x01, 0x06, 0x75, 0xe8, 0x71, 0x9b, 0x7f, 0x2b, 0x10, 0xca,
+ 0x6b, 0x3f, 0xc0, 0xb3, 0x97, 0x72, 0xda, 0xff, 0x74, 0x16,
+ 0x8e, 0xfb, 0xfb, 0x9b, 0xe4, 0x05, 0xf0, 0x98, 0xe7, 0x15,
+ 0xac, 0xca, 0x24, 0xa2, 0xe7, 0x8a, 0xb4, 0xcf, 0x72, 0x31,
+ 0x2b, 0xe3, 0x31, 0x0e, 0x30, 0x5f, 0xd5, 0xcb, 0x94, 0xb3,
+ 0xee, 0x35, 0x04, 0xd3, 0x45, 0x07, 0x09, 0x14, 0x51, 0x8a,
+ 0xf5, 0x07, 0x31, 0x5e, 0x13, 0x2f, 0x5d, 0x0c, 0xd9, 0xd7,
+ 0x36, 0xa8, 0xb0, 0x52, 0x37, 0x94, 0xc2, 0x75, 0x9c, 0x5a,
+ 0x2e, 0xa8, 0xd1, 0xb0, 0x73, 0x6b, 0x69, 0xda, 0x0c, 0x3a,
+ 0xd6, 0x11, 0x6b, 0xac, 0x9d, 0xbc, 0x45, 0x32, 0x05, 0xe8,
+ 0x89, 0x77, 0xd5, 0xb7, 0xbe, 0xc0, 0xed, 0xcd, 0xcd, 0x4e,
+ 0x6d, 0x28, 0x58, 0x0a, 0xf0, 0xb4, 0x51, 0xc8, 0xcd, 0x86,
+ 0xd1, 0x89, 0x23, 0xc5, 0x23, 0xed, 0xcf, 0x10, 0xf9, 0x0e,
+ 0x6e, 0xd8, 0xc1, 0xd7, 0x3f, 0x80, 0xfa, 0xa6, 0x2a, 0x47,
+ 0xc4, 0xdb, 0x07, 0x16, 0xe7, 0x0b, 0x8b, 0x53, 0x97, 0x11,
+ 0x2e, 0xa3, 0x61, 0x27, 0xb3, 0xbb, 0x4a, 0xd7, 0x01, 0x6d,
+ 0xb1, 0x71, 0xa5, 0xe5, 0x23, 0xd6, 0xda, 0xa1, 0xa8, 0x55,
+ 0x26, 0xaf, 0xb7, 0xba, 0x5e, 0x56, 0x2d, 0x3d, 0x10, 0xa3,
+ 0x71, 0x4a, 0x93, 0x45, 0x1c, 0x7a, 0x3c, 0x92, 0x2a, 0x69,
+ 0x3f, 0x4f, 0x1e, 0x96, 0x99, 0x90, 0x09, 0xc8, 0x01, 0xbf,
+ 0x28, 0x34, 0xb2, 0x7d, 0x11, 0x50, 0x59, 0xd0, 0x9b, 0xe3,
+ 0x33, 0x56, 0x65, 0xee, 0x98, 0x97, 0x3f, 0x3e, 0x54, 0x69,
+ 0x2d, 0x26, 0x2e, 0x03, 0x2b, 0xa0, 0xbe, 0xab, 0x6b, 0x80,
+ 0x20, 0xe1, 0x3a, 0x4b, 0xbb, 0x26, 0xbe, 0xab, 0xab, 0xa5,
+ 0x39, 0xb1, 0x9a, 0x49, 0xa6, 0xb4, 0x5b, 0x96, 0x66, 0xe2,
+ 0x49, 0x0b, 0x70, 0x02, 0xaa, 0x49, 0x49, 0x61, 0x0e, 0xfe,
+ 0xae, 0xf5, 0xa5, 0x96, 0xe7, 0xf6, 0xba, 0x6c, 0x89, 0x9f,
+ 0x0e, 0x72, 0xec, 0xfb, 0x45, 0x00, 0x87, 0x8f, 0x2c, 0xe7,
+ 0x7f, 0xb2, 0xc5, 0xa5, 0x52, 0xbe, 0x03, 0xfa, 0x31, 0x2a,
+ 0x02, 0x6a, 0xf8 ),
+ FINGERPRINT ( 0x9f, 0xd1, 0x93, 0xd3, 0x8f, 0x95, 0x30, 0xab,
+ 0x55, 0xa5, 0xc1, 0xb3, 0x51, 0x4a, 0x1d, 0x64,
+ 0x1c, 0xec, 0xc2, 0x1c, 0xc5, 0xc2, 0xf5, 0x67,
+ 0x48, 0xa7, 0x11, 0x01, 0x69, 0x83, 0xfd, 0x8e ) );
+
+/*
+ * subject RapidSSL SHA256 CA - G3
+ * issuer GeoTrust Global CA
+ */
+CERTIFICATE ( rapidssl_crt,
+ DATA ( 0x30, 0x82, 0x04, 0x25, 0x30, 0x82, 0x03, 0x0d, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x03, 0x02, 0x3a, 0x77, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x0b, 0x05, 0x00, 0x30, 0x42, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16,
+ 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47,
+ 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e,
+ 0x63, 0x2e, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x13, 0x12, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73,
+ 0x74, 0x20, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x20, 0x43,
+ 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x38, 0x32,
+ 0x39, 0x32, 0x31, 0x33, 0x39, 0x33, 0x32, 0x5a, 0x17, 0x0d,
+ 0x32, 0x32, 0x30, 0x35, 0x32, 0x30, 0x32, 0x31, 0x33, 0x39,
+ 0x33, 0x32, 0x5a, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16,
+ 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47,
+ 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e,
+ 0x63, 0x2e, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x13, 0x17, 0x52, 0x61, 0x70, 0x69, 0x64, 0x53, 0x53,
+ 0x4c, 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x43,
+ 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, 0x82, 0x01, 0x22,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00,
+ 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0xaf,
+ 0x54, 0x9b, 0xd9, 0x58, 0x5d, 0x1e, 0x2c, 0x56, 0xc6, 0xd5,
+ 0xe8, 0x7f, 0xf4, 0x7d, 0x16, 0x03, 0xff, 0xd0, 0x8b, 0x5a,
+ 0xe4, 0x8e, 0xa7, 0xdd, 0x54, 0x2e, 0xd4, 0x04, 0xc0, 0x5d,
+ 0x98, 0x9c, 0x8d, 0x90, 0x0f, 0xbc, 0x10, 0x65, 0x5f, 0xda,
+ 0x9a, 0xd6, 0x44, 0x7c, 0xc0, 0x9f, 0xb5, 0xe9, 0x4a, 0x8c,
+ 0x0b, 0x06, 0x43, 0x04, 0xbb, 0xf4, 0x96, 0xe2, 0x26, 0xf6,
+ 0x61, 0x01, 0x91, 0x66, 0x31, 0x22, 0xc3, 0x34, 0x34, 0x5f,
+ 0x3f, 0x3f, 0x91, 0x2f, 0x44, 0x5f, 0xdc, 0xc7, 0x14, 0xb6,
+ 0x03, 0x9f, 0x86, 0x4b, 0x0e, 0xa3, 0xff, 0xa0, 0x80, 0x02,
+ 0x83, 0xc3, 0xd3, 0x1f, 0x69, 0x52, 0xd6, 0x9d, 0x64, 0x0f,
+ 0xc9, 0x83, 0xe7, 0x1b, 0xc4, 0x70, 0xac, 0x94, 0xe7, 0xc3,
+ 0xa4, 0x6a, 0x2c, 0xbd, 0xb8, 0x9e, 0x69, 0xd8, 0xbe, 0x0a,
+ 0x8f, 0x16, 0x63, 0x5a, 0x68, 0x71, 0x80, 0x7b, 0x30, 0xde,
+ 0x15, 0x04, 0xbf, 0xcc, 0xd3, 0xbf, 0x3e, 0x48, 0x05, 0x55,
+ 0x7a, 0xb3, 0xd7, 0x10, 0x0c, 0x03, 0xfc, 0x9b, 0xfd, 0x08,
+ 0xa7, 0x8c, 0x8c, 0xdb, 0xa7, 0x8e, 0xf1, 0x1e, 0x63, 0xdc,
+ 0xb3, 0x01, 0x2f, 0x7f, 0xaf, 0x57, 0xc3, 0x3c, 0x48, 0xa7,
+ 0x83, 0x68, 0x21, 0xa7, 0x2f, 0xe7, 0xa7, 0x3f, 0xf0, 0xb5,
+ 0x0c, 0xfc, 0xf5, 0x84, 0xd1, 0x53, 0xbc, 0x0e, 0x72, 0x4f,
+ 0x60, 0x0c, 0x42, 0xb8, 0x98, 0xad, 0x19, 0x88, 0x57, 0xd7,
+ 0x04, 0xec, 0x87, 0xbf, 0x7e, 0x87, 0x4e, 0xa3, 0x21, 0xf9,
+ 0x53, 0xfd, 0x36, 0x98, 0x48, 0x8d, 0xd6, 0xf8, 0xbb, 0x48,
+ 0xf2, 0x29, 0xc8, 0x64, 0xd1, 0xcc, 0x54, 0x48, 0x53, 0x8b,
+ 0xaf, 0xb7, 0x65, 0x1e, 0xbf, 0x29, 0x33, 0x29, 0xd9, 0x29,
+ 0x60, 0x48, 0xf8, 0xff, 0x91, 0xbc, 0x57, 0x58, 0xe5, 0x35,
+ 0x2e, 0xbb, 0x69, 0xb6, 0x59, 0x02, 0x03, 0x01, 0x00, 0x01,
+ 0xa3, 0x82, 0x01, 0x1d, 0x30, 0x82, 0x01, 0x19, 0x30, 0x1f,
+ 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80,
+ 0x14, 0xc0, 0x7a, 0x98, 0x68, 0x8d, 0x89, 0xfb, 0xab, 0x05,
+ 0x64, 0x0c, 0x11, 0x7d, 0xaa, 0x7d, 0x65, 0xb8, 0xca, 0xcc,
+ 0x4e, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16,
+ 0x04, 0x14, 0xc3, 0x9c, 0xf3, 0xfc, 0xd3, 0x46, 0x08, 0x34,
+ 0xbb, 0xce, 0x46, 0x7f, 0xa0, 0x7c, 0x5b, 0xf3, 0xe2, 0x08,
+ 0xcb, 0x59, 0x30, 0x12, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01,
+ 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01, 0x01, 0xff, 0x02,
+ 0x01, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,
+ 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x01, 0x06, 0x30, 0x35,
+ 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x2e, 0x30, 0x2c, 0x30,
+ 0x2a, 0xa0, 0x28, 0xa0, 0x26, 0x86, 0x24, 0x68, 0x74, 0x74,
+ 0x70, 0x3a, 0x2f, 0x2f, 0x67, 0x2e, 0x73, 0x79, 0x6d, 0x63,
+ 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x72, 0x6c, 0x73,
+ 0x2f, 0x67, 0x74, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x2e,
+ 0x63, 0x72, 0x6c, 0x30, 0x2e, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x01, 0x01, 0x04, 0x22, 0x30, 0x20, 0x30,
+ 0x1e, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30,
+ 0x01, 0x86, 0x12, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f,
+ 0x67, 0x2e, 0x73, 0x79, 0x6d, 0x63, 0x64, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x30, 0x4c, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x45,
+ 0x30, 0x43, 0x30, 0x41, 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01,
+ 0x86, 0xf8, 0x45, 0x01, 0x07, 0x36, 0x30, 0x33, 0x30, 0x31,
+ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01,
+ 0x16, 0x25, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77,
+ 0x77, 0x77, 0x2e, 0x67, 0x65, 0x6f, 0x74, 0x72, 0x75, 0x73,
+ 0x74, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x6f,
+ 0x75, 0x72, 0x63, 0x65, 0x73, 0x2f, 0x63, 0x70, 0x73, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00, 0xa3,
+ 0x58, 0x1e, 0xc6, 0x43, 0x32, 0xac, 0xac, 0x2f, 0x93, 0x78,
+ 0xb7, 0xea, 0xae, 0x54, 0x40, 0x47, 0x2d, 0x7e, 0x78, 0x8d,
+ 0x50, 0xf6, 0xf8, 0x66, 0xac, 0xd6, 0x4f, 0x73, 0xd6, 0x44,
+ 0xef, 0xaf, 0x0b, 0xcc, 0x5b, 0xc1, 0xf4, 0x4f, 0x9a, 0x8f,
+ 0x49, 0x7e, 0x60, 0xaf, 0xc2, 0x27, 0xc7, 0x16, 0xf1, 0xfb,
+ 0x93, 0x81, 0x90, 0xa9, 0x7c, 0xef, 0x6f, 0x7e, 0x6e, 0x45,
+ 0x94, 0x16, 0x84, 0xbd, 0xec, 0x49, 0xf1, 0xc4, 0x0e, 0xf4,
+ 0xaf, 0x04, 0x59, 0x83, 0x87, 0x0f, 0x2c, 0x3b, 0x97, 0xc3,
+ 0x5a, 0x12, 0x9b, 0x7b, 0x04, 0x35, 0x7b, 0xa3, 0x95, 0x33,
+ 0x08, 0x7b, 0x93, 0x71, 0x22, 0x42, 0xb3, 0xa9, 0xd9, 0x6f,
+ 0x4f, 0x81, 0x92, 0xfc, 0x07, 0xb6, 0x79, 0xbc, 0x84, 0x4a,
+ 0x9d, 0x77, 0x09, 0xf1, 0xc5, 0x89, 0xf2, 0xf0, 0xb4, 0x9c,
+ 0x54, 0xaa, 0x12, 0x7b, 0x0d, 0xba, 0x4f, 0xef, 0x93, 0x19,
+ 0xec, 0xef, 0x7d, 0x4e, 0x61, 0xa3, 0x8e, 0x76, 0x9c, 0x59,
+ 0xcf, 0x8c, 0x94, 0xb1, 0x84, 0x97, 0xf7, 0x1a, 0xb9, 0x07,
+ 0xb8, 0xb2, 0xc6, 0x4f, 0x13, 0x79, 0xdb, 0xbf, 0x4f, 0x51,
+ 0x1b, 0x7f, 0x69, 0x0d, 0x51, 0x2a, 0xc1, 0xd6, 0x15, 0xff,
+ 0x37, 0x51, 0x34, 0x65, 0x51, 0xf4, 0x1e, 0xbe, 0x38, 0x6a,
+ 0xec, 0x0e, 0xab, 0xbf, 0x3d, 0x7b, 0x39, 0x05, 0x7b, 0xf4,
+ 0xf3, 0xfb, 0x1a, 0xa1, 0xd0, 0xc8, 0x7e, 0x4e, 0x64, 0x8d,
+ 0xcd, 0x8c, 0x61, 0x55, 0x90, 0xfe, 0x3a, 0xca, 0x5d, 0x25,
+ 0x0f, 0xf8, 0x1d, 0xa3, 0x4a, 0x74, 0x56, 0x4f, 0x1a, 0x55,
+ 0x40, 0x70, 0x75, 0x25, 0xa6, 0x33, 0x2e, 0xba, 0x4b, 0xa5,
+ 0x5d, 0x53, 0x9a, 0x0d, 0x30, 0xe1, 0x8d, 0x5f, 0x61, 0x2c,
+ 0xaf, 0xcc, 0xef, 0xb0, 0x99, 0xa1, 0x80, 0xff, 0x0b, 0xf2,
+ 0x62, 0x4c, 0x70, 0x26, 0x98 ),
+ FINGERPRINT ( 0xbc, 0x3f, 0x03, 0xa4, 0x36, 0x24, 0x0e, 0xdb,
+ 0xa5, 0xf8, 0x37, 0x14, 0xf6, 0xf6, 0x77, 0xe3,
+ 0x4b, 0x37, 0xf9, 0xb1, 0xf0, 0xc0, 0x8c, 0x1e,
+ 0x55, 0x8d, 0x98, 0x1e, 0x27, 0x9e, 0x82, 0x09 ) );
+
+/*
+ * subject *.vultr.com
+ * issuer RapidSSL SHA256 CA - G3
+ */
+CERTIFICATE ( vultr_crt,
+ DATA ( 0x30, 0x82, 0x04, 0xa8, 0x30, 0x82, 0x03, 0x90, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x03, 0x00, 0x95, 0x4d, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x0b, 0x05, 0x00, 0x30, 0x47, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x16,
+ 0x30, 0x14, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x47,
+ 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x49, 0x6e,
+ 0x63, 0x2e, 0x31, 0x20, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x13, 0x17, 0x52, 0x61, 0x70, 0x69, 0x64, 0x53, 0x53,
+ 0x4c, 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36, 0x20, 0x43,
+ 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17, 0x0d,
+ 0x31, 0x34, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x33, 0x31,
+ 0x32, 0x38, 0x5a, 0x17, 0x0d, 0x31, 0x37, 0x31, 0x32, 0x32,
+ 0x32, 0x31, 0x39, 0x32, 0x39, 0x31, 0x30, 0x5a, 0x30, 0x81,
+ 0x8f, 0x31, 0x13, 0x30, 0x11, 0x06, 0x03, 0x55, 0x04, 0x0b,
+ 0x13, 0x0a, 0x47, 0x54, 0x36, 0x32, 0x30, 0x37, 0x39, 0x37,
+ 0x32, 0x31, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04,
+ 0x0b, 0x13, 0x28, 0x53, 0x65, 0x65, 0x20, 0x77, 0x77, 0x77,
+ 0x2e, 0x72, 0x61, 0x70, 0x69, 0x64, 0x73, 0x73, 0x6c, 0x2e,
+ 0x63, 0x6f, 0x6d, 0x2f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72,
+ 0x63, 0x65, 0x73, 0x2f, 0x63, 0x70, 0x73, 0x20, 0x28, 0x63,
+ 0x29, 0x31, 0x33, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x13, 0x26, 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e,
+ 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x20, 0x56,
+ 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x64, 0x20, 0x2d,
+ 0x20, 0x52, 0x61, 0x70, 0x69, 0x64, 0x53, 0x53, 0x4c, 0x28,
+ 0x52, 0x29, 0x31, 0x14, 0x30, 0x12, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x0b, 0x2a, 0x2e, 0x76, 0x75, 0x6c, 0x74, 0x72,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82,
+ 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x9f, 0xa8, 0x2e,
+ 0x65, 0x41, 0x05, 0xec, 0xef, 0x69, 0x92, 0xf6, 0xd3, 0x53,
+ 0x4f, 0xd4, 0x8e, 0xd3, 0x49, 0x8c, 0xc7, 0x85, 0x6d, 0xb0,
+ 0x71, 0xe0, 0x28, 0x04, 0x80, 0x85, 0x82, 0x3e, 0x3f, 0xdb,
+ 0x0c, 0xed, 0xcd, 0x2b, 0x04, 0xc8, 0x67, 0x15, 0x8c, 0x25,
+ 0xd6, 0x7a, 0x54, 0x67, 0x94, 0xbe, 0x33, 0x12, 0x33, 0x88,
+ 0xfe, 0x5d, 0x1d, 0x36, 0x62, 0x4e, 0xbc, 0x1e, 0x7e, 0xd3,
+ 0x3e, 0x7c, 0x3c, 0x59, 0x4a, 0x99, 0x0b, 0xca, 0x9b, 0x1e,
+ 0xc7, 0xf7, 0xe7, 0x6d, 0xdc, 0x57, 0xbe, 0x3a, 0xab, 0xc2,
+ 0x0b, 0xb1, 0xbe, 0x90, 0xa1, 0x54, 0x07, 0xc5, 0x48, 0x65,
+ 0xc1, 0x32, 0x99, 0x92, 0x26, 0x97, 0x90, 0x3e, 0x68, 0x6b,
+ 0xac, 0xbd, 0x4f, 0x0e, 0x88, 0x38, 0xd3, 0xdc, 0x80, 0x9e,
+ 0xb9, 0x66, 0x5d, 0xeb, 0x19, 0xfd, 0x85, 0xff, 0xba, 0xf0,
+ 0x89, 0x20, 0x08, 0xea, 0xd8, 0x01, 0x76, 0x29, 0xdc, 0xf0,
+ 0x1c, 0xfa, 0xbf, 0x6f, 0x7b, 0x67, 0xf4, 0xc4, 0xee, 0xe3,
+ 0xde, 0x95, 0xa2, 0x76, 0x65, 0x98, 0xc5, 0x21, 0xdc, 0xe9,
+ 0x95, 0xee, 0x83, 0x97, 0xae, 0xdd, 0xab, 0xdb, 0xc0, 0x47,
+ 0xc8, 0x68, 0x00, 0xb3, 0xab, 0x11, 0x4f, 0x81, 0xf5, 0x45,
+ 0x01, 0xd1, 0x64, 0xfd, 0x53, 0xbf, 0x86, 0xef, 0x87, 0xca,
+ 0x8e, 0x55, 0xa0, 0x27, 0x27, 0xe5, 0x9e, 0xc1, 0x69, 0x28,
+ 0x2a, 0x9f, 0x2d, 0xe2, 0x2c, 0x25, 0xef, 0x74, 0x1b, 0x52,
+ 0xe4, 0x81, 0xf4, 0xc2, 0x71, 0x0a, 0x48, 0xff, 0x47, 0xa5,
+ 0xea, 0x0a, 0xf5, 0xb1, 0x6d, 0xae, 0x09, 0x2b, 0xf9, 0x23,
+ 0x6a, 0x28, 0x58, 0x3d, 0xbb, 0x9f, 0x80, 0xb2, 0x81, 0x03,
+ 0xae, 0xe5, 0xea, 0xbe, 0x97, 0xae, 0xec, 0x3c, 0x33, 0xc7,
+ 0x68, 0xf0, 0x6c, 0x89, 0x9d, 0x01, 0x2a, 0x1e, 0x2b, 0xd7,
+ 0x93, 0x5a, 0xa9, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82,
+ 0x01, 0x52, 0x30, 0x82, 0x01, 0x4e, 0x30, 0x1f, 0x06, 0x03,
+ 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xc3,
+ 0x9c, 0xf3, 0xfc, 0xd3, 0x46, 0x08, 0x34, 0xbb, 0xce, 0x46,
+ 0x7f, 0xa0, 0x7c, 0x5b, 0xf3, 0xe2, 0x08, 0xcb, 0x59, 0x30,
+ 0x57, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x01,
+ 0x01, 0x04, 0x4b, 0x30, 0x49, 0x30, 0x1f, 0x06, 0x08, 0x2b,
+ 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x86, 0x13, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x67, 0x76, 0x2e, 0x73,
+ 0x79, 0x6d, 0x63, 0x64, 0x2e, 0x63, 0x6f, 0x6d, 0x30, 0x26,
+ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x02,
+ 0x86, 0x1a, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x67,
+ 0x76, 0x2e, 0x73, 0x79, 0x6d, 0x63, 0x62, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x67, 0x76, 0x2e, 0x63, 0x72, 0x74, 0x30, 0x0e,
+ 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04,
+ 0x03, 0x02, 0x05, 0xa0, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d,
+ 0x25, 0x04, 0x16, 0x30, 0x14, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x03, 0x01, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x03, 0x02, 0x30, 0x21, 0x06, 0x03, 0x55,
+ 0x1d, 0x11, 0x04, 0x1a, 0x30, 0x18, 0x82, 0x0b, 0x2a, 0x2e,
+ 0x76, 0x75, 0x6c, 0x74, 0x72, 0x2e, 0x63, 0x6f, 0x6d, 0x82,
+ 0x09, 0x76, 0x75, 0x6c, 0x74, 0x72, 0x2e, 0x63, 0x6f, 0x6d,
+ 0x30, 0x2b, 0x06, 0x03, 0x55, 0x1d, 0x1f, 0x04, 0x24, 0x30,
+ 0x22, 0x30, 0x20, 0xa0, 0x1e, 0xa0, 0x1c, 0x86, 0x1a, 0x68,
+ 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x67, 0x76, 0x2e, 0x73,
+ 0x79, 0x6d, 0x63, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67,
+ 0x76, 0x2e, 0x63, 0x72, 0x6c, 0x30, 0x0c, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00, 0x30,
+ 0x45, 0x06, 0x03, 0x55, 0x1d, 0x20, 0x04, 0x3e, 0x30, 0x3c,
+ 0x30, 0x3a, 0x06, 0x0a, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
+ 0x45, 0x01, 0x07, 0x36, 0x30, 0x2c, 0x30, 0x2a, 0x06, 0x08,
+ 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01, 0x16, 0x1e,
+ 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77,
+ 0x77, 0x2e, 0x72, 0x61, 0x70, 0x69, 0x64, 0x73, 0x73, 0x6c,
+ 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x65, 0x67, 0x61, 0x6c,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,
+ 0x93, 0x63, 0x02, 0x6a, 0xa1, 0x2a, 0xf3, 0xbe, 0x64, 0x2b,
+ 0x36, 0xaf, 0x66, 0x16, 0x49, 0x29, 0x56, 0x6c, 0xc7, 0x75,
+ 0x74, 0xf3, 0x69, 0xd8, 0x85, 0xce, 0x50, 0x3b, 0x43, 0x89,
+ 0xaf, 0x74, 0x99, 0x26, 0x34, 0xa4, 0x27, 0xa8, 0xfa, 0xfe,
+ 0x45, 0xaf, 0xbe, 0x75, 0x22, 0x3d, 0x15, 0xca, 0xa6, 0x38,
+ 0xc9, 0x2b, 0x3c, 0xf4, 0x11, 0x9f, 0x96, 0xa7, 0x69, 0x3e,
+ 0xf8, 0xf0, 0x88, 0xd8, 0xd2, 0x9c, 0x1c, 0x0e, 0x4c, 0xfd,
+ 0xf3, 0x3b, 0x48, 0x25, 0x68, 0xb3, 0x8d, 0x7e, 0x26, 0x73,
+ 0x73, 0xcb, 0x3a, 0x41, 0x92, 0x16, 0x55, 0xe1, 0xff, 0x00,
+ 0x07, 0xa2, 0xfe, 0xfe, 0x25, 0xfc, 0x86, 0x0f, 0x49, 0xff,
+ 0x96, 0x78, 0x02, 0x65, 0xd7, 0xad, 0xcd, 0x0c, 0x82, 0x35,
+ 0x56, 0xfe, 0x12, 0x25, 0xa9, 0x8f, 0xc2, 0xa4, 0xe9, 0x43,
+ 0xbb, 0x85, 0x62, 0x21, 0x62, 0x5d, 0x70, 0x76, 0x79, 0x75,
+ 0xeb, 0xd6, 0x82, 0x53, 0x0d, 0xde, 0x77, 0x95, 0x56, 0x87,
+ 0x44, 0x13, 0x82, 0x7d, 0xa9, 0x9a, 0x94, 0x7e, 0x1c, 0x6d,
+ 0x7f, 0x72, 0xef, 0x04, 0x84, 0xdf, 0x65, 0x98, 0x17, 0xb4,
+ 0xbe, 0xfe, 0x30, 0x0f, 0xfa, 0x8d, 0x9f, 0x29, 0x1d, 0xbd,
+ 0x99, 0xa7, 0xe3, 0x09, 0x1d, 0x13, 0x21, 0xfd, 0x9e, 0x03,
+ 0x17, 0xb9, 0x9e, 0x48, 0x35, 0x66, 0xe5, 0x86, 0x0a, 0x0f,
+ 0x04, 0xfd, 0xcd, 0x3b, 0x13, 0x59, 0xd6, 0x0c, 0x05, 0x8c,
+ 0xd2, 0x6b, 0x5c, 0x45, 0x33, 0x43, 0x91, 0xac, 0xb8, 0xdd,
+ 0xe3, 0xbe, 0xdf, 0x7b, 0x5c, 0x94, 0xa9, 0xfd, 0xc0, 0xf8,
+ 0xa9, 0xd2, 0x82, 0xcd, 0xbf, 0x60, 0xd7, 0xf8, 0x3d, 0x53,
+ 0xf7, 0x6a, 0xdc, 0x46, 0xc4, 0x22, 0x84, 0x98, 0x6a, 0x32,
+ 0xf2, 0xdf, 0x43, 0xd9, 0x5a, 0xdb, 0x97, 0x20, 0x05, 0x0b,
+ 0x3e, 0x06, 0x38, 0x13, 0x3a, 0x21 ),
+ FINGERPRINT ( 0x2c, 0x58, 0x63, 0x6e, 0xf1, 0xab, 0x8f, 0xff,
+ 0x86, 0x5d, 0x4f, 0x8d, 0x3f, 0xa9, 0x4d, 0x63,
+ 0xe7, 0xe6, 0xc6, 0x03, 0x1e, 0xc9, 0x0e, 0xfb,
+ 0xe8, 0xaa, 0xa6, 0xf4, 0x6f, 0x21, 0xc7, 0x7b ) );
+
+OCSP ( barclays_ocsp, &barclays_crt, &verisign_crt,
+ DATA ( 0x30, 0x51, 0x30, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0x30, 0x49,
+ 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
+ 0x00, 0x04, 0x14, 0xd4, 0xb4, 0x3b, 0x8e, 0x3d, 0x02, 0x49,
+ 0x1a, 0x65, 0x50, 0x6f, 0x96, 0x73, 0x14, 0xdd, 0xe8, 0x59,
+ 0x44, 0x52, 0xe4, 0x04, 0x14, 0xd7, 0x9b, 0x7c, 0xd8, 0x22,
+ 0xa0, 0x15, 0xf7, 0xdd, 0xad, 0x5f, 0xce, 0x29, 0x9b, 0x58,
+ 0xc3, 0xbc, 0x46, 0x00, 0xb5, 0x02, 0x10, 0x49, 0x83, 0xfc,
+ 0x05, 0x76, 0xdf, 0x36, 0x91, 0x7c, 0x64, 0x2a, 0x27, 0xc1,
+ 0xf1, 0x48, 0xe3 ),
+ DATA ( 0x30, 0x82, 0x06, 0x4d, 0x0a, 0x01, 0x00, 0xa0, 0x82, 0x06,
+ 0x46, 0x30, 0x82, 0x06, 0x42, 0x06, 0x09, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x30, 0x01, 0x01, 0x04, 0x82, 0x06, 0x33,
+ 0x30, 0x82, 0x06, 0x2f, 0x30, 0x82, 0x01, 0x1f, 0xa0, 0x03,
+ 0x02, 0x01, 0x00, 0xa1, 0x81, 0x91, 0x30, 0x81, 0x8e, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
+ 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65,
+ 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75,
+ 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x3c, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20,
+ 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x49, 0x6e,
+ 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61,
+ 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x43,
+ 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x20, 0x4f, 0x43, 0x53,
+ 0x50, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65,
+ 0x72, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x32, 0x30, 0x35, 0x31,
+ 0x34, 0x31, 0x34, 0x30, 0x31, 0x34, 0x31, 0x5a, 0x30, 0x73,
+ 0x30, 0x71, 0x30, 0x49, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e,
+ 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0xd4, 0xb4, 0x3b,
+ 0x8e, 0x3d, 0x02, 0x49, 0x1a, 0x65, 0x50, 0x6f, 0x96, 0x73,
+ 0x14, 0xdd, 0xe8, 0x59, 0x44, 0x52, 0xe4, 0x04, 0x14, 0xd7,
+ 0x9b, 0x7c, 0xd8, 0x22, 0xa0, 0x15, 0xf7, 0xdd, 0xad, 0x5f,
+ 0xce, 0x29, 0x9b, 0x58, 0xc3, 0xbc, 0x46, 0x00, 0xb5, 0x02,
+ 0x10, 0x49, 0x83, 0xfc, 0x05, 0x76, 0xdf, 0x36, 0x91, 0x7c,
+ 0x64, 0x2a, 0x27, 0xc1, 0xf1, 0x48, 0xe3, 0x80, 0x00, 0x18,
+ 0x0f, 0x32, 0x30, 0x31, 0x32, 0x30, 0x35, 0x31, 0x34, 0x31,
+ 0x34, 0x30, 0x31, 0x34, 0x31, 0x5a, 0xa0, 0x11, 0x18, 0x0f,
+ 0x32, 0x30, 0x31, 0x32, 0x30, 0x35, 0x32, 0x31, 0x31, 0x34,
+ 0x30, 0x31, 0x34, 0x31, 0x5a, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x03, 0x81, 0x81, 0x00, 0x78, 0xa8, 0xe7, 0xdc, 0xaf, 0xf2,
+ 0x8b, 0xc2, 0x9f, 0x99, 0xf9, 0x44, 0x84, 0xa8, 0x8a, 0x2c,
+ 0x35, 0xd7, 0x91, 0xd8, 0x44, 0x3e, 0xd6, 0xe0, 0xc6, 0x3f,
+ 0xbf, 0xe3, 0x71, 0x22, 0x45, 0x5a, 0x73, 0xf4, 0x59, 0x1b,
+ 0x4c, 0xa5, 0x51, 0x21, 0x5c, 0xfa, 0xbe, 0x10, 0xcb, 0x5f,
+ 0xb0, 0x2f, 0xef, 0x22, 0x89, 0xf6, 0xc7, 0x0f, 0x7c, 0x6d,
+ 0x26, 0xbe, 0x83, 0x99, 0xe2, 0x02, 0xf5, 0x95, 0x6e, 0xca,
+ 0xd9, 0x6d, 0xdd, 0xc2, 0xf0, 0xf2, 0x4f, 0x99, 0x66, 0x93,
+ 0x6e, 0x2e, 0xcf, 0xc5, 0xab, 0x68, 0x5f, 0xde, 0x52, 0x3d,
+ 0xf2, 0x23, 0x9d, 0xe8, 0x99, 0xd5, 0xf4, 0x4f, 0x8a, 0xf3,
+ 0xfd, 0x99, 0xa3, 0xe3, 0x12, 0x56, 0xd1, 0x54, 0xf1, 0xe1,
+ 0x24, 0xa0, 0xce, 0xeb, 0x80, 0xb6, 0xde, 0x44, 0xa8, 0xef,
+ 0xb1, 0xfc, 0x9c, 0x76, 0xbb, 0x1f, 0x17, 0x40, 0xbe, 0x2a,
+ 0xc8, 0x12, 0xa0, 0x82, 0x04, 0x75, 0x30, 0x82, 0x04, 0x71,
+ 0x30, 0x82, 0x04, 0x6d, 0x30, 0x82, 0x03, 0x55, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x10, 0x68, 0x8e, 0x69, 0x1f, 0x05,
+ 0x02, 0x11, 0x40, 0x45, 0x8e, 0xf0, 0x39, 0x24, 0x07, 0xcf,
+ 0xd6, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0xbc, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67,
+ 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13, 0x16, 0x56, 0x65,
+ 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20, 0x54, 0x72, 0x75,
+ 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b,
+ 0x31, 0x3b, 0x30, 0x39, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,
+ 0x32, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x20, 0x6f, 0x66, 0x20,
+ 0x75, 0x73, 0x65, 0x20, 0x61, 0x74, 0x20, 0x68, 0x74, 0x74,
+ 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77, 0x2e, 0x76,
+ 0x65, 0x72, 0x69, 0x73, 0x69, 0x67, 0x6e, 0x2e, 0x63, 0x6f,
+ 0x6d, 0x2f, 0x72, 0x70, 0x61, 0x20, 0x28, 0x63, 0x29, 0x31,
+ 0x30, 0x31, 0x36, 0x30, 0x34, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x13, 0x2d, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e,
+ 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33, 0x20, 0x49,
+ 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e,
+ 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
+ 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x30, 0x1e, 0x17,
+ 0x0d, 0x31, 0x32, 0x30, 0x33, 0x31, 0x33, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x36,
+ 0x31, 0x31, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30,
+ 0x81, 0x8e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
+ 0x06, 0x13, 0x02, 0x55, 0x53, 0x31, 0x17, 0x30, 0x15, 0x06,
+ 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0e, 0x56, 0x65, 0x72, 0x69,
+ 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e, 0x63, 0x2e,
+ 0x31, 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,
+ 0x16, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x20,
+ 0x54, 0x72, 0x75, 0x73, 0x74, 0x20, 0x4e, 0x65, 0x74, 0x77,
+ 0x6f, 0x72, 0x6b, 0x31, 0x45, 0x30, 0x43, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x13, 0x3c, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69,
+ 0x67, 0x6e, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x33,
+ 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69,
+ 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65,
+ 0x72, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x20,
+ 0x4f, 0x43, 0x53, 0x50, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x64, 0x65, 0x72, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
+ 0x81, 0x81, 0x00, 0xa4, 0x3c, 0x3c, 0x43, 0xd3, 0x33, 0x14,
+ 0x0a, 0xb4, 0x5e, 0x25, 0x03, 0x6d, 0x60, 0x6c, 0x2f, 0xc9,
+ 0x33, 0x11, 0xe6, 0x79, 0xd9, 0x8c, 0x4a, 0x05, 0x60, 0xad,
+ 0x16, 0x8b, 0x23, 0x67, 0x8b, 0x1a, 0xaf, 0x84, 0xc3, 0xbb,
+ 0x6b, 0xcf, 0x9e, 0xf7, 0x65, 0x6d, 0x04, 0x97, 0xca, 0x12,
+ 0x96, 0x0b, 0x30, 0x7f, 0x0d, 0x6e, 0x7f, 0x81, 0x49, 0x53,
+ 0xf3, 0xcb, 0x5c, 0x00, 0xd8, 0x6d, 0xf9, 0x03, 0xf4, 0x23,
+ 0xd6, 0xd2, 0x9e, 0x8c, 0xca, 0x41, 0xfd, 0xa1, 0x02, 0x20,
+ 0xc8, 0x70, 0xb0, 0xfb, 0xaa, 0x1b, 0x33, 0x1e, 0x64, 0x30,
+ 0x70, 0x36, 0xed, 0x7b, 0xac, 0xe8, 0x64, 0xd9, 0x79, 0xa8,
+ 0x48, 0x20, 0x02, 0xdd, 0x8c, 0x02, 0x6f, 0x87, 0x2f, 0xad,
+ 0x29, 0x99, 0x8e, 0x15, 0x2c, 0xd1, 0xe0, 0x64, 0x82, 0x24,
+ 0x77, 0x31, 0xee, 0xb8, 0x68, 0xd1, 0x02, 0x32, 0xfb, 0xf0,
+ 0xcd, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x82, 0x01, 0x19,
+ 0x30, 0x82, 0x01, 0x15, 0x30, 0x09, 0x06, 0x03, 0x55, 0x1d,
+ 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x81, 0xac, 0x06, 0x03,
+ 0x55, 0x1d, 0x20, 0x04, 0x81, 0xa4, 0x30, 0x81, 0xa1, 0x30,
+ 0x81, 0x9e, 0x06, 0x0b, 0x60, 0x86, 0x48, 0x01, 0x86, 0xf8,
+ 0x45, 0x01, 0x07, 0x17, 0x03, 0x30, 0x81, 0x8e, 0x30, 0x28,
+ 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x02, 0x01,
+ 0x16, 0x1c, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,
+ 0x77, 0x77, 0x77, 0x2e, 0x76, 0x65, 0x72, 0x69, 0x73, 0x69,
+ 0x67, 0x6e, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x43, 0x50, 0x53,
+ 0x30, 0x62, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
+ 0x02, 0x02, 0x30, 0x56, 0x30, 0x15, 0x16, 0x0e, 0x56, 0x65,
+ 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x2c, 0x20, 0x49, 0x6e,
+ 0x63, 0x2e, 0x30, 0x03, 0x02, 0x01, 0x01, 0x1a, 0x3d, 0x56,
+ 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e, 0x27, 0x73, 0x20,
+ 0x43, 0x50, 0x53, 0x20, 0x69, 0x6e, 0x63, 0x6f, 0x72, 0x70,
+ 0x2e, 0x20, 0x62, 0x79, 0x20, 0x72, 0x65, 0x66, 0x65, 0x72,
+ 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6c, 0x69, 0x61, 0x62, 0x2e,
+ 0x20, 0x6c, 0x74, 0x64, 0x2e, 0x20, 0x28, 0x63, 0x29, 0x39,
+ 0x37, 0x20, 0x56, 0x65, 0x72, 0x69, 0x53, 0x69, 0x67, 0x6e,
+ 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30,
+ 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x03,
+ 0x09, 0x30, 0x0b, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04,
+ 0x03, 0x02, 0x07, 0x80, 0x30, 0x0f, 0x06, 0x09, 0x2b, 0x06,
+ 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x05, 0x04, 0x02, 0x05,
+ 0x00, 0x30, 0x26, 0x06, 0x03, 0x55, 0x1d, 0x11, 0x04, 0x1f,
+ 0x30, 0x1d, 0xa4, 0x1b, 0x30, 0x19, 0x31, 0x17, 0x30, 0x15,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x0e, 0x4f, 0x43, 0x53,
+ 0x50, 0x38, 0x2d, 0x54, 0x47, 0x56, 0x37, 0x2d, 0x32, 0x38,
+ 0x35, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01,
+ 0x00, 0x3b, 0xce, 0xd6, 0xa6, 0x61, 0x41, 0x3d, 0xb2, 0xc4,
+ 0x75, 0x00, 0x45, 0xf9, 0x3c, 0x2f, 0x2e, 0x4a, 0x8b, 0xfb,
+ 0x9c, 0xff, 0x15, 0xcb, 0x28, 0x65, 0xde, 0xc6, 0x97, 0xd8,
+ 0x85, 0x32, 0xa2, 0xfe, 0x74, 0x2d, 0xed, 0x34, 0xf8, 0x3c,
+ 0x15, 0xac, 0xfe, 0x72, 0x7f, 0x8c, 0x0e, 0x24, 0xdd, 0xb2,
+ 0x80, 0x55, 0xbd, 0x10, 0x0d, 0xa8, 0xb6, 0xf3, 0xe0, 0x98,
+ 0x8f, 0x24, 0x0b, 0xa0, 0x9d, 0x2c, 0x05, 0x20, 0x13, 0x4d,
+ 0x0b, 0x15, 0x2d, 0x1a, 0x02, 0x76, 0x0a, 0x5a, 0xb2, 0xb9,
+ 0xce, 0x6f, 0xb8, 0xc1, 0xec, 0xc4, 0xde, 0x46, 0xe4, 0xec,
+ 0x32, 0x05, 0x2d, 0xca, 0xb1, 0x4c, 0x59, 0x41, 0x13, 0x47,
+ 0x44, 0x9a, 0x55, 0x20, 0x26, 0xcc, 0x0d, 0x66, 0xb2, 0xd1,
+ 0x76, 0x87, 0x74, 0x73, 0xea, 0x5e, 0xe9, 0x49, 0xaf, 0x57,
+ 0x9c, 0xa6, 0x3d, 0xe5, 0x2c, 0x28, 0x21, 0xe5, 0x0a, 0x80,
+ 0xae, 0x99, 0x44, 0xe9, 0x83, 0x78, 0x7e, 0x24, 0xb5, 0xfa,
+ 0x50, 0x9d, 0x32, 0x55, 0x70, 0x73, 0xaf, 0x10, 0x92, 0xd3,
+ 0x14, 0xd3, 0x69, 0xfa, 0xa6, 0x81, 0x5c, 0xba, 0x9d, 0x18,
+ 0x25, 0xda, 0x78, 0x47, 0x33, 0x83, 0xd1, 0xc3, 0x96, 0x12,
+ 0x6f, 0x8b, 0xc9, 0x98, 0x32, 0x79, 0x59, 0x76, 0xcb, 0x56,
+ 0x7f, 0x5e, 0x6d, 0x1e, 0x78, 0xb2, 0xd0, 0x39, 0x3c, 0x41,
+ 0xd7, 0xab, 0x77, 0x2a, 0x0e, 0xbb, 0xc8, 0x69, 0xae, 0xfd,
+ 0x9c, 0x20, 0x11, 0xba, 0x0a, 0x5d, 0x00, 0x58, 0xf8, 0x74,
+ 0xb0, 0x77, 0x36, 0x9b, 0x8e, 0xd5, 0x4d, 0x85, 0xb1, 0xbb,
+ 0xcd, 0xcb, 0x1d, 0xee, 0x08, 0xb9, 0x53, 0x9a, 0x5f, 0xe3,
+ 0x88, 0xb1, 0x1a, 0xc3, 0x41, 0x41, 0x3e, 0x06, 0xf7, 0x70,
+ 0x58, 0xe8, 0x22, 0x22, 0xd7, 0x0e, 0xbb, 0x88, 0xce, 0x73,
+ 0x0e, 0xd0, 0x04, 0x81, 0x50, 0xd2, 0x33 ) );
+
+OCSP ( google_ocsp, &google_crt, &thawte_crt,
+ DATA ( 0x30, 0x51, 0x30, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0x30, 0x49,
+ 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
+ 0x00, 0x04, 0x14, 0x1e, 0x92, 0x09, 0xaa, 0x71, 0x3c, 0x79,
+ 0x4b, 0xca, 0x1e, 0x93, 0x1a, 0x0a, 0x61, 0xad, 0x3f, 0xd0,
+ 0xba, 0x60, 0x83, 0x04, 0x14, 0x3b, 0x34, 0x9a, 0x70, 0x91,
+ 0x73, 0xb2, 0x8a, 0x1b, 0x0c, 0xf4, 0xe9, 0x37, 0xcd, 0xb3,
+ 0x70, 0x32, 0x9e, 0x18, 0x54, 0x02, 0x10, 0x4f, 0x9d, 0x96,
+ 0xd9, 0x66, 0xb0, 0x99, 0x2b, 0x54, 0xc2, 0x95, 0x7c, 0xb4,
+ 0x15, 0x7d, 0x4d ),
+ DATA ( 0x30, 0x82, 0x04, 0x38, 0x0a, 0x01, 0x00, 0xa0, 0x82, 0x04,
+ 0x31, 0x30, 0x82, 0x04, 0x2d, 0x06, 0x09, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x30, 0x01, 0x01, 0x04, 0x82, 0x04, 0x1e,
+ 0x30, 0x82, 0x04, 0x1a, 0x30, 0x81, 0xe7, 0xa0, 0x03, 0x02,
+ 0x01, 0x00, 0xa1, 0x5a, 0x30, 0x58, 0x31, 0x0b, 0x30, 0x09,
+ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x5a, 0x41, 0x31,
+ 0x25, 0x30, 0x23, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x1c,
+ 0x54, 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x43, 0x6f, 0x6e,
+ 0x73, 0x75, 0x6c, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x28, 0x50,
+ 0x74, 0x79, 0x29, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x31, 0x22,
+ 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x19, 0x54,
+ 0x68, 0x61, 0x77, 0x74, 0x65, 0x20, 0x53, 0x47, 0x43, 0x20,
+ 0x4f, 0x43, 0x53, 0x50, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f,
+ 0x6e, 0x64, 0x65, 0x72, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x32,
+ 0x30, 0x35, 0x31, 0x32, 0x31, 0x39, 0x33, 0x31, 0x34, 0x33,
+ 0x5a, 0x30, 0x73, 0x30, 0x71, 0x30, 0x49, 0x30, 0x09, 0x06,
+ 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14,
+ 0x1e, 0x92, 0x09, 0xaa, 0x71, 0x3c, 0x79, 0x4b, 0xca, 0x1e,
+ 0x93, 0x1a, 0x0a, 0x61, 0xad, 0x3f, 0xd0, 0xba, 0x60, 0x83,
+ 0x04, 0x14, 0x3b, 0x34, 0x9a, 0x70, 0x91, 0x73, 0xb2, 0x8a,
+ 0x1b, 0x0c, 0xf4, 0xe9, 0x37, 0xcd, 0xb3, 0x70, 0x32, 0x9e,
+ 0x18, 0x54, 0x02, 0x10, 0x4f, 0x9d, 0x96, 0xd9, 0x66, 0xb0,
+ 0x99, 0x2b, 0x54, 0xc2, 0x95, 0x7c, 0xb4, 0x15, 0x7d, 0x4d,
+ 0x80, 0x00, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x32, 0x30, 0x35,
+ 0x31, 0x32, 0x31, 0x39, 0x33, 0x31, 0x34, 0x33, 0x5a, 0xa0,
+ 0x11, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x32, 0x30, 0x35, 0x31,
+ 0x39, 0x31, 0x39, 0x33, 0x31, 0x34, 0x33, 0x5a, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x57, 0xf9, 0xf8,
+ 0x26, 0x0f, 0xda, 0x0c, 0xc2, 0xf0, 0xe4, 0x80, 0xd0, 0x29,
+ 0xd6, 0x04, 0x77, 0xab, 0x0c, 0xf6, 0x7e, 0x77, 0xc9, 0xac,
+ 0x53, 0xa4, 0x4d, 0x6b, 0x75, 0x58, 0xb9, 0xc7, 0x7a, 0x9a,
+ 0x39, 0x5d, 0x4c, 0xfd, 0x15, 0x1b, 0x47, 0x55, 0x8e, 0x39,
+ 0x05, 0x2b, 0x06, 0x2f, 0x3e, 0x1d, 0x3a, 0x7c, 0x2c, 0xf4,
+ 0x4c, 0x70, 0x6a, 0x58, 0x7a, 0x4b, 0x8f, 0x77, 0xaf, 0x9e,
+ 0xcf, 0xc6, 0xb1, 0x66, 0x8d, 0xed, 0xbf, 0xc1, 0xd9, 0xe1,
+ 0x78, 0x5a, 0x18, 0x61, 0xca, 0xa8, 0xf5, 0x2b, 0xe3, 0x9b,
+ 0x50, 0x25, 0x60, 0x7d, 0x8d, 0xd1, 0xe0, 0x76, 0xbb, 0x5c,
+ 0x7b, 0xc1, 0x5d, 0xe1, 0x27, 0x3f, 0x7f, 0x9b, 0xb3, 0xb0,
+ 0xb2, 0x79, 0x37, 0xd4, 0x53, 0x29, 0x62, 0x46, 0x8f, 0xe6,
+ 0x34, 0x9e, 0xe5, 0x6e, 0x63, 0x5d, 0xcc, 0xb3, 0xb2, 0xe2,
+ 0x73, 0x7e, 0xa6, 0xad, 0xa0, 0xa0, 0x82, 0x02, 0x99, 0x30,
+ 0x82, 0x02, 0x95, 0x30, 0x82, 0x02, 0x91, 0x30, 0x82, 0x01,
+ 0xfa, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x10, 0x67, 0x4d,
+ 0x9b, 0x61, 0x8f, 0x57, 0xcd, 0x51, 0xfb, 0x58, 0x07, 0x66,
+ 0x1d, 0x24, 0xf5, 0xa5, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,
+ 0x4c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
+ 0x13, 0x02, 0x5a, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x54, 0x68, 0x61, 0x77, 0x74,
+ 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x28, 0x50, 0x74, 0x79, 0x29, 0x20, 0x4c,
+ 0x74, 0x64, 0x2e, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x13, 0x0d, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65,
+ 0x20, 0x53, 0x47, 0x43, 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17,
+ 0x0d, 0x31, 0x32, 0x30, 0x33, 0x30, 0x34, 0x30, 0x30, 0x30,
+ 0x30, 0x30, 0x30, 0x5a, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x36,
+ 0x30, 0x32, 0x32, 0x33, 0x35, 0x39, 0x35, 0x39, 0x5a, 0x30,
+ 0x58, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
+ 0x13, 0x02, 0x5a, 0x41, 0x31, 0x25, 0x30, 0x23, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x13, 0x1c, 0x54, 0x68, 0x61, 0x77, 0x74,
+ 0x65, 0x20, 0x43, 0x6f, 0x6e, 0x73, 0x75, 0x6c, 0x74, 0x69,
+ 0x6e, 0x67, 0x20, 0x28, 0x50, 0x74, 0x79, 0x29, 0x20, 0x4c,
+ 0x74, 0x64, 0x2e, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55,
+ 0x04, 0x03, 0x13, 0x19, 0x54, 0x68, 0x61, 0x77, 0x74, 0x65,
+ 0x20, 0x53, 0x47, 0x43, 0x20, 0x4f, 0x43, 0x53, 0x50, 0x20,
+ 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x30,
+ 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d,
+ 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xc2, 0x21,
+ 0x52, 0xe2, 0x10, 0x44, 0xe3, 0xc7, 0xe3, 0x72, 0x19, 0x01,
+ 0xa8, 0x0c, 0x5a, 0x8b, 0x63, 0x0b, 0x30, 0x4c, 0x4f, 0xa2,
+ 0xe2, 0xdf, 0x62, 0x2e, 0xdf, 0xe2, 0x77, 0xb9, 0x27, 0x3b,
+ 0x8d, 0x45, 0xe2, 0xa1, 0x21, 0x95, 0x13, 0x5a, 0xf2, 0x7d,
+ 0x58, 0x2c, 0x6d, 0x53, 0xb2, 0x42, 0x52, 0x8f, 0x8e, 0xf4,
+ 0x17, 0xc5, 0xcb, 0xfa, 0x2f, 0x2d, 0x9b, 0x02, 0xd0, 0x1a,
+ 0xf1, 0x32, 0xc5, 0xb9, 0xd3, 0x5a, 0xc0, 0xd6, 0x20, 0xb8,
+ 0x3f, 0xa3, 0x93, 0x8b, 0xe5, 0x22, 0x91, 0x1a, 0x7e, 0x7c,
+ 0x8b, 0x35, 0xeb, 0x94, 0xee, 0xe6, 0xcc, 0x58, 0xe4, 0x3c,
+ 0xcd, 0x00, 0x86, 0xaa, 0xc3, 0x2e, 0x8b, 0xb4, 0x3c, 0x29,
+ 0x11, 0x21, 0x5d, 0x71, 0x4a, 0xb6, 0x7a, 0x22, 0xa9, 0xf2,
+ 0xf8, 0x90, 0xed, 0x5c, 0x73, 0x8c, 0xe0, 0x70, 0x56, 0xde,
+ 0x70, 0xc5, 0x0d, 0x81, 0xb4, 0x5b, 0x02, 0x03, 0x01, 0x00,
+ 0x01, 0xa3, 0x68, 0x30, 0x66, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x13, 0x06, 0x03,
+ 0x55, 0x1d, 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b,
+ 0x06, 0x01, 0x05, 0x05, 0x07, 0x03, 0x09, 0x30, 0x0b, 0x06,
+ 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x07, 0x80,
+ 0x30, 0x0f, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
+ 0x30, 0x01, 0x05, 0x04, 0x02, 0x05, 0x00, 0x30, 0x26, 0x06,
+ 0x03, 0x55, 0x1d, 0x11, 0x04, 0x1f, 0x30, 0x1d, 0xa4, 0x1b,
+ 0x30, 0x19, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x13, 0x0e, 0x4f, 0x43, 0x53, 0x50, 0x38, 0x2d, 0x54,
+ 0x47, 0x56, 0x37, 0x2d, 0x32, 0x37, 0x35, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05,
+ 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x98, 0x50, 0x14, 0xbe,
+ 0x31, 0x44, 0x01, 0x97, 0xee, 0x21, 0xf9, 0xcf, 0xa4, 0x32,
+ 0xc2, 0x91, 0x6a, 0x4b, 0x02, 0x61, 0x62, 0xa9, 0xe4, 0xad,
+ 0x8a, 0xac, 0xe4, 0x12, 0x12, 0xbe, 0x9b, 0xba, 0x4c, 0xe2,
+ 0x92, 0xdb, 0x8b, 0x92, 0x11, 0xe6, 0x9e, 0x25, 0x2e, 0xd5,
+ 0x4b, 0xe8, 0x5d, 0xc8, 0x63, 0xd2, 0xff, 0xfa, 0x80, 0x89,
+ 0x83, 0x0f, 0xe4, 0xe2, 0x91, 0xcc, 0x0a, 0x85, 0x74, 0x38,
+ 0xb7, 0xdf, 0xb9, 0x1c, 0xf6, 0x35, 0xfe, 0x6f, 0xf3, 0x29,
+ 0xc0, 0xc5, 0x0a, 0x2c, 0x04, 0xd7, 0x69, 0xff, 0x02, 0x45,
+ 0x1c, 0x29, 0x7a, 0x27, 0xf8, 0xb2, 0xe3, 0x58, 0x09, 0x34,
+ 0xc4, 0xd7, 0x77, 0x74, 0xbd, 0xe4, 0x7c, 0xda, 0x99, 0x09,
+ 0x83, 0x03, 0x6c, 0x36, 0x0d, 0xb2, 0x91, 0x71, 0x40, 0xc7,
+ 0x97, 0x85, 0xfb, 0x2a, 0xa3, 0x92, 0x65, 0x0b, 0x02, 0x58,
+ 0x14, 0x89, 0x8f, 0x3b ) );
+
+OCSP ( unauthorized_ocsp, &barclays_crt, &thawte_crt,
+ DATA ( 0x30, 0x51, 0x30, 0x4f, 0x30, 0x4d, 0x30, 0x4b, 0x30, 0x49,
+ 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
+ 0x00, 0x04, 0x14, 0xd4, 0xb4, 0x3b, 0x8e, 0x3d, 0x02, 0x49,
+ 0x1a, 0x65, 0x50, 0x6f, 0x96, 0x73, 0x14, 0xdd, 0xe8, 0x59,
+ 0x44, 0x52, 0xe4, 0x04, 0x14, 0x3b, 0x34, 0x9a, 0x70, 0x91,
+ 0x73, 0xb2, 0x8a, 0x1b, 0x0c, 0xf4, 0xe9, 0x37, 0xcd, 0xb3,
+ 0x70, 0x32, 0x9e, 0x18, 0x54, 0x02, 0x10, 0x49, 0x83, 0xfc,
+ 0x05, 0x76, 0xdf, 0x36, 0x91, 0x7c, 0x64, 0x2a, 0x27, 0xc1,
+ 0xf1, 0x48, 0xe3 ),
+ DATA ( 0x30, 0x03, 0x0a, 0x01, 0x06 ) );
+
+OCSP ( unknown_ocsp, &thawte_crt, &startssl_crt,
+ DATA ( 0x30, 0x45, 0x30, 0x43, 0x30, 0x41, 0x30, 0x3f, 0x30, 0x3d,
+ 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
+ 0x00, 0x04, 0x14, 0x48, 0xb7, 0x64, 0x49, 0xf3, 0xd5, 0xfe,
+ 0xfa, 0x11, 0x33, 0xaa, 0x80, 0x5e, 0x42, 0x0f, 0x0f, 0xca,
+ 0x64, 0x36, 0x51, 0x04, 0x14, 0x11, 0xdb, 0x23, 0x45, 0xfd,
+ 0x54, 0xcc, 0x6a, 0x71, 0x6f, 0x84, 0x8a, 0x03, 0xd7, 0xbe,
+ 0xf7, 0x01, 0x2f, 0x26, 0x86, 0x02, 0x04, 0x30, 0x00, 0x00,
+ 0x02 ),
+ DATA ( 0x30, 0x82, 0x06, 0x46, 0x0a, 0x01, 0x00, 0xa0, 0x82, 0x06,
+ 0x3f, 0x30, 0x82, 0x06, 0x3b, 0x06, 0x09, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x30, 0x01, 0x01, 0x04, 0x82, 0x06, 0x2c,
+ 0x30, 0x82, 0x06, 0x28, 0x30, 0x81, 0xec, 0xa1, 0x70, 0x30,
+ 0x6e, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06,
+ 0x13, 0x02, 0x49, 0x4c, 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x13, 0x28, 0x53, 0x74, 0x61, 0x72, 0x74,
+ 0x43, 0x6f, 0x6d, 0x20, 0x4c, 0x74, 0x64, 0x2e, 0x20, 0x28,
+ 0x53, 0x74, 0x61, 0x72, 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d,
+ 0x65, 0x72, 0x63, 0x69, 0x61, 0x6c, 0x20, 0x4c, 0x69, 0x6d,
+ 0x69, 0x74, 0x65, 0x64, 0x29, 0x31, 0x2c, 0x30, 0x2a, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x13, 0x23, 0x53, 0x74, 0x61, 0x72,
+ 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73,
+ 0x20, 0x32, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x20,
+ 0x4f, 0x43, 0x53, 0x50, 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65,
+ 0x72, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x32, 0x30, 0x35, 0x31,
+ 0x35, 0x31, 0x31, 0x35, 0x34, 0x30, 0x38, 0x5a, 0x30, 0x67,
+ 0x30, 0x65, 0x30, 0x3d, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e,
+ 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x48, 0xb7, 0x64,
+ 0x49, 0xf3, 0xd5, 0xfe, 0xfa, 0x11, 0x33, 0xaa, 0x80, 0x5e,
+ 0x42, 0x0f, 0x0f, 0xca, 0x64, 0x36, 0x51, 0x04, 0x14, 0x11,
+ 0xdb, 0x23, 0x45, 0xfd, 0x54, 0xcc, 0x6a, 0x71, 0x6f, 0x84,
+ 0x8a, 0x03, 0xd7, 0xbe, 0xf7, 0x01, 0x2f, 0x26, 0x86, 0x02,
+ 0x04, 0x30, 0x00, 0x00, 0x02, 0x82, 0x00, 0x18, 0x0f, 0x32,
+ 0x30, 0x31, 0x32, 0x30, 0x35, 0x31, 0x35, 0x31, 0x31, 0x35,
+ 0x34, 0x30, 0x38, 0x5a, 0xa0, 0x11, 0x18, 0x0f, 0x32, 0x30,
+ 0x31, 0x32, 0x30, 0x35, 0x31, 0x36, 0x31, 0x31, 0x35, 0x34,
+ 0x30, 0x38, 0x5a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
+ 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82,
+ 0x01, 0x01, 0x00, 0xbe, 0x1b, 0xa7, 0xa7, 0xba, 0x17, 0xd9,
+ 0x94, 0x16, 0xdf, 0xd2, 0x86, 0x1e, 0x39, 0x38, 0x2f, 0x0e,
+ 0x0e, 0xb0, 0x19, 0x74, 0x9d, 0x64, 0x61, 0xfb, 0x34, 0x15,
+ 0x64, 0xe6, 0x7a, 0x44, 0xfc, 0x24, 0xaf, 0x63, 0xe3, 0xe5,
+ 0x01, 0x3f, 0xeb, 0x62, 0xc4, 0x2f, 0xd7, 0x56, 0xac, 0x9e,
+ 0x39, 0x8c, 0x54, 0x20, 0x24, 0x9f, 0xe0, 0x9a, 0x2c, 0x9a,
+ 0xfb, 0xbe, 0x13, 0x8d, 0x18, 0xf1, 0x95, 0x37, 0xf7, 0x6a,
+ 0x93, 0x28, 0x2a, 0xf6, 0x10, 0xc0, 0x5e, 0xa0, 0xfc, 0xf7,
+ 0x66, 0x97, 0xe4, 0x76, 0x04, 0x90, 0xd3, 0x45, 0x59, 0x26,
+ 0xfd, 0xe9, 0xb4, 0xe5, 0xd6, 0x30, 0x2f, 0xe0, 0xfb, 0xda,
+ 0xcc, 0x4b, 0xc4, 0x11, 0xbf, 0x20, 0x50, 0x18, 0xd5, 0x18,
+ 0xfc, 0xe7, 0x86, 0xb8, 0x80, 0x2b, 0x2e, 0x35, 0x50, 0xcd,
+ 0x73, 0x0d, 0x70, 0xbe, 0x55, 0xa2, 0xef, 0x2c, 0x62, 0x96,
+ 0xe3, 0x6a, 0xec, 0x69, 0xa6, 0x8f, 0x9d, 0x37, 0xb6, 0xbe,
+ 0x6b, 0x72, 0x02, 0x99, 0x02, 0xea, 0x0b, 0x18, 0x01, 0x26,
+ 0x82, 0x3b, 0x7b, 0x44, 0x8a, 0x84, 0xe4, 0x78, 0x6c, 0xb3,
+ 0x5b, 0x83, 0x87, 0x7c, 0xab, 0x80, 0x17, 0xfd, 0x00, 0xfd,
+ 0x56, 0x87, 0x85, 0x2b, 0x49, 0x42, 0xa2, 0x63, 0x84, 0x4f,
+ 0x4a, 0xaa, 0x5e, 0x7d, 0x64, 0x29, 0x09, 0x81, 0xac, 0xea,
+ 0x53, 0x00, 0x36, 0xbf, 0x19, 0x33, 0x5c, 0x0e, 0xee, 0xa9,
+ 0x6a, 0x9e, 0x2e, 0x44, 0x9b, 0x3e, 0xc9, 0x27, 0xb7, 0x49,
+ 0x15, 0x76, 0xa8, 0x42, 0x79, 0x2d, 0x4a, 0x42, 0x1f, 0xf1,
+ 0x32, 0x35, 0x31, 0x4c, 0xcb, 0xa2, 0xee, 0x50, 0xae, 0x1f,
+ 0x5e, 0x4d, 0x5d, 0xc1, 0x9e, 0x28, 0x17, 0x59, 0x6d, 0x1d,
+ 0x2a, 0x0a, 0x3d, 0xeb, 0x88, 0x10, 0xb5, 0xe6, 0x3b, 0xa7,
+ 0x81, 0x1f, 0xc7, 0xa0, 0xc8, 0x4a, 0xfe, 0x6c, 0x8f, 0xa0,
+ 0x82, 0x04, 0x21, 0x30, 0x82, 0x04, 0x1d, 0x30, 0x82, 0x04,
+ 0x19, 0x30, 0x82, 0x03, 0x01, 0xa0, 0x03, 0x02, 0x01, 0x02,
+ 0x02, 0x03, 0x00, 0xca, 0x67, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x30, 0x81, 0x8c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c, 0x31, 0x16, 0x30, 0x14,
+ 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13, 0x0d, 0x53, 0x74, 0x61,
+ 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x4c, 0x74, 0x64, 0x2e,
+ 0x31, 0x2b, 0x30, 0x29, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x13,
+ 0x22, 0x53, 0x65, 0x63, 0x75, 0x72, 0x65, 0x20, 0x44, 0x69,
+ 0x67, 0x69, 0x74, 0x61, 0x6c, 0x20, 0x43, 0x65, 0x72, 0x74,
+ 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x65, 0x20, 0x53, 0x69,
+ 0x67, 0x6e, 0x69, 0x6e, 0x67, 0x31, 0x38, 0x30, 0x36, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x13, 0x2f, 0x53, 0x74, 0x61, 0x72,
+ 0x74, 0x43, 0x6f, 0x6d, 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73,
+ 0x20, 0x32, 0x20, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79,
+ 0x20, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69,
+ 0x61, 0x74, 0x65, 0x20, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72,
+ 0x20, 0x43, 0x41, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30,
+ 0x34, 0x32, 0x32, 0x30, 0x35, 0x33, 0x30, 0x35, 0x39, 0x5a,
+ 0x17, 0x0d, 0x31, 0x32, 0x30, 0x36, 0x30, 0x32, 0x30, 0x36,
+ 0x32, 0x39, 0x32, 0x37, 0x5a, 0x30, 0x6e, 0x31, 0x0b, 0x30,
+ 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x49, 0x4c,
+ 0x31, 0x31, 0x30, 0x2f, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x13,
+ 0x28, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d, 0x20,
+ 0x4c, 0x74, 0x64, 0x2e, 0x20, 0x28, 0x53, 0x74, 0x61, 0x72,
+ 0x74, 0x20, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x72, 0x63, 0x69,
+ 0x61, 0x6c, 0x20, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64,
+ 0x29, 0x31, 0x2c, 0x30, 0x2a, 0x06, 0x03, 0x55, 0x04, 0x03,
+ 0x13, 0x23, 0x53, 0x74, 0x61, 0x72, 0x74, 0x43, 0x6f, 0x6d,
+ 0x20, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x20, 0x32, 0x20, 0x53,
+ 0x65, 0x72, 0x76, 0x65, 0x72, 0x20, 0x4f, 0x43, 0x53, 0x50,
+ 0x20, 0x53, 0x69, 0x67, 0x6e, 0x65, 0x72, 0x30, 0x82, 0x01,
+ 0x22, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f,
+ 0x00, 0x30, 0x82, 0x01, 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00,
+ 0xd0, 0xd5, 0xf5, 0x70, 0x9a, 0x2b, 0x41, 0x35, 0xf7, 0xf8,
+ 0xcf, 0xb5, 0x6b, 0xb3, 0xdf, 0xe0, 0xb9, 0x12, 0x0d, 0x3d,
+ 0xd3, 0x99, 0x9f, 0x32, 0x73, 0x01, 0x1f, 0xbc, 0x7d, 0x4f,
+ 0x3e, 0x66, 0xf7, 0xfd, 0x60, 0x57, 0x92, 0x30, 0xb4, 0xdb,
+ 0x9a, 0xf5, 0xd3, 0x49, 0x19, 0xd6, 0xad, 0x37, 0x43, 0x78,
+ 0x69, 0x8c, 0x0d, 0x23, 0x0e, 0x7a, 0xd1, 0x65, 0x08, 0xeb,
+ 0x71, 0x8c, 0x37, 0x36, 0xd3, 0x4d, 0xa6, 0xcb, 0x11, 0xb2,
+ 0xfa, 0xb4, 0x38, 0x3e, 0x2b, 0x70, 0x8c, 0xf7, 0xf1, 0xd9,
+ 0x64, 0x62, 0x26, 0xf4, 0xa7, 0x2c, 0x24, 0x25, 0x4e, 0x4d,
+ 0x3e, 0x7a, 0x54, 0x57, 0x0f, 0xc1, 0x89, 0x9e, 0xb6, 0x55,
+ 0x0b, 0x7c, 0xbe, 0x38, 0xda, 0x8b, 0x62, 0xe9, 0xf1, 0xfa,
+ 0x8c, 0xd9, 0x32, 0x1f, 0xbe, 0x6d, 0x2e, 0x3d, 0x48, 0xa7,
+ 0x4f, 0x48, 0xd4, 0xff, 0x6b, 0xf6, 0x17, 0xf8, 0x31, 0xb2,
+ 0x37, 0xeb, 0x89, 0x71, 0x19, 0x0f, 0xe7, 0x86, 0x06, 0x66,
+ 0xfb, 0xc5, 0xad, 0x7b, 0x75, 0x0b, 0xcc, 0x2e, 0x3c, 0x4d,
+ 0x1c, 0x99, 0x40, 0x32, 0x72, 0xd4, 0x5c, 0xc9, 0x06, 0xaa,
+ 0x98, 0xe9, 0x01, 0x92, 0xdb, 0x25, 0x48, 0x1a, 0xae, 0x3f,
+ 0x01, 0x4d, 0x8a, 0xb0, 0x78, 0xb1, 0x28, 0xe0, 0x09, 0x9b,
+ 0x23, 0xe2, 0x28, 0x46, 0x6f, 0x50, 0x52, 0x71, 0x1c, 0xf1,
+ 0x09, 0xa0, 0x87, 0x3b, 0xdb, 0x84, 0xa3, 0xb1, 0x57, 0x6f,
+ 0xbf, 0x52, 0xd2, 0x30, 0x83, 0x30, 0x26, 0xc0, 0x27, 0x8e,
+ 0x6d, 0x03, 0x43, 0x14, 0x42, 0x31, 0x29, 0xf2, 0x7e, 0x52,
+ 0xcb, 0x84, 0x20, 0x2e, 0x87, 0x19, 0xe5, 0x48, 0xad, 0x06,
+ 0xce, 0x2e, 0x0f, 0xed, 0x78, 0x2a, 0x3d, 0x79, 0xc4, 0xb0,
+ 0xdb, 0xfa, 0x4e, 0x95, 0x88, 0x46, 0x75, 0x12, 0xb0, 0x7a,
+ 0x55, 0x6a, 0x38, 0xae, 0xea, 0x59, 0x02, 0x03, 0x01, 0x00,
+ 0x01, 0xa3, 0x81, 0xa0, 0x30, 0x81, 0x9d, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x1d, 0x13, 0x04, 0x02, 0x30, 0x00, 0x30, 0x0b,
+ 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x04, 0x04, 0x03, 0x02, 0x03,
+ 0xa8, 0x30, 0x1e, 0x06, 0x03, 0x55, 0x1d, 0x25, 0x04, 0x17,
+ 0x30, 0x15, 0x06, 0x08, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
+ 0x03, 0x09, 0x06, 0x09, 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07,
+ 0x30, 0x01, 0x05, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,
+ 0x04, 0x16, 0x04, 0x14, 0xbd, 0x4c, 0xef, 0x0e, 0xf7, 0x08,
+ 0xac, 0xc9, 0xbd, 0x39, 0x0f, 0xd9, 0xa0, 0xd3, 0xce, 0xcf,
+ 0x26, 0x48, 0xb8, 0x19, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,
+ 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x11, 0xdb, 0x23,
+ 0x45, 0xfd, 0x54, 0xcc, 0x6a, 0x71, 0x6f, 0x84, 0x8a, 0x03,
+ 0xd7, 0xbe, 0xf7, 0x01, 0x2f, 0x26, 0x86, 0x30, 0x23, 0x06,
+ 0x03, 0x55, 0x1d, 0x12, 0x04, 0x1c, 0x30, 0x1a, 0x86, 0x18,
+ 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x77, 0x77, 0x77,
+ 0x2e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x73, 0x73, 0x6c, 0x2e,
+ 0x63, 0x6f, 0x6d, 0x2f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,
+ 0x82, 0x01, 0x01, 0x00, 0x56, 0x1f, 0xef, 0xa5, 0x1a, 0x07,
+ 0xbe, 0xb1, 0xd1, 0xd0, 0x17, 0xeb, 0x72, 0x5b, 0x17, 0x11,
+ 0xe5, 0x96, 0xc3, 0x96, 0xe7, 0x9a, 0xdb, 0xbf, 0x64, 0x1c,
+ 0x99, 0x11, 0x2f, 0x18, 0x07, 0xb2, 0x45, 0x48, 0xf3, 0x58,
+ 0xcd, 0x38, 0x69, 0x33, 0xf4, 0x58, 0x5b, 0x16, 0xed, 0xfb,
+ 0xce, 0xb3, 0xc3, 0x14, 0x27, 0xa6, 0x16, 0xff, 0xd0, 0x70,
+ 0x9e, 0xe1, 0x9d, 0x4b, 0xd1, 0x26, 0x6c, 0x61, 0x25, 0xf1,
+ 0x39, 0x9c, 0xbe, 0x69, 0x75, 0x58, 0xcd, 0xbd, 0x8e, 0x36,
+ 0xfd, 0x46, 0xd1, 0xe3, 0xb9, 0x1a, 0x8a, 0xc1, 0xd7, 0x3e,
+ 0x6e, 0x82, 0xb8, 0xb0, 0x3f, 0xcf, 0x14, 0x3f, 0xc6, 0xf6,
+ 0x3a, 0x86, 0xce, 0x03, 0x76, 0x1f, 0xdb, 0x0b, 0x12, 0xac,
+ 0x99, 0x79, 0x53, 0xf0, 0x3d, 0x70, 0xd3, 0x5a, 0x05, 0xf6,
+ 0xba, 0x6e, 0x35, 0x31, 0x1e, 0x08, 0x30, 0xc1, 0xa4, 0xd4,
+ 0x45, 0x43, 0x5a, 0x01, 0xd9, 0x3d, 0xa5, 0xdb, 0xd2, 0xd7,
+ 0x73, 0x97, 0xe9, 0xab, 0xe4, 0x60, 0xf1, 0xfc, 0xf0, 0x9b,
+ 0xe2, 0x5a, 0x1e, 0x31, 0xe0, 0x1b, 0x47, 0x3f, 0x5a, 0x78,
+ 0xf3, 0x6e, 0xf0, 0x94, 0x6c, 0x2c, 0xfb, 0x67, 0x6e, 0xcb,
+ 0x8c, 0xb6, 0x8d, 0xcc, 0xcf, 0x1e, 0x9f, 0xd2, 0x10, 0x52,
+ 0xc2, 0xe7, 0xc8, 0x05, 0x2c, 0xa0, 0x18, 0xf5, 0x53, 0x4a,
+ 0xd2, 0xb0, 0x57, 0x5e, 0x5f, 0x63, 0xd7, 0x7b, 0x8e, 0xfa,
+ 0x22, 0xa0, 0x69, 0x17, 0xd2, 0xa0, 0xc7, 0x70, 0x01, 0x79,
+ 0x8b, 0x69, 0x1f, 0x0f, 0xdb, 0xe5, 0xf9, 0x83, 0x2b, 0x26,
+ 0x05, 0x05, 0x87, 0x80, 0x0d, 0xf9, 0x20, 0x0e, 0x16, 0x39,
+ 0xc5, 0x9b, 0x14, 0x2e, 0xf2, 0x06, 0x57, 0x46, 0x3d, 0x0b,
+ 0x8c, 0x3e, 0xb4, 0x66, 0x76, 0x67, 0x34, 0x70, 0x00, 0x63,
+ 0xcf, 0x9e, 0xc8, 0xc5, 0x5f, 0x48, 0x06, 0x53, 0x26, 0x55 ) );
+
+OCSP ( vultr_ocsp, &vultr_crt, &rapidssl_crt,
+ DATA ( 0x30, 0x44, 0x30, 0x42, 0x30, 0x40, 0x30, 0x3e, 0x30, 0x3c,
+ 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03, 0x02, 0x1a, 0x05,
+ 0x00, 0x04, 0x14, 0x40, 0x0b, 0x46, 0x7a, 0xf1, 0xe6, 0xb2,
+ 0xd3, 0x09, 0x83, 0xba, 0x0d, 0x60, 0x7e, 0x7e, 0x59, 0x37,
+ 0x48, 0x24, 0xc4, 0x04, 0x14, 0xc3, 0x9c, 0xf3, 0xfc, 0xd3,
+ 0x46, 0x08, 0x34, 0xbb, 0xce, 0x46, 0x7f, 0xa0, 0x7c, 0x5b,
+ 0xf3, 0xe2, 0x08, 0xcb, 0x59, 0x02, 0x03, 0x00, 0x95, 0x4d ),
+ DATA ( 0x30, 0x82, 0x05, 0x70, 0x0a, 0x01, 0x00, 0xa0, 0x82, 0x05,
+ 0x69, 0x30, 0x82, 0x05, 0x65, 0x06, 0x09, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x30, 0x01, 0x01, 0x04, 0x82, 0x05, 0x56,
+ 0x30, 0x82, 0x05, 0x52, 0x30, 0x81, 0x91, 0xa2, 0x16, 0x04,
+ 0x14, 0xfa, 0x58, 0xdb, 0x09, 0x53, 0xbc, 0x19, 0xc5, 0xe7,
+ 0xb5, 0x8b, 0xf6, 0x10, 0xf8, 0x1e, 0x84, 0x6d, 0x3a, 0x8f,
+ 0xd8, 0x18, 0x0f, 0x32, 0x30, 0x31, 0x34, 0x31, 0x31, 0x32,
+ 0x32, 0x32, 0x33, 0x30, 0x38, 0x35, 0x36, 0x5a, 0x30, 0x66,
+ 0x30, 0x64, 0x30, 0x3c, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e,
+ 0x03, 0x02, 0x1a, 0x05, 0x00, 0x04, 0x14, 0x40, 0x0b, 0x46,
+ 0x7a, 0xf1, 0xe6, 0xb2, 0xd3, 0x09, 0x83, 0xba, 0x0d, 0x60,
+ 0x7e, 0x7e, 0x59, 0x37, 0x48, 0x24, 0xc4, 0x04, 0x14, 0xc3,
+ 0x9c, 0xf3, 0xfc, 0xd3, 0x46, 0x08, 0x34, 0xbb, 0xce, 0x46,
+ 0x7f, 0xa0, 0x7c, 0x5b, 0xf3, 0xe2, 0x08, 0xcb, 0x59, 0x02,
+ 0x03, 0x00, 0x95, 0x4d, 0x80, 0x00, 0x18, 0x0f, 0x32, 0x30,
+ 0x31, 0x34, 0x31, 0x31, 0x32, 0x32, 0x32, 0x33, 0x30, 0x38,
+ 0x35, 0x36, 0x5a, 0xa0, 0x11, 0x18, 0x0f, 0x32, 0x30, 0x31,
+ 0x34, 0x31, 0x31, 0x32, 0x39, 0x32, 0x33, 0x30, 0x38, 0x35,
+ 0x36, 0x5a, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x82, 0x01,
+ 0x01, 0x00, 0x6a, 0x71, 0x8f, 0x84, 0x66, 0xb5, 0x75, 0xe6,
+ 0x97, 0xa4, 0xb9, 0xc6, 0xa0, 0x37, 0x6f, 0x23, 0x76, 0x3c,
+ 0x59, 0x4c, 0x1c, 0x2d, 0x9f, 0x70, 0xab, 0x83, 0xbf, 0xa9,
+ 0xbf, 0x79, 0x31, 0x69, 0xdd, 0x78, 0xd5, 0x59, 0x90, 0x68,
+ 0xbe, 0x25, 0xb7, 0x53, 0x7d, 0x8b, 0xcf, 0x66, 0x3b, 0xcd,
+ 0xe0, 0xd2, 0x40, 0x1d, 0xc8, 0x29, 0xe4, 0x37, 0xbf, 0x20,
+ 0x7e, 0x64, 0x8d, 0x0d, 0xc7, 0xed, 0x0d, 0x08, 0x05, 0x36,
+ 0x27, 0x4f, 0xb8, 0xe3, 0x19, 0xec, 0xf0, 0x96, 0xe8, 0x48,
+ 0x9b, 0x8b, 0x2c, 0x18, 0xdb, 0x1e, 0x68, 0x11, 0xf3, 0xfb,
+ 0x9c, 0x68, 0xad, 0xcc, 0x15, 0xe0, 0x25, 0x08, 0x98, 0xd2,
+ 0xbf, 0xd0, 0x57, 0xe6, 0x4c, 0x73, 0x5a, 0x2c, 0xc8, 0x89,
+ 0xd6, 0xe4, 0xd0, 0x47, 0x6d, 0x8c, 0xc7, 0x75, 0xb1, 0x4e,
+ 0x10, 0x34, 0xe5, 0x40, 0xa3, 0xb1, 0x50, 0x07, 0x3d, 0x7d,
+ 0xad, 0xeb, 0x1d, 0x91, 0x7f, 0x77, 0x2e, 0x0d, 0x9a, 0xa7,
+ 0xbb, 0x68, 0x89, 0xd2, 0x05, 0x58, 0x16, 0xf1, 0x5e, 0x1d,
+ 0x05, 0xf6, 0x9e, 0xe9, 0x89, 0x52, 0x35, 0xb7, 0x29, 0x7a,
+ 0x68, 0x02, 0x6f, 0xc7, 0x20, 0x30, 0xc8, 0xde, 0x97, 0x3f,
+ 0xb7, 0x28, 0x38, 0x39, 0xd1, 0x4b, 0x4b, 0x90, 0x71, 0xe5,
+ 0x58, 0xa4, 0xa3, 0xbd, 0x78, 0x95, 0xb5, 0x54, 0xdd, 0xf7,
+ 0x4f, 0x8e, 0x78, 0x73, 0x86, 0xbf, 0x28, 0xb0, 0xdd, 0xc0,
+ 0xe9, 0x4a, 0xf5, 0x9f, 0x02, 0x8e, 0x63, 0x8f, 0x59, 0xf1,
+ 0x93, 0xf0, 0x45, 0x97, 0x30, 0xdb, 0x0a, 0x04, 0x3e, 0x81,
+ 0x99, 0x20, 0x7a, 0xb2, 0xe6, 0x8c, 0x8f, 0x2a, 0x4c, 0x31,
+ 0xf1, 0x64, 0xbc, 0xb7, 0xec, 0xb1, 0xf9, 0x69, 0x1f, 0x99,
+ 0x89, 0x3e, 0x3e, 0xa0, 0xf4, 0xde, 0x79, 0xa7, 0xae, 0xa3,
+ 0x23, 0xbd, 0x16, 0xbb, 0x6d, 0x0f, 0x15, 0x68, 0xa0, 0x82,
+ 0x03, 0xa6, 0x30, 0x82, 0x03, 0xa2, 0x30, 0x82, 0x03, 0x9e,
+ 0x30, 0x82, 0x02, 0x86, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02,
+ 0x01, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x0b, 0x05, 0x00, 0x30, 0x47, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x55, 0x53, 0x31, 0x16, 0x30, 0x14, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x13, 0x0d, 0x47, 0x65, 0x6f, 0x54, 0x72, 0x75, 0x73,
+ 0x74, 0x20, 0x49, 0x6e, 0x63, 0x2e, 0x31, 0x20, 0x30, 0x1e,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x13, 0x17, 0x52, 0x61, 0x70,
+ 0x69, 0x64, 0x53, 0x53, 0x4c, 0x20, 0x53, 0x48, 0x41, 0x32,
+ 0x35, 0x36, 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33,
+ 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x34, 0x30, 0x38, 0x32, 0x39,
+ 0x32, 0x33, 0x33, 0x39, 0x33, 0x30, 0x5a, 0x17, 0x0d, 0x31,
+ 0x35, 0x30, 0x35, 0x32, 0x32, 0x32, 0x33, 0x33, 0x39, 0x33,
+ 0x30, 0x5a, 0x30, 0x31, 0x31, 0x2f, 0x30, 0x2d, 0x06, 0x03,
+ 0x55, 0x04, 0x03, 0x13, 0x26, 0x52, 0x61, 0x70, 0x69, 0x64,
+ 0x53, 0x53, 0x4c, 0x20, 0x53, 0x48, 0x41, 0x32, 0x35, 0x36,
+ 0x20, 0x43, 0x41, 0x20, 0x2d, 0x20, 0x47, 0x33, 0x20, 0x4f,
+ 0x43, 0x53, 0x50, 0x20, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e,
+ 0x64, 0x65, 0x72, 0x30, 0x82, 0x01, 0x22, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ 0x05, 0x00, 0x03, 0x82, 0x01, 0x0f, 0x00, 0x30, 0x82, 0x01,
+ 0x0a, 0x02, 0x82, 0x01, 0x01, 0x00, 0x9b, 0xf2, 0x8e, 0xe9,
+ 0x57, 0x3e, 0xa8, 0x5c, 0xfd, 0x00, 0x14, 0x21, 0xe7, 0xe4,
+ 0x57, 0xbb, 0x55, 0xc8, 0xa8, 0x50, 0x93, 0xdc, 0xbf, 0xfc,
+ 0xde, 0x46, 0x8a, 0x53, 0x9f, 0x12, 0xaa, 0x7c, 0xf1, 0xdd,
+ 0x89, 0x9e, 0x02, 0x27, 0x9c, 0x1a, 0xa0, 0x94, 0xf5, 0xec,
+ 0x06, 0xa3, 0xdb, 0xf3, 0x3f, 0x6d, 0xfd, 0x30, 0x6d, 0xab,
+ 0xcb, 0xc3, 0x72, 0xa9, 0x25, 0x35, 0x69, 0x67, 0x07, 0xaf,
+ 0x9c, 0x91, 0x3a, 0x24, 0x03, 0x74, 0x59, 0xfd, 0x69, 0xa6,
+ 0xfe, 0x23, 0xa4, 0x6c, 0x2f, 0xbe, 0x44, 0x56, 0x47, 0xee,
+ 0xdb, 0x07, 0xc3, 0x72, 0x3f, 0x14, 0xdc, 0x16, 0xb9, 0x66,
+ 0x48, 0x7c, 0x6e, 0x69, 0x6f, 0xa1, 0x05, 0xc6, 0x36, 0x08,
+ 0x01, 0xdd, 0x1c, 0xb8, 0x52, 0xf4, 0x86, 0x96, 0x85, 0x39,
+ 0x89, 0xb0, 0x31, 0x67, 0x62, 0xc5, 0x52, 0x91, 0x72, 0xd7,
+ 0x96, 0x8c, 0xe1, 0x0a, 0x02, 0x6a, 0xfe, 0x82, 0xca, 0xc0,
+ 0x34, 0xc9, 0xbc, 0x45, 0xa7, 0xc0, 0x4b, 0xa0, 0x7c, 0x7c,
+ 0xcc, 0x29, 0xe5, 0x8c, 0xf6, 0x91, 0x65, 0x33, 0xf1, 0x7b,
+ 0xda, 0x55, 0x69, 0x93, 0x2d, 0x4e, 0xb9, 0xb4, 0x7f, 0x56,
+ 0xe6, 0x80, 0xbe, 0x23, 0x4a, 0x4a, 0x65, 0xa6, 0xab, 0xa2,
+ 0x40, 0xb1, 0x75, 0x62, 0x13, 0xc1, 0xfd, 0x52, 0xe1, 0xbb,
+ 0x7b, 0xb1, 0x7f, 0x8a, 0x0c, 0x27, 0x35, 0xec, 0x27, 0x3b,
+ 0xa5, 0xe7, 0x75, 0xb8, 0xe3, 0xc4, 0xcf, 0x4d, 0x8a, 0x02,
+ 0x57, 0x57, 0x16, 0xa2, 0x8e, 0x9d, 0x87, 0x5a, 0x32, 0xb6,
+ 0xf6, 0x1d, 0xf5, 0xe3, 0xd7, 0xcf, 0x79, 0xc8, 0x77, 0x74,
+ 0xdc, 0xe5, 0xba, 0xde, 0x5c, 0x22, 0xad, 0xc0, 0xfa, 0x67,
+ 0xf3, 0x26, 0xbf, 0xcc, 0xd4, 0x88, 0xd5, 0xda, 0x87, 0x4d,
+ 0x9d, 0x99, 0xc1, 0xce, 0xa4, 0x9a, 0xda, 0x99, 0xa5, 0xa2,
+ 0xe1, 0xc5, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x81, 0xaa,
+ 0x30, 0x81, 0xa7, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23,
+ 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0xc3, 0x9c, 0xf3, 0xfc,
+ 0xd3, 0x46, 0x08, 0x34, 0xbb, 0xce, 0x46, 0x7f, 0xa0, 0x7c,
+ 0x5b, 0xf3, 0xe2, 0x08, 0xcb, 0x59, 0x30, 0x0f, 0x06, 0x09,
+ 0x2b, 0x06, 0x01, 0x05, 0x05, 0x07, 0x30, 0x01, 0x05, 0x04,
+ 0x02, 0x05, 0x00, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e,
+ 0x04, 0x16, 0x04, 0x14, 0xfa, 0x58, 0xdb, 0x09, 0x53, 0xbc,
+ 0x19, 0xc5, 0xe7, 0xb5, 0x8b, 0xf6, 0x10, 0xf8, 0x1e, 0x84,
+ 0x6d, 0x3a, 0x8f, 0xd8, 0x30, 0x13, 0x06, 0x03, 0x55, 0x1d,
+ 0x25, 0x04, 0x0c, 0x30, 0x0a, 0x06, 0x08, 0x2b, 0x06, 0x01,
+ 0x05, 0x05, 0x07, 0x03, 0x09, 0x30, 0x0c, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x02, 0x30, 0x00, 0x30,
+ 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04,
+ 0x04, 0x03, 0x02, 0x07, 0x80, 0x30, 0x21, 0x06, 0x03, 0x55,
+ 0x1d, 0x11, 0x04, 0x1a, 0x30, 0x18, 0xa4, 0x16, 0x30, 0x14,
+ 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x03, 0x13,
+ 0x09, 0x54, 0x47, 0x56, 0x2d, 0x42, 0x2d, 0x32, 0x31, 0x34,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x0b, 0x05, 0x00, 0x03, 0x82, 0x01, 0x01, 0x00,
+ 0x3e, 0x45, 0xce, 0x3d, 0x53, 0x8c, 0x88, 0xcd, 0xde, 0xf1,
+ 0x38, 0x0c, 0x00, 0x7a, 0x7e, 0x22, 0xe7, 0x1a, 0xa5, 0xbe,
+ 0xee, 0x1c, 0x17, 0x20, 0xc3, 0x65, 0x68, 0x86, 0x27, 0x83,
+ 0x62, 0xd7, 0xdc, 0x1d, 0x6c, 0xfa, 0x24, 0x2e, 0x66, 0x50,
+ 0xe5, 0xe0, 0x42, 0xa5, 0x73, 0x67, 0x2a, 0xea, 0x5a, 0x17,
+ 0x20, 0x3b, 0x14, 0xd4, 0x74, 0x14, 0xbd, 0x18, 0x60, 0xbe,
+ 0xa6, 0x46, 0xb1, 0xc2, 0x82, 0xc9, 0xb6, 0x99, 0x67, 0x56,
+ 0xbe, 0x17, 0xda, 0x78, 0x05, 0x48, 0x65, 0x9d, 0x48, 0xb5,
+ 0xda, 0x1d, 0x52, 0x59, 0x2a, 0xac, 0x09, 0x2d, 0x29, 0x18,
+ 0x96, 0xc1, 0x58, 0x79, 0xfc, 0x73, 0x0b, 0x70, 0x4d, 0x31,
+ 0x61, 0x80, 0xc7, 0x77, 0x02, 0xf1, 0x12, 0xb3, 0x80, 0x6f,
+ 0xb9, 0x05, 0x69, 0xcf, 0x4f, 0x80, 0x7d, 0xf5, 0x06, 0xe6,
+ 0x2e, 0xc7, 0x53, 0x99, 0x8b, 0x07, 0xc7, 0x7a, 0xe6, 0xf3,
+ 0x12, 0x86, 0xd1, 0xbb, 0x8a, 0x8a, 0xfb, 0x9d, 0xd1, 0x0b,
+ 0xe7, 0x9f, 0x12, 0x06, 0xfb, 0x7d, 0x8e, 0xe7, 0xb7, 0x39,
+ 0xe0, 0x3c, 0xd0, 0xe8, 0x35, 0x44, 0x28, 0xb7, 0xcb, 0xee,
+ 0xef, 0xa7, 0x14, 0xfa, 0x0e, 0x34, 0xaf, 0x78, 0x59, 0x1e,
+ 0x91, 0xd9, 0xe0, 0x9b, 0x3c, 0x9e, 0x3a, 0xbf, 0xf5, 0xf5,
+ 0x11, 0x5b, 0x04, 0x48, 0xcd, 0x3a, 0x3f, 0xee, 0x46, 0x6d,
+ 0x69, 0x68, 0x39, 0xc1, 0x4d, 0x54, 0xfd, 0x6c, 0x27, 0x1e,
+ 0x5b, 0x58, 0x00, 0xbb, 0x4f, 0x1b, 0x12, 0xd3, 0xbb, 0x46,
+ 0xf4, 0x7c, 0x4a, 0x44, 0xb5, 0xcb, 0x4f, 0xf2, 0x3d, 0xc3,
+ 0x51, 0xfc, 0x7a, 0x2c, 0x59, 0xd0, 0x82, 0x73, 0xe3, 0x88,
+ 0xfc, 0x25, 0x4c, 0x35, 0x6f, 0x88, 0x85, 0xff, 0xad, 0x8c,
+ 0x83, 0xc4, 0x76, 0x58, 0x6b, 0xfa, 0xf2, 0xed, 0x5b, 0x95,
+ 0xd9, 0x07, 0x55, 0x58, 0xfe, 0x08 ) );
+
+/** Time at which OCSP responses are valid */
+static time_t test_time = 1337062083ULL; /* Tue 15 May 2012 06:08:03 */
+
+/** Time at which OCSP responses are not valid */
+static time_t test_stale = 1375573111ULL; /* Sat Aug 3 23:38:31 2013 */
+
+/** Time at which "vultr" OCSP response (generated more recently) is valid */
+static time_t test_vultr = 1416697736ULL; /* Sat 22 Nov 23:08:56 2014 */
+
+/**
+ * Report certificate parsing test result
+ *
+ * @v crt Test certificate
+ */
+#define ocsp_certificate_ok( crt ) do { \
+ ok ( x509_certificate ( (crt)->data, (crt)->len, \
+ &(crt)->cert ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report OCSP check creation test result
+ *
+ * @v test OCSP test
+ */
+#define ocsp_check_ok( test ) do { \
+ ocsp_prepare_test ( (test) ); \
+ ok ( ocsp_check ( (test)->cert->cert, (test)->issuer->cert, \
+ &(test)->ocsp ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report OCSP request construction test result
+ *
+ * @v test OCSP test
+ */
+#define ocsp_request_ok( test ) do { \
+ DBGC ( (test), "OCSPTEST %p expected request:\n", (test) ); \
+ DBGC_HDA ( (test), 0, (test)->request, (test)->request_len ); \
+ ok ( (test)->ocsp->request.builder.len == (test)->request_len );\
+ ok ( memcmp ( (test)->ocsp->request.builder.data, \
+ (test)->request, (test)->request_len ) == 0 ); \
+ DBGC ( (test), "OCSPTEST %p generated request:\n", (test) ); \
+ DBGC_HDA ( (test), 0, (test)->ocsp->request.builder.data, \
+ (test)->ocsp->request.builder.len ); \
+ } while ( 0 )
+
+/**
+ * Report OCSP response test result
+ *
+ * @v test OCSP test
+ */
+#define ocsp_response_ok( test ) do { \
+ ok ( ocsp_response ( (test)->ocsp, (test)->response, \
+ (test)->response_len ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report OCSP response failure test result
+ *
+ * @v test OCSP test
+ */
+#define ocsp_response_fail_ok( test ) do { \
+ ok ( ocsp_response ( (test)->ocsp, (test)->response, \
+ (test)->response_len ) != 0 ); \
+ } while ( 0 )
+
+/**
+ * Report OCSP validation test result
+ *
+ * @v test OCSP test
+ * @v time Test time
+ */
+#define ocsp_validate_ok( test, time ) do { \
+ ocsp_prepare_test ( (test) ); \
+ ok ( ocsp_validate ( (test)->ocsp, time ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report OCSP validation failure test result
+ *
+ * @v test OCSP test
+ * @v time Test time
+ */
+#define ocsp_validate_fail_ok( test, time ) do { \
+ ocsp_prepare_test ( (test) ); \
+ ok ( ocsp_validate ( (test)->ocsp, time ) != 0 ); \
+ } while ( 0 )
+
+/**
+ * Perform OCSP self-tests
+ *
+ */
+static void ocsp_test_exec ( void ) {
+
+ /* Parse certificates */
+ ocsp_certificate_ok ( &barclays_crt );
+ ocsp_certificate_ok ( &google_crt );
+ ocsp_certificate_ok ( &verisign_crt );
+ ocsp_certificate_ok ( &thawte_crt );
+ ocsp_certificate_ok ( &startssl_crt );
+ ocsp_certificate_ok ( &rapidssl_crt );
+ ocsp_certificate_ok ( &vultr_crt );
+
+ /* Parse OCSP checks */
+ ocsp_check_ok ( &barclays_ocsp );
+ ocsp_check_ok ( &google_ocsp );
+ ocsp_check_ok ( &unauthorized_ocsp );
+ ocsp_check_ok ( &unknown_ocsp );
+ ocsp_check_ok ( &vultr_ocsp );
+
+ /* "barclays" test */
+ ocsp_request_ok ( &barclays_ocsp );
+ ocsp_response_ok ( &barclays_ocsp );
+ ocsp_validate_ok ( &barclays_ocsp, test_time );
+ ocsp_validate_fail_ok ( &barclays_ocsp, test_stale );
+
+ /* "google" test */
+ ocsp_request_ok ( &google_ocsp );
+ ocsp_response_ok ( &google_ocsp );
+ ocsp_validate_ok ( &google_ocsp, test_time );
+ ocsp_validate_fail_ok ( &google_ocsp, test_stale );
+
+ /* "unauthorized" test */
+ ocsp_request_ok ( &unauthorized_ocsp );
+ ocsp_response_fail_ok ( &unauthorized_ocsp );
+
+ /* "unknown" test */
+ ocsp_request_ok ( &unknown_ocsp );
+ ocsp_response_fail_ok ( &unknown_ocsp );
+
+ /* "vultr" test */
+ ocsp_request_ok ( &vultr_ocsp );
+ ocsp_response_ok ( &vultr_ocsp );
+ ocsp_validate_ok ( &vultr_ocsp, test_vultr );
+ ocsp_validate_fail_ok ( &vultr_ocsp, test_stale );
+
+ /* Drop OCSP check references */
+ ocsp_put ( unknown_ocsp.ocsp );
+ ocsp_put ( unauthorized_ocsp.ocsp );
+ ocsp_put ( google_ocsp.ocsp );
+ ocsp_put ( barclays_ocsp.ocsp );
+ ocsp_put ( vultr_ocsp.ocsp );
+
+ /* Drop certificate references */
+ x509_put ( vultr_crt.cert );
+ x509_put ( rapidssl_crt.cert );
+ x509_put ( startssl_crt.cert );
+ x509_put ( thawte_crt.cert );
+ x509_put ( verisign_crt.cert );
+ x509_put ( google_crt.cert );
+ x509_put ( barclays_crt.cert );
+}
+
+/** OCSP self-test */
+struct self_test ocsp_test __self_test = {
+ .name = "ocsp",
+ .exec = ocsp_test_exec,
+};
+
+/* Drag in algorithms required for tests */
+REQUIRE_OBJECT ( rsa );
+REQUIRE_OBJECT ( sha1 );
diff --git a/roms/ipxe/src/tests/pixbuf_test.c b/roms/ipxe/src/tests/pixbuf_test.c
new file mode 100644
index 00000000..15cd33df
--- /dev/null
+++ b/roms/ipxe/src/tests/pixbuf_test.c
@@ -0,0 +1,76 @@
+/*
+ * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Pixel buffer self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <assert.h>
+#include <ipxe/image.h>
+#include <ipxe/pixbuf.h>
+#include <ipxe/test.h>
+#include "pixbuf_test.h"
+
+/**
+ * Report pixel buffer test result
+ *
+ * @v test Pixel buffer test
+ * @v file Test code file
+ * @v line Test code line
+ */
+void pixbuf_okx ( struct pixel_buffer_test *test, const char *file,
+ unsigned int line ) {
+ struct pixel_buffer *pixbuf;
+ int rc;
+
+ /* Sanity check */
+ assert ( ( test->width * test->height * sizeof ( test->data[0] ) )
+ == test->len );
+
+ /* Correct image data pointer */
+ test->image->data = virt_to_user ( ( void * ) test->image->data );
+
+ /* Check that image is detected as PNM */
+ okx ( image_probe ( test->image ) == 0, file, line );
+ okx ( test->image->type == test->type, file, line );
+
+ /* Check that a pixel buffer can be created from the image */
+ okx ( ( rc = image_pixbuf ( test->image, &pixbuf ) ) == 0, file, line );
+ if ( rc == 0 ) {
+
+ /* Check pixel buffer dimensions */
+ okx ( pixbuf->width == test->width, file, line );
+ okx ( pixbuf->height == test->height, file, line );
+
+ /* Check pixel buffer data */
+ okx ( pixbuf->len == test->len, file, line );
+ okx ( memcmp_user ( pixbuf->data, 0,
+ virt_to_user ( test->data ), 0,
+ test->len ) == 0, file, line );
+
+ pixbuf_put ( pixbuf );
+ }
+}
diff --git a/roms/ipxe/src/tests/pixbuf_test.h b/roms/ipxe/src/tests/pixbuf_test.h
new file mode 100644
index 00000000..394f7f5f
--- /dev/null
+++ b/roms/ipxe/src/tests/pixbuf_test.h
@@ -0,0 +1,66 @@
+#ifndef _PIXBUF_TEST_H
+#define _PIXBUF_TEST_H
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdint.h>
+#include <ipxe/refcnt.h>
+#include <ipxe/image.h>
+#include <ipxe/test.h>
+
+/** A pixel buffer test */
+struct pixel_buffer_test {
+ /** Image type */
+ struct image_type *type;
+ /** Source image */
+ struct image *image;
+ /** Pixel data */
+ const uint32_t *data;
+ /** Length of pixel data */
+ size_t len;
+ /** Width */
+ unsigned int width;
+ /** Height */
+ unsigned int height;
+};
+
+/**
+ * Define a pixel buffer test
+ *
+ * @v _name Test name
+ * @v _type Test image file type
+ * @v _file Test image file data
+ * @v _width Expected pixel buffer width
+ * @v _height Expected pixel buffer height
+ * @v _data Expected pixel buffer data
+ * @ret test Pixel buffer test
+ */
+#define PIX( _name, _type, _file, _width, _height, _data ) \
+ static const char _name ## __file[] = _file; \
+ static const uint32_t _name ## __data[] = _data; \
+ static struct image _name ## __image = { \
+ .refcnt = REF_INIT ( ref_no_free ), \
+ .name = #_name, \
+ .data = ( userptr_t ) ( _name ## __file ), \
+ .len = sizeof ( _name ## __file ), \
+ }; \
+ static struct pixel_buffer_test _name = { \
+ .type = _type, \
+ .image = & _name ## __image, \
+ .data = _name ## __data, \
+ .len = sizeof ( _name ## __data ), \
+ .width = _width, \
+ .height = _height, \
+ };
+
+extern void pixbuf_okx ( struct pixel_buffer_test *test, const char *file,
+ unsigned int line );
+
+/**
+ * Report pixel buffer test result
+ *
+ * @v test Pixel buffer test
+ */
+#define pixbuf_ok( test ) pixbuf_okx ( test, __FILE__, __LINE__ )
+
+#endif /* _PIXBUF_TEST_H */
diff --git a/roms/ipxe/src/tests/png_test.c b/roms/ipxe/src/tests/png_test.c
new file mode 100644
index 00000000..cf32f203
--- /dev/null
+++ b/roms/ipxe/src/tests/png_test.c
@@ -0,0 +1,1993 @@
+/*
+ * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * PNG self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <assert.h>
+#include <ipxe/pixbuf.h>
+#include <ipxe/png.h>
+#include <ipxe/test.h>
+#include "pixbuf_test.h"
+
+/** Define inline pixel data */
+#define DATA(...) { __VA_ARGS__ }
+
+/* Non-opaque alpha channel */
+PIX ( alpha, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x06, 0x00, 0x00, 0x00, 0xf3, 0x1b, 0xaf, 0xbc,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x06,
+ 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
+ 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73,
+ 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a,
+ 0x9c, 0x18, 0x00, 0x00, 0x01, 0x25, 0x49, 0x44, 0x41, 0x54, 0x18,
+ 0xd3, 0x05, 0xc1, 0xcb, 0x2e, 0x03, 0x51, 0x00, 0x80, 0xe1, 0x7f,
+ 0x6e, 0xa9, 0xe9, 0x65, 0x32, 0x53, 0x6d, 0xa5, 0x42, 0xd3, 0x34,
+ 0x12, 0x0b, 0x0b, 0x1b, 0x04, 0x3b, 0x3b, 0x3b, 0x8f, 0xe1, 0x35,
+ 0xbc, 0x81, 0x67, 0xf1, 0x10, 0x22, 0x11, 0x0b, 0x42, 0x68, 0x17,
+ 0x5a, 0x42, 0x94, 0xd0, 0x9e, 0xe9, 0xf4, 0x4c, 0x67, 0x3a, 0x39,
+ 0x33, 0xc7, 0xf7, 0x19, 0x97, 0xd7, 0xc5, 0x45, 0x7b, 0x3c, 0xc0,
+ 0xd2, 0x8a, 0xa8, 0xea, 0xa3, 0x6d, 0x87, 0xc2, 0x6f, 0xe2, 0xa9,
+ 0x39, 0x58, 0x0e, 0x69, 0x6e, 0xa0, 0x55, 0x42, 0xb8, 0xb0, 0x70,
+ 0xa5, 0x60, 0xa5, 0xa4, 0x31, 0xea, 0x75, 0xec, 0x2c, 0xd7, 0x28,
+ 0x95, 0x51, 0xff, 0x19, 0xd2, 0x7b, 0xba, 0x25, 0x2b, 0xb9, 0x8c,
+ 0x8e, 0xcf, 0xf0, 0xc2, 0x2f, 0x6a, 0x71, 0x88, 0xca, 0x73, 0x22,
+ 0xbf, 0xc9, 0x9a, 0x08, 0xf1, 0x3e, 0x5f, 0x49, 0x82, 0x26, 0x62,
+ 0x77, 0x1f, 0x33, 0x13, 0x92, 0xd5, 0xc1, 0x3d, 0xe6, 0xf4, 0x8f,
+ 0x49, 0x63, 0x93, 0xd8, 0xa9, 0xa0, 0xbf, 0xc7, 0xf4, 0xbb, 0x07,
+ 0xd4, 0x06, 0x0f, 0x68, 0x39, 0xa7, 0xdf, 0xdd, 0xc3, 0x1b, 0x8f,
+ 0x58, 0x3a, 0x65, 0x26, 0xc1, 0x06, 0x1f, 0xc1, 0x16, 0x26, 0xe1,
+ 0x0c, 0x33, 0x92, 0x58, 0x51, 0x4c, 0x25, 0x9a, 0x32, 0xa9, 0xae,
+ 0xf3, 0xdc, 0x39, 0x22, 0xff, 0x15, 0x68, 0x29, 0x11, 0x6e, 0x83,
+ 0x74, 0xa9, 0x58, 0xa6, 0x19, 0x9f, 0xe5, 0x16, 0x33, 0xa3, 0x44,
+ 0x94, 0x80, 0x1d, 0xfc, 0xbd, 0x93, 0x2a, 0x13, 0x65, 0x3a, 0xdc,
+ 0x9c, 0x9c, 0x23, 0xdc, 0x06, 0x85, 0x08, 0xd9, 0xb9, 0xb9, 0xe2,
+ 0x76, 0xfb, 0x94, 0xe6, 0xd7, 0x90, 0xb6, 0x75, 0x87, 0x23, 0xe7,
+ 0xa4, 0x75, 0x93, 0xb0, 0x1c, 0x10, 0xe3, 0x60, 0x0b, 0xd7, 0x27,
+ 0xe9, 0xee, 0xa1, 0x0d, 0x93, 0xa9, 0xe3, 0x43, 0x01, 0x5e, 0x26,
+ 0x19, 0x74, 0xf6, 0x79, 0xe9, 0x1d, 0xd2, 0x7a, 0x7b, 0xc4, 0x4d,
+ 0x26, 0x58, 0x9d, 0x1d, 0x72, 0x39, 0x63, 0x11, 0x67, 0x14, 0x96,
+ 0xcd, 0x3f, 0x0a, 0xd4, 0x8b, 0x0b, 0x4d, 0xd7, 0xb9, 0xb6, 0x00,
+ 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65,
+ 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31,
+ 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a,
+ 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30,
+ 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58,
+ 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66,
+ 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31,
+ 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b,
+ 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x48637f, 0x54566c, 0x56566a, 0x4f5c72, 0x4e5e74, 0x4d667f,
+ 0x546478, 0x54657b, 0x50647b, 0x506277, 0x485d78, 0x4c5770,
+ 0x505a6f, 0x516378, 0x45617f, 0x525469, 0x5d4958, 0x67333d,
+ 0x643641, 0x535369, 0x5b4b5c, 0x624654, 0x604452, 0x594c5d,
+ 0x5b4455, 0x623643, 0x5e3e4e, 0x555668, 0x425979, 0x5c4151,
+ 0x5e404e, 0x5d3d4b, 0x5e3947, 0x53475c, 0x475b77, 0x68323c,
+ 0x5f3e4c, 0x455c77, 0x623744, 0x5f3848, 0x54475c, 0x475e7a,
+ 0x425171, 0x5d3a4b, 0x603948, 0x633642, 0x553f54, 0x3e5679,
+ 0x46516e, 0x682c36, 0x574356, 0x415975, 0x5f3341, 0x513d53,
+ 0x4d475f, 0x405a7a, 0x4a4762, 0x59384c, 0x5b394b, 0x435676,
+ 0x3b5b80, 0x3a5278, 0x5b3447, 0x4d405a, 0x573649, 0x4d445b,
+ 0x612d3b, 0x4d3c54, 0x454c68, 0x3a5a7d, 0x424b6a, 0x464866,
+ 0x454867, 0x3a597e, 0x3a5a80, 0x414f72, 0x484361, 0x33547d,
+ 0x3e4467, 0x43405d, 0x4f3c50, 0x4b364d, 0x404765, 0x395b7f ) );
+
+/* Colour type 0, bit depth 1 */
+PIX ( ctype_0_1, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x01, 0x00, 0x00, 0x00, 0x00, 0xdb, 0x60, 0x92, 0x11,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x01, 0x86,
+ 0xa0, 0x31, 0xe8, 0x96, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4b,
+ 0x47, 0x44, 0x00, 0x01, 0xdd, 0x8a, 0x13, 0xa4, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x0e,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0xf8, 0xff, 0x87, 0x01,
+ 0x15, 0x01, 0x00, 0x6b, 0x0d, 0x0b, 0xe3, 0xeb, 0x45, 0x62, 0x80,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45,
+ 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69,
+ 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d,
+ 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33,
+ 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff ) );
+
+/* Colour type 0, bit depth 16 */
+PIX ( ctype_0_16, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x10, 0x00, 0x00, 0x00, 0x00, 0x86, 0xe0, 0x2c, 0x23,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x01, 0x86,
+ 0xa0, 0x31, 0xe8, 0x96, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4b,
+ 0x47, 0x44, 0xff, 0xff, 0x14, 0xab, 0x31, 0xcd, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x85,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x1d, 0x8e, 0xc9, 0x0a, 0xc2,
+ 0x50, 0x0c, 0x45, 0xdf, 0x5f, 0xb9, 0x52, 0xea, 0xac, 0x88, 0xad,
+ 0x58, 0x41, 0x70, 0x5e, 0x89, 0xb3, 0x82, 0x82, 0xa0, 0x9b, 0xb3,
+ 0xe9, 0x42, 0x44, 0xc4, 0x3f, 0xf6, 0xb4, 0x84, 0x0c, 0x37, 0xb9,
+ 0x37, 0x49, 0xc8, 0x38, 0x6b, 0x77, 0x9e, 0x7c, 0xf9, 0xf0, 0xe3,
+ 0x4d, 0x26, 0x3a, 0x70, 0xe3, 0x45, 0x80, 0x2d, 0x33, 0xda, 0x74,
+ 0xcc, 0x4b, 0xa6, 0x8c, 0x8d, 0xa9, 0xb8, 0xcf, 0x89, 0x70, 0x24,
+ 0xd1, 0x7a, 0xc2, 0x94, 0xab, 0x94, 0xb8, 0x88, 0x39, 0x7a, 0x10,
+ 0xe6, 0x85, 0x2a, 0xf7, 0x35, 0x0b, 0x6a, 0x12, 0x77, 0x54, 0xa9,
+ 0x33, 0xc8, 0x95, 0xb1, 0x8d, 0x06, 0x1b, 0x2e, 0x8e, 0x22, 0x9a,
+ 0x54, 0xdc, 0x52, 0xb6, 0x1a, 0x79, 0x37, 0x0c, 0x5d, 0x94, 0xb0,
+ 0x97, 0x37, 0x51, 0xbd, 0xa2, 0xe5, 0x20, 0xa2, 0x44, 0xd7, 0x37,
+ 0xff, 0x4c, 0xf2, 0x48, 0x0d, 0x2c, 0x7a, 0x80, 0xe2, 0x00, 0x00,
+ 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a,
+ 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34,
+ 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34,
+ 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2,
+ 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74,
+ 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79,
+ 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32,
+ 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30,
+ 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x858585, 0x6f6f6f, 0x6f6f6f, 0x777777, 0x7b7b7b, 0x8f8f8f,
+ 0x8d8d8d, 0x919191, 0x8b8b8b, 0x858585, 0x777777, 0x6c6c6c,
+ 0x747474, 0x898989, 0x808080, 0x696969, 0x5c5c5c, 0x474747,
+ 0x484848, 0x696969, 0x5f5f5f, 0x5b5b5b, 0x575757, 0x5f5f5f,
+ 0x535353, 0x474747, 0x4d4d4d, 0x6e6e6e, 0x6d6d6d, 0x4f4f4f,
+ 0x4f4f4f, 0x4b4b4b, 0x474747, 0x535353, 0x737373, 0x484848,
+ 0x4e4e4e, 0x737373, 0x484848, 0x474747, 0x535353, 0x7a7a7a,
+ 0x5d5d5d, 0x474747, 0x484848, 0x474747, 0x484848, 0x666666,
+ 0x5e5e5e, 0x424242, 0x4f4f4f, 0x6a6a6a, 0x414141, 0x434343,
+ 0x505050, 0x6e6e6e, 0x4e4e4e, 0x424242, 0x444444, 0x686868,
+ 0x707070, 0x5e5e5e, 0x404040, 0x454545, 0x3e3e3e, 0x4b4b4b,
+ 0x3d3d3d, 0x404040, 0x545454, 0x6c6c6c, 0x525252, 0x4e4e4e,
+ 0x4f4f4f, 0x6b6b6b, 0x6e6e6e, 0x5a5a5a, 0x484848, 0x606060,
+ 0x464646, 0x404040, 0x404040, 0x373737, 0x494949, 0x6f6f6f ) );
+
+/* Colour type 0, bit depth 2 */
+PIX ( ctype_0_2, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x02, 0x00, 0x00, 0x00, 0x00, 0x9c, 0xc0, 0xe8, 0xc1,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x01, 0x86,
+ 0xa0, 0x31, 0xe8, 0x96, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4b,
+ 0x47, 0x44, 0x00, 0x03, 0x33, 0x84, 0x72, 0x88, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x24,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x08, 0x0d, 0x0d, 0x0d,
+ 0x60, 0x08, 0x11, 0x0d, 0x11, 0x60, 0x08, 0x10, 0x11, 0x08, 0x60,
+ 0x70, 0x10, 0x09, 0x08, 0x60, 0x70, 0x0c, 0x00, 0xb2, 0x42, 0x43,
+ 0x1d, 0x02, 0x00, 0x59, 0xc5, 0x06, 0x00, 0x68, 0xee, 0x01, 0x07,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45,
+ 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69,
+ 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d,
+ 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33,
+ 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x555555, 0x555555, 0x555555, 0x555555, 0x555555, 0x555555,
+ 0x555555, 0x555555, 0x555555, 0x555555, 0x555555, 0x555555,
+ 0x555555, 0x555555, 0x555555, 0x555555, 0x555555, 0x000000,
+ 0x000000, 0x555555, 0x555555, 0x555555, 0x555555, 0x555555,
+ 0x555555, 0x000000, 0x000000, 0x555555, 0x555555, 0x555555,
+ 0x000000, 0x000000, 0x000000, 0x555555, 0x555555, 0x000000,
+ 0x000000, 0x555555, 0x000000, 0x000000, 0x555555, 0x555555,
+ 0x555555, 0x000000, 0x000000, 0x000000, 0x000000, 0x555555,
+ 0x555555, 0x000000, 0x555555, 0x555555, 0x000000, 0x000000,
+ 0x555555, 0x555555, 0x555555, 0x000000, 0x000000, 0x555555,
+ 0x555555, 0x555555, 0x000000, 0x000000, 0x000000, 0x555555,
+ 0x000000, 0x000000, 0x555555, 0x555555, 0x555555, 0x555555,
+ 0x555555, 0x555555, 0x555555, 0x555555, 0x555555, 0x555555,
+ 0x555555, 0x000000, 0x000000, 0x000000, 0x555555, 0x555555 ) );
+
+/* Colour type 0, bit depth 4 */
+PIX ( ctype_0_4, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x04, 0x00, 0x00, 0x00, 0x00, 0x13, 0x80, 0x1d, 0x61,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x01, 0x86,
+ 0xa0, 0x31, 0xe8, 0x96, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4b,
+ 0x47, 0x44, 0x00, 0x0f, 0x3a, 0x32, 0x3e, 0xa3, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x37,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x68, 0x4f, 0xaf, 0x9c,
+ 0xd9, 0x5e, 0x56, 0xc1, 0x50, 0x96, 0xe2, 0x96, 0x1a, 0x1a, 0xe2,
+ 0xc6, 0x90, 0xea, 0xe2, 0x5a, 0xe2, 0xee, 0x12, 0xce, 0x10, 0xe2,
+ 0xe2, 0x16, 0xec, 0xe6, 0xe2, 0xce, 0xe0, 0xe2, 0x56, 0xe6, 0x62,
+ 0x62, 0x02, 0xe4, 0xbb, 0x95, 0xba, 0x39, 0x1b, 0xbb, 0x03, 0x00,
+ 0x7a, 0x4c, 0x0e, 0x45, 0x5a, 0x3c, 0xd1, 0xca, 0x00, 0x00, 0x00,
+ 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d,
+ 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33,
+ 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4,
+ 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64,
+ 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00,
+ 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54,
+ 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31,
+ 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x888888, 0x777777, 0x666666, 0x777777, 0x777777, 0x999999,
+ 0x999999, 0x999999, 0x888888, 0x777777, 0x777777, 0x666666,
+ 0x777777, 0x888888, 0x777777, 0x666666, 0x666666, 0x444444,
+ 0x444444, 0x666666, 0x666666, 0x555555, 0x555555, 0x555555,
+ 0x555555, 0x444444, 0x444444, 0x666666, 0x666666, 0x555555,
+ 0x444444, 0x444444, 0x444444, 0x555555, 0x777777, 0x444444,
+ 0x444444, 0x777777, 0x444444, 0x444444, 0x555555, 0x777777,
+ 0x555555, 0x444444, 0x444444, 0x444444, 0x444444, 0x666666,
+ 0x555555, 0x333333, 0x444444, 0x666666, 0x444444, 0x444444,
+ 0x444444, 0x777777, 0x444444, 0x444444, 0x444444, 0x666666,
+ 0x777777, 0x666666, 0x444444, 0x444444, 0x333333, 0x444444,
+ 0x333333, 0x444444, 0x555555, 0x777777, 0x555555, 0x444444,
+ 0x444444, 0x666666, 0x777777, 0x555555, 0x444444, 0x666666,
+ 0x444444, 0x333333, 0x333333, 0x333333, 0x444444, 0x777777 ) );
+
+/* Colour type 0, bit depth 8 */
+PIX ( ctype_0_8, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x00, 0x00, 0x00, 0x00, 0xd6, 0x70, 0xf0, 0x60,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x01, 0x86,
+ 0xa0, 0x31, 0xe8, 0x96, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4b,
+ 0x47, 0x44, 0x00, 0xff, 0x87, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x62,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x68, 0xcd, 0xcf, 0x2f,
+ 0xaf, 0xee, 0xef, 0x9d, 0xd8, 0xdd, 0x5a, 0x9e, 0x53, 0xd2, 0xc9,
+ 0xd0, 0x90, 0x19, 0xe3, 0xe1, 0x91, 0x19, 0x1f, 0x1d, 0x1e, 0x1f,
+ 0xec, 0xee, 0x97, 0xc7, 0x90, 0xeb, 0x1f, 0xe0, 0xed, 0x1e, 0x5c,
+ 0xec, 0xe9, 0x57, 0xec, 0xe9, 0x1e, 0x52, 0xc5, 0x10, 0xeb, 0xee,
+ 0xe9, 0xee, 0x91, 0x16, 0xe7, 0xec, 0x9f, 0xe5, 0xe8, 0x1c, 0x90,
+ 0xc7, 0xe0, 0xe7, 0xe4, 0x9a, 0x51, 0x10, 0xe7, 0xe0, 0x6a, 0xef,
+ 0x6d, 0xe7, 0x10, 0x92, 0xc3, 0x10, 0xe4, 0xe7, 0x9f, 0x9d, 0x17,
+ 0xe5, 0x91, 0xe8, 0xe6, 0xe0, 0x60, 0xee, 0x99, 0x0f, 0x00, 0xb8,
+ 0xaa, 0x1e, 0x19, 0xe8, 0x28, 0x25, 0xa0, 0x00, 0x00, 0x00, 0x25,
+ 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30,
+ 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a,
+ 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66,
+ 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61,
+ 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32,
+ 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a,
+ 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49,
+ 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x858585, 0x6f6f6f, 0x6f6f6f, 0x777777, 0x7b7b7b, 0x8f8f8f,
+ 0x8d8d8d, 0x919191, 0x8b8b8b, 0x858585, 0x777777, 0x6c6c6c,
+ 0x747474, 0x898989, 0x808080, 0x696969, 0x5c5c5c, 0x484848,
+ 0x484848, 0x696969, 0x5f5f5f, 0x5b5b5b, 0x575757, 0x5f5f5f,
+ 0x535353, 0x474747, 0x4e4e4e, 0x6e6e6e, 0x6d6d6d, 0x4f4f4f,
+ 0x505050, 0x4b4b4b, 0x474747, 0x535353, 0x737373, 0x494949,
+ 0x4e4e4e, 0x737373, 0x494949, 0x474747, 0x545454, 0x7a7a7a,
+ 0x5d5d5d, 0x474747, 0x494949, 0x474747, 0x484848, 0x666666,
+ 0x5e5e5e, 0x434343, 0x4f4f4f, 0x6a6a6a, 0x414141, 0x434343,
+ 0x505050, 0x6e6e6e, 0x4e4e4e, 0x424242, 0x454545, 0x686868,
+ 0x707070, 0x5e5e5e, 0x404040, 0x454545, 0x3f3f3f, 0x4b4b4b,
+ 0x3e3e3e, 0x404040, 0x545454, 0x6c6c6c, 0x525252, 0x4e4e4e,
+ 0x4f4f4f, 0x6b6b6b, 0x6e6e6e, 0x5a5a5a, 0x484848, 0x616161,
+ 0x464646, 0x404040, 0x404040, 0x373737, 0x494949, 0x6f6f6f ) );
+
+/* Colour type 2, bit depth 16 */
+PIX ( ctype_2_16, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x10, 0x02, 0x00, 0x00, 0x00, 0x2c, 0xe9, 0xe4, 0xa8,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x06,
+ 0x62, 0x4b, 0x47, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09,
+ 0x58, 0xf7, 0xdc, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73,
+ 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a,
+ 0x9c, 0x18, 0x00, 0x00, 0x01, 0x45, 0x49, 0x44, 0x41, 0x54, 0x18,
+ 0xd3, 0x2d, 0xcb, 0xc1, 0x6e, 0xd2, 0x00, 0x00, 0x00, 0xd0, 0x47,
+ 0x4b, 0x83, 0xb0, 0x8d, 0x00, 0x8e, 0x99, 0x19, 0x25, 0x64, 0x31,
+ 0xf1, 0xb0, 0x83, 0x97, 0xcd, 0xa8, 0x37, 0x6f, 0xde, 0xfc, 0x0c,
+ 0x7f, 0x83, 0x3f, 0xf0, 0x5b, 0xfc, 0x08, 0xb3, 0x64, 0xf1, 0xa0,
+ 0xd1, 0xe8, 0x38, 0xb8, 0x69, 0x5c, 0x86, 0xc6, 0x41, 0x4b, 0x29,
+ 0x83, 0x35, 0x2d, 0xf5, 0xe2, 0xbb, 0xbf, 0xda, 0xdb, 0xd1, 0xfb,
+ 0xd1, 0x66, 0xb4, 0x6f, 0x62, 0x2c, 0x54, 0x29, 0xa4, 0xb6, 0x75,
+ 0x54, 0xea, 0x22, 0x1b, 0x1d, 0x7d, 0x6d, 0x85, 0x05, 0x42, 0x91,
+ 0xb5, 0x52, 0x4d, 0xa5, 0xb0, 0x92, 0xb8, 0x11, 0x6a, 0xca, 0xc4,
+ 0xee, 0x68, 0xa8, 0xd4, 0xf4, 0xf4, 0xd4, 0x73, 0xa5, 0x4a, 0xa1,
+ 0x90, 0xeb, 0xf9, 0xe3, 0xdc, 0x81, 0x2f, 0x4e, 0xe5, 0x1a, 0x9a,
+ 0x2e, 0xbc, 0xf0, 0x5a, 0x5b, 0xe2, 0xca, 0x8e, 0xa5, 0x44, 0xa1,
+ 0x54, 0x4a, 0x75, 0xf4, 0xdd, 0x13, 0x4b, 0xb4, 0x5d, 0xfa, 0x6e,
+ 0xa5, 0xab, 0x2f, 0xf6, 0xc4, 0xb1, 0x20, 0x17, 0xcb, 0xdc, 0x35,
+ 0xf6, 0x51, 0x60, 0xe6, 0xda, 0xd4, 0xae, 0x87, 0x96, 0x22, 0x5b,
+ 0x2a, 0xbf, 0x4d, 0x9c, 0x19, 0x7a, 0x6a, 0xc7, 0xd8, 0x27, 0x95,
+ 0xcc, 0xc2, 0x99, 0xa1, 0x23, 0x6d, 0x13, 0x17, 0x6e, 0x45, 0x5a,
+ 0xa6, 0xba, 0x1e, 0xf8, 0xa5, 0xeb, 0x91, 0x80, 0xc4, 0x5c, 0x20,
+ 0x95, 0x09, 0xa5, 0x96, 0xb6, 0xa4, 0x66, 0xa6, 0xb6, 0xdd, 0xf7,
+ 0xd5, 0xc0, 0x73, 0xa5, 0xbf, 0x62, 0x95, 0x4c, 0x26, 0xd6, 0xb4,
+ 0x6b, 0xed, 0x56, 0xe1, 0xd6, 0x5a, 0xee, 0x52, 0xcb, 0x9e, 0xb9,
+ 0x9a, 0x86, 0xd4, 0x0a, 0xf5, 0xae, 0x6b, 0x3f, 0xad, 0x15, 0x02,
+ 0x85, 0x40, 0xe4, 0xc4, 0x4b, 0x6f, 0xfe, 0xe7, 0x8d, 0x58, 0xe2,
+ 0xd0, 0x89, 0x77, 0x4e, 0x3d, 0xf6, 0x4a, 0xdf, 0x95, 0x73, 0xfb,
+ 0x42, 0x1f, 0x44, 0x32, 0x0b, 0x6b, 0x3d, 0x81, 0x44, 0x4b, 0xd7,
+ 0x12, 0x91, 0x7a, 0xac, 0xa9, 0x63, 0x65, 0xe8, 0x48, 0xa5, 0x26,
+ 0x30, 0x13, 0xe9, 0x60, 0x83, 0xb6, 0x5c, 0x66, 0x6c, 0xe0, 0xd8,
+ 0x37, 0x07, 0x9e, 0xd9, 0xf3, 0xc3, 0x67, 0x4d, 0x2b, 0x53, 0xa1,
+ 0x81, 0x43, 0xa5, 0xcc, 0xdc, 0x8d, 0xa5, 0xdc, 0x46, 0xa8, 0xee,
+ 0x1f, 0x17, 0x48, 0x8c, 0x0b, 0x6d, 0x83, 0xc4, 0x70, 0x00, 0x00,
+ 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a,
+ 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34,
+ 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34,
+ 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2,
+ 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74,
+ 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79,
+ 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32,
+ 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30,
+ 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00,
+ 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Colour type 2, bit depth 8 */
+PIX ( ctype_2_8, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x02, 0x00, 0x00, 0x00, 0x7c, 0x79, 0x38, 0xeb,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x06,
+ 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
+ 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73,
+ 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a,
+ 0x9c, 0x18, 0x00, 0x00, 0x01, 0x04, 0x49, 0x44, 0x41, 0x54, 0x18,
+ 0xd3, 0x05, 0xc1, 0xc1, 0x4e, 0x83, 0x30, 0x00, 0x00, 0x50, 0x68,
+ 0x69, 0xb0, 0x6c, 0x23, 0x80, 0x30, 0x33, 0xa3, 0x84, 0x2c, 0x26,
+ 0x1e, 0x76, 0xf0, 0xb2, 0x19, 0xf5, 0xe6, 0xcd, 0x9b, 0x9f, 0xe1,
+ 0xe7, 0xf8, 0x2d, 0x7e, 0x84, 0x59, 0xb2, 0x78, 0xd0, 0x68, 0x74,
+ 0x1c, 0xdc, 0x34, 0x2e, 0x63, 0xc6, 0x41, 0x0b, 0x94, 0x01, 0x4d,
+ 0xa1, 0xbe, 0xa7, 0xde, 0x3f, 0xb6, 0x83, 0x28, 0x84, 0x52, 0x64,
+ 0x5d, 0x4b, 0x6a, 0xa8, 0xb5, 0x3c, 0x53, 0xe4, 0x0a, 0x44, 0x55,
+ 0xa3, 0x4a, 0x51, 0xd2, 0x1d, 0xc4, 0x8c, 0xec, 0xe9, 0x52, 0x75,
+ 0x1c, 0x8d, 0x37, 0x52, 0x08, 0xee, 0xfc, 0x2e, 0x86, 0x6f, 0x33,
+ 0xae, 0xe3, 0xe5, 0xd5, 0xad, 0x49, 0xd7, 0xbd, 0x82, 0x8a, 0xa6,
+ 0xc9, 0x2c, 0xef, 0x80, 0x50, 0x73, 0xf5, 0x59, 0xda, 0x1e, 0x39,
+ 0x9b, 0x00, 0x4e, 0xd8, 0x7e, 0xf8, 0x0c, 0x92, 0x6d, 0xec, 0x1e,
+ 0x17, 0xa8, 0x23, 0x37, 0xd1, 0x3c, 0x38, 0xef, 0x85, 0x2f, 0x92,
+ 0xe5, 0xf3, 0x60, 0x6c, 0x46, 0xcb, 0x1a, 0x19, 0xb1, 0x7d, 0xf4,
+ 0x63, 0x9f, 0x00, 0x85, 0xa6, 0x20, 0x63, 0x30, 0x2b, 0x3a, 0x59,
+ 0x12, 0x77, 0x0f, 0xdf, 0xfd, 0xcb, 0xe6, 0x8f, 0x48, 0xc6, 0x08,
+ 0x76, 0xab, 0x5a, 0xd4, 0x15, 0x5f, 0x19, 0xfd, 0x54, 0xd5, 0xb3,
+ 0x52, 0xd1, 0xec, 0xed, 0x77, 0x25, 0x80, 0x00, 0x68, 0x7a, 0x7d,
+ 0x47, 0xb0, 0xdb, 0x12, 0x3a, 0x9a, 0x3e, 0xcc, 0x4e, 0x6f, 0xbc,
+ 0xf5, 0x62, 0x00, 0x9f, 0x10, 0xcb, 0x2b, 0x07, 0x50, 0xc3, 0x2e,
+ 0x14, 0xa4, 0x11, 0x6c, 0x95, 0xc1, 0x58, 0xaa, 0x20, 0x41, 0x96,
+ 0xd2, 0x2a, 0x26, 0x67, 0xa1, 0x3f, 0xf9, 0x18, 0x5e, 0xf4, 0xbf,
+ 0x5e, 0x71, 0x19, 0x43, 0x7f, 0xd4, 0xb0, 0x74, 0x57, 0xf0, 0x16,
+ 0x6a, 0xff, 0xc1, 0x85, 0x8a, 0x8b, 0x87, 0xa4, 0x8a, 0x0e, 0x00,
+ 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65,
+ 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31,
+ 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a,
+ 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30,
+ 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58,
+ 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66,
+ 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31,
+ 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b,
+ 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Colour type 3, bit depth 1 */
+PIX ( ctype_3_1, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x02, 0x03, 0x00, 0x00, 0x00, 0x8e, 0x75, 0x47, 0x2f,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x0c,
+ 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0xff,
+ 0x00, 0xff, 0x00, 0xff, 0xff, 0x35, 0x24, 0xb1, 0xc4, 0x00, 0x00,
+ 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x00, 0x88, 0x05, 0x1d, 0x48,
+ 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b,
+ 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00,
+ 0x00, 0x00, 0x24, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x60,
+ 0x00, 0x01, 0xc6, 0x06, 0xa6, 0x06, 0x06, 0xae, 0xc6, 0x2e, 0x06,
+ 0x06, 0xad, 0x8d, 0x5c, 0x06, 0x0c, 0x1a, 0xbf, 0xda, 0x0c, 0x18,
+ 0x98, 0x0f, 0xbf, 0xfa, 0x00, 0x00, 0x4a, 0x48, 0x07, 0xa6, 0x66,
+ 0x5c, 0x57, 0x79, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74,
+ 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32,
+ 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30,
+ 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00,
+ 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d,
+ 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d,
+ 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33,
+ 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9,
+ 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+ 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xff0000,
+ 0xff00ff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xff00ff, 0xff00ff, 0xffffff, 0xffffff, 0xffffff,
+ 0xff00ff, 0xff00ff, 0xff00ff, 0xffffff, 0xffffff, 0xff0000,
+ 0xff00ff, 0xffffff, 0xff00ff, 0xff00ff, 0xffffff, 0xffffff,
+ 0xffffff, 0xff00ff, 0xff00ff, 0xff00ff, 0xff00ff, 0x00ffff,
+ 0xffffff, 0xff0000, 0xffffff, 0xffffff, 0xff00ff, 0xff00ff,
+ 0xffffff, 0x00ffff, 0xffffff, 0xff00ff, 0xff00ff, 0xffffff,
+ 0x00ffff, 0x00ffff, 0xff00ff, 0xff00ff, 0xff00ff, 0xffffff,
+ 0xff0000, 0xff00ff, 0xffffff, 0x00ffff, 0xffffff, 0xffffff,
+ 0xffffff, 0x00ffff, 0x00ffff, 0xffffff, 0xffffff, 0x00ffff,
+ 0x00ffff, 0xff00ff, 0xff00ff, 0xff00ff, 0x00ffff, 0x00ffff ) );
+
+/* Colour type 3, bit depth 2 */
+PIX ( ctype_3_2, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x04, 0x03, 0x00, 0x00, 0x00, 0x01, 0x35, 0xb2, 0x8f,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x15,
+ 0x50, 0x4c, 0x54, 0x45, 0xaa, 0xaa, 0xff, 0xaa, 0xaa, 0xaa, 0xaa,
+ 0x55, 0x55, 0xaa, 0x55, 0xaa, 0x55, 0xaa, 0xff, 0x55, 0xaa, 0xaa,
+ 0xff, 0xff, 0xff, 0xef, 0x1e, 0x2f, 0x5e, 0x00, 0x00, 0x00, 0x01,
+ 0x62, 0x4b, 0x47, 0x44, 0x06, 0x61, 0x66, 0xb8, 0x7d, 0x00, 0x00,
+ 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00,
+ 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00,
+ 0x34, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x60, 0x10, 0x60,
+ 0x00, 0x03, 0x46, 0x21, 0x43, 0x41, 0x41, 0x61, 0x43, 0x06, 0x46,
+ 0x63, 0x43, 0x26, 0x03, 0x63, 0x01, 0x06, 0x66, 0x63, 0x13, 0x26,
+ 0x01, 0x63, 0x11, 0x06, 0x61, 0x03, 0x17, 0x63, 0x43, 0x65, 0x11,
+ 0x06, 0x41, 0x11, 0x07, 0x91, 0x60, 0xe3, 0x10, 0x00, 0x53, 0x53,
+ 0x04, 0xcd, 0x45, 0xaa, 0x11, 0x71, 0x00, 0x00, 0x00, 0x25, 0x74,
+ 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30,
+ 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0xaaaaff, 0xaaaaff, 0xaaaaaa, 0xaaaaff, 0xaaaaff, 0xaaaaff,
+ 0xaaaaff, 0xaaaaff, 0xaaaaff, 0xaaaaff, 0xaaaaff, 0xaaaaff,
+ 0xaaaaff, 0xaaaaff, 0xaaaaff, 0xaaaaaa, 0xaaaaaa, 0xaa5555,
+ 0xaa55aa, 0xaaaaaa, 0xaaaaaa, 0xaaaaaa, 0xaaaaaa, 0xaaaaaa,
+ 0xaaaaaa, 0xaa55aa, 0xaa55aa, 0xaaaaaa, 0xaaaaff, 0xaaaaaa,
+ 0xaa55aa, 0xaa55aa, 0xaa55aa, 0xaaaaaa, 0xaaaaff, 0xaa5555,
+ 0xaa55aa, 0xaaaaff, 0xaa55aa, 0xaa55aa, 0xaaaaaa, 0xaaaaff,
+ 0xaaaaff, 0xaa55aa, 0xaa55aa, 0xaa55aa, 0xaa55aa, 0x55aaff,
+ 0xaaaaff, 0xaa5555, 0xaaaaaa, 0xaaaaff, 0xaa55aa, 0xaa55aa,
+ 0xaaaaaa, 0x55aaff, 0xaaaaaa, 0xaa55aa, 0xaa55aa, 0xaaaaff,
+ 0x55aaff, 0x55aaff, 0xaa55aa, 0xaa55aa, 0xaa55aa, 0xaaaaaa,
+ 0xaa5555, 0xaa55aa, 0xaaaaaa, 0x55aaff, 0xaaaaaa, 0xaaaaaa,
+ 0xaaaaaa, 0x55aaff, 0x55aaff, 0xaaaaff, 0xaaaaaa, 0x55aaff,
+ 0x55aaaa, 0xaa55aa, 0xaa55aa, 0xaa55aa, 0x55aaaa, 0x55aaff ) );
+
+/* Colour type 3, bit depth 4 */
+PIX ( ctype_3_4, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x8a,
+ 0x50, 0x4c, 0x54, 0x45, 0x88, 0xcc, 0xff, 0xaa, 0xaa, 0xdd, 0xaa,
+ 0xaa, 0xcc, 0x99, 0xbb, 0xdd, 0x99, 0xbb, 0xee, 0x99, 0xcc, 0xff,
+ 0xaa, 0xcc, 0xee, 0x99, 0xcc, 0xee, 0x88, 0xbb, 0xee, 0x99, 0xaa,
+ 0xdd, 0x88, 0xbb, 0xff, 0xbb, 0x99, 0xaa, 0xcc, 0x66, 0x77, 0xcc,
+ 0x66, 0x88, 0xbb, 0x99, 0xbb, 0xbb, 0x88, 0xaa, 0xaa, 0x99, 0xbb,
+ 0xbb, 0x77, 0x99, 0x88, 0xaa, 0xee, 0xbb, 0x88, 0x99, 0xbb, 0x77,
+ 0x88, 0xaa, 0x88, 0xbb, 0x88, 0x99, 0xdd, 0xaa, 0x77, 0xaa, 0x77,
+ 0xaa, 0xee, 0xcc, 0x55, 0x66, 0xaa, 0x88, 0xaa, 0xbb, 0x66, 0x88,
+ 0x99, 0x77, 0xaa, 0x99, 0x88, 0xbb, 0x77, 0xbb, 0xee, 0xaa, 0x77,
+ 0x99, 0x77, 0xbb, 0xff, 0x99, 0x77, 0xbb, 0xaa, 0x66, 0x99, 0xbb,
+ 0x55, 0x77, 0x88, 0x99, 0xcc, 0x88, 0x88, 0xcc, 0x77, 0xaa, 0xff,
+ 0x88, 0x88, 0xbb, 0x66, 0xaa, 0xff, 0x77, 0x88, 0xcc, 0x88, 0x77,
+ 0xbb, 0x99, 0x77, 0x99, 0x99, 0x66, 0x99, 0xff, 0xff, 0xff, 0xac,
+ 0x68, 0xae, 0x0f, 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44,
+ 0x2d, 0xcd, 0xda, 0x41, 0x3d, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48,
+ 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01,
+ 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x59, 0x49, 0x44, 0x41,
+ 0x54, 0x08, 0xd7, 0x0d, 0xc5, 0xd9, 0x02, 0x40, 0x20, 0x10, 0x00,
+ 0xc0, 0x95, 0x2b, 0x47, 0xb2, 0x49, 0xce, 0x08, 0xe5, 0xfe, 0xff,
+ 0xef, 0x63, 0x5e, 0x06, 0xc0, 0x23, 0x7e, 0x10, 0x46, 0x51, 0x1c,
+ 0xd0, 0xc4, 0x8f, 0x21, 0x25, 0x59, 0xce, 0x48, 0xc1, 0x79, 0xc9,
+ 0x19, 0x12, 0x10, 0x15, 0xa2, 0xac, 0x69, 0x8e, 0x94, 0xfd, 0x81,
+ 0x42, 0xc9, 0x9a, 0x56, 0x75, 0xbd, 0x18, 0x46, 0x3d, 0x81, 0x9e,
+ 0x51, 0x98, 0x76, 0x58, 0x56, 0xbd, 0x8d, 0xd6, 0x80, 0x75, 0x6e,
+ 0x37, 0xea, 0x38, 0xaf, 0xfb, 0x79, 0x2f, 0xf3, 0x01, 0xcb, 0xd6,
+ 0x06, 0x9f, 0x93, 0x26, 0xe0, 0xd0, 0x00, 0x00, 0x00, 0x25, 0x74,
+ 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30,
+ 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x88ccff, 0xaaaadd, 0xaaaacc, 0x99bbdd, 0x99bbee, 0x99ccff,
+ 0xaaccee, 0xaaccee, 0x99ccee, 0x99bbee, 0x88bbee, 0x99aadd,
+ 0x99bbdd, 0x99ccee, 0x88bbff, 0xaaaacc, 0xbb99aa, 0xcc6677,
+ 0xcc6688, 0xaaaacc, 0xbb99bb, 0xbb88aa, 0xbb88aa, 0xaa99bb,
+ 0xbb88aa, 0xcc6688, 0xbb7799, 0xaaaacc, 0x88aaee, 0xbb8899,
+ 0xbb7799, 0xbb7799, 0xbb7788, 0xaa88bb, 0x88bbee, 0xcc6677,
+ 0xbb7799, 0x88bbee, 0xcc6688, 0xbb7788, 0xaa88bb, 0x88bbee,
+ 0x8899dd, 0xbb7799, 0xbb7788, 0xcc6688, 0xaa77aa, 0x77aaee,
+ 0x8899dd, 0xcc5566, 0xaa88aa, 0x88aaee, 0xbb6688, 0x9977aa,
+ 0x9988bb, 0x77bbee, 0x9988bb, 0xaa7799, 0xbb7799, 0x88aaee,
+ 0x77bbff, 0x77aaee, 0xbb6688, 0x9977bb, 0xaa6699, 0x9988bb,
+ 0xbb5577, 0x9977aa, 0x8899cc, 0x77bbff, 0x8899cc, 0x8888cc,
+ 0x8888cc, 0x77aaff, 0x77bbff, 0x8899dd, 0x8888bb, 0x66aaff,
+ 0x7788cc, 0x8877bb, 0x997799, 0x996699, 0x7788cc, 0x77bbff ) );
+
+/* Colour type 3, bit depth 8 */
+PIX ( ctype_3_8, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x62, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
+ 0x60, 0x60, 0x64, 0x62, 0x66, 0x61, 0x65, 0x63, 0xe7, 0xe0, 0xe4,
+ 0xe2, 0xe6, 0xe1, 0x65, 0xe0, 0xe3, 0x17, 0x10, 0x14, 0x12, 0x16,
+ 0x11, 0x15, 0x13, 0x97, 0x90, 0x94, 0x92, 0x66, 0x90, 0x91, 0x95,
+ 0x93, 0x57, 0x50, 0x54, 0x52, 0x56, 0x51, 0x55, 0x53, 0xd7, 0xd0,
+ 0x64, 0xd0, 0xd2, 0xd6, 0xd1, 0xd5, 0xd3, 0x37, 0x30, 0x34, 0x32,
+ 0x36, 0x31, 0x35, 0x33, 0x67, 0xb0, 0xb0, 0xb4, 0xb2, 0xb6, 0xb1,
+ 0xb5, 0xb3, 0x77, 0x70, 0x74, 0x72, 0x76, 0x71, 0x65, 0x70, 0x73,
+ 0xf7, 0xf0, 0xf4, 0xf2, 0xf6, 0xf1, 0xf5, 0xf3, 0x0f, 0x08, 0x0c,
+ 0x0a, 0x06, 0x00, 0x96, 0xe0, 0x0d, 0x9f, 0x37, 0x73, 0x30, 0xa4,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45,
+ 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69,
+ 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d,
+ 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33,
+ 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Colour type 4, bit depth 16 */
+PIX ( ctype_4_16, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x10, 0x04, 0x00, 0x00, 0x00, 0x09, 0x82, 0xbb, 0x74,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x01, 0x86,
+ 0xa0, 0x31, 0xe8, 0x96, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4b,
+ 0x47, 0x44, 0xff, 0xff, 0x14, 0xab, 0x31, 0xcd, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x93,
+ 0x49, 0x44, 0x41, 0x54, 0x18, 0xd3, 0x4d, 0xcf, 0xc1, 0x4e, 0xc2,
+ 0x60, 0x10, 0x04, 0xe0, 0x8f, 0xf2, 0x0b, 0x24, 0x72, 0x13, 0x4f,
+ 0x9e, 0x48, 0x78, 0xd0, 0x5e, 0x78, 0x51, 0x0f, 0x1e, 0x4a, 0xaa,
+ 0x80, 0x96, 0x22, 0x68, 0xeb, 0xc1, 0x39, 0x74, 0x93, 0xc9, 0x4e,
+ 0x76, 0x76, 0x33, 0xb3, 0xb3, 0x7d, 0x3d, 0xd6, 0x8d, 0xff, 0x5a,
+ 0xa1, 0x60, 0x83, 0x21, 0xfc, 0x16, 0x9c, 0xd1, 0x65, 0xe7, 0x19,
+ 0xe5, 0x1e, 0xe1, 0x13, 0x07, 0xcc, 0xb0, 0xc5, 0x05, 0x3f, 0xc1,
+ 0x0a, 0x5f, 0xc1, 0x22, 0xfb, 0x55, 0x8b, 0xb7, 0x1c, 0x16, 0x8c,
+ 0x68, 0xe2, 0xda, 0xa2, 0x0f, 0xef, 0x92, 0x6a, 0x81, 0x35, 0xca,
+ 0x11, 0xd7, 0x38, 0x8d, 0xe9, 0x4f, 0x71, 0xbf, 0x61, 0x99, 0xe3,
+ 0x6f, 0x54, 0xf8, 0x8d, 0x73, 0x39, 0xe1, 0x9e, 0xe1, 0x2e, 0xb1,
+ 0xde, 0xf1, 0x8a, 0x07, 0x7c, 0x4c, 0x22, 0xcf, 0x93, 0x6a, 0x40,
+ 0x55, 0x62, 0xfd, 0x18, 0x61, 0x98, 0xfc, 0xf5, 0x92, 0xde, 0x45,
+ 0xeb, 0x27, 0xfc, 0x0f, 0x08, 0x4c, 0x30, 0x03, 0xe4, 0x95, 0x23,
+ 0xfb, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61,
+ 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32,
+ 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a,
+ 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74,
+ 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64,
+ 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30,
+ 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94,
+ 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
+ 0x82 ),
+ 14, 6,
+ DATA ( 0x858585, 0x6f6f6f, 0x6f6f6f, 0x777777, 0x7b7b7b, 0x8f8f8f,
+ 0x8d8d8d, 0x919191, 0x8b8b8b, 0x858585, 0x777777, 0x6c6c6c,
+ 0x747474, 0x898989, 0x808080, 0x696969, 0x5c5c5c, 0x474747,
+ 0x484848, 0x696969, 0x5f5f5f, 0x5b5b5b, 0x575757, 0x5f5f5f,
+ 0x535353, 0x474747, 0x4d4d4d, 0x6e6e6e, 0x6d6d6d, 0x4f4f4f,
+ 0x4f4f4f, 0x4b4b4b, 0x474747, 0x535353, 0x737373, 0x484848,
+ 0x4e4e4e, 0x737373, 0x484848, 0x474747, 0x535353, 0x7a7a7a,
+ 0x5d5d5d, 0x474747, 0x484848, 0x474747, 0x484848, 0x666666,
+ 0x5e5e5e, 0x424242, 0x4f4f4f, 0x6a6a6a, 0x414141, 0x434343,
+ 0x505050, 0x6e6e6e, 0x4e4e4e, 0x424242, 0x444444, 0x686868,
+ 0x707070, 0x5e5e5e, 0x404040, 0x454545, 0x3e3e3e, 0x4b4b4b,
+ 0x3d3d3d, 0x404040, 0x545454, 0x6c6c6c, 0x525252, 0x4e4e4e,
+ 0x4f4f4f, 0x6b6b6b, 0x6e6e6e, 0x5a5a5a, 0x484848, 0x606060,
+ 0x464646, 0x404040, 0x404040, 0x373737, 0x494949, 0x6f6f6f ) );
+
+/* Colour type 4, bit depth 8 */
+PIX ( ctype_4_8, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x04, 0x00, 0x00, 0x00, 0x59, 0x12, 0x67, 0x37,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x01, 0x86,
+ 0xa0, 0x31, 0xe8, 0x96, 0x5f, 0x00, 0x00, 0x00, 0x02, 0x62, 0x4b,
+ 0x47, 0x44, 0x00, 0xff, 0x87, 0x8f, 0xcc, 0xbf, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x72,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x05, 0xc1, 0xbb, 0x0e, 0x82,
+ 0x30, 0x00, 0x00, 0xc0, 0xa3, 0x54, 0x6d, 0x0c, 0x9b, 0xb8, 0xb9,
+ 0x18, 0xbf, 0xd5, 0x1f, 0x75, 0x70, 0xf0, 0x15, 0x1f, 0x20, 0xa6,
+ 0x56, 0xf0, 0xae, 0xda, 0x4f, 0x27, 0x24, 0x51, 0x6b, 0x14, 0x65,
+ 0xd9, 0x53, 0x2f, 0x59, 0x8b, 0x5f, 0xd9, 0xcb, 0x05, 0x5b, 0x6f,
+ 0x45, 0x91, 0x74, 0x3a, 0x0b, 0x59, 0xb8, 0x3a, 0xea, 0xd4, 0x26,
+ 0x27, 0xad, 0x9b, 0x41, 0xeb, 0x8d, 0xb9, 0x46, 0xbc, 0xfb, 0x08,
+ 0x46, 0x95, 0x95, 0xb3, 0x6c, 0x6e, 0xf0, 0x11, 0x14, 0x9d, 0xf8,
+ 0xf0, 0x55, 0xdb, 0x49, 0x6e, 0x0e, 0x66, 0xee, 0x8a, 0x9f, 0x49,
+ 0x34, 0x0a, 0x51, 0x63, 0xa9, 0x36, 0x2a, 0x92, 0x8d, 0x85, 0x5e,
+ 0x30, 0xe8, 0xd5, 0xfe, 0x3c, 0xbb, 0x2f, 0xff, 0xe5, 0xd1, 0x65,
+ 0x25, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61,
+ 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32,
+ 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a,
+ 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74,
+ 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64,
+ 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30,
+ 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94,
+ 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
+ 0x82 ),
+ 14, 6,
+ DATA ( 0x858585, 0x6f6f6f, 0x6f6f6f, 0x777777, 0x7b7b7b, 0x8f8f8f,
+ 0x8d8d8d, 0x919191, 0x8b8b8b, 0x858585, 0x777777, 0x6c6c6c,
+ 0x747474, 0x898989, 0x808080, 0x696969, 0x5c5c5c, 0x484848,
+ 0x484848, 0x696969, 0x5f5f5f, 0x5b5b5b, 0x575757, 0x5f5f5f,
+ 0x535353, 0x474747, 0x4e4e4e, 0x6e6e6e, 0x6d6d6d, 0x4f4f4f,
+ 0x505050, 0x4b4b4b, 0x474747, 0x535353, 0x737373, 0x494949,
+ 0x4e4e4e, 0x737373, 0x494949, 0x474747, 0x545454, 0x7a7a7a,
+ 0x5d5d5d, 0x474747, 0x494949, 0x474747, 0x484848, 0x666666,
+ 0x5e5e5e, 0x434343, 0x4f4f4f, 0x6a6a6a, 0x414141, 0x434343,
+ 0x505050, 0x6e6e6e, 0x4e4e4e, 0x424242, 0x454545, 0x686868,
+ 0x707070, 0x5e5e5e, 0x404040, 0x454545, 0x3f3f3f, 0x4b4b4b,
+ 0x3e3e3e, 0x404040, 0x545454, 0x6c6c6c, 0x525252, 0x4e4e4e,
+ 0x4f4f4f, 0x6b6b6b, 0x6e6e6e, 0x5a5a5a, 0x484848, 0x616161,
+ 0x464646, 0x404040, 0x404040, 0x373737, 0x494949, 0x6f6f6f ) );
+
+/* Colour type 6, bit depth 16 */
+PIX ( ctype_6_16, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x10, 0x06, 0x00, 0x00, 0x00, 0xa3, 0x8b, 0x73, 0xff,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x06,
+ 0x62, 0x4b, 0x47, 0x44, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x09,
+ 0x58, 0xf7, 0xdc, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73,
+ 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a,
+ 0x9c, 0x18, 0x00, 0x00, 0x01, 0x5f, 0x49, 0x44, 0x41, 0x54, 0x28,
+ 0xcf, 0x4d, 0xd0, 0x31, 0x6e, 0xd3, 0x00, 0x00, 0x85, 0xe1, 0x2f,
+ 0x76, 0xac, 0x90, 0xb4, 0x8d, 0x92, 0xd0, 0x14, 0x15, 0x41, 0x84,
+ 0x2a, 0x24, 0x86, 0x0e, 0x2c, 0x14, 0x01, 0x1b, 0x1b, 0x1b, 0xc7,
+ 0xe0, 0x1a, 0xb9, 0x01, 0x67, 0xe1, 0x10, 0xa8, 0x52, 0xc5, 0x00,
+ 0x02, 0x01, 0x19, 0x68, 0x41, 0xad, 0x1a, 0x10, 0x4d, 0xec, 0xb8,
+ 0x4e, 0x93, 0x58, 0x4e, 0xcc, 0xe2, 0x81, 0xf5, 0x0d, 0xef, 0xfd,
+ 0xef, 0xaf, 0xbd, 0x1d, 0xbe, 0x1f, 0x6e, 0x86, 0xe5, 0x70, 0xdf,
+ 0xd8, 0x08, 0xa1, 0x52, 0x81, 0xd4, 0xb6, 0x0e, 0x4a, 0x75, 0x11,
+ 0x36, 0x3a, 0xfa, 0x68, 0x2b, 0x5c, 0x83, 0x50, 0x84, 0xa5, 0xb5,
+ 0x1a, 0x4a, 0x85, 0x05, 0x12, 0x37, 0x42, 0x34, 0x65, 0x62, 0xdc,
+ 0xd2, 0x50, 0xa2, 0xa6, 0xa7, 0x87, 0x7a, 0x6e, 0xad, 0x44, 0xa1,
+ 0x90, 0xa3, 0xe7, 0x8f, 0x53, 0x1c, 0xf8, 0xe2, 0x04, 0xb9, 0x86,
+ 0x26, 0xce, 0xbc, 0xf0, 0x1a, 0x6d, 0x89, 0x4b, 0xec, 0x98, 0x4b,
+ 0x50, 0x58, 0x5b, 0x23, 0xad, 0x80, 0xee, 0x88, 0x25, 0x68, 0xbb,
+ 0xf0, 0x03, 0x0b, 0x5d, 0x7d, 0xc4, 0x1e, 0x3b, 0x42, 0x90, 0x8b,
+ 0x65, 0xb8, 0x6d, 0xe4, 0x23, 0x02, 0x53, 0x57, 0x98, 0xd8, 0x75,
+ 0x1f, 0x73, 0x91, 0x2d, 0x94, 0x7e, 0x1b, 0xe3, 0xbb, 0x07, 0x9e,
+ 0x62, 0xc7, 0xc8, 0x27, 0x94, 0x32, 0xd7, 0x55, 0xfe, 0x04, 0x6d,
+ 0x63, 0x67, 0x58, 0x89, 0xb4, 0x30, 0xd1, 0x75, 0x0f, 0xe7, 0xba,
+ 0x1e, 0x22, 0x20, 0x31, 0x43, 0x20, 0x95, 0x21, 0x94, 0x9a, 0x63,
+ 0x4b, 0x6a, 0x8a, 0x89, 0x6d, 0x77, 0xf1, 0xd5, 0xc0, 0x73, 0xac,
+ 0xfd, 0x15, 0x57, 0x43, 0x19, 0x62, 0x4d, 0xbb, 0x58, 0x5a, 0x29,
+ 0xb0, 0xb2, 0x94, 0xe3, 0x42, 0xcb, 0x1e, 0x66, 0x6a, 0x1a, 0x48,
+ 0x2d, 0x40, 0xbd, 0xeb, 0xca, 0x2f, 0x2c, 0x15, 0x02, 0x14, 0x02,
+ 0x11, 0x8e, 0xbd, 0xf4, 0xe6, 0xbf, 0xc2, 0x4d, 0xa5, 0xea, 0xd0,
+ 0xb1, 0x77, 0x38, 0xf1, 0xc8, 0x2b, 0xf4, 0x5d, 0x3a, 0xc5, 0xbe,
+ 0xd0, 0x07, 0x44, 0xd5, 0xe3, 0xa5, 0x9e, 0x00, 0x89, 0x96, 0x2e,
+ 0xe6, 0x88, 0x50, 0x8f, 0x35, 0x75, 0xb0, 0xa8, 0x94, 0x94, 0x6a,
+ 0x02, 0x4c, 0x45, 0x3a, 0x60, 0x03, 0xda, 0x72, 0x19, 0x46, 0x06,
+ 0x8e, 0xf0, 0xcd, 0x81, 0x67, 0xd8, 0xf3, 0xd3, 0x67, 0x34, 0x2d,
+ 0x4c, 0x10, 0x1a, 0x38, 0xc4, 0x5a, 0x66, 0x86, 0x1b, 0x73, 0x39,
+ 0x36, 0x42, 0x75, 0xfc, 0x03, 0x3f, 0x65, 0x8d, 0x8a, 0xc6, 0x64,
+ 0x55, 0xda, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64,
+ 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00,
+ 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54,
+ 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31,
+ 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25,
+ 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f,
+ 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30,
+ 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a,
+ 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde,
+ 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Colour type 6, bit depth 8 */
+PIX ( ctype_6_8, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x06, 0x00, 0x00, 0x00, 0xf3, 0x1b, 0xaf, 0xbc,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x06,
+ 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
+ 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73,
+ 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a,
+ 0x9c, 0x18, 0x00, 0x00, 0x01, 0x23, 0x49, 0x44, 0x41, 0x54, 0x18,
+ 0xd3, 0x05, 0xc1, 0x4d, 0x4e, 0xc2, 0x40, 0x00, 0x80, 0xd1, 0xaf,
+ 0x7f, 0xc1, 0x22, 0x36, 0x2d, 0x02, 0x06, 0xa3, 0x84, 0x10, 0x13,
+ 0x17, 0x2e, 0xdc, 0x80, 0x51, 0x77, 0xee, 0xdc, 0x79, 0x0c, 0x8f,
+ 0xe3, 0x59, 0x3c, 0x84, 0x31, 0x21, 0x2e, 0x34, 0x1a, 0x95, 0x85,
+ 0xa8, 0x91, 0x88, 0x46, 0x60, 0x4a, 0x99, 0xd2, 0xd2, 0x4c, 0x3b,
+ 0xbe, 0x67, 0x5c, 0xdd, 0x14, 0xba, 0x39, 0x1e, 0x60, 0x69, 0x45,
+ 0x54, 0xf1, 0xd1, 0xb6, 0x43, 0xe1, 0xd7, 0xf1, 0xd4, 0x02, 0x2c,
+ 0x87, 0x34, 0x37, 0xd0, 0x2a, 0x21, 0x5c, 0x5a, 0xb8, 0x52, 0xb0,
+ 0x56, 0xd2, 0x18, 0xd5, 0x2a, 0x76, 0x96, 0x6b, 0x94, 0xca, 0xa8,
+ 0xfe, 0x0e, 0xe9, 0x3c, 0xf5, 0xc9, 0x4a, 0x2e, 0xef, 0xa7, 0x17,
+ 0x78, 0xe1, 0x37, 0x1b, 0x71, 0x88, 0xca, 0x73, 0x22, 0xbf, 0xce,
+ 0x96, 0x08, 0xf1, 0x46, 0x6f, 0x24, 0x41, 0x1d, 0x71, 0xd8, 0xc3,
+ 0xcc, 0x84, 0x64, 0x73, 0x70, 0x8f, 0x39, 0x9b, 0x30, 0xad, 0xed,
+ 0x12, 0x3b, 0xeb, 0xe8, 0x9f, 0x31, 0xaf, 0xed, 0x23, 0x36, 0x06,
+ 0x0f, 0x68, 0xb9, 0xe0, 0xb5, 0xdd, 0xc5, 0x1b, 0xbf, 0xb3, 0x72,
+ 0xca, 0x4c, 0x83, 0x1d, 0xbe, 0x82, 0x3d, 0x4c, 0xc2, 0x39, 0x66,
+ 0x24, 0xb1, 0xa2, 0x98, 0xf5, 0x68, 0xc6, 0xb4, 0xb2, 0xcd, 0x73,
+ 0xeb, 0x84, 0xfc, 0x4f, 0xa0, 0xa5, 0x44, 0xb8, 0x35, 0xd2, 0x95,
+ 0x62, 0x95, 0x66, 0x8c, 0xca, 0x0d, 0xe6, 0x46, 0x89, 0x28, 0x01,
+ 0x3b, 0x98, 0x7c, 0x92, 0x2a, 0x13, 0x65, 0x3a, 0xdc, 0x9e, 0x5d,
+ 0x22, 0xdc, 0x1a, 0x85, 0x08, 0x39, 0xb8, 0xbd, 0xa6, 0xbf, 0x7f,
+ 0x4e, 0xfd, 0x7b, 0x48, 0xd3, 0xba, 0xc3, 0x91, 0x0b, 0xd2, 0xaa,
+ 0x49, 0x58, 0x0e, 0x88, 0x71, 0xb0, 0x85, 0xeb, 0x93, 0xb4, 0xbb,
+ 0x68, 0xc3, 0x64, 0xe6, 0xf8, 0x50, 0x80, 0x97, 0x49, 0x06, 0xad,
+ 0x1e, 0x2f, 0x9d, 0x63, 0x1a, 0x1f, 0x8f, 0xb8, 0xc9, 0x14, 0xab,
+ 0x75, 0x40, 0x2e, 0xe7, 0x2c, 0xe3, 0x8c, 0xc2, 0xb2, 0xf9, 0x07,
+ 0xb2, 0x82, 0x8b, 0x8a, 0x51, 0x8a, 0xfe, 0x2f, 0x00, 0x00, 0x00,
+ 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d,
+ 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33,
+ 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4,
+ 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64,
+ 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00,
+ 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54,
+ 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31,
+ 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Filter method 0 */
+PIX ( filter_0, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x62, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
+ 0x60, 0x60, 0x64, 0x62, 0x66, 0x61, 0x65, 0x63, 0xe7, 0xe0, 0xe4,
+ 0xe2, 0xe6, 0xe1, 0x65, 0xe0, 0xe3, 0x17, 0x10, 0x14, 0x12, 0x16,
+ 0x11, 0x15, 0x13, 0x97, 0x90, 0x94, 0x92, 0x66, 0x90, 0x91, 0x95,
+ 0x93, 0x57, 0x50, 0x54, 0x52, 0x56, 0x51, 0x55, 0x53, 0xd7, 0xd0,
+ 0x64, 0xd0, 0xd2, 0xd6, 0xd1, 0xd5, 0xd3, 0x37, 0x30, 0x34, 0x32,
+ 0x36, 0x31, 0x35, 0x33, 0x67, 0xb0, 0xb0, 0xb4, 0xb2, 0xb6, 0xb1,
+ 0xb5, 0xb3, 0x77, 0x70, 0x74, 0x72, 0x76, 0x71, 0x65, 0x70, 0x73,
+ 0xf7, 0xf0, 0xf4, 0xf2, 0xf6, 0xf1, 0xf5, 0xf3, 0x0f, 0x08, 0x0c,
+ 0x0a, 0x06, 0x00, 0x96, 0xe0, 0x0d, 0x9f, 0x37, 0x73, 0x30, 0xa4,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45,
+ 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69,
+ 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d,
+ 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33,
+ 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Filter method 1 */
+PIX ( filter_1, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x1b, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
+ 0x64, 0x60, 0x44, 0x01, 0x7c, 0xa8, 0x5c, 0x19, 0x54, 0xae, 0x16,
+ 0x2a, 0xd7, 0x02, 0x95, 0xeb, 0x86, 0xc2, 0x03, 0x00, 0x2b, 0x08,
+ 0x01, 0x27, 0x21, 0x1c, 0x62, 0x0d, 0x00, 0x00, 0x00, 0x25, 0x74,
+ 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30,
+ 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Filter method 2 */
+PIX ( filter_2, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x1c, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
+ 0x62, 0x60, 0x64, 0x62, 0x66, 0x61, 0x65, 0x63, 0xe7, 0xe0, 0xe4,
+ 0xe2, 0xe6, 0xe1, 0x65, 0xe2, 0x43, 0x01, 0x94, 0x70, 0x01, 0xae,
+ 0xce, 0x04, 0x3c, 0x32, 0x9e, 0x82, 0x4f, 0x00, 0x00, 0x00, 0x25,
+ 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30,
+ 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a,
+ 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66,
+ 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61,
+ 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32,
+ 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a,
+ 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49,
+ 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Filter method 3 */
+PIX ( filter_3, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x28, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
+ 0x66, 0x60, 0x64, 0x62, 0x62, 0x66, 0x66, 0x61, 0x61, 0x65, 0x65,
+ 0x63, 0x63, 0x67, 0x67, 0xe6, 0xe3, 0x40, 0x06, 0xcc, 0xa2, 0xa8,
+ 0x5c, 0x19, 0x54, 0xae, 0x32, 0x2a, 0x57, 0x0b, 0x85, 0x0b, 0x00,
+ 0x74, 0x6c, 0x02, 0xde, 0x3a, 0xf5, 0xbf, 0x99, 0x00, 0x00, 0x00,
+ 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63,
+ 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d,
+ 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33,
+ 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4,
+ 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64,
+ 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00,
+ 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54,
+ 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31,
+ 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00,
+ 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Filter method 4 */
+PIX ( filter_4, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x11, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
+ 0x61, 0x60, 0x44, 0x06, 0x2c, 0x7c, 0x54, 0xe3, 0x02, 0x00, 0x1e,
+ 0xdd, 0x00, 0xad, 0x19, 0xa1, 0xfb, 0x47, 0x00, 0x00, 0x00, 0x25,
+ 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30,
+ 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a,
+ 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66,
+ 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61,
+ 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32,
+ 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a,
+ 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49,
+ 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Interlaced */
+PIX ( interlaced, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x01, 0xb3, 0xc2, 0x6f, 0x18,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x68, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63,
+ 0x60, 0xe0, 0x60, 0x60, 0xe1, 0x61, 0xb0, 0xb0, 0x71, 0x70, 0x61,
+ 0x60, 0x62, 0xe3, 0x62, 0xb0, 0xb2, 0x73, 0x62, 0x90, 0x91, 0x53,
+ 0x50, 0x52, 0x51, 0xd3, 0x60, 0x60, 0x64, 0x66, 0x65, 0xe7, 0xe4,
+ 0xe6, 0x65, 0x90, 0x95, 0x57, 0x54, 0x56, 0x55, 0xd7, 0x64, 0xb0,
+ 0xb4, 0xb6, 0xb5, 0x77, 0x74, 0x76, 0x65, 0xe0, 0xe3, 0x17, 0x10,
+ 0x14, 0x12, 0x16, 0x11, 0x15, 0x13, 0x97, 0x90, 0x94, 0x92, 0x66,
+ 0xd0, 0xd2, 0xd6, 0xd1, 0xd5, 0xd3, 0x37, 0x30, 0x34, 0x32, 0x36,
+ 0x31, 0x35, 0x33, 0x67, 0x70, 0x73, 0xf7, 0xf0, 0xf4, 0xf2, 0xf6,
+ 0xf1, 0xf5, 0xf3, 0x0f, 0x08, 0x0c, 0x0a, 0x06, 0x00, 0xf9, 0xc2,
+ 0x0d, 0x9f, 0x36, 0xdc, 0x4b, 0x87, 0x00, 0x00, 0x00, 0x25, 0x74,
+ 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30,
+ 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Interlaced (height 1) */
+PIX ( interlaced_h1, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x01, 0x04, 0x03, 0x00, 0x00, 0x01, 0x66, 0x29, 0xc2, 0xe6,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x1b,
+ 0x50, 0x4c, 0x54, 0x45, 0x9a, 0x9a, 0xcd, 0xae, 0x88, 0xae, 0x9f,
+ 0x94, 0xc3, 0x9a, 0x9d, 0xcf, 0xab, 0x8a, 0xb3, 0xa2, 0x91, 0xbb,
+ 0xa9, 0x7f, 0xa6, 0x93, 0xa4, 0xd7, 0xff, 0xff, 0xff, 0x01, 0x68,
+ 0x32, 0x1c, 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x08,
+ 0x86, 0xde, 0x95, 0x7a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59,
+ 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00,
+ 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x11, 0x49, 0x44, 0x41, 0x54,
+ 0x08, 0xd7, 0x63, 0x60, 0x60, 0x70, 0x60, 0x50, 0x63, 0x10, 0x0e,
+ 0x07, 0x00, 0x02, 0x9e, 0x00, 0xd1, 0x1a, 0x21, 0xdf, 0x5d, 0x00,
+ 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65,
+ 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31,
+ 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a,
+ 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30,
+ 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58,
+ 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66,
+ 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31,
+ 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b,
+ 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00,
+ 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 8, 1,
+ DATA ( 0x9a9acd, 0xae88ae, 0x9f94c3, 0x9a9dcf, 0xab8ab3, 0xa291bb,
+ 0xa97fa6, 0x93a4d7, ) );
+
+/* Interlaced (height 2) */
+PIX ( interlaced_h2, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x02, 0x08, 0x03, 0x00, 0x00, 0x01, 0x25, 0x4d, 0x5d, 0x49,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x33,
+ 0x50, 0x4c, 0x54, 0x45, 0x9b, 0xa9, 0xda, 0xb7, 0x8b, 0xab, 0xb1,
+ 0x8b, 0xae, 0xa4, 0xa6, 0xd2, 0xb7, 0x94, 0xb5, 0xa7, 0x9e, 0xc5,
+ 0xb0, 0x86, 0xab, 0xa2, 0xa5, 0xd0, 0x99, 0x8b, 0xbe, 0xa7, 0x82,
+ 0xae, 0x8e, 0x9b, 0xd5, 0x90, 0x92, 0xcb, 0xa0, 0x7e, 0xad, 0x9e,
+ 0x82, 0xae, 0xa4, 0x76, 0x9f, 0x85, 0xa2, 0xde, 0xff, 0xff, 0xff,
+ 0xf3, 0x35, 0x13, 0x79, 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47,
+ 0x44, 0x10, 0x95, 0xb2, 0x0d, 0x2c, 0x00, 0x00, 0x00, 0x09, 0x70,
+ 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13,
+ 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x1d, 0x49, 0x44,
+ 0x41, 0x54, 0x08, 0xd7, 0x63, 0x60, 0x60, 0x60, 0x61, 0x60, 0x62,
+ 0x63, 0x60, 0x64, 0x66, 0x65, 0x67, 0xe0, 0xe0, 0xe4, 0xe2, 0xe6,
+ 0xe1, 0xe5, 0xe3, 0x07, 0x00, 0x02, 0xf9, 0x00, 0x79, 0x11, 0xe8,
+ 0xb8, 0x97, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64,
+ 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00,
+ 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54,
+ 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31,
+ 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25,
+ 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f,
+ 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30,
+ 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a,
+ 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde,
+ 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x60, 0x82 ),
+ 8, 2,
+ DATA ( 0x9ba9da, 0xb78bab, 0xb18bae, 0xa4a6d2, 0xb794b5, 0xa79ec5,
+ 0xb086ab, 0xa2a5d0, 0x998bbe, 0xa782ae, 0x8e9bd5, 0x9092cb,
+ 0xa07ead, 0x9e82ae, 0xa4769f, 0x85a2de, ) );
+
+/* Interlaced (height 3) */
+PIX ( interlaced_h3, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x03, 0x08, 0x03, 0x00, 0x00, 0x01, 0xee, 0x11, 0x8e, 0xec,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x4b,
+ 0x50, 0x4c, 0x54, 0x45, 0x99, 0xb4, 0xe6, 0xb3, 0x97, 0xb9, 0xb1,
+ 0x95, 0xb7, 0xa9, 0xaf, 0xd7, 0xb4, 0xa4, 0xc7, 0xa8, 0xa6, 0xce,
+ 0xad, 0x90, 0xb7, 0xa8, 0xa8, 0xcf, 0x9d, 0x94, 0xc5, 0xbc, 0x78,
+ 0x97, 0xac, 0x81, 0xa8, 0x9a, 0x98, 0xca, 0xb9, 0x79, 0x99, 0xa5,
+ 0x8f, 0xb6, 0xb1, 0x76, 0x9a, 0x94, 0xa1, 0xd4, 0x96, 0x87, 0xbc,
+ 0x9a, 0x8a, 0xbe, 0x7d, 0xaa, 0xef, 0x8c, 0x8f, 0xcc, 0x91, 0x83,
+ 0xbc, 0x9b, 0x7c, 0xaa, 0x9c, 0x76, 0xa2, 0x7d, 0xa3, 0xe2, 0xff,
+ 0xff, 0xff, 0x53, 0xa1, 0xdb, 0xb9, 0x00, 0x00, 0x00, 0x01, 0x62,
+ 0x4b, 0x47, 0x44, 0x18, 0x9b, 0x69, 0x85, 0x1e, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x26,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x05, 0xc1, 0x85, 0x01, 0x00,
+ 0x20, 0x00, 0xc0, 0xa0, 0xd9, 0xdd, 0xf5, 0xff, 0xa7, 0x02, 0xa0,
+ 0x91, 0x96, 0x3e, 0xf7, 0x45, 0x28, 0xe3, 0x18, 0xeb, 0x3c, 0x7c,
+ 0x88, 0x29, 0x97, 0xda, 0x3e, 0x0d, 0xb1, 0x01, 0x15, 0x29, 0x54,
+ 0xbc, 0x10, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64,
+ 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x00,
+ 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54,
+ 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31,
+ 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00, 0x25,
+ 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d, 0x6f,
+ 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30,
+ 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a,
+ 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9, 0xde,
+ 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
+ 0x60, 0x82 ),
+ 8, 3,
+ DATA ( 0x99b4e6, 0xb397b9, 0xb195b7, 0xa9afd7, 0xb4a4c7, 0xa8a6ce,
+ 0xad90b7, 0xa8a8cf, 0x9d94c5, 0xbc7897, 0xac81a8, 0x9a98ca,
+ 0xb97999, 0xa58fb6, 0xb1769a, 0x94a1d4, 0x9687bc, 0x9a8abe,
+ 0x7daaef, 0x8c8fcc, 0x9183bc, 0x9b7caa, 0x9c76a2, 0x7da3e2 ) );
+
+/* Interlaced (height 4) */
+PIX ( interlaced_h4, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x04, 0x08, 0x03, 0x00, 0x00, 0x01, 0xf3, 0x14, 0xbe, 0x54,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x63,
+ 0x50, 0x4c, 0x54, 0x45, 0x99, 0xb8, 0xea, 0xaf, 0xa0, 0xc4, 0xab,
+ 0xa1, 0xc7, 0xa8, 0xb7, 0xe0, 0xaf, 0xb1, 0xd7, 0xa5, 0xae, 0xd7,
+ 0xa6, 0x9b, 0xc5, 0xa8, 0xad, 0xd3, 0x9a, 0xa3, 0xd4, 0xbd, 0x7e,
+ 0x9b, 0xbb, 0x77, 0x94, 0xa4, 0x9b, 0xc6, 0xbe, 0x80, 0x9d, 0xaa,
+ 0x93, 0xb9, 0xba, 0x76, 0x96, 0xa2, 0x9e, 0xca, 0x9f, 0x87, 0xb7,
+ 0xb7, 0x76, 0x99, 0x99, 0x91, 0xc5, 0x91, 0x94, 0xcc, 0xb1, 0x76,
+ 0x9a, 0xa2, 0x88, 0xb1, 0xa7, 0x77, 0x9f, 0x87, 0xa3, 0xde, 0x92,
+ 0x8a, 0xc1, 0x91, 0x91, 0xca, 0x77, 0xb0, 0xf8, 0x8a, 0x8f, 0xce,
+ 0x87, 0x89, 0xc8, 0x97, 0x7a, 0xaa, 0x99, 0x76, 0xa3, 0x7b, 0xa2,
+ 0xe3, 0xff, 0xff, 0xff, 0xfa, 0x09, 0xb4, 0x8e, 0x00, 0x00, 0x00,
+ 0x01, 0x62, 0x4b, 0x47, 0x44, 0x20, 0xb3, 0x6b, 0x3d, 0x80, 0x00,
+ 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13,
+ 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00,
+ 0x00, 0x30, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x63, 0x60, 0x60,
+ 0x60, 0x61, 0x60, 0x62, 0x63, 0x10, 0x10, 0x12, 0x11, 0x63, 0x60,
+ 0x64, 0x66, 0x65, 0x67, 0x10, 0x14, 0x16, 0x15, 0x67, 0xe0, 0xe0,
+ 0xe4, 0xe2, 0xe6, 0xe1, 0xe5, 0xe3, 0x67, 0x90, 0x90, 0x94, 0x92,
+ 0x96, 0x91, 0x95, 0x93, 0x07, 0x00, 0x1b, 0x22, 0x01, 0xf1, 0x69,
+ 0x98, 0xfa, 0x95, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74,
+ 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65,
+ 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32,
+ 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30,
+ 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00, 0x00,
+ 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x6d,
+ 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d,
+ 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33,
+ 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3, 0xe9,
+ 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
+ 0x42, 0x60, 0x82 ),
+ 8, 4,
+ DATA ( 0x99b8ea, 0xafa0c4, 0xaba1c7, 0xa8b7e0, 0xafb1d7, 0xa5aed7,
+ 0xa69bc5, 0xa8add3, 0x9aa3d4, 0xbd7e9b, 0xbb7794, 0xa49bc6,
+ 0xbe809d, 0xaa93b9, 0xba7696, 0xa29eca, 0x9f87b7, 0xb77699,
+ 0x9991c5, 0x9194cc, 0xb1769a, 0xa288b1, 0xa7779f, 0x87a3de,
+ 0x928ac1, 0x9191ca, 0x77b0f8, 0x8a8fce, 0x8789c8, 0x977aaa,
+ 0x9976a3, 0x7ba2e3, ) );
+
+/* Interlaced (width 1) */
+PIX ( interlaced_w1, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x08, 0x04, 0x03, 0x00, 0x00, 0x01, 0xbd, 0x33, 0xb8, 0xe4,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x1b,
+ 0x50, 0x4c, 0x54, 0x45, 0x9f, 0xbd, 0xeb, 0xae, 0xa0, 0xc5, 0xb4,
+ 0x8a, 0xac, 0xac, 0x8a, 0xb0, 0xa5, 0x87, 0xb2, 0x9d, 0x86, 0xb6,
+ 0x90, 0x8c, 0xc3, 0x82, 0x93, 0xd3, 0xff, 0xff, 0xff, 0xac, 0xaf,
+ 0x93, 0xf1, 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x08,
+ 0x86, 0xde, 0x95, 0x7a, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59,
+ 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00,
+ 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x18, 0x49, 0x44, 0x41, 0x54,
+ 0x08, 0xd7, 0x63, 0x60, 0x60, 0x70, 0x60, 0x50, 0x60, 0x48, 0x60,
+ 0x10, 0x60, 0x30, 0x60, 0x08, 0x60, 0x28, 0x00, 0x00, 0x0a, 0xd0,
+ 0x01, 0xc1, 0x05, 0xa2, 0x99, 0xc6, 0x00, 0x00, 0x00, 0x25, 0x74,
+ 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65,
+ 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31,
+ 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30,
+ 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28,
+ 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74,
+ 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30,
+ 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32,
+ 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30,
+ 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
+ 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 1, 8,
+ DATA ( 0x9fbdeb, 0xaea0c5, 0xb48aac, 0xac8ab0, 0xa587b2, 0x9d86b6,
+ 0x908cc3, 0x8293d3, ) );
+
+/* Interlaced (width 2) */
+PIX ( interlaced_w2, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x08, 0x08, 0x03, 0x00, 0x00, 0x01, 0x93, 0xf4, 0xee, 0xe6,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x33,
+ 0x50, 0x4c, 0x54, 0x45, 0xa0, 0xbc, 0xe9, 0x9e, 0xbe, 0xec, 0xad,
+ 0xa1, 0xc7, 0xaf, 0x9e, 0xc2, 0xb4, 0x8b, 0xad, 0xb6, 0x88, 0xa9,
+ 0xae, 0x87, 0xac, 0xac, 0x8b, 0xb1, 0xa9, 0x83, 0xad, 0xa1, 0x8a,
+ 0xb6, 0x9e, 0x87, 0xb8, 0x9d, 0x84, 0xb3, 0x8e, 0x92, 0xcc, 0x92,
+ 0x85, 0xba, 0x80, 0x9b, 0xde, 0x84, 0x8b, 0xc7, 0xff, 0xff, 0xff,
+ 0xa3, 0x2a, 0xf5, 0x35, 0x00, 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47,
+ 0x44, 0x10, 0x95, 0xb2, 0x0d, 0x2c, 0x00, 0x00, 0x00, 0x09, 0x70,
+ 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13,
+ 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x20, 0x49, 0x44,
+ 0x41, 0x54, 0x08, 0xd7, 0x05, 0xc1, 0x05, 0x01, 0x00, 0x20, 0x00,
+ 0x00, 0x20, 0xec, 0xd6, 0xff, 0x6f, 0x05, 0x74, 0xd9, 0x16, 0x14,
+ 0xc3, 0x11, 0x93, 0xda, 0xcc, 0xe5, 0xbe, 0x0f, 0x04, 0xf2, 0x00,
+ 0x79, 0x83, 0x54, 0x1a, 0x1e, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45,
+ 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61,
+ 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d,
+ 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33,
+ 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00,
+ 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65,
+ 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31,
+ 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a,
+ 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30,
+ 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
+ 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 2, 8,
+ DATA ( 0xa0bce9, 0x9ebeec, 0xada1c7, 0xaf9ec2, 0xb48bad, 0xb688a9,
+ 0xae87ac, 0xac8bb1, 0xa983ad, 0xa18ab6, 0x9e87b8, 0x9d84b3,
+ 0x8e92cc, 0x9285ba, 0x809bde, 0x848bc7, ) );
+
+/* Interlaced (width 3) */
+PIX ( interlaced_w3, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
+ 0x00, 0x08, 0x08, 0x03, 0x00, 0x00, 0x01, 0x7c, 0x36, 0x85, 0xd8,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x4b,
+ 0x50, 0x4c, 0x54, 0x45, 0xa0, 0xb7, 0xe4, 0xa1, 0xc4, 0xf1, 0x9c,
+ 0xba, 0xe9, 0xab, 0xa0, 0xc7, 0xb1, 0xa1, 0xc5, 0xae, 0x9b, 0xc0,
+ 0xb1, 0x8d, 0xb0, 0xb8, 0x88, 0xa8, 0xb5, 0x87, 0xa9, 0xae, 0x86,
+ 0xab, 0xae, 0x88, 0xad, 0xaa, 0x8c, 0xb4, 0xac, 0x80, 0xa9, 0xa5,
+ 0x88, 0xb2, 0x9f, 0x8b, 0xb7, 0xa0, 0x88, 0xb8, 0x9e, 0x84, 0xb5,
+ 0x9c, 0x85, 0xb4, 0x8f, 0x94, 0xce, 0x8f, 0x8a, 0xc4, 0x93, 0x84,
+ 0xb6, 0x81, 0x9d, 0xdf, 0x7e, 0x95, 0xd8, 0x88, 0x86, 0xbe, 0xff,
+ 0xff, 0xff, 0xef, 0xfb, 0x85, 0x9c, 0x00, 0x00, 0x00, 0x01, 0x62,
+ 0x4b, 0x47, 0x44, 0x18, 0x9b, 0x69, 0x85, 0x1e, 0x00, 0x00, 0x00,
+ 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00,
+ 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x28,
+ 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x05, 0xc1, 0x85, 0x01, 0x00,
+ 0x20, 0x00, 0xc0, 0xa0, 0xd9, 0xdd, 0xf5, 0xff, 0xa7, 0x02, 0x90,
+ 0x91, 0x54, 0xac, 0x67, 0x6e, 0x04, 0x8e, 0xc2, 0x42, 0x69, 0x43,
+ 0x88, 0x89, 0xd6, 0x07, 0xe7, 0xbe, 0x0f, 0x0f, 0x68, 0x01, 0x15,
+ 0x06, 0x65, 0x37, 0x5a, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58,
+ 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72, 0x65, 0x61, 0x74,
+ 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31,
+ 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b,
+ 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66, 0x28, 0x00, 0x00,
+ 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a,
+ 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32, 0x30, 0x31, 0x34,
+ 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34,
+ 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xd3,
+ 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
+ 0xae, 0x42, 0x60, 0x82 ),
+ 3, 8,
+ DATA ( 0xa0b7e4, 0xa1c4f1, 0x9cbae9, 0xaba0c7, 0xb1a1c5, 0xae9bc0,
+ 0xb18db0, 0xb888a8, 0xb587a9, 0xae86ab, 0xae88ad, 0xaa8cb4,
+ 0xac80a9, 0xa588b2, 0x9f8bb7, 0xa088b8, 0x9e84b5, 0x9c85b4,
+ 0x8f94ce, 0x8f8ac4, 0x9384b6, 0x819ddf, 0x7e95d8, 0x8886be ) );
+
+/* Interlaced (width 4) */
+PIX ( interlaced_w4, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00,
+ 0x00, 0x08, 0x08, 0x03, 0x00, 0x00, 0x01, 0x9e, 0xea, 0x9e, 0xa1,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0x63,
+ 0x50, 0x4c, 0x54, 0x45, 0xa0, 0xb4, 0xe1, 0xa1, 0xc1, 0xee, 0x9f,
+ 0xc3, 0xf1, 0x9b, 0xb8, 0xe6, 0xa8, 0xa3, 0xcc, 0xb2, 0x9d, 0xc1,
+ 0xb0, 0xa2, 0xc6, 0xad, 0x99, 0xbe, 0xae, 0x92, 0xb7, 0xb9, 0x84,
+ 0xa4, 0xb8, 0x89, 0xa9, 0xb4, 0x87, 0xa9, 0xae, 0x87, 0xac, 0xae,
+ 0x86, 0xab, 0xaf, 0x88, 0xac, 0xa8, 0x8d, 0xb7, 0xaf, 0x7e, 0xa5,
+ 0xa4, 0x88, 0xb5, 0xa8, 0x85, 0xad, 0x9c, 0x8d, 0xbc, 0xa6, 0x81,
+ 0xae, 0x94, 0x90, 0xc7, 0xa8, 0x79, 0xa2, 0x96, 0x8b, 0xbd, 0x94,
+ 0x8e, 0xc4, 0x85, 0x9b, 0xdb, 0x99, 0x7b, 0xac, 0x8f, 0x89, 0xbe,
+ 0x84, 0x99, 0xd9, 0x7c, 0xa1, 0xe8, 0x83, 0x87, 0xc5, 0x88, 0x89,
+ 0xbf, 0xff, 0xff, 0xff, 0xec, 0xf4, 0xb8, 0xe8, 0x00, 0x00, 0x00,
+ 0x01, 0x62, 0x4b, 0x47, 0x44, 0x20, 0xb3, 0x6b, 0x3d, 0x80, 0x00,
+ 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13,
+ 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00,
+ 0x00, 0x34, 0x49, 0x44, 0x41, 0x54, 0x08, 0xd7, 0x05, 0xc1, 0x09,
+ 0x02, 0x80, 0x10, 0x00, 0x00, 0xc1, 0x4d, 0x85, 0x0e, 0x8a, 0xa2,
+ 0xc3, 0xf5, 0xff, 0x5f, 0x9a, 0x01, 0x4e, 0x04, 0x1e, 0xbd, 0xf2,
+ 0xfe, 0x0c, 0x23, 0xcb, 0x86, 0xbb, 0xf8, 0x12, 0xd3, 0x2c, 0x15,
+ 0xbb, 0xb1, 0x07, 0x77, 0x88, 0x0f, 0xb9, 0xd4, 0xd6, 0x01, 0x21,
+ 0x30, 0x01, 0xf1, 0x50, 0x46, 0x7a, 0xbf, 0x00, 0x00, 0x00, 0x25,
+ 0x74, 0x45, 0x58, 0x74, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x63, 0x72,
+ 0x65, 0x61, 0x74, 0x65, 0x00, 0x32, 0x30, 0x31, 0x34, 0x2d, 0x30,
+ 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32, 0x32, 0x3a, 0x34, 0x33, 0x3a,
+ 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a, 0x30, 0x30, 0xa2, 0xb4, 0x66,
+ 0x28, 0x00, 0x00, 0x00, 0x25, 0x74, 0x45, 0x58, 0x74, 0x64, 0x61,
+ 0x74, 0x65, 0x3a, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x79, 0x00, 0x32,
+ 0x30, 0x31, 0x34, 0x2d, 0x30, 0x31, 0x2d, 0x31, 0x32, 0x54, 0x32,
+ 0x32, 0x3a, 0x34, 0x33, 0x3a, 0x30, 0x33, 0x2b, 0x30, 0x31, 0x3a,
+ 0x30, 0x30, 0xd3, 0xe9, 0xde, 0x94, 0x00, 0x00, 0x00, 0x00, 0x49,
+ 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 4, 8,
+ DATA ( 0xa0b4e1, 0xa1c1ee, 0x9fc3f1, 0x9bb8e6, 0xa8a3cc, 0xb29dc1,
+ 0xb0a2c6, 0xad99be, 0xae92b7, 0xb984a4, 0xb889a9, 0xb487a9,
+ 0xae87ac, 0xae86ab, 0xaf88ac, 0xa88db7, 0xaf7ea5, 0xa488b5,
+ 0xa885ad, 0x9c8dbc, 0xa681ae, 0x9490c7, 0xa879a2, 0x968bbd,
+ 0x948ec4, 0x859bdb, 0x997bac, 0x8f89be, 0x8499d9, 0x7ca1e8,
+ 0x8387c5, 0x8889bf, ) );
+
+/* Multiple IDAT sections */
+PIX ( multi_idat, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00,
+ 0x00, 0x06, 0x08, 0x03, 0x00, 0x00, 0x00, 0xc4, 0xc5, 0x5f, 0x8e,
+ 0x00, 0x00, 0x00, 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xb1,
+ 0x8f, 0x0b, 0xfc, 0x61, 0x05, 0x00, 0x00, 0x00, 0x01, 0x73, 0x52,
+ 0x47, 0x42, 0x00, 0xae, 0xce, 0x1c, 0xe9, 0x00, 0x00, 0x00, 0x20,
+ 0x63, 0x48, 0x52, 0x4d, 0x00, 0x00, 0x7a, 0x26, 0x00, 0x00, 0x80,
+ 0x84, 0x00, 0x00, 0xfa, 0x00, 0x00, 0x00, 0x80, 0xe8, 0x00, 0x00,
+ 0x75, 0x30, 0x00, 0x00, 0xea, 0x60, 0x00, 0x00, 0x3a, 0x98, 0x00,
+ 0x00, 0x17, 0x70, 0x9c, 0xba, 0x51, 0x3c, 0x00, 0x00, 0x00, 0xff,
+ 0x50, 0x4c, 0x54, 0x45, 0x8f, 0xc5, 0xfe, 0xa8, 0xac, 0xd7, 0xab,
+ 0xab, 0xd3, 0x9d, 0xb7, 0xe3, 0x9c, 0xbb, 0xe8, 0x9a, 0xcb, 0xfd,
+ 0xa8, 0xc7, 0xf0, 0xa8, 0xca, 0xf5, 0xa0, 0xc7, 0xf6, 0x9f, 0xc3,
+ 0xed, 0x8f, 0xb9, 0xf0, 0x98, 0xad, 0xdf, 0xa0, 0xb4, 0xde, 0xa1,
+ 0xc6, 0xf0, 0x89, 0xc2, 0xfd, 0xa4, 0xa8, 0xd1, 0xba, 0x91, 0xaf,
+ 0xcd, 0x65, 0x79, 0xc7, 0x6c, 0x82, 0xa6, 0xa6, 0xd1, 0xb6, 0x96,
+ 0xb7, 0xc3, 0x8b, 0xa7, 0xbf, 0x88, 0xa4, 0xb1, 0x98, 0xb9, 0xb6,
+ 0x87, 0xa9, 0xc4, 0x6b, 0x86, 0xbb, 0x7c, 0x9b, 0xaa, 0xab, 0xd0,
+ 0x83, 0xb1, 0xf1, 0xb7, 0x81, 0xa1, 0xbc, 0x7f, 0x9b, 0xba, 0x79,
+ 0x96, 0xbc, 0x71, 0x8d, 0xa5, 0x8e, 0xb8, 0x8e, 0xb6, 0xed, 0xd0,
+ 0x64, 0x78, 0xbe, 0x7c, 0x97, 0x89, 0xb8, 0xed, 0xc4, 0x6e, 0x88,
+ 0xbd, 0x70, 0x90, 0xa8, 0x8d, 0xb7, 0x8d, 0xbc, 0xf4, 0x83, 0xa1,
+ 0xe2, 0xb9, 0x73, 0x95, 0xbf, 0x71, 0x90, 0xc5, 0x6b, 0x84, 0xa9,
+ 0x7d, 0xa7, 0x7b, 0xac, 0xf1, 0x8b, 0xa1, 0xdc, 0xcf, 0x58, 0x6c,
+ 0xad, 0x85, 0xab, 0x81, 0xb1, 0xe9, 0xbd, 0x66, 0x82, 0xa1, 0x7a,
+ 0xa6, 0x99, 0x8e, 0xbe, 0x7f, 0xb3, 0xf4, 0x94, 0x8d, 0xc3, 0xb1,
+ 0x6f, 0x97, 0xb5, 0x71, 0x95, 0x86, 0xac, 0xeb, 0x75, 0xb5, 0xff,
+ 0x73, 0xa4, 0xef, 0xb6, 0x68, 0x8d, 0x99, 0x7f, 0xb4, 0xae, 0x6b,
+ 0x92, 0x9a, 0x88, 0xb5, 0xc2, 0x5a, 0x75, 0x99, 0x78, 0xa8, 0x89,
+ 0x98, 0xcf, 0x74, 0xb3, 0xf9, 0x83, 0x96, 0xd3, 0x8b, 0x8f, 0xcb,
+ 0x8a, 0x90, 0xcd, 0x74, 0xb1, 0xfb, 0x74, 0xb3, 0xff, 0x81, 0x9e,
+ 0xe3, 0x8f, 0x86, 0xc2, 0x66, 0xa8, 0xfa, 0x7c, 0x88, 0xcd, 0x85,
+ 0x7f, 0xba, 0x9d, 0x78, 0xa0, 0x96, 0x6c, 0x99, 0x7f, 0x8d, 0xc9,
+ 0x72, 0xb6, 0xfd, 0xff, 0xff, 0xff, 0xdb, 0x2a, 0x9f, 0xad, 0x00,
+ 0x00, 0x00, 0x01, 0x62, 0x4b, 0x47, 0x44, 0x54, 0xe4, 0x03, 0x88,
+ 0xa5, 0x00, 0x00, 0x00, 0x09, 0x70, 0x48, 0x59, 0x73, 0x00, 0x00,
+ 0x0b, 0x13, 0x00, 0x00, 0x0b, 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18,
+ 0x00, 0x00, 0x00, 0x07, 0x49, 0x44, 0x41, 0x54, 0x08, 0x5b, 0x63,
+ 0x64, 0x60, 0x44, 0x01, 0xdd, 0xe3, 0x71, 0x09, 0x00, 0x00, 0x00,
+ 0x07, 0x49, 0x44, 0x41, 0x54, 0x7c, 0x28, 0x3c, 0x16, 0x0a, 0xb8,
+ 0x00, 0xb9, 0x49, 0x1a, 0x82, 0x00, 0x00, 0x00, 0x04, 0x49, 0x44,
+ 0x41, 0x54, 0x1c, 0xee, 0x00, 0xa7, 0x1b, 0x22, 0xc4, 0xc1, 0x00,
+ 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82 ),
+ 14, 6,
+ DATA ( 0x8fc5fe, 0xa8acd7, 0xababd3, 0x9db7e3, 0x9cbbe8, 0x9acbfd,
+ 0xa8c7f0, 0xa8caf5, 0xa0c7f6, 0x9fc3ed, 0x8fb9f0, 0x98addf,
+ 0xa0b4de, 0xa1c6f0, 0x89c2fd, 0xa4a8d1, 0xba91af, 0xcd6579,
+ 0xc76c82, 0xa6a6d1, 0xb696b7, 0xc38ba7, 0xbf88a4, 0xb198b9,
+ 0xb687a9, 0xc46b86, 0xbb7c9b, 0xaaabd0, 0x83b1f1, 0xb781a1,
+ 0xbc7f9b, 0xba7996, 0xbc718d, 0xa58eb8, 0x8eb6ed, 0xd06478,
+ 0xbe7c97, 0x89b8ed, 0xc46e88, 0xbd7090, 0xa88db7, 0x8dbcf4,
+ 0x83a1e2, 0xb97395, 0xbf7190, 0xc56b84, 0xa97da7, 0x7bacf1,
+ 0x8ba1dc, 0xcf586c, 0xad85ab, 0x81b1e9, 0xbd6682, 0xa17aa6,
+ 0x998ebe, 0x7fb3f4, 0x948dc3, 0xb16f97, 0xb57195, 0x86aceb,
+ 0x75b5ff, 0x73a4ef, 0xb6688d, 0x997fb4, 0xae6b92, 0x9a88b5,
+ 0xc25a75, 0x9978a8, 0x8998cf, 0x74b3f9, 0x8396d3, 0x8b8fcb,
+ 0x8a90cd, 0x74b1fb, 0x74b3ff, 0x819ee3, 0x8f86c2, 0x66a8fa,
+ 0x7c88cd, 0x857fba, 0x9d78a0, 0x966c99, 0x7f8dc9, 0x72b6fd ) );
+
+/* Original large image */
+PIX ( original, &png_image_type,
+ DATA ( 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00,
+ 0x0d, 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x1c, 0x00, 0x00,
+ 0x00, 0x0c, 0x08, 0x06, 0x00, 0x00, 0x00, 0x71, 0xdb, 0xdd, 0x0f,
+ 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47, 0x44, 0x00, 0xff, 0x00,
+ 0xff, 0x00, 0xff, 0xa0, 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09,
+ 0x70, 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x13, 0x00, 0x00, 0x0b,
+ 0x13, 0x01, 0x00, 0x9a, 0x9c, 0x18, 0x00, 0x00, 0x00, 0x07, 0x74,
+ 0x49, 0x4d, 0x45, 0x07, 0xde, 0x01, 0x06, 0x10, 0x37, 0x03, 0xe9,
+ 0xc3, 0xf3, 0x6d, 0x00, 0x00, 0x00, 0x1d, 0x69, 0x54, 0x58, 0x74,
+ 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69,
+ 0x74, 0x68, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x64, 0x2e, 0x65, 0x07,
+ 0x00, 0x00, 0x04, 0x14, 0x49, 0x44, 0x41, 0x54, 0x38, 0xcb, 0x35,
+ 0xcd, 0x5d, 0x4c, 0x56, 0x65, 0x00, 0xc0, 0xf1, 0xff, 0xf3, 0x9c,
+ 0x6f, 0x10, 0x04, 0x14, 0x14, 0x03, 0x11, 0xc9, 0x8f, 0x54, 0x96,
+ 0x42, 0x5a, 0x2d, 0x5d, 0x19, 0xa6, 0x76, 0xd1, 0xec, 0xc6, 0x34,
+ 0x6b, 0xf3, 0xa3, 0x39, 0xb3, 0x69, 0x6b, 0x6b, 0xb3, 0xac, 0x95,
+ 0x5b, 0x8b, 0x5a, 0xb9, 0xd2, 0x0b, 0xaf, 0x32, 0xbd, 0xc0, 0xa5,
+ 0xd5, 0x85, 0xce, 0x69, 0xf8, 0xb1, 0x35, 0x96, 0x92, 0x3a, 0x33,
+ 0xdd, 0x50, 0xd4, 0xa5, 0x94, 0x86, 0x06, 0xa8, 0x7c, 0xc8, 0xfb,
+ 0xf2, 0xbe, 0xe7, 0x9c, 0xe7, 0x9c, 0xe7, 0xe9, 0xa2, 0x75, 0xf5,
+ 0xbb, 0xfc, 0x89, 0x9d, 0xed, 0xda, 0x08, 0x93, 0xe2, 0x49, 0x70,
+ 0x03, 0x9b, 0x54, 0x43, 0x12, 0x2b, 0x54, 0xa2, 0x71, 0x3d, 0x17,
+ 0x23, 0x04, 0x49, 0xa2, 0x29, 0xf0, 0x25, 0xd2, 0x80, 0x30, 0x9a,
+ 0x02, 0x5f, 0x20, 0xb5, 0x60, 0x24, 0x34, 0x24, 0x06, 0x6c, 0x0f,
+ 0x84, 0x05, 0xc3, 0x23, 0x8a, 0x5c, 0x5e, 0xa3, 0x8d, 0x8b, 0x6b,
+ 0x49, 0xd2, 0x44, 0x61, 0xd9, 0x8a, 0xb2, 0xb2, 0x00, 0x93, 0x6a,
+ 0xa2, 0x48, 0x62, 0x1b, 0x21, 0xd0, 0xa9, 0x26, 0xb2, 0x2c, 0xe6,
+ 0xef, 0xfe, 0x08, 0x30, 0xb4, 0xbf, 0xf1, 0x29, 0x39, 0x17, 0x42,
+ 0x09, 0xb6, 0x0b, 0x26, 0x94, 0x48, 0xa5, 0x09, 0x3c, 0x89, 0x52,
+ 0x20, 0x02, 0x81, 0x0f, 0x10, 0x19, 0x4c, 0xaa, 0xc9, 0x69, 0x0b,
+ 0xab, 0x48, 0x60, 0xa5, 0x2e, 0x22, 0x1f, 0x93, 0xb3, 0x24, 0x89,
+ 0x07, 0x56, 0xe0, 0x90, 0x0d, 0x1d, 0x1c, 0x0b, 0x02, 0xdf, 0x42,
+ 0x2a, 0x83, 0x1d, 0x27, 0x06, 0xd7, 0x76, 0xd0, 0x02, 0x12, 0xad,
+ 0xb1, 0x2c, 0x0b, 0x27, 0x97, 0xe5, 0xbd, 0x55, 0x93, 0xd1, 0x5e,
+ 0x80, 0xb2, 0x5c, 0x6e, 0x3d, 0xf1, 0x02, 0x27, 0xd7, 0x7c, 0x46,
+ 0x54, 0x5a, 0x42, 0xd1, 0x40, 0x1f, 0xcb, 0xd6, 0x2d, 0xa6, 0x67,
+ 0xde, 0x62, 0xce, 0x6e, 0xfa, 0x8a, 0x54, 0x6b, 0x1a, 0x5a, 0x3e,
+ 0x67, 0x76, 0xeb, 0x5e, 0x8e, 0x6e, 0x3b, 0x40, 0xb6, 0x6a, 0x0e,
+ 0x1b, 0xb7, 0x2d, 0xa5, 0xe2, 0xee, 0x75, 0xd0, 0x1a, 0x21, 0x04,
+ 0x26, 0xd5, 0x74, 0x37, 0x2c, 0xe4, 0xc4, 0xb6, 0x16, 0xec, 0x30,
+ 0x52, 0xb8, 0xae, 0x83, 0x46, 0x70, 0xf4, 0xcd, 0x66, 0xc6, 0x4a,
+ 0xa8, 0x6b, 0x3b, 0xc4, 0x50, 0x65, 0x1d, 0x47, 0x56, 0x37, 0xe3,
+ 0xa1, 0x59, 0xb2, 0xef, 0x63, 0x9e, 0xfc, 0x71, 0x3b, 0xa7, 0xd6,
+ 0x35, 0x23, 0xca, 0x2b, 0xe9, 0x7c, 0x7e, 0x15, 0xd3, 0xcf, 0x1d,
+ 0xc1, 0x7e, 0x38, 0xc0, 0x84, 0xae, 0x2b, 0xcc, 0x3e, 0xb6, 0x97,
+ 0xd6, 0xcd, 0x3b, 0xe8, 0x9d, 0x3e, 0x97, 0xc2, 0xbe, 0x07, 0xb8,
+ 0xe1, 0x08, 0x3f, 0x2f, 0xdb, 0xca, 0xed, 0x99, 0xcf, 0x62, 0x5b,
+ 0x9a, 0x34, 0xce, 0x23, 0xc6, 0x8f, 0xc5, 0x06, 0x64, 0x2e, 0x4c,
+ 0xc8, 0x8c, 0xc0, 0xb4, 0x4b, 0xc7, 0xd8, 0xb2, 0xa2, 0x8e, 0xfe,
+ 0x14, 0x26, 0x74, 0xb4, 0x33, 0x52, 0x36, 0x8e, 0xee, 0xba, 0x46,
+ 0x3a, 0xa6, 0xcc, 0x67, 0xa0, 0xbc, 0x86, 0xd1, 0xfd, 0x77, 0xc8,
+ 0x86, 0x29, 0x99, 0x1c, 0x9c, 0x5e, 0xbe, 0x15, 0x19, 0x87, 0x4c,
+ 0x39, 0xde, 0xc2, 0xc2, 0x1d, 0x6f, 0xd1, 0xfe, 0xda, 0x07, 0x5c,
+ 0x9d, 0xbb, 0x94, 0xa1, 0x4c, 0x44, 0x41, 0x38, 0xc8, 0xa8, 0xe1,
+ 0xfb, 0x9c, 0x99, 0xb7, 0x92, 0x9e, 0xda, 0xe9, 0xdc, 0xad, 0x99,
+ 0x41, 0xf7, 0xc4, 0xc7, 0xe9, 0x0d, 0xca, 0xc9, 0x47, 0x06, 0xdb,
+ 0x71, 0x7d, 0x32, 0x89, 0xa0, 0xec, 0xf2, 0x05, 0x6e, 0x34, 0x2e,
+ 0xc5, 0x0c, 0x19, 0x4a, 0xfe, 0xbe, 0x41, 0xcf, 0xd4, 0x46, 0xa2,
+ 0xb2, 0xd1, 0x54, 0x5d, 0x3c, 0xc7, 0x98, 0x9e, 0x2e, 0xce, 0x2f,
+ 0x5a, 0x4b, 0xa4, 0xc0, 0xa8, 0x98, 0xa2, 0xd1, 0x2e, 0xc7, 0x57,
+ 0x7f, 0xc1, 0x4b, 0xdf, 0xbc, 0xcd, 0xd5, 0x05, 0xcb, 0xb9, 0xd4,
+ 0xb4, 0x86, 0x28, 0x93, 0x25, 0x36, 0x1e, 0xc5, 0x37, 0xaf, 0xa0,
+ 0x2d, 0x8b, 0x95, 0x2d, 0x9b, 0xb1, 0x45, 0x8a, 0x30, 0x86, 0x7b,
+ 0x15, 0xb5, 0xb4, 0xbe, 0xde, 0x4c, 0x41, 0x62, 0xb0, 0xb5, 0x11,
+ 0x64, 0x14, 0x54, 0x5f, 0x3b, 0x4b, 0xe7, 0xc2, 0x95, 0xf8, 0x0f,
+ 0x07, 0x71, 0xf2, 0x19, 0xea, 0xdb, 0xf6, 0x33, 0xe7, 0xc4, 0x1e,
+ 0xa2, 0x82, 0x62, 0xfe, 0xaa, 0xaa, 0xa7, 0x6d, 0xc9, 0x46, 0x44,
+ 0xa8, 0xc9, 0xc5, 0x20, 0x0b, 0xc0, 0xef, 0xef, 0x45, 0x0a, 0xe8,
+ 0x2f, 0x7d, 0x84, 0x10, 0x09, 0x32, 0x20, 0x13, 0x0b, 0x2a, 0x2f,
+ 0xb4, 0x31, 0x5c, 0x52, 0x09, 0x46, 0x13, 0xa7, 0x06, 0xcf, 0x86,
+ 0xfe, 0xa2, 0x0a, 0x54, 0xac, 0xc9, 0x03, 0x76, 0x9c, 0x08, 0xac,
+ 0x38, 0xa5, 0xb2, 0xf7, 0x0f, 0x5a, 0xab, 0xe7, 0x50, 0x38, 0xf2,
+ 0x80, 0x92, 0xfe, 0x6e, 0x5a, 0xb6, 0x1c, 0x02, 0xd7, 0x62, 0xd8,
+ 0x04, 0xfc, 0x69, 0x8f, 0xc5, 0x1e, 0xd6, 0xf8, 0xae, 0x44, 0x49,
+ 0x97, 0xaa, 0xd3, 0x27, 0x59, 0x74, 0x78, 0x3b, 0x17, 0x67, 0xbd,
+ 0x48, 0x43, 0xdb, 0x3e, 0xce, 0xcc, 0x5d, 0x8e, 0xa8, 0x28, 0xc5,
+ 0xb8, 0x82, 0xfa, 0x6b, 0x6d, 0x1c, 0x58, 0xbb, 0x93, 0x8b, 0x33,
+ 0x9a, 0x78, 0xf8, 0x20, 0xa6, 0xba, 0xca, 0x25, 0x8d, 0xc0, 0x89,
+ 0x14, 0xd9, 0x44, 0x21, 0x35, 0x30, 0xb5, 0xaf, 0x83, 0x9c, 0x5f,
+ 0x4c, 0x0f, 0xe5, 0x4c, 0xe8, 0xfa, 0x9d, 0xc1, 0xb2, 0x89, 0xdc,
+ 0x9c, 0x54, 0xcf, 0x3f, 0xe3, 0x1f, 0x63, 0xb0, 0xa2, 0x16, 0xdb,
+ 0x2f, 0x24, 0x0c, 0x15, 0xd9, 0x9c, 0xa6, 0x78, 0xb0, 0x8f, 0x97,
+ 0x0f, 0x7f, 0xc2, 0x8d, 0xba, 0xa7, 0xd8, 0xb3, 0xe2, 0x6b, 0xac,
+ 0x24, 0x66, 0xda, 0xaf, 0x07, 0x19, 0x88, 0x04, 0x95, 0x77, 0x6e,
+ 0x63, 0xe9, 0x94, 0x2b, 0xfe, 0x14, 0xa2, 0x08, 0x62, 0x63, 0xb8,
+ 0xdb, 0x17, 0xe2, 0xf9, 0x90, 0x1a, 0x8b, 0x30, 0x9f, 0x60, 0x47,
+ 0x06, 0x26, 0x75, 0x9d, 0x27, 0x5b, 0x58, 0x46, 0x7f, 0x30, 0x86,
+ 0x49, 0x1d, 0xbf, 0x70, 0x7d, 0xc6, 0x73, 0xc4, 0x31, 0x48, 0x23,
+ 0x40, 0x18, 0x3c, 0x4b, 0xa2, 0x8c, 0x21, 0x8b, 0x64, 0xd3, 0x81,
+ 0x77, 0xc0, 0x18, 0xbe, 0x7d, 0x65, 0x17, 0x8e, 0x80, 0xef, 0x9a,
+ 0x3e, 0x64, 0xfd, 0x4f, 0xef, 0xd3, 0xd6, 0xb0, 0x82, 0xc9, 0xd7,
+ 0x4f, 0xa1, 0x2d, 0x9b, 0x0d, 0x07, 0xdf, 0xc5, 0x38, 0x1e, 0xda,
+ 0x68, 0x4c, 0x9a, 0x72, 0x74, 0xc3, 0x97, 0x0c, 0x16, 0x56, 0xa3,
+ 0x22, 0x89, 0x0c, 0x55, 0x8c, 0x9f, 0x19, 0xe0, 0x56, 0x6d, 0x23,
+ 0x19, 0xcf, 0xc1, 0xc9, 0x0c, 0x71, 0x69, 0xe6, 0x12, 0x12, 0x05,
+ 0xa1, 0x02, 0xa5, 0x04, 0xc2, 0x18, 0x1c, 0xd7, 0xa5, 0xe9, 0xb7,
+ 0xef, 0xb1, 0x13, 0xc5, 0xae, 0x57, 0x77, 0x13, 0x5a, 0x2e, 0x69,
+ 0x62, 0xb8, 0xfc, 0xe8, 0x02, 0x3a, 0x6a, 0x9e, 0xe6, 0x99, 0xd3,
+ 0x2d, 0x04, 0xf7, 0xfb, 0xe8, 0xae, 0x99, 0x85, 0xb2, 0x1d, 0x42,
+ 0xa5, 0x10, 0x52, 0x10, 0xd9, 0x3e, 0xf7, 0x43, 0x17, 0x3b, 0x90,
+ 0xd8, 0x9e, 0x8f, 0x58, 0xff, 0x43, 0xc6, 0x38, 0xc1, 0x28, 0x3c,
+ 0x0f, 0xa2, 0x61, 0x43, 0x2e, 0x85, 0xc2, 0x40, 0xe0, 0x59, 0x06,
+ 0xc1, 0x7f, 0xd9, 0xff, 0x46, 0x5a, 0x90, 0x4f, 0xc1, 0x28, 0x83,
+ 0x11, 0x60, 0x10, 0x24, 0x1a, 0x06, 0x43, 0x43, 0x3e, 0x9f, 0xa3,
+ 0xa0, 0xb4, 0x90, 0x31, 0xe3, 0x20, 0x1f, 0x43, 0x67, 0xe7, 0x3d,
+ 0x6a, 0x6b, 0x2b, 0x50, 0x0a, 0xc8, 0x85, 0xd4, 0x57, 0xf9, 0x88,
+ 0xc4, 0xf0, 0x2f, 0xb4, 0x16, 0xf4, 0xd5, 0x82, 0x00, 0xa9, 0x50,
+ 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
+ 0x82 ),
+ 28, 12,
+ DATA ( 0x90c4fe, 0x91c3fb, 0x98c5fb, 0x9eceff, 0x9bccff, 0x97c6fa,
+ 0x92c2f8, 0x98c9fe, 0x97caff, 0x93c6fd, 0x9dceff, 0x9fcdff,
+ 0xa0ccfd, 0xaad4fe, 0xacd2ff, 0xa1cafe, 0x9dc9fe, 0xa1d0fe,
+ 0xa2d3fe, 0x94c8f9, 0x8abff7, 0x88befd, 0x8ec1ff, 0x8bbdfa,
+ 0x8ec1f5, 0xa0d3fe, 0x9fd0fc, 0x98c9fe, 0x8fc5ff, 0x8ec1f9,
+ 0x91c6fc, 0xd4697c, 0xd4697b, 0x98ccff, 0x88ccff, 0x8aceff,
+ 0x8ed4ff, 0x8dccff, 0x95c9fd, 0x9ed0ff, 0x9acbfd, 0xa1ddff,
+ 0xa9ddff, 0xa1cbfd, 0x9cc7fb, 0x97cefe, 0x9addff, 0x97d0ff,
+ 0x8bbff9, 0x7ec1ff, 0x84c8ff, 0x87caff, 0x7fc2ff, 0x93d6ff,
+ 0x9cdbff, 0x9acbfe, 0x89c1fe, 0x8fc5fe, 0x8fc7fe, 0xd0677a,
+ 0xd36a7d, 0x9dc2f3, 0xff1c15, 0xfd231e, 0xf82624, 0xd85a69,
+ 0x92baef, 0x97cbff, 0xa4b9e6, 0xf32d2c, 0xda6372, 0xa1cfff,
+ 0x99c9fb, 0xc97085, 0xf92623, 0xada5ca, 0x8bc1fb, 0xe74047,
+ 0xfd251f, 0xfd231d, 0xfe241e, 0xfd211c, 0xe0535d, 0x99d2ff,
+ 0x81baf9, 0x8fc7fe, 0x8dc7ff, 0x84cfff, 0x98d1ff, 0xbb90ae,
+ 0xef3538, 0xa294bd, 0xa994bb, 0xf03739, 0xc9647a, 0x8bc6ff,
+ 0x98ceff, 0xc86f86, 0xf03739, 0xa5c0ed, 0xb39dc1, 0xf92723,
+ 0xaf93b2, 0x95cdff, 0x96b6eb, 0xed383c, 0xba7498, 0x9b9fd7,
+ 0x9fa2d5, 0x9c9ccc, 0x9db4e0, 0x9dd2ff, 0x77b2f5, 0x82bcfe,
+ 0xb496b6, 0xfa2622, 0x85ceff, 0xd56272, 0xe4474f, 0x85b7f0,
+ 0x7bb9f7, 0xde4c58, 0xd8515e, 0x7fbefc, 0x8bc4ff, 0x8bc4ff,
+ 0xf23131, 0xca788f, 0xf42c2b, 0xbd829d, 0x85c8fa, 0x85c0f8,
+ 0xa0aeda, 0xf92a27, 0x80aaf0, 0x82c0ff, 0x84c1ff, 0x7fbafb,
+ 0x85bdf5, 0x94cbfe, 0x7cb8fd, 0x75b8ff, 0xc66982, 0xd5596a,
+ 0x84befe, 0xe5444d, 0xcc6a80, 0x7ec9ff, 0x9797c7, 0xf13335,
+ 0xbb7796, 0x78b9fc, 0x7eb9f9, 0x8bc8ff, 0xaa90ba, 0xf72a28,
+ 0xcd677d, 0x8cc5fd, 0x7ebbf1, 0x78baf8, 0xae8aae, 0xf72d2a,
+ 0xd84c5d, 0xdc4d5a, 0xdd4c59, 0xc7627a, 0x7dbeff, 0x8fc7fe,
+ 0x7ab7fe, 0x68b2ff, 0xe34049, 0xb881a1, 0x8cafed, 0xea3b40,
+ 0xf92926, 0xfd231d, 0xf62d2b, 0xd54958, 0x7abeff, 0x79b6fd,
+ 0x74b0f9, 0x80c3ff, 0xb27da2, 0xf92b28, 0xba7898, 0x84c5ff,
+ 0x7ebdfa, 0x6bb7fb, 0xc7566d, 0xe93d43, 0xd84b5b, 0xd64959,
+ 0xdd4d59, 0xb46f90, 0x78b8fd, 0x86befd, 0x74b3ff, 0x6bacfc,
+ 0xfc2823, 0x999ed2, 0x97a4d9, 0xfa2823, 0x9c9ed2, 0x9ca4d5,
+ 0x8ea3de, 0x6ca7f2, 0x70b0fd, 0x78b6ff, 0x6fb2ff, 0x9c86b9,
+ 0xf62e2d, 0xc75771, 0xec373b, 0x80aded, 0x7fc3fe, 0x6ac3ff,
+ 0xf42d2c, 0x9b8ebc, 0x69b8ff, 0x5aa4f9, 0x77c0ff, 0x74b9ff,
+ 0x79b2fa, 0x7ab4f5, 0x72b3ff, 0x9195ce, 0xf23031, 0x809ee7,
+ 0xb181a6, 0xe93a41, 0x78beff, 0x82bcfe, 0x7db9ff, 0x70affd,
+ 0x68a8f8, 0x6cacfd, 0x7da1e8, 0xec373b, 0xd15165, 0x64aeff,
+ 0xef3335, 0xa7729b, 0x6dbcff, 0x83a7e0, 0xf72b29, 0x6f96e1,
+ 0x62b1ff, 0x54a3f8, 0x5ca9f7, 0x7bc1ff, 0x76b1fd, 0x72abf1,
+ 0x6bb2ff, 0xb17298, 0xe63b43, 0x6da7fa, 0xd15367, 0xc16481,
+ 0x72b8ff, 0x7ab7ff, 0x7ab8fe, 0x77b2ff, 0x6ba7f7, 0x60acff,
+ 0xd84858, 0xec363a, 0x6da7f9, 0x69afff, 0x9476b0, 0xf92b28,
+ 0x66a4f2, 0xa57ca2, 0xf52e2d, 0xd64454, 0xd5495b, 0xd34859,
+ 0xd24556, 0x86ace0, 0x75b7fd, 0x6daaf3, 0x63adf9, 0xb96586,
+ 0xc65c76, 0x60aeff, 0xd64657, 0x908fc8, 0x6eb3ff, 0x72b2ff,
+ 0x75b3ff, 0x78b1fe, 0x70adfd, 0xa377a7, 0xdc4453, 0x808fd5,
+ 0x65aaff, 0x66abfe, 0x679aed, 0xcb4a61, 0xa16794, 0xae678b,
+ 0xd84d59, 0xd14859, 0xcd4456, 0xd44a5a, 0xcb495e, 0x71a4e6,
+ 0x79c0ff, 0x71b1fb, 0x65a9f3, 0x6ab2ff, 0x71b9ff, 0x6aabfe,
+ 0x60a8fe, 0x6bb1ff, 0x72b4fe, 0x73b4ff, 0x74b3fe, 0x75b3ff,
+ 0x76b2fe, 0x6fb0ff, 0x66adff, 0x65a8fe, 0x64a9fe, 0x63a9ff,
+ 0x5fa7ff, 0x4e9ffe, 0x4596f4, 0x4fa7ff, 0x62beff, 0x59b8ff,
+ 0x2e8de9, 0x4faeff, 0x4aa9ff, 0x4a9ff7, 0x77bbff, 0x78b7fe ) );
+
+/**
+ * Perform PNG self-test
+ *
+ */
+static void png_test_exec ( void ) {
+
+ /* Original image */
+ pixbuf_ok ( &original );
+
+ /* All allowed colour type and bit depth combinations */
+ pixbuf_ok ( &ctype_0_1 );
+ pixbuf_ok ( &ctype_0_2 );
+ pixbuf_ok ( &ctype_0_4 );
+ pixbuf_ok ( &ctype_0_8 );
+ pixbuf_ok ( &ctype_0_16 );
+ pixbuf_ok ( &ctype_2_8 );
+ pixbuf_ok ( &ctype_2_16 );
+ pixbuf_ok ( &ctype_3_1 );
+ pixbuf_ok ( &ctype_3_2 );
+ pixbuf_ok ( &ctype_3_4 );
+ pixbuf_ok ( &ctype_3_8 );
+ pixbuf_ok ( &ctype_4_8 );
+ pixbuf_ok ( &ctype_4_16 );
+ pixbuf_ok ( &ctype_6_8 );
+ pixbuf_ok ( &ctype_6_16 );
+
+ /* All basic filter types */
+ pixbuf_ok ( &filter_0 );
+ pixbuf_ok ( &filter_1 );
+ pixbuf_ok ( &filter_2 );
+ pixbuf_ok ( &filter_3 );
+ pixbuf_ok ( &filter_4 );
+
+ /* Multiple IDAT sections */
+ pixbuf_ok ( &multi_idat );
+
+ /* Interlaced */
+ pixbuf_ok ( &interlaced );
+ pixbuf_ok ( &interlaced_w1 );
+ pixbuf_ok ( &interlaced_w2 );
+ pixbuf_ok ( &interlaced_w3 );
+ pixbuf_ok ( &interlaced_w4 );
+ pixbuf_ok ( &interlaced_h1 );
+ pixbuf_ok ( &interlaced_h2 );
+ pixbuf_ok ( &interlaced_h3 );
+ pixbuf_ok ( &interlaced_h4 );
+
+ /* Alpha channel */
+ pixbuf_ok ( &alpha );
+}
+
+/** PNG self-test */
+struct self_test png_test __self_test = {
+ .name = "png",
+ .exec = png_test_exec,
+};
diff --git a/roms/ipxe/src/tests/pnm_test.c b/roms/ipxe/src/tests/pnm_test.c
new file mode 100644
index 00000000..26b0c072
--- /dev/null
+++ b/roms/ipxe/src/tests/pnm_test.c
@@ -0,0 +1,230 @@
+/*
+ * Copyright (C) 2013 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * PNM self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <assert.h>
+#include <ipxe/pixbuf.h>
+#include <ipxe/pnm.h>
+#include <ipxe/test.h>
+#include "pixbuf_test.h"
+
+/** Define inline pixel data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** PBM ASCII example (from Wikipedia) */
+PIX ( pbm_ascii, &pnm_image_type,
+ "P1\n"
+ "# This is an example bitmap of the letter \"J\"\n"
+ "6 10\n"
+ "0 0 0 0 1 0\n"
+ "0 0 0 0 1 0\n"
+ "0 0 0 0 1 0\n"
+ "0 0 0 0 1 0\n"
+ "0 0 0 0 1 0\n"
+ "0 0 0 0 1 0\n"
+ "1 0 0 0 1 0\n"
+ "0 1 1 1 0 0\n"
+ "0 0 0 0 0 0\n"
+ "0 0 0 0 0 0\n",
+ 6, 10,
+ DATA ( 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0x000000, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0x000000, 0x000000, 0x000000, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff ) );
+
+/** PGM ASCII example (from Wikipedia) */
+PIX ( pgm_ascii, &pnm_image_type,
+ "P2\n"
+ "# Shows the word \"FEEP\" (example from Netpbm man page on PGM)\n"
+ "24 7\n"
+ "15\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
+ "0 3 3 3 3 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 15 15 15 0\n"
+ "0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 15 0\n"
+ "0 3 3 3 0 0 0 7 7 7 0 0 0 11 11 11 0 0 0 15 15 15 15 0\n"
+ "0 3 0 0 0 0 0 7 0 0 0 0 0 11 0 0 0 0 0 15 0 0 0 0\n"
+ "0 3 0 0 0 0 0 7 7 7 7 0 0 11 11 11 11 0 0 15 0 0 0 0\n"
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0\n"
+ , 24, 7,
+ DATA ( 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x333333, 0x333333, 0x333333, 0x333333, 0x000000,
+ 0x000000, 0x777777, 0x777777, 0x777777, 0x777777, 0x000000,
+ 0x000000, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0x000000,
+ 0x000000, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000,
+ 0x000000, 0x333333, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xbbbbbb, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xffffff, 0x000000, 0x000000, 0xffffff, 0x000000,
+ 0x000000, 0x333333, 0x333333, 0x333333, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x777777, 0x777777, 0x000000, 0x000000,
+ 0x000000, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0x000000, 0x000000,
+ 0x000000, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000,
+ 0x000000, 0x333333, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xbbbbbb, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xffffff, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x333333, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x777777, 0x777777, 0x777777, 0x000000,
+ 0x000000, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0x000000,
+ 0x000000, 0xffffff, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000 ) );
+
+/** PPM ASCII example (from Wikipedia) */
+PIX ( ppm_ascii, &pnm_image_type,
+ "P3\n"
+ "# The P3 means colors are in ASCII, then 3 columns and 2 rows,\n"
+ "# then 255 for max color, then RGB triplets\n"
+ "3 2\n"
+ "255\n"
+ "255 0 0 0 255 0 0 0 255\n"
+ "255 255 0 255 255 255 0 0 0\n",
+ 3, 2,
+ DATA ( 0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xffffff, 0x000000 ) );
+
+/** PBM ASCII with no space between pixel values */
+PIX ( pbm_ascii_no_space, &pnm_image_type,
+ "P1\n"
+ "3 3\n"
+ "001\n"
+ "010\n"
+ "111\n",
+ 3, 3,
+ DATA ( 0xffffff, 0xffffff, 0x000000, 0xffffff, 0x000000, 0xffffff,
+ 0x000000, 0x000000, 0x000000 ) );
+
+/** PBM binary example (converted from Wikipedia) */
+PIX ( pbm_binary, &pnm_image_type,
+ DATA ( 0x50, 0x34, 0x0a, 0x23, 0x20, 0x43, 0x52, 0x45, 0x41, 0x54, 0x4f,
+ 0x52, 0x3a, 0x20, 0x47, 0x49, 0x4d, 0x50, 0x20, 0x50, 0x4e, 0x4d,
+ 0x20, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
+ 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x31, 0x2e, 0x31, 0x0a, 0x36, 0x20,
+ 0x31, 0x30, 0x0a, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x88, 0x70,
+ 0x00, 0x00 ),
+ 6, 10,
+ DATA ( 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0x000000, 0xffffff, 0xffffff, 0xffffff, 0x000000, 0xffffff,
+ 0xffffff, 0x000000, 0x000000, 0x000000, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff,
+ 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0xffffff ) );
+
+/** PGM binary example (converted from Wikipedia) */
+PIX ( pgm_binary, &pnm_image_type,
+ DATA ( 0x50, 0x35, 0x0a, 0x32, 0x34, 0x20, 0x37, 0x0a, 0x31, 0x35, 0x0a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x03, 0x03, 0x03, 0x03, 0x00, 0x00, 0x07, 0x07,
+ 0x07, 0x07, 0x00, 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x00, 0x0f,
+ 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x0f, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x03, 0x03, 0x03, 0x00,
+ 0x00, 0x00, 0x07, 0x07, 0x07, 0x00, 0x00, 0x00, 0x0b, 0x0b, 0x0b,
+ 0x00, 0x00, 0x00, 0x0f, 0x0f, 0x0f, 0x0f, 0x00, 0x00, 0x03, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x00,
+ 0x00, 0x0b, 0x0b, 0x0b, 0x0b, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00 ),
+ 24, 7,
+ DATA ( 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x333333, 0x333333, 0x333333, 0x333333, 0x000000,
+ 0x000000, 0x777777, 0x777777, 0x777777, 0x777777, 0x000000,
+ 0x000000, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0x000000,
+ 0x000000, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000,
+ 0x000000, 0x333333, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xbbbbbb, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xffffff, 0x000000, 0x000000, 0xffffff, 0x000000,
+ 0x000000, 0x333333, 0x333333, 0x333333, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x777777, 0x777777, 0x000000, 0x000000,
+ 0x000000, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0x000000, 0x000000,
+ 0x000000, 0xffffff, 0xffffff, 0xffffff, 0xffffff, 0x000000,
+ 0x000000, 0x333333, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xbbbbbb, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0xffffff, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x333333, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x777777, 0x777777, 0x777777, 0x777777, 0x000000,
+ 0x000000, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0xbbbbbb, 0x000000,
+ 0x000000, 0xffffff, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000,
+ 0x000000, 0x000000, 0x000000, 0x000000, 0x000000, 0x000000 ) );
+
+/** PPM binary example (converted from Wikipedia) */
+PIX ( ppm_binary, &pnm_image_type,
+ DATA ( 0x50, 0x36, 0x0a, 0x33, 0x20, 0x32, 0x0a, 0x32, 0x35, 0x35, 0x0a,
+ 0xff, 0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff,
+ 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00 ),
+ 3, 2,
+ DATA ( 0xff0000, 0x00ff00, 0x0000ff, 0xffff00, 0xffffff, 0x000000 ) );
+
+/**
+ * Perform PNM self-test
+ *
+ */
+static void pnm_test_exec ( void ) {
+
+ pixbuf_ok ( &pbm_ascii );
+ pixbuf_ok ( &pgm_ascii );
+ pixbuf_ok ( &ppm_ascii );
+ pixbuf_ok ( &pbm_ascii_no_space );
+ pixbuf_ok ( &pbm_binary );
+ pixbuf_ok ( &pgm_binary );
+ pixbuf_ok ( &ppm_binary );
+}
+
+/** PNM self-test */
+struct self_test pnm_test __self_test = {
+ .name = "pnm",
+ .exec = pnm_test_exec,
+};
diff --git a/roms/ipxe/src/tests/profile_test.c b/roms/ipxe/src/tests/profile_test.c
new file mode 100644
index 00000000..9d682bf2
--- /dev/null
+++ b/roms/ipxe/src/tests/profile_test.c
@@ -0,0 +1,140 @@
+/*
+ * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Profiling self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <assert.h>
+#include <ipxe/test.h>
+#include <ipxe/profile.h>
+
+/** A profiling test */
+struct profile_test {
+ /** Sample values */
+ const unsigned long *samples;
+ /** Number of samples */
+ unsigned int count;
+ /** Expected mean sample value */
+ unsigned long mean;
+ /** Expected standard deviation */
+ unsigned long stddev;
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define a profiling test */
+#define PROFILE_TEST( name, MEAN, STDDEV, SAMPLES ) \
+ static const unsigned long name ## _samples[] = SAMPLES; \
+ static struct profile_test name = { \
+ .samples = name ## _samples, \
+ .count = ( sizeof ( name ## _samples ) / \
+ sizeof ( name ## _samples [0] ) ), \
+ .mean = MEAN, \
+ .stddev = STDDEV, \
+ }
+
+/** Empty data set */
+PROFILE_TEST ( empty, 0, 0, DATA() );
+
+/** Single-element data set (zero) */
+PROFILE_TEST ( zero, 0, 0, DATA ( 0 ) );
+
+/** Single-element data set (non-zero) */
+PROFILE_TEST ( single, 42, 0, DATA ( 42 ) );
+
+/** Multiple identical element data set */
+PROFILE_TEST ( identical, 69, 0, DATA ( 69, 69, 69, 69, 69, 69, 69 ) );
+
+/** Small element data set */
+PROFILE_TEST ( small, 5, 2, DATA ( 3, 5, 9, 4, 3, 2, 5, 7 ) );
+
+/** Random data set */
+PROFILE_TEST ( random, 70198, 394,
+ DATA ( 69772, 70068, 70769, 69653, 70663, 71078, 70101, 70341,
+ 70215, 69600, 70020, 70456, 70421, 69972, 70267, 69999,
+ 69972 ) );
+
+/** Large-valued random data set */
+PROFILE_TEST ( large, 93533894UL, 25538UL,
+ DATA ( 93510333UL, 93561169UL, 93492361UL, 93528647UL,
+ 93557566UL, 93503465UL, 93540126UL, 93549020UL,
+ 93502307UL, 93527320UL, 93537152UL, 93540125UL,
+ 93550773UL, 93586731UL, 93521312UL ) );
+
+/**
+ * Report a profiling test result
+ *
+ * @v test Profiling test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void profile_okx ( struct profile_test *test, const char *file,
+ unsigned int line ) {
+ struct profiler profiler;
+ unsigned long mean;
+ unsigned long stddev;
+ unsigned int i;
+
+ /* Initialise profiler */
+ memset ( &profiler, 0, sizeof ( profiler ) );
+
+ /* Record sample values */
+ for ( i = 0 ; i < test->count ; i++ )
+ profile_update ( &profiler, test->samples[i] );
+
+ /* Check resulting statistics */
+ mean = profile_mean ( &profiler );
+ stddev = profile_stddev ( &profiler );
+ DBGC ( test, "PROFILE calculated mean %ld stddev %ld\n", mean, stddev );
+ okx ( mean == test->mean, file, line );
+ okx ( stddev == test->stddev, file, line );
+}
+#define profile_ok( test ) profile_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Perform profiling self-tests
+ *
+ */
+static void profile_test_exec ( void ) {
+
+ /* Perform profiling tests */
+ profile_ok ( &empty );
+ profile_ok ( &zero );
+ profile_ok ( &single );
+ profile_ok ( &identical );
+ profile_ok ( &small );
+ profile_ok ( &random );
+ profile_ok ( &large );
+}
+
+/** Profiling self-test */
+struct self_test profile_test __self_test = {
+ .name = "profile",
+ .exec = profile_test_exec,
+};
diff --git a/roms/ipxe/src/tests/pubkey_test.h b/roms/ipxe/src/tests/pubkey_test.h
new file mode 100644
index 00000000..7678453a
--- /dev/null
+++ b/roms/ipxe/src/tests/pubkey_test.h
@@ -0,0 +1,175 @@
+#ifndef _PUBKEY_TEST_H
+#define _PUBKEY_TEST_H
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+#include <stdint.h>
+#include <ipxe/crypto.h>
+#include <ipxe/test.h>
+
+/**
+ * Report public key decryption test result
+ *
+ * @v pubkey Public key algorithm
+ * @v key Key
+ * @v key_len Key length
+ * @v ciphertext Ciphertext
+ * @v ciphertext_len Ciphertext length
+ * @v expected Expected plaintext
+ * @v expected_len Expected plaintext length
+ */
+#define pubkey_decrypt_ok( pubkey, key, key_len, ciphertext, \
+ ciphertext_len, expected, expected_len ) do {\
+ uint8_t ctx[ (pubkey)->ctxsize ]; \
+ \
+ ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
+ { \
+ size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
+ uint8_t decrypted[ max_len ]; \
+ int decrypted_len; \
+ \
+ decrypted_len = pubkey_decrypt ( (pubkey), ctx, \
+ (ciphertext), \
+ (ciphertext_len), \
+ decrypted ); \
+ ok ( decrypted_len == ( ( int ) (expected_len) ) ); \
+ ok ( memcmp ( decrypted, (expected), \
+ (expected_len) ) == 0 ); \
+ } \
+ pubkey_final ( (pubkey), ctx ); \
+ } while ( 0 )
+
+/**
+ * Report public key encryption and decryption test result
+ *
+ * @v pubkey Public key algorithm
+ * @v encrypt_key Encryption key
+ * @v encrypt_key_len Encryption key length
+ * @v decrypt_key Decryption key
+ * @v decrypt_key_len Decryption key length
+ * @v plaintext Plaintext
+ * @v plaintext_len Plaintext length
+ */
+#define pubkey_encrypt_ok( pubkey, encrypt_key, encrypt_key_len, \
+ decrypt_key, decrypt_key_len, plaintext, \
+ plaintext_len ) do { \
+ uint8_t ctx[ (pubkey)->ctxsize ]; \
+ \
+ ok ( pubkey_init ( (pubkey), ctx, (encrypt_key), \
+ (encrypt_key_len) ) == 0 ); \
+ { \
+ size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
+ uint8_t encrypted[ max_len ]; \
+ int encrypted_len; \
+ \
+ encrypted_len = pubkey_encrypt ( (pubkey), ctx, \
+ (plaintext), \
+ (plaintext_len), \
+ encrypted ); \
+ ok ( encrypted_len >= 0 ); \
+ pubkey_decrypt_ok ( (pubkey), (decrypt_key), \
+ (decrypt_key_len), encrypted, \
+ encrypted_len, (plaintext), \
+ (plaintext_len) ); \
+ } \
+ pubkey_final ( (pubkey), ctx ); \
+ } while ( 0 )
+
+/**
+ * Report public key signature test result
+ *
+ * @v pubkey Public key algorithm
+ * @v key Key
+ * @v key_len Key length
+ * @v digest Digest algorithm
+ * @v plaintext Plaintext
+ * @v plaintext_len Plaintext length
+ * @v expected Expected signature
+ * @v expected_len Expected signature length
+ */
+#define pubkey_sign_ok( pubkey, key, key_len, digest, plaintext, \
+ plaintext_len, expected, expected_len ) do { \
+ uint8_t ctx[ (pubkey)->ctxsize ]; \
+ uint8_t digestctx[ (digest)->ctxsize ]; \
+ uint8_t digestout[ (digest)->digestsize ]; \
+ \
+ digest_init ( (digest), digestctx ); \
+ digest_update ( (digest), digestctx, (plaintext), \
+ (plaintext_len) ); \
+ digest_final ( (digest), digestctx, digestout ); \
+ \
+ ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
+ { \
+ size_t max_len = pubkey_max_len ( (pubkey), ctx ); \
+ uint8_t signature[ max_len ]; \
+ int signature_len; \
+ \
+ signature_len = pubkey_sign ( (pubkey), ctx, (digest), \
+ digestout, signature ); \
+ ok ( signature_len == ( ( int ) (expected_len) ) ); \
+ ok ( memcmp ( signature, (expected), \
+ (expected_len) ) == 0 ); \
+ } \
+ pubkey_final ( (pubkey), ctx ); \
+ } while ( 0 )
+
+/**
+ * Report public key verification test result
+ *
+ * @v pubkey Public key algorithm
+ * @v key Key
+ * @v key_len Key length
+ * @v digest Digest algorithm
+ * @v plaintext Plaintext
+ * @v plaintext_len Plaintext length
+ * @v signature Signature
+ * @v signature_len Signature length
+ */
+#define pubkey_verify_ok( pubkey, key, key_len, digest, plaintext, \
+ plaintext_len, signature, signature_len ) do {\
+ uint8_t ctx[ (pubkey)->ctxsize ]; \
+ uint8_t digestctx[ (digest)->ctxsize ]; \
+ uint8_t digestout[ (digest)->digestsize ]; \
+ \
+ digest_init ( (digest), digestctx ); \
+ digest_update ( (digest), digestctx, (plaintext), \
+ (plaintext_len) ); \
+ digest_final ( (digest), digestctx, digestout ); \
+ \
+ ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
+ ok ( pubkey_verify ( (pubkey), ctx, (digest), digestout, \
+ (signature), (signature_len) ) == 0 ); \
+ pubkey_final ( (pubkey), ctx ); \
+ } while ( 0 )
+
+/**
+ * Report public key verification test result
+ *
+ * @v pubkey Public key algorithm
+ * @v key Key
+ * @v key_len Key length
+ * @v digest Digest algorithm
+ * @v plaintext Plaintext
+ * @v plaintext_len Plaintext length
+ * @v signature Signature
+ * @v signature_len Signature length
+ */
+#define pubkey_verify_fail_ok( pubkey, key, key_len, digest, plaintext, \
+ plaintext_len, signature, \
+ signature_len ) do { \
+ uint8_t ctx[ (pubkey)->ctxsize ]; \
+ uint8_t digestctx[ (digest)->ctxsize ]; \
+ uint8_t digestout[ (digest)->digestsize ]; \
+ \
+ digest_init ( (digest), digestctx ); \
+ digest_update ( (digest), digestctx, (plaintext), \
+ (plaintext_len) ); \
+ digest_final ( (digest), digestctx, digestout ); \
+ \
+ ok ( pubkey_init ( (pubkey), ctx, (key), (key_len) ) == 0 ); \
+ ok ( pubkey_verify ( (pubkey), ctx, (digest), digestout, \
+ (signature), (signature_len) ) != 0 ); \
+ pubkey_final ( (pubkey), ctx ); \
+ } while ( 0 )
+
+#endif /* _PUBKEY_TEST_H */
diff --git a/roms/ipxe/src/tests/rsa_test.c b/roms/ipxe/src/tests/rsa_test.c
new file mode 100644
index 00000000..3b32c74b
--- /dev/null
+++ b/roms/ipxe/src/tests/rsa_test.c
@@ -0,0 +1,492 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * RSA self-tests
+ *
+ * These test vectors are generated using openssl's genrsa, rsa,
+ * rsautl, and dgst tools.
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <ipxe/crypto.h>
+#include <ipxe/rsa.h>
+#include <ipxe/md5.h>
+#include <ipxe/sha1.h>
+#include <ipxe/sha256.h>
+#include <ipxe/test.h>
+#include "pubkey_test.h"
+
+/** Define inline private key data */
+#define PRIVATE(...) { __VA_ARGS__ }
+
+/** Define inline public key data */
+#define PUBLIC(...) { __VA_ARGS__ }
+
+/** Define inline plaintext data */
+#define PLAINTEXT(...) { __VA_ARGS__ }
+
+/** Define inline ciphertext data */
+#define CIPHERTEXT(...) { __VA_ARGS__ }
+
+/** Define inline signature data */
+#define SIGNATURE(...) { __VA_ARGS__ }
+
+/** An RSA encryption and decryption self-test */
+struct rsa_encrypt_decrypt_test {
+ /** Private key */
+ const void *private;
+ /** Private key length */
+ size_t private_len;
+ /** Public key */
+ const void *public;
+ /** Public key length */
+ size_t public_len;
+ /** Plaintext */
+ const void *plaintext;
+ /** Plaintext length */
+ size_t plaintext_len;
+ /** Ciphertext
+ *
+ * Note that the encryption process includes some random
+ * padding, so a given plaintext will encrypt to multiple
+ * different ciphertexts.
+ */
+ const void *ciphertext;
+ /** Ciphertext length */
+ size_t ciphertext_len;
+};
+
+/**
+ * Define an RSA encryption and decryption test
+ *
+ * @v name Test name
+ * @v PRIVATE Private key
+ * @v PUBLIC Public key
+ * @v PLAINTEXT Plaintext
+ * @v CIPHERTEXT Ciphertext
+ * @ret test Encryption and decryption test
+ */
+#define RSA_ENCRYPT_DECRYPT_TEST( name, PRIVATE, PUBLIC, PLAINTEXT, \
+ CIPHERTEXT ) \
+ static const uint8_t name ## _private[] = PRIVATE; \
+ static const uint8_t name ## _public[] = PUBLIC; \
+ static const uint8_t name ## _plaintext[] = PLAINTEXT; \
+ static const uint8_t name ## _ciphertext[] = CIPHERTEXT; \
+ static struct rsa_encrypt_decrypt_test name = { \
+ .private = name ## _private, \
+ .private_len = sizeof ( name ## _private ), \
+ .public = name ## _public, \
+ .public_len = sizeof ( name ## _public ), \
+ .plaintext = name ## _plaintext, \
+ .plaintext_len = sizeof ( name ## _plaintext ), \
+ .ciphertext = name ## _ciphertext, \
+ .ciphertext_len = sizeof ( name ## _ciphertext ), \
+ }
+
+/** An RSA signature self-test */
+struct rsa_signature_test {
+ /** Private key */
+ const void *private;
+ /** Private key length */
+ size_t private_len;
+ /** Public key */
+ const void *public;
+ /** Public key length */
+ size_t public_len;
+ /** Plaintext */
+ const void *plaintext;
+ /** Plaintext length */
+ size_t plaintext_len;
+ /** Digest algorithm */
+ struct digest_algorithm *digest;
+ /** Signature */
+ const void *signature;
+ /** Signature length */
+ size_t signature_len;
+};
+
+/**
+ * Define an RSA signature test
+ *
+ * @v name Test name
+ * @v PRIVATE Private key
+ * @v PUBLIC Public key
+ * @v PLAINTEXT Plaintext
+ * @v DIGEST Digest algorithm
+ * @v SIGNATURE Signature
+ * @ret test Signature test
+ */
+#define RSA_SIGNATURE_TEST( name, PRIVATE, PUBLIC, PLAINTEXT, DIGEST, \
+ SIGNATURE ) \
+ static const uint8_t name ## _private[] = PRIVATE; \
+ static const uint8_t name ## _public[] = PUBLIC; \
+ static const uint8_t name ## _plaintext[] = PLAINTEXT; \
+ static const uint8_t name ## _signature[] = SIGNATURE; \
+ static struct rsa_signature_test name = { \
+ .private = name ## _private, \
+ .private_len = sizeof ( name ## _private ), \
+ .public = name ## _public, \
+ .public_len = sizeof ( name ## _public ), \
+ .plaintext = name ## _plaintext, \
+ .plaintext_len = sizeof ( name ## _plaintext ), \
+ .digest = DIGEST, \
+ .signature = name ## _signature, \
+ .signature_len = sizeof ( name ## _signature ), \
+ }
+
+/**
+ * Report RSA encryption and decryption test result
+ *
+ * @v test RSA encryption and decryption test
+ */
+#define rsa_encrypt_decrypt_ok( test ) do { \
+ pubkey_decrypt_ok ( &rsa_algorithm, (test)->private, \
+ (test)->private_len, (test)->ciphertext, \
+ (test)->ciphertext_len, (test)->plaintext, \
+ (test)->plaintext_len ); \
+ pubkey_encrypt_ok ( &rsa_algorithm, (test)->private, \
+ (test)->private_len, (test)->public, \
+ (test)->public_len, (test)->plaintext, \
+ (test)->plaintext_len ); \
+ pubkey_encrypt_ok ( &rsa_algorithm, (test)->public, \
+ (test)->public_len, (test)->private, \
+ (test)->private_len, (test)->plaintext, \
+ (test)->plaintext_len ); \
+ } while ( 0 )
+
+
+/**
+ * Report RSA signature test result
+ *
+ * @v test RSA signature test
+ */
+#define rsa_signature_ok( test ) do { \
+ uint8_t bad_signature[ (test)->signature_len ]; \
+ pubkey_sign_ok ( &rsa_algorithm, (test)->private, \
+ (test)->private_len, (test)->digest, \
+ (test)->plaintext, (test)->plaintext_len, \
+ (test)->signature, (test)->signature_len ); \
+ pubkey_verify_ok ( &rsa_algorithm, (test)->public, \
+ (test)->public_len, (test)->digest, \
+ (test)->plaintext, (test)->plaintext_len, \
+ (test)->signature, (test)->signature_len ); \
+ memset ( bad_signature, 0, sizeof ( bad_signature ) ); \
+ pubkey_verify_fail_ok ( &rsa_algorithm, (test)->public, \
+ (test)->public_len, (test)->digest, \
+ (test)->plaintext, \
+ (test)->plaintext_len, bad_signature, \
+ sizeof ( bad_signature ) ); \
+ } while ( 0 )
+
+/** "Hello world" encryption and decryption test */
+RSA_ENCRYPT_DECRYPT_TEST ( hw_test,
+ PRIVATE ( 0x30, 0x82, 0x01, 0x3b, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
+ 0xd2, 0xf1, 0x04, 0x67, 0xf6, 0x2c, 0x96, 0x07, 0xa6, 0xbd,
+ 0x85, 0xac, 0xc1, 0x17, 0x5d, 0xe8, 0xf0, 0x93, 0x94, 0x0c,
+ 0x45, 0x67, 0x26, 0x67, 0xde, 0x7e, 0xfb, 0xa8, 0xda, 0xbd,
+ 0x07, 0xdf, 0xcf, 0x45, 0x04, 0x6d, 0xbd, 0x69, 0x8b, 0xfb,
+ 0xc1, 0x72, 0xc0, 0xfc, 0x03, 0x04, 0xf2, 0x82, 0xc4, 0x7b,
+ 0x6a, 0x3e, 0xec, 0x53, 0x7a, 0xe3, 0x4e, 0xa8, 0xc9, 0xf9,
+ 0x1f, 0x2a, 0x13, 0x0d, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
+ 0x40, 0x49, 0xb8, 0x61, 0xc9, 0xd3, 0x87, 0x11, 0x87, 0xeb,
+ 0x06, 0x21, 0x49, 0x96, 0xd2, 0x0b, 0xc7, 0xf5, 0x0c, 0x1e,
+ 0x99, 0x8b, 0x47, 0xd9, 0x6c, 0x43, 0x9e, 0x2d, 0x65, 0x7d,
+ 0xcc, 0xc2, 0x8b, 0x1a, 0x6f, 0x2b, 0x55, 0xbe, 0xb3, 0x9f,
+ 0xd1, 0xe2, 0x9a, 0xde, 0x1d, 0xac, 0xec, 0x67, 0xec, 0xa5,
+ 0xbf, 0x9c, 0x30, 0xd6, 0xf9, 0x0a, 0x1a, 0x48, 0xf3, 0xc2,
+ 0x93, 0x3a, 0x17, 0x27, 0x21, 0x02, 0x21, 0x00, 0xfc, 0x8d,
+ 0xfb, 0xee, 0x8a, 0xaa, 0x45, 0x19, 0x4b, 0xf0, 0x68, 0xb0,
+ 0x02, 0x38, 0x3e, 0x03, 0x6b, 0x24, 0x77, 0x20, 0xbd, 0x5e,
+ 0x6c, 0x76, 0xdb, 0xc9, 0xe1, 0x43, 0xa3, 0x40, 0x62, 0x6f,
+ 0x02, 0x21, 0x00, 0xd5, 0xd1, 0xb4, 0x4d, 0x03, 0x40, 0x69,
+ 0x3f, 0x9a, 0xa7, 0x44, 0x15, 0x28, 0x1e, 0xa5, 0x5f, 0xcf,
+ 0x97, 0x21, 0x12, 0xb3, 0xe6, 0x1c, 0x9a, 0x8d, 0xb7, 0xb4,
+ 0x80, 0x3a, 0x9c, 0xb0, 0x43, 0x02, 0x20, 0x71, 0xf0, 0xa0,
+ 0xab, 0x82, 0xf5, 0xc4, 0x8c, 0xe0, 0x1c, 0xcb, 0x2e, 0x35,
+ 0x22, 0x28, 0xa0, 0x24, 0x33, 0x64, 0x67, 0x69, 0xe7, 0xf2,
+ 0xa9, 0x41, 0x09, 0x78, 0x4e, 0xaa, 0x95, 0x3e, 0x93, 0x02,
+ 0x21, 0x00, 0x85, 0xcc, 0x4d, 0xd9, 0x0b, 0x39, 0xd9, 0x22,
+ 0x75, 0xf2, 0x49, 0x46, 0x3b, 0xee, 0xc1, 0x69, 0x6d, 0x0b,
+ 0x93, 0x24, 0x92, 0xf2, 0x61, 0xdf, 0xcc, 0xe2, 0xb1, 0xce,
+ 0xb3, 0xde, 0xac, 0xe5, 0x02, 0x21, 0x00, 0x9c, 0x23, 0x6a,
+ 0x95, 0xa6, 0xfe, 0x1e, 0xd8, 0x0c, 0x3f, 0x6e, 0xe6, 0x0a,
+ 0xeb, 0x97, 0xd6, 0x36, 0x1c, 0x80, 0xc1, 0x02, 0x87, 0x0d,
+ 0x4d, 0xfe, 0x28, 0x02, 0x1e, 0xde, 0xe1, 0xcc, 0x72 ),
+ PUBLIC ( 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x4b, 0x00,
+ 0x30, 0x48, 0x02, 0x41, 0x00, 0xd2, 0xf1, 0x04, 0x67, 0xf6,
+ 0x2c, 0x96, 0x07, 0xa6, 0xbd, 0x85, 0xac, 0xc1, 0x17, 0x5d,
+ 0xe8, 0xf0, 0x93, 0x94, 0x0c, 0x45, 0x67, 0x26, 0x67, 0xde,
+ 0x7e, 0xfb, 0xa8, 0xda, 0xbd, 0x07, 0xdf, 0xcf, 0x45, 0x04,
+ 0x6d, 0xbd, 0x69, 0x8b, 0xfb, 0xc1, 0x72, 0xc0, 0xfc, 0x03,
+ 0x04, 0xf2, 0x82, 0xc4, 0x7b, 0x6a, 0x3e, 0xec, 0x53, 0x7a,
+ 0xe3, 0x4e, 0xa8, 0xc9, 0xf9, 0x1f, 0x2a, 0x13, 0x0d, 0x02,
+ 0x03, 0x01, 0x00, 0x01 ),
+ PLAINTEXT ( 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x77, 0x6f, 0x72, 0x6c,
+ 0x64, 0x0a ),
+ CIPHERTEXT ( 0x39, 0xff, 0x5c, 0x54, 0x65, 0x3e, 0x6a, 0xab, 0xc0, 0x62,
+ 0x91, 0xb2, 0xbf, 0x1d, 0x73, 0x5b, 0xd5, 0x4c, 0xbd, 0x16,
+ 0x0f, 0x24, 0xc9, 0xf5, 0xa7, 0xdd, 0x94, 0xd6, 0xf8, 0xae,
+ 0xd3, 0xa0, 0x9f, 0x4d, 0xff, 0x8d, 0x81, 0x34, 0x47, 0xff,
+ 0x2a, 0x87, 0x96, 0xd3, 0x17, 0x5d, 0x93, 0x4d, 0x7b, 0x27,
+ 0x88, 0x4f, 0xec, 0x43, 0x9c, 0xed, 0xb3, 0xf2, 0x19, 0x89,
+ 0x38, 0x43, 0xf9, 0x41 ) );
+
+/** Random message MD5 signature test */
+RSA_SIGNATURE_TEST ( md5_test,
+ PRIVATE ( 0x30, 0x82, 0x01, 0x3b, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
+ 0xf9, 0x3f, 0x78, 0x44, 0xe2, 0x0e, 0x25, 0xf1, 0x0e, 0x94,
+ 0xcd, 0xca, 0x6f, 0x9e, 0xea, 0x6d, 0xdf, 0xcd, 0xa0, 0x7c,
+ 0xe2, 0x21, 0xeb, 0xde, 0xa6, 0x01, 0x4b, 0xb0, 0x76, 0x4b,
+ 0xd8, 0x8b, 0x19, 0x83, 0xb4, 0xbe, 0x45, 0xde, 0x3d, 0x46,
+ 0x61, 0x0f, 0x11, 0xe2, 0x2c, 0xf5, 0xb0, 0x63, 0xa0, 0x84,
+ 0xc0, 0xaf, 0x4e, 0xbe, 0x6a, 0xd3, 0x84, 0x3f, 0xec, 0x42,
+ 0x17, 0xe9, 0x25, 0xe1, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
+ 0x40, 0x62, 0x7d, 0x93, 0x1f, 0xdd, 0x17, 0xec, 0x24, 0x42,
+ 0x37, 0xc8, 0xce, 0x0a, 0xa7, 0x88, 0x49, 0x5c, 0x9b, 0x9b,
+ 0xa4, 0x5d, 0x93, 0x3b, 0xea, 0x62, 0x3c, 0xb6, 0xd5, 0x07,
+ 0x19, 0xd7, 0x79, 0xf0, 0x3b, 0xab, 0xa3, 0xa5, 0x43, 0x35,
+ 0x8d, 0x58, 0x40, 0xa0, 0x95, 0xc5, 0x63, 0x28, 0x28, 0xda,
+ 0x13, 0x28, 0xdf, 0xc9, 0x05, 0xdc, 0x69, 0x46, 0xff, 0x2a,
+ 0xfb, 0xe4, 0xd1, 0x23, 0xa5, 0x02, 0x21, 0x00, 0xfc, 0xef,
+ 0x3b, 0x9d, 0x9d, 0x69, 0xf3, 0x66, 0x0a, 0x2b, 0x52, 0xd6,
+ 0x61, 0x14, 0x90, 0x6e, 0x7d, 0x3c, 0x08, 0x4b, 0x98, 0x44,
+ 0x00, 0xf2, 0xa4, 0x16, 0x2d, 0xd1, 0xf9, 0xa0, 0x1e, 0x37,
+ 0x02, 0x21, 0x00, 0xfc, 0x44, 0xcc, 0x7c, 0xc0, 0x26, 0x9a,
+ 0x0a, 0x6e, 0xda, 0x17, 0x05, 0x7d, 0x66, 0x8d, 0x29, 0x1a,
+ 0x44, 0xbf, 0x33, 0x76, 0xae, 0x8d, 0xe8, 0xb5, 0xed, 0xb8,
+ 0x6f, 0xdc, 0xfe, 0x10, 0xa7, 0x02, 0x20, 0x76, 0x48, 0x8a,
+ 0x60, 0x93, 0x14, 0xd1, 0x36, 0x8e, 0xda, 0xe3, 0xca, 0x4d,
+ 0x6c, 0x08, 0x7f, 0x23, 0x21, 0xc7, 0xdf, 0x52, 0x3d, 0xbb,
+ 0x13, 0xbd, 0x98, 0x81, 0xa5, 0x08, 0x4f, 0xd0, 0xd1, 0x02,
+ 0x21, 0x00, 0xd9, 0xa3, 0x11, 0x37, 0xdf, 0x1e, 0x6e, 0x6e,
+ 0xe9, 0xcb, 0xc5, 0x68, 0xbb, 0x13, 0x2a, 0x5d, 0x77, 0x88,
+ 0x2f, 0xdc, 0x5a, 0x5b, 0xa5, 0x9a, 0x4a, 0xba, 0x58, 0x10,
+ 0x49, 0xfb, 0xf6, 0xa9, 0x02, 0x21, 0x00, 0x89, 0xe8, 0x47,
+ 0x5b, 0x20, 0x04, 0x3b, 0x0f, 0xb9, 0xe0, 0x1d, 0xab, 0xcf,
+ 0xe8, 0x72, 0xfd, 0x7d, 0x17, 0x85, 0xc8, 0xd8, 0xbd, 0x1a,
+ 0x92, 0xe0, 0xbc, 0x7a, 0xc7, 0x31, 0xbe, 0xef, 0xf4 ),
+ PUBLIC ( 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x4b, 0x00,
+ 0x30, 0x48, 0x02, 0x41, 0x00, 0xf9, 0x3f, 0x78, 0x44, 0xe2,
+ 0x0e, 0x25, 0xf1, 0x0e, 0x94, 0xcd, 0xca, 0x6f, 0x9e, 0xea,
+ 0x6d, 0xdf, 0xcd, 0xa0, 0x7c, 0xe2, 0x21, 0xeb, 0xde, 0xa6,
+ 0x01, 0x4b, 0xb0, 0x76, 0x4b, 0xd8, 0x8b, 0x19, 0x83, 0xb4,
+ 0xbe, 0x45, 0xde, 0x3d, 0x46, 0x61, 0x0f, 0x11, 0xe2, 0x2c,
+ 0xf5, 0xb0, 0x63, 0xa0, 0x84, 0xc0, 0xaf, 0x4e, 0xbe, 0x6a,
+ 0xd3, 0x84, 0x3f, 0xec, 0x42, 0x17, 0xe9, 0x25, 0xe1, 0x02,
+ 0x03, 0x01, 0x00, 0x01 ),
+ PLAINTEXT ( 0x9d, 0x5b, 0x46, 0x42, 0x27, 0xc0, 0xf1, 0x4b, 0xe5, 0x9e,
+ 0xd3, 0x10, 0xa1, 0xeb, 0x16, 0xc3, 0xc6, 0x8f, 0x1a, 0x18,
+ 0x86, 0xc3, 0x92, 0x15, 0x2d, 0x65, 0xa0, 0x40, 0xe1, 0x3e,
+ 0x29, 0x79, 0x7c, 0xd4, 0x08, 0xef, 0x53, 0xeb, 0x08, 0x07,
+ 0x39, 0x21, 0xb3, 0x40, 0xff, 0x4b, 0xc7, 0x76, 0xb9, 0x12,
+ 0x32, 0x41, 0xcc, 0x5a, 0x86, 0x5c, 0x2e, 0x0b, 0x05, 0xd8,
+ 0x56, 0xd4, 0xdf, 0x6f, 0x2c, 0xf0, 0xbf, 0x4b, 0x6f, 0x68,
+ 0xde, 0x39, 0x4a, 0x3e, 0xae, 0x44, 0xb9, 0xc6, 0x24, 0xb3,
+ 0x83, 0x2e, 0x9f, 0xf5, 0x6d, 0x61, 0xc3, 0x8e, 0xe8, 0x8f,
+ 0xa6, 0x87, 0x58, 0x3f, 0x36, 0x13, 0xf4, 0x7e, 0xf0, 0x20,
+ 0x47, 0x87, 0x3f, 0x21, 0x6e, 0x51, 0x3c, 0xf1, 0xef, 0xca,
+ 0x9f, 0x77, 0x9c, 0x91, 0x4f, 0xd4, 0x56, 0xc0, 0x39, 0x11,
+ 0xab, 0x15, 0x2c, 0x5e, 0xad, 0x40, 0x09, 0xe6, 0xde, 0xe5,
+ 0x77, 0x60, 0x19, 0xd4, 0x0d, 0x77, 0x76, 0x24, 0x8b, 0xe6,
+ 0xdd, 0xa5, 0x8d, 0x4a, 0x55, 0x3a, 0xdf, 0xf8, 0x29, 0xfb,
+ 0x47, 0x8a, 0xfe, 0x98, 0x34, 0xf6, 0x30, 0x7f, 0x09, 0x03,
+ 0x26, 0x05, 0xd5, 0x46, 0x18, 0x96, 0xca, 0x96, 0x5b, 0x66,
+ 0xf2, 0x8d, 0xfc, 0xfc, 0x37, 0xf7, 0xc7, 0x6d, 0x6c, 0xd8,
+ 0x24, 0x0c, 0x6a, 0xec, 0x82, 0x5c, 0x72, 0xf1, 0xfc, 0x05,
+ 0xed, 0x8e, 0xe8, 0xd9, 0x8b, 0x8b, 0x67, 0x02, 0x95 ),
+ &md5_algorithm,
+ SIGNATURE ( 0xdb, 0x56, 0x3d, 0xea, 0xae, 0x81, 0x4b, 0x3b, 0x2e, 0x8e,
+ 0xb8, 0xee, 0x13, 0x61, 0xc6, 0xe7, 0xd7, 0x50, 0xcd, 0x0d,
+ 0x34, 0x3a, 0xfe, 0x9a, 0x8d, 0xf8, 0xfb, 0xd6, 0x7e, 0xbd,
+ 0xdd, 0xb3, 0xf9, 0xfb, 0xe0, 0xf8, 0xe7, 0x71, 0x03, 0xe6,
+ 0x55, 0xd5, 0xf4, 0x02, 0x3c, 0xb5, 0xbc, 0x95, 0x2b, 0x66,
+ 0x56, 0xec, 0x2f, 0x8e, 0xa7, 0xae, 0xd9, 0x80, 0xb3, 0xaa,
+ 0xac, 0x45, 0x00, 0xa8 ) );
+
+/** Random message SHA-1 signature test */
+RSA_SIGNATURE_TEST ( sha1_test,
+ PRIVATE ( 0x30, 0x82, 0x01, 0x3b, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
+ 0xe0, 0x3a, 0x8d, 0x35, 0xe1, 0x92, 0x2f, 0xea, 0x0d, 0x82,
+ 0x60, 0x2e, 0xb6, 0x0b, 0x02, 0xd3, 0xf4, 0x39, 0xfb, 0x06,
+ 0x43, 0x8e, 0xa1, 0x7c, 0xc5, 0xae, 0x0d, 0xc7, 0xee, 0x83,
+ 0xb3, 0x63, 0x20, 0x92, 0x34, 0xe2, 0x94, 0x3d, 0xdd, 0xbb,
+ 0x6c, 0x64, 0x69, 0x68, 0x25, 0x24, 0x81, 0x4b, 0x4d, 0x48,
+ 0x5a, 0xd2, 0x29, 0x14, 0xeb, 0x38, 0xdd, 0x3e, 0xb5, 0x57,
+ 0x45, 0x9b, 0xed, 0x33, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
+ 0x40, 0x3d, 0xa9, 0x1c, 0x47, 0xe2, 0xdd, 0xf6, 0x7b, 0x20,
+ 0x77, 0xe7, 0xc7, 0x30, 0x9c, 0x5a, 0x8c, 0xba, 0xae, 0x6f,
+ 0x0f, 0x4b, 0xe8, 0x9f, 0x13, 0xd6, 0xb0, 0x84, 0x6d, 0xa4,
+ 0x73, 0x67, 0x12, 0xa9, 0x7c, 0x75, 0xaf, 0x62, 0x92, 0x7b,
+ 0x80, 0xaf, 0x39, 0x7d, 0x01, 0xb3, 0x43, 0xc8, 0x0d, 0x17,
+ 0x7f, 0x82, 0x59, 0x46, 0xb8, 0xe5, 0x4e, 0xba, 0x5e, 0x71,
+ 0x5c, 0xba, 0x62, 0x06, 0x91, 0x02, 0x21, 0x00, 0xf7, 0xaa,
+ 0xb6, 0x9c, 0xc8, 0xad, 0x68, 0xa8, 0xd7, 0x25, 0xb1, 0xb5,
+ 0x91, 0xd4, 0xc7, 0xd6, 0x69, 0x51, 0x5d, 0x04, 0xed, 0xd8,
+ 0xc6, 0xea, 0x69, 0xd2, 0x24, 0xbe, 0x5e, 0x7c, 0x89, 0xa5,
+ 0x02, 0x21, 0x00, 0xe7, 0xc5, 0xf4, 0x01, 0x35, 0xe0, 0x16,
+ 0xb5, 0x13, 0x86, 0x14, 0x5a, 0x6a, 0x8d, 0x03, 0x90, 0xae,
+ 0x7d, 0x3a, 0xc1, 0xfe, 0x8c, 0xa0, 0x4a, 0xb4, 0x94, 0x50,
+ 0x58, 0xa4, 0xc6, 0x73, 0xf7, 0x02, 0x21, 0x00, 0xe2, 0xda,
+ 0x16, 0x6c, 0x63, 0x90, 0x1a, 0xc6, 0x54, 0x53, 0x2d, 0x84,
+ 0x8f, 0x70, 0x24, 0x1f, 0x6b, 0xd6, 0x5f, 0xea, 0x8c, 0xe5,
+ 0xbb, 0xc5, 0xa9, 0x6a, 0x17, 0xc7, 0xdb, 0x8a, 0x1d, 0x15,
+ 0x02, 0x21, 0x00, 0xe4, 0x2a, 0x7e, 0xe4, 0x76, 0x2a, 0x2d,
+ 0x90, 0x83, 0x30, 0xda, 0x76, 0x8c, 0x30, 0x58, 0x13, 0x25,
+ 0x83, 0x88, 0xc5, 0x93, 0x96, 0xd2, 0xf1, 0xd8, 0x45, 0xad,
+ 0xb7, 0x26, 0x37, 0x6b, 0xcf, 0x02, 0x20, 0x73, 0x58, 0x1f,
+ 0x0a, 0xcd, 0x0c, 0x83, 0x27, 0xcc, 0x15, 0xa2, 0x1e, 0x07,
+ 0x32, 0x1b, 0xa3, 0xc6, 0xa6, 0xb8, 0x83, 0x97, 0x48, 0x45,
+ 0x50, 0x6c, 0x37, 0x45, 0xa5, 0x54, 0x2a, 0x59, 0x3c ),
+ PUBLIC ( 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x4b, 0x00,
+ 0x30, 0x48, 0x02, 0x41, 0x00, 0xe0, 0x3a, 0x8d, 0x35, 0xe1,
+ 0x92, 0x2f, 0xea, 0x0d, 0x82, 0x60, 0x2e, 0xb6, 0x0b, 0x02,
+ 0xd3, 0xf4, 0x39, 0xfb, 0x06, 0x43, 0x8e, 0xa1, 0x7c, 0xc5,
+ 0xae, 0x0d, 0xc7, 0xee, 0x83, 0xb3, 0x63, 0x20, 0x92, 0x34,
+ 0xe2, 0x94, 0x3d, 0xdd, 0xbb, 0x6c, 0x64, 0x69, 0x68, 0x25,
+ 0x24, 0x81, 0x4b, 0x4d, 0x48, 0x5a, 0xd2, 0x29, 0x14, 0xeb,
+ 0x38, 0xdd, 0x3e, 0xb5, 0x57, 0x45, 0x9b, 0xed, 0x33, 0x02,
+ 0x03, 0x01, 0x00, 0x01 ),
+ PLAINTEXT ( 0xf7, 0x42, 0x01, 0x57, 0x6b, 0x70, 0xcc, 0x4a, 0xdc, 0xed,
+ 0x12, 0x83, 0x3f, 0xef, 0x27, 0xc1, 0x3c, 0x85, 0xdd, 0x5e,
+ 0x0a, 0x34, 0x98, 0xf9, 0x21, 0xd3, 0x24, 0x2a, 0x5a, 0xb2,
+ 0xdf, 0x60, 0x21, 0x28, 0x7c, 0x5b, 0x7a, 0xbe, 0xcb, 0xea,
+ 0xbc, 0xd6, 0x0e, 0xae, 0x94, 0x64, 0x21, 0xda, 0x28, 0x66,
+ 0x2f, 0x71, 0x48, 0xe5, 0xea, 0x59, 0x38, 0x28, 0x3e, 0xed,
+ 0x3b, 0x95, 0x4f, 0x3d, 0x72, 0x2a, 0x00, 0xf3, 0x95, 0x4d,
+ 0xf0, 0x02, 0x71, 0x63, 0x5a, 0xbc, 0x84, 0xd1, 0x81, 0x3f,
+ 0x16, 0xcd, 0x28, 0x3d, 0x47, 0xa2, 0xee, 0xa1, 0x2f, 0x84,
+ 0x8a, 0x22, 0x02, 0x88, 0xd7, 0x83, 0x06, 0x4a, 0x9f, 0xea,
+ 0x0f, 0x15, 0x48, 0x43, 0x58, 0x6d, 0x39, 0x78, 0x5a, 0x43,
+ 0x3f, 0xed, 0x6f, 0x68, 0xde, 0x9c, 0xfe, 0xd3, 0x67, 0x74,
+ 0x08, 0x46, 0x7d, 0x20, 0x22, 0x60, 0x8c, 0x37, 0x35, 0x46,
+ 0x56, 0x19, 0x3c, 0xfa, 0xa5, 0x40, 0xac, 0x44, 0x90, 0x8a,
+ 0xa5, 0x80, 0xb2, 0x32, 0xbc, 0xb4, 0x3f, 0x3e, 0x5e, 0xd4,
+ 0x51, 0xa9, 0x2e, 0xd9, 0x7f, 0x5e, 0x32, 0xb1, 0x24, 0x35,
+ 0x88, 0x71, 0x3a, 0x01, 0x86, 0x5c, 0xa2, 0xe2, 0x2d, 0x02,
+ 0x30, 0x91, 0x1c, 0xaa, 0x6c, 0x24, 0x42, 0x1b, 0x1a, 0xba,
+ 0x30, 0x40, 0x49, 0x83, 0xd9, 0xd7, 0x66, 0x7e, 0x5c, 0x1a,
+ 0x4b, 0x7f, 0xa6, 0x8e, 0x8a, 0xd6, 0x0c, 0x65, 0x75 ),
+ &sha1_algorithm,
+ SIGNATURE ( 0xa5, 0x5a, 0x8a, 0x67, 0x81, 0x76, 0x7e, 0xad, 0x99, 0x22,
+ 0xf1, 0x47, 0x64, 0xd2, 0xfb, 0x81, 0x45, 0xeb, 0x85, 0x56,
+ 0xf8, 0x7d, 0xb8, 0xec, 0x41, 0x17, 0x84, 0xf7, 0x2b, 0xbb,
+ 0x2b, 0x8f, 0xb6, 0xb8, 0x8f, 0xc6, 0xab, 0x39, 0xbc, 0xa3,
+ 0x72, 0xb3, 0x63, 0x45, 0x5a, 0xe0, 0xac, 0xf8, 0x1c, 0x83,
+ 0x48, 0x84, 0x89, 0x8a, 0x6b, 0xdf, 0x93, 0xa0, 0xc3, 0x0b,
+ 0x0e, 0x3d, 0x80, 0x80 ) );
+
+/** Random message SHA-256 signature test */
+RSA_SIGNATURE_TEST ( sha256_test,
+ PRIVATE ( 0x30, 0x82, 0x01, 0x3a, 0x02, 0x01, 0x00, 0x02, 0x41, 0x00,
+ 0xa5, 0xe9, 0xdb, 0xa9, 0x1a, 0x6e, 0xd6, 0x4c, 0x25, 0x50,
+ 0xfe, 0x61, 0x77, 0x08, 0x7a, 0x80, 0x36, 0xcb, 0x88, 0x49,
+ 0x5c, 0xe8, 0xaa, 0x15, 0xf8, 0xb3, 0xd6, 0x78, 0x51, 0x46,
+ 0x86, 0x3a, 0x5f, 0xd5, 0x9f, 0xab, 0xfe, 0x74, 0x8c, 0x53,
+ 0x0d, 0xb5, 0x3c, 0x7d, 0x2c, 0x35, 0x88, 0x3f, 0xde, 0xa2,
+ 0xce, 0x46, 0x94, 0x30, 0xa9, 0x76, 0xee, 0x25, 0xc5, 0x5d,
+ 0xa6, 0xa6, 0x3a, 0xa5, 0x02, 0x03, 0x01, 0x00, 0x01, 0x02,
+ 0x40, 0x14, 0x4b, 0xbc, 0x4c, 0x3e, 0x68, 0x8a, 0x9c, 0x7c,
+ 0x00, 0x21, 0x6e, 0x28, 0xd2, 0x87, 0xb1, 0xc1, 0x82, 0x3a,
+ 0x64, 0xc7, 0x11, 0xcb, 0x24, 0xae, 0xec, 0xc8, 0xf2, 0xa4,
+ 0xf6, 0x9c, 0x9a, 0xbb, 0x05, 0x94, 0x80, 0x9b, 0xc1, 0x21,
+ 0x83, 0x36, 0x23, 0xba, 0x04, 0x20, 0x23, 0x06, 0x48, 0xa7,
+ 0xa4, 0xe6, 0x31, 0x8e, 0xa1, 0x73, 0xe5, 0x6b, 0x83, 0x4c,
+ 0x3a, 0xb8, 0xd8, 0x22, 0x61, 0x02, 0x21, 0x00, 0xd4, 0xdf,
+ 0xcb, 0x21, 0x4a, 0x9a, 0x35, 0x52, 0x02, 0x99, 0xcc, 0x40,
+ 0x83, 0x65, 0x30, 0x1f, 0x9d, 0x13, 0xd6, 0xd1, 0x79, 0x10,
+ 0xce, 0x5b, 0xeb, 0x25, 0xa2, 0x39, 0x4e, 0xdf, 0x1c, 0x29,
+ 0x02, 0x21, 0x00, 0xc7, 0x86, 0x8f, 0xd9, 0x88, 0xe9, 0x98,
+ 0x4b, 0x5c, 0x50, 0x06, 0x94, 0x05, 0x59, 0x31, 0x25, 0xa7,
+ 0xa8, 0xe6, 0x95, 0x2b, 0xe3, 0x74, 0x93, 0x51, 0xa8, 0x8e,
+ 0x3d, 0xe2, 0xe0, 0xfa, 0x1d, 0x02, 0x20, 0x6e, 0xe3, 0x81,
+ 0x31, 0xff, 0x65, 0xa3, 0x1e, 0xec, 0x61, 0xe7, 0x67, 0x37,
+ 0xcb, 0x0f, 0x2d, 0x78, 0xaa, 0xab, 0xfd, 0x84, 0x5e, 0x3f,
+ 0xd0, 0xdc, 0x06, 0x47, 0xa2, 0x28, 0xb6, 0xca, 0x39, 0x02,
+ 0x20, 0x13, 0x7d, 0x9f, 0x9b, 0xbe, 0x76, 0x23, 0x3c, 0x69,
+ 0x5e, 0x1f, 0xe6, 0x61, 0xc7, 0x5e, 0xb7, 0xb0, 0xf3, 0x1c,
+ 0xe3, 0x41, 0x90, 0x4c, 0x98, 0xff, 0x87, 0x19, 0xae, 0x0d,
+ 0xf5, 0xb0, 0x39, 0x02, 0x21, 0x00, 0xb7, 0xeb, 0xcd, 0x01,
+ 0x2e, 0x23, 0x42, 0x4f, 0x0c, 0x6f, 0xde, 0xc8, 0x4f, 0xa7,
+ 0x69, 0x09, 0x12, 0x34, 0xb6, 0x95, 0x4d, 0xb8, 0x7f, 0x16,
+ 0xd0, 0x48, 0x17, 0x4a, 0x9e, 0x6e, 0x5e, 0xe2 ),
+ PUBLIC ( 0x30, 0x5c, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x4b, 0x00,
+ 0x30, 0x48, 0x02, 0x41, 0x00, 0xa5, 0xe9, 0xdb, 0xa9, 0x1a,
+ 0x6e, 0xd6, 0x4c, 0x25, 0x50, 0xfe, 0x61, 0x77, 0x08, 0x7a,
+ 0x80, 0x36, 0xcb, 0x88, 0x49, 0x5c, 0xe8, 0xaa, 0x15, 0xf8,
+ 0xb3, 0xd6, 0x78, 0x51, 0x46, 0x86, 0x3a, 0x5f, 0xd5, 0x9f,
+ 0xab, 0xfe, 0x74, 0x8c, 0x53, 0x0d, 0xb5, 0x3c, 0x7d, 0x2c,
+ 0x35, 0x88, 0x3f, 0xde, 0xa2, 0xce, 0x46, 0x94, 0x30, 0xa9,
+ 0x76, 0xee, 0x25, 0xc5, 0x5d, 0xa6, 0xa6, 0x3a, 0xa5, 0x02,
+ 0x03, 0x01, 0x00, 0x01 ),
+ PLAINTEXT ( 0x60, 0xe7, 0xba, 0x9d, 0x5a, 0xe3, 0x2d, 0xfa, 0x5f, 0x47,
+ 0xdb, 0x93, 0x24, 0x2c, 0xc4, 0xe2, 0x61, 0xf3, 0x89, 0x4d,
+ 0x67, 0xad, 0xc8, 0xae, 0xf8, 0xe2, 0xfb, 0x52, 0x0f, 0x8d,
+ 0x18, 0x7e, 0x30, 0xd8, 0x8d, 0x94, 0x07, 0x92, 0x70, 0x91,
+ 0xaf, 0x3b, 0x92, 0xa6, 0x0f, 0x7a, 0x9b, 0x46, 0x85, 0x8c,
+ 0x2a, 0x5a, 0x78, 0x5d, 0x1e, 0x13, 0xbf, 0xe6, 0x12, 0xbd,
+ 0xb1, 0xbb, 0x92, 0x6d, 0x11, 0xed, 0xe1, 0xe4, 0x6e, 0x88,
+ 0x4d, 0x0b, 0x51, 0xd6, 0xfd, 0x6a, 0xb2, 0x9b, 0xd3, 0xfd,
+ 0x56, 0xec, 0xd9, 0xd6, 0xb8, 0xc5, 0xfd, 0x0c, 0xf7, 0x55,
+ 0x5f, 0xc5, 0x6f, 0xbc, 0xbb, 0x78, 0x2f, 0x50, 0x08, 0x65,
+ 0x0f, 0x12, 0xca, 0x5a, 0xea, 0x52, 0xd0, 0x94, 0x76, 0x17,
+ 0xe4, 0xba, 0x97, 0xba, 0x11, 0xbf, 0x05, 0x7e, 0xa1, 0xfd,
+ 0x7d, 0xb5, 0xf1, 0x3a, 0x7e, 0x6f, 0xa1, 0xaa, 0x97, 0x66,
+ 0x5d, 0x72, 0x76, 0x45, 0x40, 0xb5, 0x22, 0x71, 0x43, 0xe8,
+ 0x77, 0x76, 0xc8, 0x1b, 0xd2, 0xd1, 0x33, 0x05, 0x64, 0xa9,
+ 0xc2, 0xa8, 0x40, 0x40, 0x21, 0xdd, 0xcf, 0x07, 0x7e, 0xf2,
+ 0x4b, 0x80, 0x3d, 0x0f, 0x67, 0xf6, 0xbd, 0xc2, 0xc7, 0xe3,
+ 0x91, 0x71, 0xd6, 0x2d, 0xa1, 0xae, 0x81, 0x0c, 0xed, 0x54,
+ 0x48, 0x79, 0x8a, 0x78, 0x05, 0x74, 0x4d, 0x4f, 0xf0, 0xe0,
+ 0x3c, 0x41, 0x5c, 0x04, 0x0b, 0x68, 0x57, 0xc5, 0xd6 ),
+ &sha256_algorithm,
+ SIGNATURE ( 0x02, 0x2e, 0xc5, 0x2a, 0x2b, 0x7f, 0xb4, 0x80, 0xca, 0x9d,
+ 0x96, 0x5b, 0xaf, 0x1f, 0x72, 0x5b, 0x6e, 0xf1, 0x69, 0x7f,
+ 0x4d, 0x41, 0xd5, 0x9f, 0x00, 0xdc, 0x47, 0xf4, 0x68, 0x8f,
+ 0xda, 0xfc, 0xd1, 0x23, 0x96, 0x11, 0x1d, 0xc0, 0x1b, 0x1d,
+ 0x36, 0x66, 0x2a, 0xf9, 0x21, 0x51, 0xcb, 0xb9, 0x7d, 0x24,
+ 0x7d, 0x38, 0x37, 0xc4, 0xea, 0xdd, 0x3a, 0x6f, 0xa8, 0x65,
+ 0x60, 0x73, 0x77, 0x3c ) );
+
+/**
+ * Perform RSA self-tests
+ *
+ */
+static void rsa_test_exec ( void ) {
+
+ rsa_encrypt_decrypt_ok ( &hw_test );
+ rsa_signature_ok ( &md5_test );
+ rsa_signature_ok ( &sha1_test );
+ rsa_signature_ok ( &sha256_test );
+}
+
+/** RSA self-test */
+struct self_test rsa_test __self_test = {
+ .name = "rsa",
+ .exec = rsa_test_exec,
+};
diff --git a/roms/ipxe/src/tests/settings_test.c b/roms/ipxe/src/tests/settings_test.c
new file mode 100644
index 00000000..4ee6a10f
--- /dev/null
+++ b/roms/ipxe/src/tests/settings_test.c
@@ -0,0 +1,401 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Settings self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <ipxe/settings.h>
+#include <ipxe/test.h>
+
+/** Define inline raw data */
+#define RAW(...) { __VA_ARGS__ }
+
+/**
+ * Report a formatted-store test result
+ *
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _formatted Formatted value
+ * @v _raw_array Expected raw value
+ */
+#define storef_ok( _settings, _setting, _formatted, _raw_array ) do { \
+ const uint8_t expected[] = _raw_array; \
+ uint8_t actual[ sizeof ( expected ) ]; \
+ int len; \
+ \
+ ok ( storef_setting ( _settings, _setting, _formatted ) == 0 ); \
+ len = fetch_setting ( _settings, _setting, NULL, NULL, actual, \
+ sizeof ( actual ) ); \
+ if ( len >= 0 ) { \
+ DBGC ( _settings, "Stored %s \"%s\", got:\n", \
+ (_setting)->type->name, _formatted ); \
+ DBGC_HDA ( _settings, 0, actual, len ); \
+ } else { \
+ DBGC ( _settings, "Stored %s \"%s\", got error %s\n", \
+ (_setting)->type->name, _formatted, \
+ strerror ( len ) ); \
+ } \
+ ok ( len == ( int ) sizeof ( actual ) ); \
+ ok ( memcmp ( actual, expected, sizeof ( actual ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report a formatted-fetch test result
+ *
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _raw_array Raw value
+ * @v _formatted Expected formatted value
+ */
+#define fetchf_ok( _settings, _setting, _raw_array, _formatted ) do { \
+ const uint8_t raw[] = _raw_array; \
+ char actual[ strlen ( _formatted ) + 1 ]; \
+ int len; \
+ \
+ ok ( store_setting ( _settings, _setting, raw, \
+ sizeof ( raw ) ) == 0 ); \
+ len = fetchf_setting ( _settings, _setting, NULL, NULL, actual, \
+ sizeof ( actual ) ); \
+ DBGC ( _settings, "Fetched %s \"%s\" from:\n", \
+ (_setting)->type->name, actual ); \
+ DBGC_HDA ( _settings, 0, raw, sizeof ( raw ) ); \
+ ok ( len == ( int ) ( sizeof ( actual ) - 1 ) ); \
+ ok ( strcmp ( actual, _formatted ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report a numeric-store test result
+ *
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _numeric Numeric value
+ * @v _raw_array Expected raw value
+ */
+#define storen_ok( _settings, _setting, _numeric, _raw_array ) do { \
+ const uint8_t expected[] = _raw_array; \
+ uint8_t actual[ sizeof ( expected ) ]; \
+ int len; \
+ \
+ ok ( storen_setting ( _settings, _setting, _numeric ) == 0 ); \
+ len = fetch_setting ( _settings, _setting, NULL, NULL, actual, \
+ sizeof ( actual ) ); \
+ if ( len >= 0 ) { \
+ DBGC ( _settings, "Stored %s %#lx, got:\n", \
+ (_setting)->type->name, \
+ ( unsigned long ) _numeric ); \
+ DBGC_HDA ( _settings, 0, actual, len ); \
+ } else { \
+ DBGC ( _settings, "Stored %s %#lx, got error %s\n", \
+ (_setting)->type->name, \
+ ( unsigned long ) _numeric, strerror ( len ) ); \
+ } \
+ ok ( len == ( int ) sizeof ( actual ) ); \
+ ok ( memcmp ( actual, expected, sizeof ( actual ) ) == 0 ); \
+ } while ( 0 )
+
+/**
+ * Report a numeric-fetch test result
+ *
+ * @v _settings Settings block
+ * @v _setting Setting
+ * @v _raw_array Raw array
+ * @v _numeric Expected numeric value
+ */
+#define fetchn_ok( _settings, _setting, _raw_array, _numeric ) do { \
+ const uint8_t raw[] = _raw_array; \
+ unsigned long actual; \
+ \
+ ok ( store_setting ( _settings, _setting, raw, \
+ sizeof ( raw ) ) == 0 ); \
+ ok ( fetchn_setting ( _settings, _setting, NULL, NULL, \
+ &actual ) == 0 ); \
+ DBGC ( _settings, "Fetched %s %#lx from:\n", \
+ (_setting)->type->name, actual ); \
+ DBGC_HDA ( _settings, 0, raw, sizeof ( raw ) ); \
+ ok ( actual == ( unsigned long ) _numeric ); \
+ } while ( 0 )
+
+/** Test generic settings block */
+struct generic_settings test_generic_settings = {
+ .settings = {
+ .refcnt = NULL,
+ .siblings =
+ LIST_HEAD_INIT ( test_generic_settings.settings.siblings ),
+ .children =
+ LIST_HEAD_INIT ( test_generic_settings.settings.children ),
+ .op = &generic_settings_operations,
+ },
+ .list = LIST_HEAD_INIT ( test_generic_settings.list ),
+};
+
+/** Test settings block */
+#define test_settings test_generic_settings.settings
+
+/** Test string setting */
+static struct setting test_string_setting = {
+ .name = "test_string",
+ .type = &setting_type_string,
+};
+
+/** Test IPv4 address setting type */
+static struct setting test_ipv4_setting = {
+ .name = "test_ipv4",
+ .type = &setting_type_ipv4,
+};
+
+/** Test IPv6 address setting type */
+static struct setting test_ipv6_setting = {
+ .name = "test_ipv6",
+ .type = &setting_type_ipv6,
+};
+
+/** Test signed 8-bit integer setting type */
+static struct setting test_int8_setting = {
+ .name = "test_int8",
+ .type = &setting_type_int8,
+};
+
+/** Test signed 16-bit integer setting type */
+static struct setting test_int16_setting = {
+ .name = "test_int16",
+ .type = &setting_type_int16,
+};
+
+/** Test signed 32-bit integer setting type */
+static struct setting test_int32_setting = {
+ .name = "test_int32",
+ .type = &setting_type_int32,
+};
+
+/** Test unsigned 8-bit integer setting type */
+static struct setting test_uint8_setting = {
+ .name = "test_uint8",
+ .type = &setting_type_uint8,
+};
+
+/** Test unsigned 16-bit integer setting type */
+static struct setting test_uint16_setting = {
+ .name = "test_uint16",
+ .type = &setting_type_uint16,
+};
+
+/** Test unsigned 32-bit integer setting type */
+static struct setting test_uint32_setting = {
+ .name = "test_uint32",
+ .type = &setting_type_uint32,
+};
+
+/** Test colon-separated hex string setting type */
+static struct setting test_hex_setting = {
+ .name = "test_hex",
+ .type = &setting_type_hex,
+};
+
+/** Test hyphen-separated hex string setting type */
+static struct setting test_hexhyp_setting = {
+ .name = "test_hexhyp",
+ .type = &setting_type_hexhyp,
+};
+
+/** Test raw hex string setting type */
+static struct setting test_hexraw_setting = {
+ .name = "test_hexraw",
+ .type = &setting_type_hexraw,
+};
+
+/** Test UUID setting type */
+static struct setting test_uuid_setting = {
+ .name = "test_uuid",
+ .type = &setting_type_uuid,
+};
+
+/** Test PCI bus:dev.fn setting type */
+static struct setting test_busdevfn_setting = {
+ .name = "test_busdevfn",
+ .type = &setting_type_busdevfn,
+};
+
+/**
+ * Perform settings self-tests
+ *
+ */
+static void settings_test_exec ( void ) {
+
+ /* Register test settings block */
+ ok ( register_settings ( &test_settings, NULL, "test" ) == 0 );
+
+ /* "string" setting type */
+ storef_ok ( &test_settings, &test_string_setting, "hello",
+ RAW ( 'h', 'e', 'l', 'l', 'o' ) );
+ fetchf_ok ( &test_settings, &test_string_setting,
+ RAW ( 'w', 'o', 'r', 'l', 'd' ), "world" );
+
+ /* "ipv4" setting type */
+ storef_ok ( &test_settings, &test_ipv4_setting, "192.168.0.1",
+ RAW ( 192, 168, 0, 1 ) );
+ fetchf_ok ( &test_settings, &test_ipv4_setting,
+ RAW ( 212, 13, 204, 60 ), "212.13.204.60" );
+
+ /* "ipv6" setting type */
+ storef_ok ( &test_settings, &test_ipv6_setting,
+ "2001:ba8:0:1d4::6950:5845",
+ RAW ( 0x20, 0x01, 0x0b, 0xa8, 0x00, 0x00, 0x01, 0xd4,
+ 0x00, 0x00, 0x00, 0x00, 0x69, 0x50, 0x58, 0x45 ) );
+ fetchf_ok ( &test_settings, &test_ipv6_setting,
+ RAW ( 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x02, 0x0c, 0x29, 0xff, 0xfe, 0xc5, 0x39, 0xa1 ),
+ "fe80::20c:29ff:fec5:39a1" );
+
+ /* Integer setting types (as formatted strings) */
+ storef_ok ( &test_settings, &test_int8_setting,
+ "54", RAW ( 54 ) );
+ storef_ok ( &test_settings, &test_int8_setting,
+ "0x7f", RAW ( 0x7f ) );
+ storef_ok ( &test_settings, &test_int8_setting,
+ "0x1234", RAW ( 0x34 ) );
+ storef_ok ( &test_settings, &test_int8_setting,
+ "-32", RAW ( -32 ) );
+ fetchf_ok ( &test_settings, &test_int8_setting,
+ RAW ( -9 ), "-9" );
+ fetchf_ok ( &test_settings, &test_int8_setting,
+ RAW ( 106 ), "106" );
+ storef_ok ( &test_settings, &test_uint8_setting,
+ "129", RAW ( 129 ) );
+ storef_ok ( &test_settings, &test_uint8_setting,
+ "0x3421", RAW ( 0x21 ) );
+ fetchf_ok ( &test_settings, &test_uint8_setting,
+ RAW ( 0x54 ), "0x54" );
+ storef_ok ( &test_settings, &test_int16_setting,
+ "29483", RAW ( 0x73, 0x2b ) );
+ fetchf_ok ( &test_settings, &test_int16_setting,
+ RAW ( 0x82, 0x14 ), "-32236" );
+ fetchf_ok ( &test_settings, &test_int16_setting,
+ RAW ( 0x12, 0x78 ), "4728" );
+ storef_ok ( &test_settings, &test_uint16_setting,
+ "48727", RAW ( 0xbe, 0x57 ) );
+ fetchf_ok ( &test_settings, &test_uint16_setting,
+ RAW ( 0x9a, 0x24 ), "0x9a24" );
+ storef_ok ( &test_settings, &test_int32_setting,
+ "2901274", RAW ( 0x00, 0x2c, 0x45, 0x1a ) );
+ fetchf_ok ( &test_settings, &test_int32_setting,
+ RAW ( 0xff, 0x34, 0x2d, 0xaf ), "-13357649" );
+ fetchf_ok ( &test_settings, &test_int32_setting,
+ RAW ( 0x01, 0x00, 0x34, 0xab ), "16790699" );
+ storef_ok ( &test_settings, &test_uint32_setting,
+ "0xb598d21", RAW ( 0x0b, 0x59, 0x8d, 0x21 ) );
+ fetchf_ok ( &test_settings, &test_uint32_setting,
+ RAW ( 0xf2, 0x37, 0xb2, 0x18 ), "0xf237b218" );
+
+ /* Integer setting types (as numeric values) */
+ storen_ok ( &test_settings, &test_int8_setting,
+ 72, RAW ( 72 ) );
+ storen_ok ( &test_settings, &test_int8_setting,
+ 0xabcd, RAW ( 0xcd ) );
+ fetchn_ok ( &test_settings, &test_int8_setting,
+ RAW ( 0xfe ), -2 );
+ storen_ok ( &test_settings, &test_uint8_setting,
+ 84, RAW ( 84 ) );
+ fetchn_ok ( &test_settings, &test_uint8_setting,
+ RAW ( 0xfe ), 0xfe );
+ storen_ok ( &test_settings, &test_int16_setting,
+ 0x87bd, RAW ( 0x87, 0xbd ) );
+ fetchn_ok ( &test_settings, &test_int16_setting,
+ RAW ( 0x3d, 0x14 ), 0x3d14 );
+ fetchn_ok ( &test_settings, &test_int16_setting,
+ RAW ( 0x80 ), -128 );
+ storen_ok ( &test_settings, &test_uint16_setting,
+ 1, RAW ( 0x00, 0x01 ) );
+ fetchn_ok ( &test_settings, &test_uint16_setting,
+ RAW ( 0xbd, 0x87 ), 0xbd87 );
+ fetchn_ok ( &test_settings, &test_uint16_setting,
+ RAW ( 0x80 ), 0x0080 );
+ storen_ok ( &test_settings, &test_int32_setting,
+ 0x0812bfd2, RAW ( 0x08, 0x12, 0xbf, 0xd2 ) );
+ fetchn_ok ( &test_settings, &test_int32_setting,
+ RAW ( 0x43, 0x87, 0x91, 0xb4 ), 0x438791b4 );
+ fetchn_ok ( &test_settings, &test_int32_setting,
+ RAW ( 0xff, 0xff, 0xfe ), -2 );
+ storen_ok ( &test_settings, &test_uint32_setting,
+ 0xb5927ab8, RAW ( 0xb5, 0x92, 0x7a, 0xb8 ) );
+ fetchn_ok ( &test_settings, &test_uint32_setting,
+ RAW ( 0x98, 0xab, 0x41, 0x81 ), 0x98ab4181 );
+ fetchn_ok ( &test_settings, &test_uint32_setting,
+ RAW ( 0xff, 0xff, 0xfe ), 0x00fffffe );
+ fetchn_ok ( &test_settings, &test_uint32_setting,
+ RAW ( 0, 0, 0, 0x12, 0x34, 0x56, 0x78 ), 0x12345678 );
+ fetchn_ok ( &test_settings, &test_int32_setting,
+ RAW ( 0, 0, 0, 0x12, 0x34, 0x56, 0x78 ), 0x12345678 );
+ fetchn_ok ( &test_settings, &test_int32_setting,
+ RAW ( 0xff, 0xff, 0x87, 0x65, 0x43, 0x21 ), -0x789abcdf );
+
+ /* "hex" setting type */
+ storef_ok ( &test_settings, &test_hex_setting,
+ "08:12:f5:22:90:1b:4b:47:a8:30:cb:4d:67:4c:d6:76",
+ RAW ( 0x08, 0x12, 0xf5, 0x22, 0x90, 0x1b, 0x4b, 0x47, 0xa8,
+ 0x30, 0xcb, 0x4d, 0x67, 0x4c, 0xd6, 0x76 ) );
+ fetchf_ok ( &test_settings, &test_hex_setting,
+ RAW ( 0x62, 0xd9, 0xd4, 0xc4, 0x7e, 0x3b, 0x41, 0x46, 0x91,
+ 0xc6, 0xfd, 0x0c, 0xbf ),
+ "62:d9:d4:c4:7e:3b:41:46:91:c6:fd:0c:bf" );
+
+ /* "hexhyp" setting type */
+ storef_ok ( &test_settings, &test_hexhyp_setting,
+ "11-33-22", RAW ( 0x11, 0x33, 0x22 ) );
+ fetchf_ok ( &test_settings, &test_hexhyp_setting,
+ RAW ( 0x9f, 0xe5, 0x6d, 0xfb, 0x24, 0x3a, 0x4c, 0xbb, 0xa9,
+ 0x09, 0x6c, 0x66, 0x13, 0xc1, 0xa8, 0xec, 0x27 ),
+ "9f-e5-6d-fb-24-3a-4c-bb-a9-09-6c-66-13-c1-a8-ec-27" );
+
+ /* "hexraw" setting type */
+ storef_ok ( &test_settings, &test_hexraw_setting,
+ "012345abcdef", RAW ( 0x01, 0x23, 0x45, 0xab, 0xcd, 0xef ));
+ fetchf_ok ( &test_settings, &test_hexraw_setting,
+ RAW ( 0x9e, 0x4b, 0x6e, 0xef, 0x36, 0xb6, 0x46, 0xfe, 0x8f,
+ 0x17, 0x06, 0x39, 0x6b, 0xf4, 0x48, 0x4e ),
+ "9e4b6eef36b646fe8f1706396bf4484e" );
+
+ /* "uuid" setting type (no store capability) */
+ fetchf_ok ( &test_settings, &test_uuid_setting,
+ RAW ( 0x1a, 0x6a, 0x74, 0x9d, 0x0e, 0xda, 0x46, 0x1a,0xa8,
+ 0x7a, 0x7c, 0xfe, 0x4f, 0xca, 0x4a, 0x57 ),
+ "1a6a749d-0eda-461a-a87a-7cfe4fca4a57" );
+
+ /* "busdevfn" setting type (no store capability) */
+ fetchf_ok ( &test_settings, &test_busdevfn_setting,
+ RAW ( 0x03, 0x45 ), "03:08.5" );
+
+ /* Clear and unregister test settings block */
+ clear_settings ( &test_settings );
+ unregister_settings ( &test_settings );
+}
+
+/** Settings self-test */
+struct self_test settings_test __self_test = {
+ .name = "settings",
+ .exec = settings_test_exec,
+};
diff --git a/roms/ipxe/src/tests/sha1_test.c b/roms/ipxe/src/tests/sha1_test.c
new file mode 100644
index 00000000..bcf761bd
--- /dev/null
+++ b/roms/ipxe/src/tests/sha1_test.c
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * SHA-1 tests
+ *
+ */
+
+#include <stdint.h>
+#include <ipxe/sha1.h>
+#include <ipxe/test.h>
+#include "digest_test.h"
+
+/** An SHA-1 test vector */
+struct sha1_test_vector {
+ /** Test data */
+ void *data;
+ /** Test data length */
+ size_t len;
+ /** Expected digest */
+ uint8_t digest[SHA1_DIGEST_SIZE];
+};
+
+/** SHA-1 test vectors */
+static struct sha1_test_vector sha1_test_vectors[] = {
+ /* Empty test data
+ *
+ * Expected digest value obtained from "sha1sum /dev/null"
+ */
+ { NULL, 0,
+ { 0xda, 0x39, 0xa3, 0xee, 0x5e, 0x6b, 0x4b, 0x0d, 0x32, 0x55,
+ 0xbf, 0xef, 0x95, 0x60, 0x18, 0x90, 0xaf, 0xd8, 0x07, 0x09 } },
+ /* Test data and expected digests taken from the NIST
+ * Cryptographic Toolkit Algorithm Examples at
+ * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA1.pdf
+ */
+ { "abc", 3,
+ { 0xa9, 0x99, 0x3e, 0x36, 0x47, 0x06, 0x81, 0x6a, 0xba, 0x3e,
+ 0x25, 0x71, 0x78, 0x50, 0xc2, 0x6c, 0x9c, 0xd0, 0xd8, 0x9d } },
+ { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
+ { 0x84, 0x98, 0x3e, 0x44, 0x1c, 0x3b, 0xd2, 0x6e, 0xba, 0xae,
+ 0x4a, 0xa1, 0xf9, 0x51, 0x29, 0xe5, 0xe5, 0x46, 0x70, 0xf1 } },
+};
+
+/** SHA-1 test fragment lists */
+static struct digest_test_fragments sha1_test_fragments[] = {
+ { { 0, -1UL, } },
+ { { 1, 1, 1, 1, 1, 1, 1, 1 } },
+ { { 2, 0, 23, 4, 6, 1, 0 } },
+};
+
+/**
+ * Perform SHA-1 self-test
+ *
+ */
+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];
+ /* Test with a single pass */
+ digest_ok ( digest, NULL, test->data, test->len, test->digest );
+ /* Test with fragment lists */
+ for ( j = 0 ; j < ( sizeof ( sha1_test_fragments ) /
+ sizeof ( sha1_test_fragments[0] ) ) ; j++ ){
+ digest_ok ( digest, &sha1_test_fragments[j],
+ 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 */
+struct self_test sha1_test __self_test = {
+ .name = "sha1",
+ .exec = sha1_test_exec,
+};
diff --git a/roms/ipxe/src/tests/sha256_test.c b/roms/ipxe/src/tests/sha256_test.c
new file mode 100644
index 00000000..06a8cae2
--- /dev/null
+++ b/roms/ipxe/src/tests/sha256_test.c
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * SHA-256 tests
+ *
+ */
+
+#include <stdint.h>
+#include <ipxe/sha256.h>
+#include <ipxe/test.h>
+#include "digest_test.h"
+
+/** An SHA-256 test vector */
+struct sha256_test_vector {
+ /** Test data */
+ void *data;
+ /** Test data length */
+ size_t len;
+ /** Expected digest */
+ uint8_t digest[SHA256_DIGEST_SIZE];
+};
+
+/** SHA-256 test vectors */
+static struct sha256_test_vector sha256_test_vectors[] = {
+ /* Empty test data
+ *
+ * Expected digest value obtained from "sha256sum /dev/null"
+ */
+ { NULL, 0,
+ { 0xe3, 0xb0, 0xc4, 0x42, 0x98, 0xfc, 0x1c, 0x14, 0x9a, 0xfb, 0xf4,
+ 0xc8, 0x99, 0x6f, 0xb9, 0x24, 0x27, 0xae, 0x41, 0xe4, 0x64, 0x9b,
+ 0x93, 0x4c, 0xa4, 0x95, 0x99, 0x1b, 0x78, 0x52, 0xb8, 0x55 } },
+ /* Test data and expected digests taken from the NIST
+ * Cryptographic Toolkit Algorithm Examples at
+ * http://csrc.nist.gov/groups/ST/toolkit/documents/Examples/SHA256.pdf
+ */
+ { "abc", 3,
+ { 0xba, 0x78, 0x16, 0xbf, 0x8f, 0x01, 0xcf, 0xea, 0x41, 0x41, 0x40,
+ 0xde, 0x5d, 0xae, 0x22, 0x23, 0xb0, 0x03, 0x61, 0xa3, 0x96, 0x17,
+ 0x7a, 0x9c, 0xb4, 0x10, 0xff, 0x61, 0xf2, 0x00, 0x15, 0xad } },
+ { "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
+ { 0x24, 0x8d, 0x6a, 0x61, 0xd2, 0x06, 0x38, 0xb8, 0xe5, 0xc0, 0x26,
+ 0x93, 0x0c, 0x3e, 0x60, 0x39, 0xa3, 0x3c, 0xe4, 0x59, 0x64, 0xff,
+ 0x21, 0x67, 0xf6, 0xec, 0xed, 0xd4, 0x19, 0xdb, 0x06, 0xc1 } },
+};
+
+/** SHA-256 test fragment lists */
+static struct digest_test_fragments sha256_test_fragments[] = {
+ { { 0, -1UL, } },
+ { { 1, 1, 1, 1, 1, 1, 1, 1 } },
+ { { 2, 0, 23, 4, 6, 1, 0 } },
+};
+
+/**
+ * Perform SHA-256 self-test
+ *
+ */
+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];
+ /* Test with a single pass */
+ digest_ok ( digest, NULL, test->data, test->len, test->digest );
+ /* Test with fragment lists */
+ for ( j = 0 ; j < ( sizeof ( sha256_test_fragments ) /
+ sizeof ( sha256_test_fragments[0] )); j++ ){
+ digest_ok ( digest, &sha256_test_fragments[j],
+ 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 */
+struct self_test sha256_test __self_test = {
+ .name = "sha256",
+ .exec = sha256_test_exec,
+};
diff --git a/roms/ipxe/src/tests/string_test.c b/roms/ipxe/src/tests/string_test.c
new file mode 100644
index 00000000..3b48d9f3
--- /dev/null
+++ b/roms/ipxe/src/tests/string_test.c
@@ -0,0 +1,163 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * String self-tests
+ *
+ * memcpy() tests are handled separately
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ipxe/test.h>
+
+/**
+ * Perform string self-tests
+ *
+ */
+static void string_test_exec ( void ) {
+
+ /* Test strlen() */
+ ok ( strlen ( "" ) == 0 );
+ ok ( strlen ( "Hello" ) == 5 );
+ ok ( strlen ( "Hello world!" ) == 12 );
+ ok ( strlen ( "Hello\0world!" ) == 5 );
+
+ /* Test strnlen() */
+ ok ( strnlen ( "", 0 ) == 0 );
+ ok ( strnlen ( "", 10 ) == 0 );
+ ok ( strnlen ( "Hello", 0 ) == 0 );
+ ok ( strnlen ( "Hello", 3 ) == 3 );
+ ok ( strnlen ( "Hello", 5 ) == 5 );
+ ok ( strnlen ( "Hello", 16 ) == 5 );
+ ok ( strnlen ( "Hello world!", 5 ) == 5 );
+ ok ( strnlen ( "Hello world!", 11 ) == 11 );
+ ok ( strnlen ( "Hello world!", 16 ) == 12 );
+
+ /* Test strchr() */
+ ok ( strchr ( "", 'a' ) == NULL );
+ ok ( *(strchr ( "Testing", 'e' )) == 'e' );
+ ok ( *(strchr ( "Testing", 'g' )) == 'g' );
+ ok ( strchr ( "Testing", 'x' ) == NULL );
+
+ /* Test strcmp() */
+ ok ( strcmp ( "", "" ) == 0 );
+ ok ( strcmp ( "Hello", "Hello" ) == 0 );
+ ok ( strcmp ( "Hello", "hello" ) != 0 );
+ ok ( strcmp ( "Hello", "Hello world!" ) != 0 );
+ ok ( strcmp ( "Hello world!", "Hello" ) != 0 );
+
+ /* Test strncmp() */
+ ok ( strncmp ( "", "", 0 ) == 0 );
+ ok ( strncmp ( "", "", 15 ) == 0 );
+ ok ( strncmp ( "Goodbye", "Goodbye", 16 ) == 0 );
+ ok ( strncmp ( "Goodbye", "Hello", 16 ) != 0 );
+ ok ( strncmp ( "Goodbye", "Goodbye world", 32 ) != 0 );
+ ok ( strncmp ( "Goodbye", "Goodbye world", 7 ) == 0 );
+
+ /* Test memcmp() */
+ ok ( memcmp ( "", "", 0 ) == 0 );
+ ok ( memcmp ( "Foo", "Foo", 3 ) == 0 );
+ ok ( memcmp ( "Foo", "Bar", 3 ) != 0 );
+
+ /* Test memset() */
+ {
+ static uint8_t test[7] = { '>', 1, 1, 1, 1, 1, '<' };
+ static const uint8_t expected[7] = { '>', 0, 0, 0, 0, 0, '<' };
+ memset ( ( test + 1 ), 0, ( sizeof ( test ) - 2 ) );
+ ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
+ }
+ {
+ static uint8_t test[4] = { '>', 0, 0, '<' };
+ static const uint8_t expected[4] = { '>', 0xeb, 0xeb, '<' };
+ memset ( ( test + 1 ), 0xeb, ( sizeof ( test ) - 2 ) );
+ ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
+ }
+
+ /* Test memmove() */
+ {
+ static uint8_t test[11] =
+ { '>', 1, 2, 3, 4, 5, 6, 7, 8, 9, '<' };
+ static const uint8_t expected[11] =
+ { '>', 3, 4, 5, 6, 7, 8, 7, 8, 9, '<' };
+ memmove ( ( test + 1 ), ( test + 3 ), 6 );
+ ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
+ }
+ {
+ static uint8_t test[12] =
+ { '>', 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '<' };
+ static const uint8_t expected[12] =
+ { '>', 1, 2, 3, 4, 5, 1, 2, 3, 4, 5, '<' };
+ memmove ( ( test + 6 ), ( test + 1 ), 5 );
+ ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
+ }
+
+ /* Test memswap() */
+ {
+ static uint8_t test[8] =
+ { '>', 1, 2, 3, 7, 8, 9, '<' };
+ static const uint8_t expected[8] =
+ { '>', 7, 8, 9, 1, 2, 3, '<' };
+ memswap ( ( test + 1 ), ( test + 4 ), 3 );
+ ok ( memcmp ( test, expected, sizeof ( test ) ) == 0 );
+ }
+
+ /* Test strdup() */
+ {
+ const char *orig = "testing testing";
+ char *dup = strdup ( orig );
+ ok ( dup != NULL );
+ ok ( dup != orig );
+ ok ( strcmp ( dup, orig ) == 0 );
+ free ( dup );
+ }
+
+ /* Test strndup() */
+ {
+ const char *normal = "testing testing";
+ const char unterminated[6] = { 'h', 'e', 'l', 'l', 'o', '!' };
+ char *dup;
+ dup = strndup ( normal, 32 );
+ ok ( dup != NULL );
+ ok ( dup != normal );
+ ok ( strcmp ( dup, normal ) == 0 );
+ free ( dup );
+ dup = strndup ( normal, 4 );
+ ok ( dup != NULL );
+ ok ( strcmp ( dup, "test" ) == 0 );
+ free ( dup );
+ dup = strndup ( unterminated, 5 );
+ ok ( dup != NULL );
+ ok ( strcmp ( dup, "hello" ) == 0 );
+ free ( dup );
+ }
+}
+
+/** String self-test */
+struct self_test string_test __self_test = {
+ .name = "string",
+ .exec = string_test_exec,
+};
diff --git a/roms/ipxe/src/tests/tcpip_test.c b/roms/ipxe/src/tests/tcpip_test.c
new file mode 100644
index 00000000..00c88ae3
--- /dev/null
+++ b/roms/ipxe/src/tests/tcpip_test.c
@@ -0,0 +1,239 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * TCP/IP self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include <ipxe/test.h>
+#include <ipxe/profile.h>
+#include <ipxe/tcpip.h>
+
+/** Number of sample iterations for profiling */
+#define PROFILE_COUNT 16
+
+/** A TCP/IP fixed-data test */
+struct tcpip_test {
+ /** Data */
+ const void *data;
+ /** Length of data */
+ size_t len;
+};
+
+/** A TCP/IP pseudorandom-data test */
+struct tcpip_random_test {
+ /** Seed */
+ unsigned int seed;
+ /** Length of data */
+ size_t len;
+ /** Alignment offset */
+ size_t offset;
+};
+
+/** Define inline data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define a TCP/IP fixed-data test */
+#define TCPIP_TEST( name, DATA ) \
+ static const uint8_t __attribute__ (( aligned ( 16 ) )) \
+ name ## _data[] = DATA; \
+ static struct tcpip_test name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ }
+
+/** Define a TCP/IP pseudorandom-data test */
+#define TCPIP_RANDOM_TEST( name, SEED, LEN, OFFSET ) \
+ static struct tcpip_random_test name = { \
+ .seed = SEED, \
+ .len = LEN, \
+ .offset = OFFSET, \
+ }
+
+/** Buffer for pseudorandom-data tests */
+static uint8_t __attribute__ (( aligned ( 16 ) ))
+ tcpip_data[ 4096 + 7 /* offset */ ];
+
+/** Empty data */
+TCPIP_TEST ( empty, DATA() );
+
+/** Single byte */
+TCPIP_TEST ( one_byte, DATA ( 0xeb ) );
+
+/** Double byte */
+TCPIP_TEST ( two_bytes, DATA ( 0xba, 0xbe ) );
+
+/** Final wrap-around carry (big-endian) */
+TCPIP_TEST ( final_carry_big,
+ DATA ( 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01 ) );
+
+/** Final wrap-around carry (little-endian) */
+TCPIP_TEST ( final_carry_little,
+ DATA ( 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00 ) );
+
+/** Random data (aligned) */
+TCPIP_RANDOM_TEST ( random_aligned, 0x12345678UL, 4096, 0 );
+
+/** Random data (unaligned, +1) */
+TCPIP_RANDOM_TEST ( random_unaligned_1, 0x12345678UL, 4096, 1 );
+
+/** Random data (unaligned, +2) */
+TCPIP_RANDOM_TEST ( random_unaligned_2, 0x12345678UL, 4096, 2 );
+
+/** Random data (aligned, truncated) */
+TCPIP_RANDOM_TEST ( random_aligned_truncated, 0x12345678UL, 4095, 0 );
+
+/** Random data (unaligned start and finish) */
+TCPIP_RANDOM_TEST ( partial, 0xcafebabe, 121, 5 );
+
+/**
+ * Calculate TCP/IP checksum
+ *
+ * @v data Data to sum
+ * @v len Length of data
+ * @ret cksum Checksum
+ *
+ * This is a reference implementation taken from RFC1071 (and modified
+ * to fix compilation without warnings under gcc).
+ */
+static uint16_t rfc_tcpip_chksum ( const void *data, size_t len ) {
+ unsigned long sum = 0;
+
+ while ( len > 1 ) {
+ sum += *( ( uint16_t * ) data );
+ data += 2;
+ len -= 2;
+ }
+
+ if ( len > 0 )
+ sum += *( ( uint8_t * ) data );
+
+ while ( sum >> 16 )
+ sum = ( ( sum & 0xffff ) + ( sum >> 16 ) );
+
+ return ~sum;
+}
+
+/**
+ * Report TCP/IP fixed-data test result
+ *
+ * @v test TCP/IP test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void tcpip_okx ( struct tcpip_test *test, const char *file,
+ unsigned int line ) {
+ uint16_t expected;
+ uint16_t generic_sum;
+ uint16_t sum;
+
+ /* Verify generic_tcpip_continue_chksum() result */
+ expected = rfc_tcpip_chksum ( test->data, test->len );
+ generic_sum = generic_tcpip_continue_chksum ( TCPIP_EMPTY_CSUM,
+ test->data, test->len );
+ okx ( generic_sum == expected, file, line );
+
+ /* Verify optimised tcpip_continue_chksum() result */
+ sum = tcpip_continue_chksum ( TCPIP_EMPTY_CSUM, test->data, test->len );
+ okx ( sum == expected, file, line );
+}
+#define tcpip_ok( test ) tcpip_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report TCP/IP pseudorandom-data test result
+ *
+ * @v test TCP/IP test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void tcpip_random_okx ( struct tcpip_random_test *test,
+ const char *file, unsigned int line ) {
+ uint8_t *data = ( tcpip_data + test->offset );
+ struct profiler profiler;
+ uint16_t expected;
+ uint16_t generic_sum;
+ uint16_t sum;
+ unsigned int i;
+
+ /* Sanity check */
+ assert ( ( test->len + test->offset ) <= sizeof ( tcpip_data ) );
+
+ /* Generate random data */
+ srandom ( test->seed );
+ for ( i = 0 ; i < test->len ; i++ )
+ data[i] = random();
+
+ /* Verify generic_tcpip_continue_chksum() result */
+ expected = rfc_tcpip_chksum ( data, test->len );
+ generic_sum = generic_tcpip_continue_chksum ( TCPIP_EMPTY_CSUM,
+ data, test->len );
+ okx ( generic_sum == expected, file, line );
+
+ /* Verify optimised tcpip_continue_chksum() result */
+ sum = tcpip_continue_chksum ( TCPIP_EMPTY_CSUM, data, test->len );
+ okx ( sum == expected, file, line );
+
+ /* Profile optimised calculation */
+ memset ( &profiler, 0, sizeof ( profiler ) );
+ for ( i = 0 ; i < PROFILE_COUNT ; i++ ) {
+ profile_start ( &profiler );
+ sum = tcpip_continue_chksum ( TCPIP_EMPTY_CSUM, data,
+ test->len );
+ profile_stop ( &profiler );
+ }
+ DBG ( "TCPIP checksummed %zd bytes (+%zd) in %ld +/- %ld ticks\n",
+ test->len, test->offset, profile_mean ( &profiler ),
+ profile_stddev ( &profiler ) );
+}
+#define tcpip_random_ok( test ) tcpip_random_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Perform TCP/IP self-tests
+ *
+ */
+static void tcpip_test_exec ( void ) {
+
+ tcpip_ok ( &empty );
+ tcpip_ok ( &one_byte );
+ tcpip_ok ( &two_bytes );
+ tcpip_ok ( &final_carry_big );
+ tcpip_ok ( &final_carry_little );
+ tcpip_random_ok ( &random_aligned );
+ tcpip_random_ok ( &random_unaligned_1 );
+ tcpip_random_ok ( &random_unaligned_2 );
+ tcpip_random_ok ( &random_aligned_truncated );
+ tcpip_random_ok ( &partial );
+}
+
+/** TCP/IP self-test */
+struct self_test tcpip_test __self_test = {
+ .name = "tcpip",
+ .exec = tcpip_test_exec,
+};
diff --git a/roms/ipxe/src/tests/test.c b/roms/ipxe/src/tests/test.c
new file mode 100644
index 00000000..c05e72a7
--- /dev/null
+++ b/roms/ipxe/src/tests/test.c
@@ -0,0 +1,178 @@
+/*
+ * Copyright (C) 2011 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Self-test infrastructure
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stddef.h>
+#include <stdio.h>
+#include <errno.h>
+#include <assert.h>
+#include <ipxe/test.h>
+#include <ipxe/init.h>
+#include <ipxe/image.h>
+#include <usr/profstat.h>
+
+/** Current self-test set */
+static struct self_test *current_tests;
+
+/**
+ * Report test result
+ *
+ * @v success Test succeeded
+ * @v file Test code file
+ * @v line Test code line
+ * @v test Test code
+ */
+void test_ok ( int success, const char *file, unsigned int line,
+ const char *test ) {
+
+ /* Sanity check */
+ assert ( current_tests != NULL );
+
+ /* Increment test counter */
+ current_tests->total++;
+
+ /* Report failure if applicable */
+ if ( ! success ) {
+ current_tests->failures++;
+ printf ( "FAILURE: \"%s\" test failed at %s line %d: ( %s )\n",
+ current_tests->name, file, line, test );
+ }
+}
+
+/**
+ * Run self-test set
+ *
+ */
+static void run_tests ( struct self_test *tests ) {
+ unsigned int old_assertion_failures = assertion_failures;
+
+ /* Sanity check */
+ assert ( current_tests == NULL );
+
+ /* Record current test set */
+ current_tests = tests;
+
+ /* Run tests */
+ tests->exec();
+
+ /* Clear current test set */
+ current_tests = NULL;
+
+ /* Record number of assertion failures */
+ tests->assertion_failures =
+ ( assertion_failures - old_assertion_failures );
+
+ /* Print test set summary */
+ if ( tests->failures || tests->assertion_failures ) {
+ printf ( "FAILURE: \"%s\" %d of %d tests failed",
+ tests->name, tests->failures, tests->total );
+ if ( tests->assertion_failures ) {
+ printf ( " with %d assertion failures",
+ tests->assertion_failures );
+ }
+ printf ( "\n" );
+ } else {
+ printf ( "OK: \"%s\" %d tests passed\n",
+ tests->name, tests->total );
+ }
+}
+
+/**
+ * Run all self-tests
+ *
+ * @ret rc Return status code
+ */
+static int run_all_tests ( void ) {
+ struct self_test *tests;
+ unsigned int failures = 0;
+ unsigned int assertions = 0;
+ unsigned int total = 0;
+
+ /* Run all compiled-in self-tests */
+ printf ( "Starting self-tests\n" );
+ for_each_table_entry ( tests, SELF_TESTS )
+ run_tests ( tests );
+
+ /* Print overall summary */
+ for_each_table_entry ( tests, SELF_TESTS ) {
+ total += tests->total;
+ failures += tests->failures;
+ assertions += tests->assertion_failures;
+ }
+ if ( failures || assertions ) {
+ printf ( "FAILURE: %d of %d tests failed",
+ failures, total );
+ if ( assertions ) {
+ printf ( " with %d assertion failures", assertions );
+ }
+ printf ( "\n" );
+ return -EINPROGRESS;
+ } else {
+ printf ( "OK: all %d tests passed\n", total );
+ profstat();
+ return 0;
+ }
+}
+
+static int test_image_probe ( struct image *image __unused ) {
+ return -ENOTTY;
+}
+
+static int test_image_exec ( struct image *image __unused ) {
+ return run_all_tests();
+}
+
+static struct image_type test_image_type = {
+ .name = "self-tests",
+ .probe = test_image_probe,
+ .exec = test_image_exec,
+};
+
+static struct image test_image = {
+ .refcnt = REF_INIT ( ref_no_free ),
+ .name = "<TESTS>",
+ .type = &test_image_type,
+};
+
+static void test_init ( void ) {
+ int rc;
+
+ /* Register self-tests image */
+ if ( ( rc = register_image ( &test_image ) ) != 0 ) {
+ DBG ( "Could not register self-test image: %s\n",
+ strerror ( rc ) );
+ /* No way to report failure */
+ return;
+ }
+}
+
+/** Self-test initialisation function */
+struct init_fn test_init_fn __init_fn ( INIT_EARLY ) = {
+ .initialise = test_init,
+};
diff --git a/roms/ipxe/src/tests/tests.c b/roms/ipxe/src/tests/tests.c
new file mode 100644
index 00000000..2b4b78c7
--- /dev/null
+++ b/roms/ipxe/src/tests/tests.c
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Self-test collection
+ *
+ */
+
+/* Drag in all applicable self-tests */
+REQUIRE_OBJECT ( memcpy_test );
+REQUIRE_OBJECT ( string_test );
+REQUIRE_OBJECT ( math_test );
+REQUIRE_OBJECT ( vsprintf_test );
+REQUIRE_OBJECT ( list_test );
+REQUIRE_OBJECT ( byteswap_test );
+REQUIRE_OBJECT ( base64_test );
+REQUIRE_OBJECT ( base16_test );
+REQUIRE_OBJECT ( settings_test );
+REQUIRE_OBJECT ( time_test );
+REQUIRE_OBJECT ( tcpip_test );
+REQUIRE_OBJECT ( ipv6_test );
+REQUIRE_OBJECT ( crc32_test );
+REQUIRE_OBJECT ( md5_test );
+REQUIRE_OBJECT ( sha1_test );
+REQUIRE_OBJECT ( sha256_test );
+REQUIRE_OBJECT ( aes_cbc_test );
+REQUIRE_OBJECT ( hmac_drbg_test );
+REQUIRE_OBJECT ( hash_df_test );
+REQUIRE_OBJECT ( bigint_test );
+REQUIRE_OBJECT ( rsa_test );
+REQUIRE_OBJECT ( x509_test );
+REQUIRE_OBJECT ( ocsp_test );
+REQUIRE_OBJECT ( cms_test );
+REQUIRE_OBJECT ( pnm_test );
+REQUIRE_OBJECT ( deflate_test );
+REQUIRE_OBJECT ( png_test );
+REQUIRE_OBJECT ( dns_test );
+REQUIRE_OBJECT ( uri_test );
+REQUIRE_OBJECT ( profile_test );
diff --git a/roms/ipxe/src/tests/time_test.c b/roms/ipxe/src/tests/time_test.c
new file mode 100644
index 00000000..28acebee
--- /dev/null
+++ b/roms/ipxe/src/tests/time_test.c
@@ -0,0 +1,183 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * Date and time self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <time.h>
+#include <ipxe/test.h>
+
+/** A mktime() test */
+struct mktime_test {
+ /** Broken-down time */
+ struct tm tm;
+ /** Day of the week */
+ int wday;
+ /** Day of the year */
+ int yday;
+ /** Seconds since the Epoch */
+ time_t time;
+};
+
+/**
+ * Define a mktime() test
+ *
+ * @v name Test name
+ * @v SEC Seconds [0,60]
+ * @v MIN Minutes [0,59]
+ * @v HOUR Hour [0,23]
+ * @v MDAY Day of month [1,31]
+ * @v MON Month of year [0,11]
+ * @v YEAR Years since 1900
+ * @v WDAY Day of week [0,6] (Sunday=0)
+ * @v YDAY Day of year [0,365]
+ * @v ISDST Daylight savings flag (ignored)
+ * @v TIME Seconds since the Epoch
+ * @ret test mktime() test
+ *
+ * This macro is designed to make it easy to generate test vectors in
+ * Perl using
+ *
+ * print join ", ", gmtime ( $time ), $time."ULL";
+ *
+ */
+#define MKTIME_TEST( name, SEC, MIN, HOUR, MDAY, MON, YEAR, WDAY, \
+ YDAY, ISDST, TIME ) \
+ static struct mktime_test name = { \
+ .tm = { \
+ .tm_sec = SEC, \
+ .tm_min = MIN, \
+ .tm_hour = HOUR, \
+ .tm_mday = MDAY, \
+ .tm_mon = MON, \
+ .tm_year = YEAR, \
+ .tm_isdst = ISDST, \
+ }, \
+ .wday = WDAY, \
+ .yday = YDAY, \
+ .time = TIME, \
+ }
+
+/**
+ * Report mktime() test result
+ *
+ * @v test mktime() test
+ */
+#define mktime_ok( test ) do { \
+ time_t time = mktime ( &(test)->tm ); \
+ ok ( time == (test)->time ); \
+ ok ( (test)->tm.tm_wday == (test)->wday ); \
+ ok ( (test)->tm.tm_yday == (test)->yday ); \
+ } while ( 0 )
+
+/* Start of the Epoch */
+MKTIME_TEST ( mktime_epoch, 00, 00, 00, 01, 00, 70, 4, 0, 0, 0 );
+
+/* Birth of iPXE as a new project */
+MKTIME_TEST ( mktime_ipxe, 01, 15, 20, 19, 03, 110, 1, 108, 0, 1271708101ULL );
+
+/* Random test vectors generated using Perl's gmtime() */
+MKTIME_TEST ( mktime_0, 4, 17, 20, 1, 0, 150, 6, 0, 0, 2524681024ULL );
+MKTIME_TEST ( mktime_1, 22, 47, 21, 27, 11, 77, 2, 360, 0, 252107242ULL );
+MKTIME_TEST ( mktime_2, 26, 10, 0, 7, 2, 196, 3, 66, 0, 3981917426ULL );
+MKTIME_TEST ( mktime_3, 44, 44, 23, 15, 9, 261, 4, 287, 0, 6052319084ULL );
+MKTIME_TEST ( mktime_4, 3, 22, 18, 8, 9, 296, 6, 281, 0, 7156232523ULL );
+MKTIME_TEST ( mktime_5, 27, 26, 16, 18, 11, 338, 2, 351, 0, 8487649587ULL );
+MKTIME_TEST ( mktime_6, 31, 36, 22, 3, 3, 293, 3, 92, 0, 7045310191ULL );
+MKTIME_TEST ( mktime_7, 2, 0, 6, 25, 5, 289, 4, 175, 0, 6926191202ULL );
+MKTIME_TEST ( mktime_8, 43, 50, 1, 8, 0, 210, 3, 7, 0, 4418589043ULL );
+MKTIME_TEST ( mktime_9, 48, 14, 20, 23, 3, 86, 3, 112, 0, 514671288ULL );
+MKTIME_TEST ( mktime_10, 4, 43, 5, 29, 11, 173, 5, 362, 0, 3281751784ULL );
+MKTIME_TEST ( mktime_11, 47, 26, 21, 12, 7, 177, 4, 223, 0, 3396029207ULL );
+MKTIME_TEST ( mktime_12, 18, 55, 20, 26, 11, 88, 1, 360, 0, 599172918ULL );
+MKTIME_TEST ( mktime_13, 8, 32, 13, 15, 7, 314, 1, 226, 0, 7719456728ULL );
+MKTIME_TEST ( mktime_14, 0, 16, 11, 20, 6, 138, 2, 200, 0, 2163237360ULL );
+MKTIME_TEST ( mktime_15, 48, 0, 9, 31, 2, 202, 5, 89, 0, 4173238848ULL );
+MKTIME_TEST ( mktime_16, 51, 55, 0, 15, 1, 323, 6, 45, 0, 7987769751ULL );
+MKTIME_TEST ( mktime_17, 36, 10, 7, 11, 5, 301, 4, 161, 0, 7303590636ULL );
+MKTIME_TEST ( mktime_18, 22, 39, 11, 21, 9, 233, 3, 293, 0, 5169181162ULL );
+MKTIME_TEST ( mktime_19, 48, 29, 8, 31, 7, 207, 3, 242, 0, 4344222588ULL );
+MKTIME_TEST ( mktime_20, 4, 53, 22, 8, 8, 165, 2, 250, 0, 3019675984ULL );
+MKTIME_TEST ( mktime_21, 14, 16, 8, 10, 5, 298, 0, 160, 0, 7208900174ULL );
+MKTIME_TEST ( mktime_22, 10, 35, 3, 12, 3, 188, 1, 102, 0, 3732579310ULL );
+MKTIME_TEST ( mktime_23, 47, 12, 18, 22, 2, 103, 6, 80, 0, 1048356767ULL );
+MKTIME_TEST ( mktime_24, 23, 29, 17, 23, 10, 201, 3, 326, 0, 4162210163ULL );
+MKTIME_TEST ( mktime_25, 58, 35, 23, 24, 3, 111, 0, 113, 0, 1303688158ULL );
+MKTIME_TEST ( mktime_26, 34, 56, 15, 24, 11, 154, 4, 357, 0, 2681740594ULL );
+MKTIME_TEST ( mktime_27, 7, 11, 22, 28, 1, 243, 4, 58, 0, 5464447867ULL );
+MKTIME_TEST ( mktime_28, 25, 45, 23, 29, 11, 90, 6, 362, 0, 662514325ULL );
+MKTIME_TEST ( mktime_29, 31, 20, 12, 24, 1, 146, 6, 54, 0, 2403087631ULL );
+MKTIME_TEST ( mktime_30, 49, 7, 18, 16, 10, 271, 6, 319, 0, 6370596469ULL );
+MKTIME_TEST ( mktime_31, 31, 55, 2, 25, 5, 141, 2, 175, 0, 2255741731ULL );
+
+/**
+ * Perform date and time self-tests
+ *
+ */
+static void time_test_exec ( void ) {
+
+ mktime_ok ( &mktime_epoch );
+ mktime_ok ( &mktime_ipxe );
+ mktime_ok ( &mktime_0 );
+ mktime_ok ( &mktime_1 );
+ mktime_ok ( &mktime_2 );
+ mktime_ok ( &mktime_3 );
+ mktime_ok ( &mktime_4 );
+ mktime_ok ( &mktime_5 );
+ mktime_ok ( &mktime_6 );
+ mktime_ok ( &mktime_7 );
+ mktime_ok ( &mktime_8 );
+ mktime_ok ( &mktime_9 );
+ mktime_ok ( &mktime_10 );
+ mktime_ok ( &mktime_11 );
+ mktime_ok ( &mktime_12 );
+ mktime_ok ( &mktime_13 );
+ mktime_ok ( &mktime_14 );
+ mktime_ok ( &mktime_15 );
+ mktime_ok ( &mktime_16 );
+ mktime_ok ( &mktime_17 );
+ mktime_ok ( &mktime_18 );
+ mktime_ok ( &mktime_19 );
+ mktime_ok ( &mktime_20 );
+ mktime_ok ( &mktime_21 );
+ mktime_ok ( &mktime_22 );
+ mktime_ok ( &mktime_23 );
+ mktime_ok ( &mktime_24 );
+ mktime_ok ( &mktime_25 );
+ mktime_ok ( &mktime_26 );
+ mktime_ok ( &mktime_27 );
+ mktime_ok ( &mktime_28 );
+ mktime_ok ( &mktime_29 );
+ mktime_ok ( &mktime_30 );
+ mktime_ok ( &mktime_31 );
+}
+
+/** Date and time self-test */
+struct self_test time_test __self_test = {
+ .name = "time",
+ .exec = time_test_exec,
+};
diff --git a/roms/ipxe/src/tests/umalloc_test.c b/roms/ipxe/src/tests/umalloc_test.c
new file mode 100644
index 00000000..53810833
--- /dev/null
+++ b/roms/ipxe/src/tests/umalloc_test.c
@@ -0,0 +1,26 @@
+#include <stdio.h>
+#include <ipxe/uaccess.h>
+#include <ipxe/umalloc.h>
+#include <ipxe/io.h>
+
+void umalloc_test ( void ) {
+ struct memory_map memmap;
+ userptr_t bob;
+ userptr_t fred;
+
+ printf ( "Before allocation:\n" );
+ get_memmap ( &memmap );
+
+ bob = umalloc ( 1234 );
+ bob = urealloc ( bob, 12345 );
+ fred = umalloc ( 999 );
+
+ printf ( "After allocation:\n" );
+ get_memmap ( &memmap );
+
+ ufree ( bob );
+ ufree ( fred );
+
+ printf ( "After freeing:\n" );
+ get_memmap ( &memmap );
+}
diff --git a/roms/ipxe/src/tests/uri_test.c b/roms/ipxe/src/tests/uri_test.c
new file mode 100644
index 00000000..14f1b4ad
--- /dev/null
+++ b/roms/ipxe/src/tests/uri_test.c
@@ -0,0 +1,858 @@
+/*
+ * Copyright (C) 2014 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * URI self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <byteswap.h>
+#include <ipxe/uri.h>
+#include <ipxe/params.h>
+#include <ipxe/test.h>
+
+/** A URI parsing/formatting test */
+struct uri_test {
+ /** URI string */
+ const char *string;
+ /** URI */
+ struct uri uri;
+};
+
+/** A URI port number test */
+struct uri_port_test {
+ /** URI string */
+ const char *string;
+ /** Default port number */
+ unsigned int default_port;
+ /** Expected port number */
+ unsigned int port;
+};
+
+/** A URI or path resolution test */
+struct uri_resolve_test {
+ /** Base path or URI */
+ const char *base;
+ /** Relative path or URI */
+ const char *relative;
+ /** Expected resolved path or URI */
+ const char *resolved;
+};
+
+/** A TFTP URI test */
+struct uri_tftp_test {
+ /** Next-server address */
+ struct in_addr next_server;
+ /** Filename */
+ const char *filename;
+ /** URI */
+ struct uri uri;
+ /** URI string (for display only; cannot be reparsed) */
+ const char *string;
+};
+
+/** A current working URI test */
+struct uri_churi_test {
+ /** Relative URI */
+ const char *relative;
+ /** Expected new working URI */
+ const char *expected;
+};
+
+/** A form parameter URI test list */
+struct uri_params_test_list {
+ /** Key */
+ const char *key;
+ /** Value */
+ const char *value;
+};
+
+/** A form parameter URI test */
+struct uri_params_test {
+ /** URI string */
+ const char *string;
+ /** URI */
+ struct uri uri;
+ /** Parameter list name */
+ const char *name;
+ /** Parameter list */
+ struct uri_params_test_list *list;
+};
+
+/**
+ * Compare two URI component strings
+ *
+ * @v first First string, or NULL
+ * @v second Second string, or NULL
+ * @v difference Difference
+ */
+static int uristrcmp ( const char *first, const char *second ) {
+
+ /* Compare strings, allowing for either to be NULL */
+ if ( first == second ) {
+ return 0;
+ } else if ( ( first == NULL ) || ( second == NULL ) ) {
+ return -1;
+ } else {
+ return strcmp ( first, second );
+ }
+}
+
+/**
+ * Report URI equality test result
+ *
+ * @v uri URI
+ * @v expected Expected URI
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_okx ( struct uri *uri, struct uri *expected, const char *file,
+ unsigned int line ) {
+
+ okx ( uristrcmp ( uri->scheme, expected->scheme ) == 0, file, line );
+ okx ( uristrcmp ( uri->opaque, expected->opaque ) == 0, file, line );
+ okx ( uristrcmp ( uri->user, expected->user ) == 0, file, line );
+ okx ( uristrcmp ( uri->password, expected->password ) == 0, file, line);
+ okx ( uristrcmp ( uri->host, expected->host ) == 0, file, line );
+ okx ( uristrcmp ( uri->port, expected->port ) == 0, file, line );
+ okx ( uristrcmp ( uri->path, expected->path ) == 0, file, line );
+ okx ( uristrcmp ( uri->query, expected->query ) == 0, file, line );
+ okx ( uristrcmp ( uri->fragment, expected->fragment ) == 0, file, line);
+ okx ( uri->params == expected->params, file, line );
+}
+#define uri_ok( uri, expected ) uri_okx ( uri, expected, __FILE__, __LINE__ )
+
+/**
+ * Report URI parsing test result
+ *
+ * @v test URI test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_parse_okx ( struct uri_test *test, const char *file,
+ unsigned int line ) {
+ struct uri *uri;
+
+ /* Parse URI */
+ uri = parse_uri ( test->string );
+ okx ( uri != NULL, file, line );
+ if ( uri )
+ uri_okx ( uri, &test->uri, file, line );
+ uri_put ( uri );
+}
+#define uri_parse_ok( test ) uri_parse_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report URI formatting test result
+ *
+ * @v test URI test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_format_okx ( struct uri_test *test, const char *file,
+ unsigned int line ) {
+ char buf[ strlen ( test->string ) + 1 /* NUL */ ];
+ char *tmp;
+ size_t len;
+
+ /* Format into fixed-size buffer */
+ len = format_uri ( &test->uri, buf, sizeof ( buf ) );
+ okx ( len == ( sizeof ( buf ) - 1 /* NUL */ ), file, line );
+ okx ( strcmp ( buf, test->string ) == 0, file, line );
+
+ /* Format into temporarily allocated buffer */
+ tmp = format_uri_alloc ( &test->uri );
+ okx ( tmp != NULL, file, line );
+ if ( tmp )
+ okx ( strcmp ( tmp, test->string ) == 0, file, line );
+ free ( tmp );
+}
+#define uri_format_ok( test ) uri_format_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report URI duplication test result
+ *
+ * @v test URI
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_dup_okx ( struct uri *uri, const char *file,
+ unsigned int line ) {
+ struct uri *dup;
+
+ dup = uri_dup ( uri );
+ okx ( dup != NULL, file, line );
+ if ( dup )
+ uri_okx ( dup, uri, file, line );
+ uri_put ( dup );
+}
+#define uri_dup_ok( test ) uri_dup_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report URI combined parsing and formatting test result
+ *
+ * @v test URI test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_parse_format_dup_okx ( struct uri_test *test, const char *file,
+ unsigned int line ) {
+
+ uri_parse_okx ( test, file, line );
+ uri_format_okx ( test, file, line );
+ uri_dup_okx ( &test->uri, file, line );
+}
+#define uri_parse_format_dup_ok( test ) \
+ uri_parse_format_dup_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report URI port number test result
+ *
+ * @v test URI port number test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_port_okx ( struct uri_port_test *test, const char *file,
+ unsigned int line ) {
+ struct uri *uri;
+ unsigned int port;
+
+ /* Parse URI */
+ uri = parse_uri ( test->string );
+ okx ( uri != NULL, file, line );
+ if ( uri ) {
+ port = uri_port ( uri, test->default_port );
+ okx ( port == test->port, file, line );
+ }
+ uri_put ( uri );
+}
+#define uri_port_ok( test ) uri_port_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report URI resolution test result
+ *
+ * @v test Path resolution test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_resolve_okx ( struct uri_resolve_test *test,
+ const char *file, unsigned int line ) {
+ struct uri *base;
+ struct uri *relative;
+ struct uri *resolved = NULL;
+ char *formatted;
+
+ /* Parse URIs */
+ base = parse_uri ( test->base );
+ okx ( base != NULL, file, line );
+ relative = parse_uri ( test->relative );
+ okx ( relative != NULL, file, line );
+
+ /* Resolve URI */
+ if ( base && relative ) {
+ resolved = resolve_uri ( base, relative );
+ okx ( resolved != NULL, file, line );
+ }
+
+ /* Format resolved URI */
+ formatted = format_uri_alloc ( resolved );
+ okx ( formatted != NULL, file, line );
+
+ /* Check resolved URI */
+ if ( formatted )
+ okx ( strcmp ( formatted, test->resolved ) == 0, file, line );
+
+ free ( formatted );
+ uri_put ( resolved );
+ uri_put ( relative );
+ uri_put ( base );
+}
+#define uri_resolve_ok( test ) uri_resolve_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report path resolution test result
+ *
+ * @v test Path resolution test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_resolve_path_okx ( struct uri_resolve_test *test,
+ const char *file, unsigned int line ) {
+ char *resolved;
+
+ /* Resolve paths using resolve_path() directly */
+ resolved = resolve_path ( test->base, test->relative );
+ okx ( resolved != NULL, file, line );
+ if ( resolved )
+ okx ( strcmp ( resolved, test->resolved ) == 0, file, line );
+ free ( resolved );
+
+ /* Resolve paths as URIs (since all paths are valid URIs) */
+ uri_resolve_okx ( test, file, line );
+}
+#define uri_resolve_path_ok( test ) \
+ uri_resolve_path_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report URI TFTP test result
+ *
+ * @v test URI TFTP test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_tftp_okx ( struct uri_tftp_test *test, const char *file,
+ unsigned int line ) {
+ char buf[ strlen ( test->string ) + 1 /* NUL */ ];
+ struct uri *uri;
+ size_t len;
+
+ /* Construct URI */
+ uri = tftp_uri ( test->next_server, test->filename );
+ okx ( uri != NULL, file, line );
+ if ( uri ) {
+ uri_okx ( uri, &test->uri, file, line );
+ len = format_uri ( uri, buf, sizeof ( buf ) );
+ okx ( len == ( sizeof ( buf ) - 1 /* NUL */ ), file, line );
+ okx ( strcmp ( buf, test->string ) == 0, file, line );
+ }
+ uri_put ( uri );
+}
+#define uri_tftp_ok( test ) uri_tftp_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report current working URI test result
+ *
+ * @v tests List of current working URI tests
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_churi_okx ( struct uri_churi_test *test, const char *file,
+ unsigned int line ) {
+ struct uri *old_cwuri;
+ struct uri *uri;
+ char *formatted;
+
+ /* Preserve original current working URI */
+ old_cwuri = uri_get ( cwuri );
+
+ /* Perform sequence of current working URI changes */
+ do {
+ /* Parse relative URI */
+ uri = parse_uri ( test->relative );
+ okx ( uri != NULL, file, line );
+
+ /* Move to this URI */
+ churi ( uri );
+
+ /* Format new current working URI */
+ formatted = format_uri_alloc ( cwuri );
+ okx ( formatted != NULL, file, line );
+ if ( formatted ) {
+ okx ( strcmp ( formatted, test->expected ) == 0,
+ file, line );
+ }
+
+ /* Free temporary storage */
+ free ( formatted );
+ uri_put ( uri );
+
+ /* Move to next current working URI test */
+ test++;
+
+ } while ( test->relative != NULL );
+
+ /* Restore original current working URI */
+ churi ( old_cwuri );
+ uri_put ( old_cwuri );
+}
+#define uri_churi_ok( test ) uri_churi_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report form parameter URI test list result
+ *
+ * @v test Form parameter URI test
+ * @v uri URI
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_params_list_okx ( struct uri_params_test *test,
+ struct uri *uri, const char *file,
+ unsigned int line ) {
+ struct uri_params_test_list *list;
+ struct parameter *param;
+
+ /* Check URI */
+ uri_okx ( uri, &test->uri, file, line );
+
+ /* Check URI parameters */
+ okx ( uri->params != NULL, file, line );
+ if ( uri->params ) {
+ list = test->list;
+ for_each_param ( param, uri->params ) {
+ okx ( strcmp ( param->key, list->key ) == 0,
+ file, line );
+ okx ( strcmp ( param->value, list->value ) == 0,
+ file, line );
+ list++;
+ }
+ okx ( list->key == NULL, file, line );
+ }
+}
+#define uri_params_list_ok( test ) \
+ uri_params_list_okx ( test, __FILE__, __LINE__ )
+
+/**
+ * Report form parameter URI test result
+ *
+ * @v test Form parameter URI test
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void uri_params_okx ( struct uri_params_test *test, const char *file,
+ unsigned int line ) {
+ struct uri_params_test_list *list;
+ struct parameters *params;
+ struct parameter *param;
+ struct uri *uri;
+ struct uri *dup;
+
+ /* Create parameter list */
+ params = create_parameters ( test->name );
+ okx ( params != NULL, file, line );
+ if ( params ) {
+ for ( list = test->list ; list->key ; list++ ) {
+ param = add_parameter ( params, list->key, list->value);
+ okx ( param != NULL, file, line );
+ }
+ }
+
+ /* Record parameter list as part of expected URI */
+ test->uri.params = params;
+
+ /* Parse URI */
+ uri = parse_uri ( test->string );
+ okx ( uri != NULL, file, line );
+ if ( uri )
+ uri_params_list_okx ( test, uri, file, line );
+
+ /* Duplicate URI */
+ dup = uri_dup ( uri );
+ okx ( dup != NULL, file, line );
+ if ( dup )
+ uri_params_list_okx ( test, dup, file, line );
+
+ /* Clear parameter list in expected URI */
+ test->uri.params = NULL;
+
+ uri_put ( uri );
+ uri_put ( dup );
+}
+#define uri_params_ok( test ) uri_params_okx ( test, __FILE__, __LINE__ )
+
+/** Empty URI */
+static struct uri_test uri_empty = {
+ .string = "",
+};
+
+/** Basic HTTP URI */
+static struct uri_test uri_boot_ipxe_org = {
+ "http://boot.ipxe.org/demo/boot.php",
+ { .scheme = "http", .host = "boot.ipxe.org", .path = "/demo/boot.php" }
+};
+
+/** Basic opaque URI */
+static struct uri_test uri_mailto = {
+ "mailto:ipxe-devel@lists.ipxe.org",
+ { .scheme = "mailto", .opaque = "ipxe-devel@lists.ipxe.org" }
+};
+
+/** HTTP URI with all the trimmings */
+static struct uri_test uri_http_all = {
+ "http://anon:password@example.com:3001/~foo/cgi-bin/foo.pl?a=b&c=d#bit",
+ {
+ .scheme = "http",
+ .user = "anon",
+ .password = "password",
+ .host = "example.com",
+ .port = "3001",
+ .path = "/~foo/cgi-bin/foo.pl",
+ .query = "a=b&c=d",
+ .fragment = "bit",
+ },
+};
+
+/** HTTP URI with escaped characters */
+static struct uri_test uri_http_escaped = {
+ "https://test.ipxe.org/wtf%3F%0A?kind%23of/uri%20is#this%3F",
+ {
+ .scheme = "https",
+ .host = "test.ipxe.org",
+ .path = "/wtf?\n",
+ .query = "kind#of/uri is",
+ .fragment = "this?",
+ },
+};
+
+/** HTTP URI with improperly escaped characters */
+static struct uri_test uri_http_escaped_improper = {
+ /* We accept for parsing improperly escaped characters.
+ * (Formatting the parsed URI would produce the properly
+ * encoded form, and so would not exactly match the original
+ * URI string.)
+ */
+ "https://test%2eipxe.org/wt%66%3f\n?kind%23of/uri is#this?",
+ {
+ .scheme = "https",
+ .host = "test.ipxe.org",
+ .path = "/wtf?\n",
+ .query = "kind#of/uri is",
+ .fragment = "this?",
+ },
+};
+
+/** IPv6 URI */
+static struct uri_test uri_ipv6 = {
+ "http://[2001:ba8:0:1d4::6950:5845]/",
+ {
+ .scheme = "http",
+ .host = "[2001:ba8:0:1d4::6950:5845]",
+ .path = "/",
+ },
+};
+
+/** IPv6 URI with port */
+static struct uri_test uri_ipv6_port = {
+ "http://[2001:ba8:0:1d4::6950:5845]:8001/boot",
+ {
+ .scheme = "http",
+ .host = "[2001:ba8:0:1d4::6950:5845]",
+ .port = "8001",
+ .path = "/boot",
+ },
+};
+
+/** IPv6 URI with link-local address */
+static struct uri_test uri_ipv6_local = {
+ "http://[fe80::69ff:fe50:5845%25net0]/ipxe",
+ {
+ .scheme = "http",
+ .host = "[fe80::69ff:fe50:5845%net0]",
+ .path = "/ipxe",
+ },
+};
+
+/** IPv6 URI with link-local address not conforming to RFC 6874 */
+static struct uri_test uri_ipv6_local_non_conforming = {
+ /* We accept for parsing a single "%" in "%net0" (rather than
+ * the properly encoded form "%25net0"). (Formatting the
+ * parsed URI would produce the properly encoded form, and so
+ * would not exactly match the original URI string.)
+ */
+ "http://[fe80::69ff:fe50:5845%net0]/ipxe",
+ {
+ .scheme = "http",
+ .host = "[fe80::69ff:fe50:5845%net0]",
+ .path = "/ipxe",
+ },
+};
+
+/** iSCSI URI */
+static struct uri_test uri_iscsi = {
+ "iscsi:10.253.253.1::::iqn.2010-04.org.ipxe:rabbit",
+ {
+ .scheme = "iscsi",
+ .opaque = "10.253.253.1::::iqn.2010-04.org.ipxe:rabbit",
+ },
+};
+
+/** URI with port number */
+static struct uri_port_test uri_explicit_port = {
+ "http://192.168.0.1:8080/boot.php",
+ 80,
+ 8080,
+};
+
+/** URI without port number */
+static struct uri_port_test uri_default_port = {
+ "http://192.168.0.1/boot.php",
+ 80,
+ 80,
+};
+
+/** Simple path resolution test */
+static struct uri_resolve_test uri_simple_path = {
+ "/etc/passwd",
+ "group",
+ "/etc/group",
+};
+
+/** Path resolution test with "." and ".." elements */
+static struct uri_resolve_test uri_relative_path = {
+ "/var/lib/tftpboot/pxe/pxelinux.0",
+ "./../ipxe/undionly.kpxe",
+ "/var/lib/tftpboot/ipxe/undionly.kpxe",
+};
+
+/** Path resolution test terminating with directory */
+static struct uri_resolve_test uri_directory_path = {
+ "/test/cgi-bin.pl/boot.ipxe",
+ "..",
+ "/test/",
+};
+
+/** Path resolution test with excessive ".." elements */
+static struct uri_resolve_test uri_excessive_path = {
+ "/var/lib/tftpboot/ipxe.pxe",
+ "../../../../../../../foo",
+ "/foo",
+};
+
+/** Path resolution test with absolute path */
+static struct uri_resolve_test uri_absolute_path = {
+ "/var/lib/tftpboot",
+ "/etc/hostname",
+ "/etc/hostname",
+};
+
+/** Relative URI resolution test */
+static struct uri_resolve_test uri_relative = {
+ "http://boot.ipxe.org/demo/boot.php?vendor=10ec&device=8139",
+ "initrd.img",
+ "http://boot.ipxe.org/demo/initrd.img",
+};
+
+/** Absolute URI resolution test */
+static struct uri_resolve_test uri_absolute = {
+ "http://boot.ipxe.org/demo/boot.php",
+ "ftp://192.168.0.1/boot.ipxe",
+ "ftp://192.168.0.1/boot.ipxe",
+};
+
+/** Absolute path URI resolution test */
+static struct uri_resolve_test uri_absolute_uri_path = {
+ "http://boot.ipxe.org/demo/boot.php#test",
+ "/demo/vmlinuz",
+ "http://boot.ipxe.org/demo/vmlinuz",
+};
+
+/** Query URI resolution test */
+static struct uri_resolve_test uri_query = {
+ "http://10.253.253.1/test.pl?mac=02-00-69-50-58-45",
+ "?mac=00-1f-16-bc-fe-2f",
+ "http://10.253.253.1/test.pl?mac=00-1f-16-bc-fe-2f",
+};
+
+/** Fragment URI resolution test */
+static struct uri_resolve_test uri_fragment = {
+ "http://192.168.0.254/test#foo",
+ "#bar",
+ "http://192.168.0.254/test#bar",
+};
+
+/** TFTP URI with absolute path */
+static struct uri_tftp_test uri_tftp_absolute = {
+ { .s_addr = htonl ( 0xc0a80002 ) /* 192.168.0.2 */ },
+ "/absolute/path",
+ {
+ .scheme = "tftp",
+ .host = "192.168.0.2",
+ .path = "/absolute/path",
+ },
+ "tftp://192.168.0.2/absolute/path",
+};
+
+/** TFTP URI with relative path */
+static struct uri_tftp_test uri_tftp_relative = {
+ { .s_addr = htonl ( 0xc0a80003 ) /* 192.168.0.3 */ },
+ "relative/path",
+ {
+ .scheme = "tftp",
+ .host = "192.168.0.3",
+ .path = "relative/path",
+ },
+ "tftp://192.168.0.3/relative/path",
+};
+
+/** TFTP URI with path containing special characters */
+static struct uri_tftp_test uri_tftp_icky = {
+ { .s_addr = htonl ( 0x0a000006 ) /* 10.0.0.6 */ },
+ "C:\\tftpboot\\icky#path",
+ {
+ .scheme = "tftp",
+ .host = "10.0.0.6",
+ .path = "C:\\tftpboot\\icky#path",
+ },
+ "tftp://10.0.0.6/C%3A\\tftpboot\\icky%23path",
+};
+
+/** Current working URI test */
+static struct uri_churi_test uri_churi[] = {
+ {
+ "http://boot.ipxe.org/demo/boot.php",
+ "http://boot.ipxe.org/demo/boot.php",
+ },
+ {
+ "?vendor=10ec&device=8139",
+ "http://boot.ipxe.org/demo/boot.php?vendor=10ec&device=8139",
+ },
+ {
+ "fedora/fedora.ipxe",
+ "http://boot.ipxe.org/demo/fedora/fedora.ipxe",
+ },
+ {
+ "vmlinuz",
+ "http://boot.ipxe.org/demo/fedora/vmlinuz",
+ },
+ {
+ "http://local/boot/initrd.img",
+ "http://local/boot/initrd.img",
+ },
+ {
+ "modules/8139too.ko",
+ "http://local/boot/modules/8139too.ko",
+ },
+ {
+ NULL,
+ NULL,
+ }
+};
+
+/** Form parameter URI test list */
+static struct uri_params_test_list uri_params_list[] = {
+ {
+ "vendor",
+ "10ec",
+ },
+ {
+ "device",
+ "8139",
+ },
+ {
+ "uuid",
+ "f59fac00-758f-498f-9fe5-87d790045d94",
+ },
+ {
+ NULL,
+ NULL,
+ }
+};
+
+/** Form parameter URI test */
+static struct uri_params_test uri_params = {
+ "http://boot.ipxe.org/demo/boot.php##params",
+ {
+ .scheme = "http",
+ .host = "boot.ipxe.org",
+ .path = "/demo/boot.php",
+ },
+ NULL,
+ uri_params_list,
+};
+
+/** Named form parameter URI test list */
+static struct uri_params_test_list uri_named_params_list[] = {
+ {
+ "mac",
+ "00:1e:65:80:d3:b6",
+ },
+ {
+ "serial",
+ "LXTQ20Z1139322762F2000",
+ },
+ {
+ NULL,
+ NULL,
+ }
+};
+
+/** Named form parameter URI test */
+static struct uri_params_test uri_named_params = {
+ "http://192.168.100.4:3001/register##params=foo",
+ {
+ .scheme = "http",
+ .host = "192.168.100.4",
+ .port = "3001",
+ .path = "/register",
+ },
+ "foo",
+ uri_named_params_list,
+};
+
+/**
+ * Perform URI self-test
+ *
+ */
+static void uri_test_exec ( void ) {
+
+ /* URI parsing, formatting, and duplication tests */
+ uri_parse_format_dup_ok ( &uri_empty );
+ uri_parse_format_dup_ok ( &uri_boot_ipxe_org );
+ uri_parse_format_dup_ok ( &uri_mailto );
+ uri_parse_format_dup_ok ( &uri_http_all );
+ uri_parse_format_dup_ok ( &uri_http_escaped );
+ uri_parse_ok ( &uri_http_escaped_improper ); /* Parse only */
+ uri_parse_format_dup_ok ( &uri_ipv6 );
+ uri_parse_format_dup_ok ( &uri_ipv6_port );
+ uri_parse_format_dup_ok ( &uri_ipv6_local );
+ uri_parse_ok ( &uri_ipv6_local_non_conforming ); /* Parse only */
+ uri_parse_format_dup_ok ( &uri_iscsi );
+
+ /** URI port number tests */
+ uri_port_ok ( &uri_explicit_port );
+ uri_port_ok ( &uri_default_port );
+
+ /** Path resolution tests */
+ uri_resolve_path_ok ( &uri_simple_path );
+ uri_resolve_path_ok ( &uri_relative_path );
+ uri_resolve_path_ok ( &uri_directory_path );
+ uri_resolve_path_ok ( &uri_excessive_path );
+ uri_resolve_path_ok ( &uri_absolute_path );
+
+ /** URI resolution tests */
+ uri_resolve_ok ( &uri_relative );
+ uri_resolve_ok ( &uri_absolute );
+ uri_resolve_ok ( &uri_absolute_uri_path );
+ uri_resolve_ok ( &uri_query );
+ uri_resolve_ok ( &uri_fragment );
+
+ /* TFTP URI construction tests */
+ uri_tftp_ok ( &uri_tftp_absolute );
+ uri_tftp_ok ( &uri_tftp_relative );
+ uri_tftp_ok ( &uri_tftp_icky );
+
+ /* Current working URI tests */
+ uri_churi_ok ( uri_churi );
+
+ /* Form parameter URI tests */
+ uri_params_ok ( &uri_params );
+ uri_params_ok ( &uri_named_params );
+}
+
+/** URI self-test */
+struct self_test uri_test __self_test = {
+ .name = "uri",
+ .exec = uri_test_exec,
+};
diff --git a/roms/ipxe/src/tests/vsprintf_test.c b/roms/ipxe/src/tests/vsprintf_test.c
new file mode 100644
index 00000000..11512ec8
--- /dev/null
+++ b/roms/ipxe/src/tests/vsprintf_test.c
@@ -0,0 +1,102 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * vsprintf() self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <string.h>
+#include <stdio.h>
+#include <ipxe/test.h>
+
+/**
+ * Report an snprintf() test result
+ *
+ */
+#define snprintf_ok( len, result, format, ... ) do { \
+ char actual[ (len) ]; \
+ const char expected[] = result; \
+ size_t actual_len; \
+ \
+ actual_len = snprintf ( actual, sizeof ( actual ), \
+ format, ##__VA_ARGS__ ); \
+ ok ( actual_len >= strlen ( result ) ); \
+ ok ( strcmp ( actual, expected ) == 0 ); \
+ if ( strcmp ( actual, expected ) != 0 ) { \
+ DBG ( "SNPRINTF expected \"%s\", got \"%s\"\n", \
+ expected, actual ); \
+ } \
+ } while ( 0 )
+
+/**
+ * Perform vsprintf() self-tests
+ *
+ */
+static void vsprintf_test_exec ( void ) {
+
+ /* Constant string */
+ snprintf_ok ( 16, "Testing", "Testing" );
+
+ /* Constant string, truncated to fit */
+ snprintf_ok ( 5, "Test", "Testing" );
+
+ /* Basic format specifiers */
+ snprintf_ok ( 16, "%", "%%" );
+ snprintf_ok ( 16, "ABC", "%c%c%c", 'A', 'B', 'C' );
+ snprintf_ok ( 16, "abc", "%lc%lc%lc", L'a', L'b', L'c' );
+ snprintf_ok ( 16, "Hello world", "%s %s", "Hello", "world" );
+ snprintf_ok ( 16, "Goodbye world", "%ls %s", L"Goodbye", "world" );
+ snprintf_ok ( 16, "0x1234abcd", "%p", ( ( void * ) 0x1234abcd ) );
+ snprintf_ok ( 16, "0xa723", "%#x", 0xa723 );
+ snprintf_ok ( 16, "a723", "%x", 0xa723 );
+ snprintf_ok ( 16, "0x0000a723", "%#08x", 0xa723 );
+ snprintf_ok ( 16, "00A723", "%06X", 0xa723 );
+ snprintf_ok ( 16, "9876abcd", "%lx", 0x9876abcdUL );
+ snprintf_ok ( 16, "1234 5678", "%04llx %04llx", 0x1234ULL, 0x5678ULL );
+ snprintf_ok ( 16, "123", "%d", 123 );
+ snprintf_ok ( 16, "456", "%i", 456 );
+ snprintf_ok ( 16, " 99", "%3d", 99 );
+ snprintf_ok ( 16, "099", "%03d", 99 );
+ snprintf_ok ( 16, "-72", "%d", -72 );
+ snprintf_ok ( 16, " -72", "%4d", -72 );
+ snprintf_ok ( 16, "-072", "%04d", -72 );
+ snprintf_ok ( 16, "4", "%zd", sizeof ( uint32_t ) );
+ snprintf_ok ( 16, "123456789", "%d", 123456789 );
+
+ /* Realistic combinations */
+ snprintf_ok ( 64, "DBG 0x1234 thingy at 0x0003f0c0+0x5c\n",
+ "DBG %p %s at %#08lx+%#zx\n", ( ( void * ) 0x1234 ),
+ "thingy", 0x3f0c0UL, ( ( size_t ) 0x5c ) );
+ snprintf_ok ( 64, "PCI 00:1f.3", "PCI %02x:%02x.%x", 0x00, 0x1f, 0x03 );
+ snprintf_ok ( 64, "Region [1000000,3f000000)", "Region [%llx,%llx)",
+ 0x1000000ULL, 0x3f000000ULL );
+}
+
+/** vsprintf() self-test */
+struct self_test vsprintf_test __self_test = {
+ .name = "vsprintf",
+ .exec = vsprintf_test_exec,
+};
diff --git a/roms/ipxe/src/tests/x509_test.c b/roms/ipxe/src/tests/x509_test.c
new file mode 100644
index 00000000..fd39e12d
--- /dev/null
+++ b/roms/ipxe/src/tests/x509_test.c
@@ -0,0 +1,1112 @@
+/*
+ * Copyright (C) 2012 Michael Brown <mbrown@fensystems.co.uk>.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+FILE_LICENCE ( GPL2_OR_LATER );
+
+/** @file
+ *
+ * X.509 self-tests
+ *
+ */
+
+/* Forcibly enable assertions */
+#undef NDEBUG
+
+#include <stdint.h>
+#include <string.h>
+#include <errno.h>
+#include <ipxe/x509.h>
+#include <ipxe/asn1.h>
+#include <ipxe/sha256.h>
+#include <ipxe/test.h>
+
+/** Fingerprint algorithm used for X.509 test certificates */
+#define x509_test_algorithm sha256_algorithm
+
+/** An X.509 test certificate */
+struct x509_test_certificate {
+ /** Data */
+ const void *data;
+ /** Length of data */
+ size_t len;
+ /** Fingerprint */
+ const void *fingerprint;
+
+ /** Parsed certificate */
+ struct x509_certificate *cert;
+};
+
+/** An X.509 test certificate chain */
+struct x509_test_chain {
+ /** Test certificates */
+ struct x509_test_certificate **certs;
+ /** Number of certificates */
+ unsigned int count;
+
+ /** Parsed certificate chain */
+ struct x509_chain *chain;
+};
+
+/** Define inline certificate data */
+#define DATA(...) { __VA_ARGS__ }
+
+/** Define inline fingerprint data */
+#define FINGERPRINT(...) { __VA_ARGS__ }
+
+/** Define a test certificate */
+#define CERTIFICATE( name, DATA, FINGERPRINT ) \
+ static const uint8_t name ## _data[] = DATA; \
+ static const uint8_t name ## _fingerprint[] = FINGERPRINT; \
+ static struct x509_test_certificate name = { \
+ .data = name ## _data, \
+ .len = sizeof ( name ## _data ), \
+ .fingerprint = name ## _fingerprint, \
+ }
+
+/** Define a test certificate chain */
+#define CHAIN( name, ... ) \
+ static struct x509_test_certificate * name ## _certs[] = \
+ { __VA_ARGS__ }; \
+ static struct x509_test_chain name = { \
+ .certs = name ## _certs, \
+ .count = ( sizeof ( name ## _certs ) / \
+ sizeof ( name ## _certs[0] ) ), \
+ }
+
+/*
+ * subject iPXE self-test root CA
+ * issuer iPXE self-test root CA
+ */
+CERTIFICATE ( root_crt,
+ DATA ( 0x30, 0x82, 0x02, 0xb3, 0x30, 0x82, 0x02, 0x1c, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x09, 0x00, 0xc6, 0xb8, 0x9c, 0x58,
+ 0xd2, 0xdc, 0xc9, 0x5d, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30,
+ 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04,
+ 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06,
+ 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62,
+ 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65,
+ 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c,
+ 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65,
+ 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c,
+ 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65,
+ 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f,
+ 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78,
+ 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d, 0x06,
+ 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58, 0x45,
+ 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74,
+ 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30, 0x1e,
+ 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30,
+ 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x33, 0x39, 0x30,
+ 0x38, 0x30, 0x38, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a,
+ 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15,
+ 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72,
+ 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07,
+ 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30,
+ 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70,
+ 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58,
+ 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73,
+ 0x74, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41, 0x30,
+ 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d,
+ 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xaa, 0x72,
+ 0xb5, 0xc1, 0x73, 0xf4, 0x95, 0x76, 0xa4, 0x27, 0xab, 0x5e,
+ 0xeb, 0x1d, 0x9d, 0xd0, 0x04, 0xb2, 0x93, 0x05, 0xc7, 0xfa,
+ 0x75, 0x84, 0x66, 0xe6, 0x3a, 0x26, 0x1f, 0xbc, 0x2d, 0xfd,
+ 0x8f, 0x59, 0x64, 0xac, 0xcf, 0x65, 0x9d, 0x82, 0x23, 0xc3,
+ 0x72, 0x93, 0xf2, 0x40, 0x68, 0x32, 0xd1, 0xb8, 0xf1, 0x47,
+ 0x61, 0x50, 0xea, 0xbc, 0xcc, 0x3c, 0x6b, 0x74, 0x7a, 0xec,
+ 0x2b, 0x75, 0xa6, 0xc2, 0xa2, 0xb8, 0xbf, 0x23, 0x48, 0x97,
+ 0xd5, 0xaf, 0x77, 0xc1, 0x92, 0x88, 0xd7, 0x38, 0xb7, 0x9e,
+ 0xda, 0xee, 0x72, 0x04, 0xcb, 0x96, 0xe5, 0xdb, 0xfd, 0x9b,
+ 0x5d, 0x99, 0x4e, 0x7a, 0x60, 0x23, 0x34, 0xa4, 0x8d, 0xd7,
+ 0x6c, 0xe7, 0x5d, 0x93, 0x97, 0xe1, 0xab, 0x36, 0x2c, 0x24,
+ 0x16, 0x92, 0x66, 0xf6, 0x6a, 0x14, 0x23, 0x1d, 0x18, 0xb9,
+ 0x44, 0x24, 0x61, 0x6b, 0xd3, 0x75, 0x02, 0x03, 0x01, 0x00,
+ 0x01, 0xa3, 0x23, 0x30, 0x21, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,
+ 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,
+ 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x94, 0x9e, 0xea,
+ 0x17, 0x8d, 0x27, 0xa9, 0x17, 0xe5, 0xa9, 0x19, 0xbe, 0x82,
+ 0x36, 0xbd, 0xac, 0x74, 0xf3, 0x6e, 0x75, 0x71, 0x30, 0x1c,
+ 0x05, 0x80, 0x6d, 0x1a, 0x69, 0x37, 0x86, 0x9c, 0x77, 0x75,
+ 0x29, 0xa1, 0xc6, 0xb7, 0x11, 0x0a, 0x63, 0x27, 0xee, 0xb1,
+ 0xc8, 0x94, 0xa9, 0x2e, 0x56, 0x8f, 0xca, 0x9d, 0xbe, 0xf4,
+ 0xdb, 0x63, 0x97, 0x68, 0x3b, 0x13, 0xf8, 0x6a, 0xa5, 0xd1,
+ 0x3d, 0xed, 0xbb, 0x86, 0x9d, 0x42, 0xfc, 0x15, 0x0a, 0x04,
+ 0xf8, 0x3c, 0x0e, 0xc4, 0x86, 0x05, 0x57, 0x56, 0x96, 0xf6,
+ 0xc0, 0x18, 0x53, 0xb0, 0xc5, 0xf0, 0xca, 0x72, 0x77, 0x77,
+ 0xc9, 0x8e, 0x90, 0xa5, 0x4b, 0xb6, 0x80, 0x4a, 0x4c, 0x34,
+ 0x6f, 0xc9, 0xe8, 0x6f, 0xc2, 0x28, 0xdf, 0x93, 0xa9, 0xf5,
+ 0x63, 0x18, 0xc0, 0xec, 0x9e, 0xd5, 0x19, 0x36, 0xc5, 0x94,
+ 0x10, 0xd4, 0x72, 0xd2, 0xb8 ),
+ FINGERPRINT ( 0x71, 0x5d, 0x51, 0x37, 0x5e, 0x18, 0xb3, 0xbc,
+ 0xbb, 0x30, 0x0e, 0x8f, 0x50, 0xc7, 0x55, 0xf5,
+ 0x96, 0xe7, 0xa8, 0x6d, 0x63, 0x2d, 0x32, 0x38,
+ 0xaf, 0x00, 0xc4, 0x1a, 0xfc, 0xd8, 0xac, 0xc3 ) );
+
+/*
+ * subject iPXE self-test intermediate CA
+ * issuer iPXE self-test root CA
+ */
+CERTIFICATE ( intermediate_crt,
+ DATA ( 0x30, 0x82, 0x02, 0xb3, 0x30, 0x82, 0x02, 0x1c, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
+ 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
+ 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30,
+ 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69,
+ 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73,
+ 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69,
+ 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50,
+ 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65,
+ 0x73, 0x74, 0x20, 0x72, 0x6f, 0x6f, 0x74, 0x20, 0x43, 0x41,
+ 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32,
+ 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x31,
+ 0x34, 0x31, 0x32, 0x31, 0x37, 0x30, 0x30, 0x30, 0x31, 0x33,
+ 0x33, 0x5a, 0x30, 0x81, 0x90, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17,
+ 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68,
+ 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
+ 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55,
+ 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31,
+ 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08,
+ 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x27,
+ 0x30, 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x69,
+ 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74,
+ 0x65, 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d,
+ 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x43, 0x41, 0x30,
+ 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d,
+ 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xc9, 0x3a,
+ 0xee, 0xc6, 0x3c, 0xac, 0x4d, 0x81, 0xc6, 0x98, 0x5e, 0xe1,
+ 0x48, 0x66, 0x1a, 0x1e, 0x60, 0x19, 0x41, 0xae, 0xca, 0x14,
+ 0x97, 0xc8, 0x3a, 0x50, 0xb6, 0x48, 0xf5, 0x42, 0xac, 0x0f,
+ 0xe1, 0xe3, 0x47, 0xf0, 0xbf, 0x7c, 0xd0, 0xee, 0x8f, 0xb7,
+ 0xa6, 0x19, 0xad, 0xbb, 0xc5, 0x1b, 0x34, 0x38, 0xc8, 0xbd,
+ 0x55, 0x84, 0x93, 0x72, 0xaf, 0x84, 0xfc, 0x9b, 0x97, 0x1d,
+ 0xb5, 0x54, 0x24, 0xd6, 0x5d, 0xb7, 0x31, 0xf4, 0xbd, 0x3b,
+ 0x40, 0x97, 0xc0, 0xa9, 0x5a, 0x2a, 0xcb, 0x6b, 0x98, 0x07,
+ 0xdb, 0xb5, 0x9f, 0xe8, 0x31, 0x3f, 0x01, 0x46, 0x46, 0x70,
+ 0x05, 0xa2, 0x0f, 0x8c, 0x7a, 0x61, 0xf3, 0xdf, 0xdb, 0xa1,
+ 0x37, 0x2c, 0x88, 0x6a, 0x81, 0x21, 0x12, 0x4c, 0xf5, 0xcd,
+ 0xaf, 0xc9, 0xd2, 0x36, 0x3d, 0x82, 0xd1, 0xca, 0x19, 0xaf,
+ 0x4e, 0xae, 0x50, 0x71, 0x44, 0xbf, 0x02, 0x03, 0x01, 0x00,
+ 0x01, 0xa3, 0x23, 0x30, 0x21, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01,
+ 0x01, 0xff, 0x30, 0x0e, 0x06, 0x03, 0x55, 0x1d, 0x0f, 0x01,
+ 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02, 0x04, 0x30, 0x0d,
+ 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01,
+ 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x5d, 0x3c, 0xb3,
+ 0x52, 0x19, 0xa6, 0x9e, 0x4a, 0x44, 0x98, 0xbf, 0x51, 0x20,
+ 0x47, 0x0a, 0xf3, 0x26, 0x1a, 0xcc, 0x35, 0x2f, 0xc9, 0xed,
+ 0xe0, 0x9d, 0x46, 0xeb, 0xbc, 0x7e, 0xc9, 0xb9, 0x1d, 0x76,
+ 0xa4, 0x1d, 0xc2, 0xd9, 0x16, 0x29, 0x77, 0x01, 0x40, 0xdd,
+ 0xe5, 0xcb, 0x28, 0x91, 0x3a, 0x0c, 0x13, 0x01, 0x1b, 0x72,
+ 0x62, 0x45, 0x27, 0xfd, 0xd7, 0x00, 0x47, 0x36, 0x09, 0x1e,
+ 0x7b, 0xd2, 0xcb, 0x95, 0x3d, 0x28, 0x82, 0xce, 0x83, 0x59,
+ 0x32, 0xf9, 0xe6, 0xec, 0x89, 0xac, 0x88, 0x45, 0x22, 0x88,
+ 0x6f, 0x5e, 0xa2, 0x79, 0x95, 0xba, 0xb9, 0xc9, 0xb6, 0x4c,
+ 0x7c, 0xb4, 0x29, 0xa1, 0x02, 0xf5, 0xac, 0x5d, 0x8e, 0x52,
+ 0xeb, 0xe8, 0xb1, 0x56, 0x49, 0xb3, 0x77, 0x62, 0x7d, 0x87,
+ 0x4d, 0x17, 0xf2, 0x62, 0x83, 0x08, 0x59, 0x21, 0x60, 0x0d,
+ 0x84, 0x8e, 0x5a, 0x84, 0xf6 ),
+ FINGERPRINT ( 0x88, 0x70, 0xbf, 0xf0, 0xd6, 0x09, 0x03, 0x3a,
+ 0xe1, 0x80, 0xa7, 0xa5, 0x5c, 0x3e, 0xe1, 0x05,
+ 0x38, 0x97, 0xde, 0xe1, 0xe9, 0x74, 0x55, 0xb1,
+ 0x1e, 0x59, 0x69, 0x44, 0x42, 0x1b, 0xc8, 0xff ) );
+
+/*
+ * subject iPXE self-test leaf CA
+ * issuer iPXE self-test intermediate CA
+ */
+CERTIFICATE ( leaf_crt,
+ DATA ( 0x30, 0x82, 0x02, 0xb6, 0x30, 0x82, 0x02, 0x1f, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
+ 0x00, 0x30, 0x81, 0x90, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
+ 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30,
+ 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69,
+ 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73,
+ 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69,
+ 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x27, 0x30,
+ 0x25, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1e, 0x69, 0x50,
+ 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65,
+ 0x73, 0x74, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65,
+ 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x43, 0x41, 0x30, 0x1e,
+ 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30,
+ 0x30, 0x31, 0x33, 0x33, 0x5a, 0x17, 0x0d, 0x31, 0x34, 0x31,
+ 0x32, 0x31, 0x37, 0x30, 0x30, 0x30, 0x31, 0x33, 0x33, 0x5a,
+ 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15,
+ 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72,
+ 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07,
+ 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30,
+ 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70,
+ 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30, 0x1d,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50, 0x58,
+ 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73,
+ 0x74, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x43, 0x41, 0x30,
+ 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86,
+ 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d,
+ 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xc3, 0x55,
+ 0xad, 0xdf, 0x7b, 0xd1, 0x48, 0xc3, 0xd3, 0x02, 0x54, 0x6c,
+ 0x92, 0x45, 0x22, 0x3d, 0x90, 0xd8, 0xc7, 0x13, 0xcd, 0xc1,
+ 0x59, 0xc6, 0xe0, 0xad, 0x0e, 0xe6, 0xdb, 0x3b, 0xe8, 0x63,
+ 0xea, 0x4e, 0xb6, 0xea, 0x50, 0xea, 0x6e, 0x33, 0x9d, 0x28,
+ 0x25, 0x42, 0x49, 0xd0, 0xf0, 0xed, 0xc5, 0x5b, 0x6b, 0x4a,
+ 0xe7, 0x45, 0xfa, 0xd3, 0x3f, 0xae, 0xde, 0x5a, 0x90, 0xab,
+ 0xf1, 0x61, 0x2f, 0x40, 0x5e, 0xcf, 0x8b, 0x0b, 0x10, 0x59,
+ 0xa9, 0xd0, 0x1e, 0x0f, 0x18, 0x6b, 0x92, 0xd8, 0x9f, 0x58,
+ 0x10, 0x84, 0xb6, 0x15, 0xe8, 0x5b, 0xc4, 0xa0, 0x3e, 0x49,
+ 0x8b, 0xea, 0xdd, 0xa9, 0x7e, 0x32, 0x26, 0x9a, 0x68, 0x44,
+ 0xf0, 0x30, 0xca, 0x2a, 0xd6, 0x19, 0x7a, 0x80, 0xfd, 0xd7,
+ 0xfc, 0xc7, 0x5d, 0xe7, 0x61, 0xd2, 0x3f, 0x1f, 0x2c, 0x40,
+ 0x70, 0x7b, 0x34, 0xcb, 0x08, 0xa9, 0x02, 0x03, 0x01, 0x00,
+ 0x01, 0xa3, 0x26, 0x30, 0x24, 0x30, 0x12, 0x06, 0x03, 0x55,
+ 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x08, 0x30, 0x06, 0x01,
+ 0x01, 0xff, 0x02, 0x01, 0x00, 0x30, 0x0e, 0x06, 0x03, 0x55,
+ 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03, 0x02, 0x02,
+ 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00,
+ 0x40, 0xd2, 0x70, 0x02, 0x08, 0x19, 0xa0, 0xb8, 0x8d, 0x9d,
+ 0x3d, 0x62, 0x41, 0x90, 0x2a, 0x36, 0x4a, 0x8b, 0x21, 0x42,
+ 0x9a, 0xb4, 0xc5, 0xf8, 0x79, 0x17, 0xd7, 0x64, 0x4d, 0xbf,
+ 0x8f, 0x6a, 0x04, 0x54, 0x7a, 0x0b, 0xd4, 0xb5, 0x0e, 0xab,
+ 0xf7, 0xb7, 0x06, 0x2b, 0xf8, 0xde, 0x87, 0xb2, 0x37, 0x3b,
+ 0x95, 0x01, 0xba, 0x9f, 0x8f, 0xec, 0x0a, 0x86, 0xca, 0x51,
+ 0xb6, 0x25, 0x73, 0x2f, 0xa1, 0x66, 0xc8, 0x7a, 0x5e, 0x51,
+ 0xbd, 0x49, 0xb5, 0x75, 0xda, 0xea, 0xe5, 0xeb, 0x5d, 0xe3,
+ 0xb0, 0xad, 0x49, 0x9f, 0x8b, 0xfd, 0x89, 0xb3, 0xb7, 0xb2,
+ 0x4c, 0x7d, 0x8a, 0x29, 0xb2, 0xbe, 0x04, 0xef, 0x9c, 0x73,
+ 0x3c, 0xea, 0xa3, 0x9f, 0x07, 0x66, 0x5a, 0x2f, 0x38, 0xad,
+ 0x1a, 0xeb, 0xe1, 0xb0, 0x62, 0x14, 0x55, 0xdc, 0x8c, 0x83,
+ 0xbb, 0xc7, 0x13, 0x04, 0x41, 0x54, 0xf1, 0x45 ),
+ FINGERPRINT ( 0xca, 0xcf, 0xea, 0x98, 0x3d, 0x71, 0xb6, 0x9d,
+ 0x4f, 0x5b, 0x84, 0x5e, 0xaa, 0x8e, 0xae, 0x63,
+ 0x0e, 0xad, 0x52, 0xe8, 0xc7, 0x51, 0x81, 0x07,
+ 0xd1, 0xa1, 0x66, 0xdb, 0xd5, 0x62, 0xe1, 0xe6 ) );
+
+/*
+ * subject iPXE self-test useless CA
+ * issuer iPXE self-test leaf CA
+ */
+CERTIFICATE ( useless_crt,
+ DATA ( 0x30, 0x82, 0x02, 0xae, 0x30, 0x82, 0x02, 0x17, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x01, 0x02, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
+ 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
+ 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30,
+ 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69,
+ 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73,
+ 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69,
+ 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50,
+ 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65,
+ 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x43, 0x41,
+ 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32,
+ 0x30, 0x30, 0x30, 0x31, 0x33, 0x34, 0x5a, 0x17, 0x0d, 0x31,
+ 0x34, 0x31, 0x32, 0x31, 0x37, 0x30, 0x30, 0x30, 0x31, 0x33,
+ 0x34, 0x5a, 0x30, 0x81, 0x8b, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17,
+ 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68,
+ 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
+ 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55,
+ 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31,
+ 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08,
+ 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x22,
+ 0x30, 0x20, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x19, 0x69,
+ 0x50, 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74,
+ 0x65, 0x73, 0x74, 0x20, 0x75, 0x73, 0x65, 0x6c, 0x65, 0x73,
+ 0x73, 0x20, 0x43, 0x41, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06,
+ 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01,
+ 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02,
+ 0x81, 0x81, 0x00, 0xbe, 0x7f, 0x5a, 0x07, 0x7c, 0x61, 0xc2,
+ 0x3a, 0x7e, 0xe3, 0x94, 0xcb, 0xe9, 0xc3, 0x4c, 0x6f, 0x8d,
+ 0x5c, 0x4a, 0xf0, 0xc2, 0x13, 0x54, 0x09, 0x39, 0xa8, 0xf9,
+ 0xc2, 0xc3, 0xdd, 0xbe, 0x42, 0x99, 0xa6, 0xe1, 0x58, 0x0a,
+ 0xd5, 0x89, 0x12, 0xa6, 0xd6, 0x4e, 0xfb, 0x6c, 0xe5, 0xab,
+ 0xff, 0x40, 0x52, 0xcc, 0x1e, 0x63, 0x10, 0xd7, 0xfe, 0x49,
+ 0xf3, 0x86, 0x29, 0x58, 0x6a, 0x90, 0xe4, 0xe2, 0x56, 0x85,
+ 0x14, 0x7d, 0xa5, 0xf8, 0xe0, 0x7e, 0x96, 0x88, 0xd9, 0x23,
+ 0xe5, 0x44, 0x72, 0xa9, 0x5a, 0xbb, 0x76, 0x6b, 0x59, 0x3e,
+ 0x85, 0xd4, 0xe7, 0xb2, 0x31, 0x32, 0xea, 0x40, 0x1f, 0xce,
+ 0xfb, 0xb1, 0x91, 0xee, 0x86, 0x91, 0x3e, 0xa4, 0x86, 0xa4,
+ 0xe9, 0x74, 0xd7, 0x14, 0x8c, 0xb6, 0xb4, 0xc0, 0x08, 0xbb,
+ 0xc8, 0x38, 0xc3, 0x96, 0x3d, 0x85, 0xcf, 0xef, 0x94, 0x52,
+ 0x29, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3, 0x23, 0x30, 0x21,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff,
+ 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0e, 0x06,
+ 0x03, 0x55, 0x1d, 0x0f, 0x01, 0x01, 0xff, 0x04, 0x04, 0x03,
+ 0x02, 0x02, 0x04, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48,
+ 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03, 0x81,
+ 0x81, 0x00, 0x50, 0x59, 0xfb, 0x9d, 0x4d, 0xfe, 0x0e, 0x5b,
+ 0xc4, 0x51, 0xe9, 0xe8, 0xa4, 0xf5, 0x2f, 0x32, 0x8b, 0x06,
+ 0x78, 0xbe, 0xf1, 0x18, 0xc5, 0x6f, 0xd9, 0x20, 0xee, 0xb7,
+ 0x51, 0x40, 0xaf, 0xf3, 0x3c, 0xe4, 0x74, 0x00, 0xa4, 0x63,
+ 0x3b, 0x37, 0xe1, 0xef, 0x80, 0xdc, 0xd5, 0x90, 0xed, 0xba,
+ 0x91, 0x86, 0x7f, 0x97, 0x5d, 0x3e, 0x8f, 0x29, 0xcc, 0x57,
+ 0xee, 0x79, 0x15, 0x6b, 0xe3, 0xd1, 0x25, 0x14, 0x24, 0xdf,
+ 0xbf, 0x38, 0xee, 0xe3, 0x8a, 0x88, 0x19, 0x0f, 0xc8, 0x10,
+ 0xae, 0x27, 0x99, 0xa8, 0x35, 0x47, 0xc9, 0xfb, 0x92, 0x47,
+ 0xa2, 0x36, 0x2a, 0x8c, 0x26, 0x12, 0xb1, 0x0d, 0x46, 0xe2,
+ 0xdc, 0x33, 0x29, 0x0c, 0x32, 0xcf, 0x22, 0x49, 0xde, 0xc3,
+ 0x55, 0x2a, 0xba, 0xdd, 0xe3, 0x98, 0xc0, 0xe4, 0x9a, 0xa2,
+ 0xe5, 0x43, 0x04, 0x32, 0xd3, 0x50, 0x7d, 0x9c, 0x71, 0x23 ),
+ FINGERPRINT ( 0xda, 0xbf, 0xd3, 0x5e, 0x2e, 0x29, 0xa9, 0xfd,
+ 0x4d, 0x40, 0xba, 0xb8, 0xdd, 0x66, 0x93, 0x4c,
+ 0x10, 0xea, 0x5b, 0x07, 0xa6, 0xe2, 0x27, 0x63,
+ 0x2e, 0xfe, 0x01, 0x63, 0x7c, 0xea, 0xc6, 0xd0 ) );
+
+/*
+ * subject boot.test.ipxe.org
+ * issuer iPXE self-test leaf CA
+ */
+CERTIFICATE ( server_crt,
+ DATA ( 0x30, 0x82, 0x02, 0xd2, 0x30, 0x82, 0x02, 0x3b, 0xa0, 0x03,
+ 0x02, 0x01, 0x02, 0x02, 0x01, 0x1e, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05,
+ 0x00, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03,
+ 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30,
+ 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69,
+ 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04,
+ 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04,
+ 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73,
+ 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11,
+ 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69,
+ 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1f, 0x30,
+ 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16, 0x69, 0x50,
+ 0x58, 0x45, 0x20, 0x73, 0x65, 0x6c, 0x66, 0x2d, 0x74, 0x65,
+ 0x73, 0x74, 0x20, 0x6c, 0x65, 0x61, 0x66, 0x20, 0x43, 0x41,
+ 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x30, 0x35,
+ 0x31, 0x33, 0x34, 0x35, 0x30, 0x35, 0x5a, 0x17, 0x0d, 0x31,
+ 0x33, 0x30, 0x33, 0x30, 0x35, 0x31, 0x33, 0x34, 0x35, 0x30,
+ 0x35, 0x5a, 0x30, 0x81, 0x84, 0x31, 0x0b, 0x30, 0x09, 0x06,
+ 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17,
+ 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43,
+ 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68,
+ 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55,
+ 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69,
+ 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55,
+ 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79,
+ 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31,
+ 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08,
+ 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x1b,
+ 0x30, 0x19, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x12, 0x62,
+ 0x6f, 0x6f, 0x74, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x69,
+ 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x30, 0x81, 0x9f,
+ 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d,
+ 0x01, 0x01, 0x01, 0x05, 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30,
+ 0x81, 0x89, 0x02, 0x81, 0x81, 0x00, 0xac, 0x7b, 0x54, 0xc1,
+ 0x97, 0x4d, 0x56, 0xbd, 0xb2, 0x52, 0xb3, 0x5c, 0x1b, 0x28,
+ 0xae, 0x91, 0x33, 0xf0, 0xc8, 0xc2, 0x3c, 0x7d, 0xe8, 0x95,
+ 0x72, 0xaf, 0xfe, 0xa1, 0x68, 0xe1, 0xbd, 0xe2, 0x9d, 0x4c,
+ 0xe8, 0x95, 0x56, 0x94, 0xce, 0x47, 0x57, 0x1b, 0xb1, 0x08,
+ 0xa1, 0x5b, 0x02, 0x8f, 0x56, 0x75, 0x1e, 0x4f, 0xfd, 0xc5,
+ 0x87, 0x5c, 0x1c, 0x3f, 0xab, 0x4f, 0xba, 0x25, 0x14, 0x6d,
+ 0xe3, 0xa2, 0x47, 0x33, 0xd0, 0x78, 0x63, 0xcc, 0x11, 0x37,
+ 0x08, 0x73, 0x25, 0x42, 0x20, 0xa9, 0x57, 0x29, 0xeb, 0x44,
+ 0x80, 0x0d, 0xe6, 0x76, 0x4b, 0x02, 0x8b, 0x67, 0xb2, 0x99,
+ 0xfe, 0xb3, 0x44, 0x62, 0xdf, 0x34, 0x0e, 0xf3, 0xe2, 0x17,
+ 0x42, 0x8f, 0x36, 0x42, 0x5a, 0x1c, 0x03, 0x3e, 0x06, 0x0d,
+ 0x5e, 0x08, 0x52, 0xd1, 0x06, 0xfb, 0xa9, 0xdb, 0x13, 0x15,
+ 0x08, 0x6d, 0x03, 0x85, 0x02, 0x03, 0x01, 0x00, 0x01, 0xa3,
+ 0x4e, 0x30, 0x4c, 0x30, 0x4a, 0x06, 0x03, 0x55, 0x1d, 0x11,
+ 0x04, 0x43, 0x30, 0x41, 0x82, 0x12, 0x64, 0x65, 0x6d, 0x6f,
+ 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x69, 0x70, 0x78, 0x65,
+ 0x2e, 0x6f, 0x72, 0x67, 0x82, 0x13, 0x2a, 0x2e, 0x61, 0x6c,
+ 0x74, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x69, 0x70, 0x78,
+ 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x87, 0x04, 0xc0, 0xa8, 0x00,
+ 0x01, 0x87, 0x10, 0xfe, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x69, 0xff, 0xfe, 0x50, 0x58, 0x45, 0x30,
+ 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01,
+ 0x01, 0x05, 0x05, 0x00, 0x03, 0x81, 0x81, 0x00, 0x63, 0x83,
+ 0xf5, 0xde, 0xf7, 0x59, 0x81, 0xd3, 0x34, 0x61, 0xfd, 0x2c,
+ 0x0c, 0xec, 0x1c, 0x25, 0xd2, 0x2c, 0xe8, 0x90, 0x4f, 0x34,
+ 0x43, 0x2c, 0x86, 0x18, 0x9e, 0x66, 0x26, 0x0d, 0x02, 0x2a,
+ 0xea, 0x28, 0xc6, 0xbb, 0x51, 0x02, 0xbe, 0x8f, 0x51, 0x50,
+ 0xc7, 0x04, 0x49, 0x97, 0xb9, 0xd4, 0xa5, 0x74, 0x39, 0xaa,
+ 0x22, 0xbb, 0x4e, 0x46, 0x57, 0x15, 0x0e, 0xcf, 0x64, 0x60,
+ 0xc8, 0x13, 0xdf, 0x82, 0x09, 0x3b, 0x92, 0xf5, 0x69, 0x80,
+ 0xd2, 0x5e, 0x53, 0x9d, 0x3a, 0xcd, 0x9e, 0x81, 0xa1, 0xbd,
+ 0x5b, 0x66, 0x89, 0x4d, 0xf7, 0xa4, 0xd6, 0x92, 0xe4, 0xe1,
+ 0x80, 0x87, 0xfa, 0xa5, 0x47, 0x25, 0x9c, 0x35, 0x77, 0xa5,
+ 0x11, 0x1b, 0x48, 0x4c, 0x5e, 0x5e, 0x2f, 0xc7, 0xf8, 0x78,
+ 0x4c, 0x36, 0x41, 0xfb, 0x91, 0x5d, 0xf6, 0x43, 0x99, 0x7c,
+ 0xcd, 0x7f, 0x27, 0x4c, 0x75, 0xca ),
+ FINGERPRINT ( 0x82, 0xd3, 0xa0, 0x4c, 0x0d, 0x7d, 0x3c, 0xb1,
+ 0x90, 0x63, 0xd8, 0xef, 0x1e, 0xd2, 0xdd, 0x10,
+ 0xd5, 0x89, 0x40, 0x35, 0xb9, 0x5e, 0x98, 0x44,
+ 0x30, 0xa2, 0x48, 0x9a, 0xb8, 0x2f, 0xcf, 0xe3 ) );
+
+/*
+ * subject not.a.ca.test.ipxe.org
+ * issuer boot.test.ipxe.org
+ */
+CERTIFICATE ( not_ca_crt,
+ DATA ( 0x30, 0x82, 0x02, 0x7d, 0x30, 0x82, 0x01, 0xe6, 0x02, 0x01,
+ 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x84, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x1b, 0x30, 0x19, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x12, 0x62, 0x6f, 0x6f, 0x74, 0x2e, 0x74, 0x65,
+ 0x73, 0x74, 0x2e, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72,
+ 0x67, 0x30, 0x1e, 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32,
+ 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x34, 0x5a, 0x17, 0x0d,
+ 0x31, 0x33, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31,
+ 0x33, 0x34, 0x5a, 0x30, 0x81, 0x88, 0x31, 0x0b, 0x30, 0x09,
+ 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31,
+ 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e,
+ 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73,
+ 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03,
+ 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72,
+ 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03,
+ 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53,
+ 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64,
+ 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c,
+ 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31,
+ 0x1f, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x16,
+ 0x6e, 0x6f, 0x74, 0x2e, 0x61, 0x2e, 0x63, 0x61, 0x2e, 0x74,
+ 0x65, 0x73, 0x74, 0x2e, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05, 0x00,
+ 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81, 0x81,
+ 0x00, 0xc3, 0x5b, 0x6d, 0xb3, 0x8d, 0x74, 0x9c, 0x1d, 0xbd,
+ 0x94, 0x41, 0xa2, 0x42, 0x96, 0x3c, 0x41, 0x82, 0xc0, 0xf1,
+ 0x95, 0xbf, 0xc5, 0x34, 0x92, 0x92, 0xa3, 0xed, 0xed, 0x5c,
+ 0x07, 0xaa, 0xb4, 0xc1, 0x66, 0xbb, 0xa6, 0xd1, 0xd9, 0x78,
+ 0x93, 0xf1, 0x9c, 0x3e, 0x13, 0x3a, 0xee, 0x74, 0x31, 0xeb,
+ 0x55, 0x86, 0xa5, 0x43, 0x8a, 0x5d, 0x0c, 0x2c, 0x0d, 0xfb,
+ 0x91, 0x9e, 0x31, 0x22, 0xbe, 0x96, 0xb5, 0x0e, 0x44, 0xc8,
+ 0x5b, 0x65, 0xb2, 0xf5, 0xec, 0x2a, 0x51, 0xed, 0x8f, 0x28,
+ 0xd8, 0xb2, 0x4b, 0x45, 0x39, 0x31, 0x1f, 0x11, 0xb7, 0x12,
+ 0xe3, 0xc6, 0xb2, 0xd2, 0x8d, 0x50, 0xd5, 0xf4, 0xd2, 0x71,
+ 0x77, 0xc9, 0x4c, 0x67, 0xee, 0xf7, 0xdc, 0xdb, 0x68, 0xa6,
+ 0xac, 0x33, 0xd4, 0xb2, 0x12, 0x61, 0x5c, 0xae, 0x4c, 0x2e,
+ 0x26, 0xe8, 0xdf, 0x46, 0x3a, 0x05, 0xaf, 0xeb, 0x0d, 0x02,
+ 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86,
+ 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x03,
+ 0x81, 0x81, 0x00, 0x90, 0x3e, 0x16, 0x27, 0x2f, 0x4e, 0x4b,
+ 0x31, 0x0e, 0xae, 0x31, 0x9d, 0x64, 0x88, 0x9f, 0xce, 0xd8,
+ 0x22, 0x51, 0x9d, 0xd9, 0x2b, 0xfe, 0xed, 0x75, 0xbe, 0xec,
+ 0x5a, 0x73, 0xaf, 0x6c, 0xa5, 0x5e, 0xd1, 0x15, 0x9a, 0x08,
+ 0xcf, 0x4d, 0x41, 0x78, 0x48, 0xb4, 0x29, 0xf1, 0xf7, 0x63,
+ 0x9b, 0x11, 0x91, 0x16, 0x94, 0x55, 0xff, 0xeb, 0xe9, 0x6f,
+ 0x0a, 0x34, 0x89, 0xed, 0xf2, 0xd1, 0x79, 0x91, 0x9d, 0xe5,
+ 0x73, 0x48, 0x68, 0x7f, 0x9b, 0xf4, 0x94, 0x80, 0x29, 0xbb,
+ 0x2f, 0xac, 0x6c, 0xf7, 0x6a, 0x43, 0xcc, 0x40, 0x34, 0x85,
+ 0xc8, 0xa1, 0x6d, 0x16, 0x36, 0x65, 0x3f, 0x93, 0x60, 0xc1,
+ 0x64, 0x33, 0x91, 0xa1, 0x8f, 0x86, 0x8c, 0xce, 0x14, 0x19,
+ 0x72, 0x28, 0xef, 0x94, 0x3d, 0x09, 0xb8, 0x3b, 0x39, 0xe8,
+ 0xd1, 0x66, 0x2b, 0x38, 0xb4, 0x46, 0x50, 0xf4, 0xcd, 0xc4,
+ 0x9a ),
+ FINGERPRINT ( 0x37, 0x6b, 0xc2, 0x20, 0xa9, 0xbc, 0xe2, 0x83,
+ 0x99, 0x60, 0x06, 0x2e, 0xaf, 0x94, 0xfe, 0xb0,
+ 0x1a, 0x2c, 0x17, 0x47, 0x1e, 0xc0, 0xd1, 0x66,
+ 0xb6, 0x76, 0xeb, 0x1c, 0x07, 0xae, 0x72, 0xf2 ) );
+
+/*
+ * subject bad.path.len.test.ipxe.org
+ * issuer iPXE self-test useless CA
+ */
+CERTIFICATE ( bad_path_len_crt,
+ DATA ( 0x30, 0x82, 0x02, 0x88, 0x30, 0x82, 0x01, 0xf1, 0x02, 0x01,
+ 0x02, 0x30, 0x0d, 0x06, 0x09, 0x2a, 0x86, 0x48, 0x86, 0xf7,
+ 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00, 0x30, 0x81, 0x8b, 0x31,
+ 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55, 0x04, 0x06, 0x13, 0x02,
+ 0x47, 0x42, 0x31, 0x17, 0x30, 0x15, 0x06, 0x03, 0x55, 0x04,
+ 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64,
+ 0x67, 0x65, 0x73, 0x68, 0x69, 0x72, 0x65, 0x31, 0x12, 0x30,
+ 0x10, 0x06, 0x03, 0x55, 0x04, 0x07, 0x0c, 0x09, 0x43, 0x61,
+ 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x31, 0x18, 0x30,
+ 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a, 0x0c, 0x0f, 0x46, 0x65,
+ 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x73, 0x20,
+ 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30, 0x0f, 0x06, 0x03, 0x55,
+ 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70, 0x78, 0x65, 0x2e, 0x6f,
+ 0x72, 0x67, 0x31, 0x22, 0x30, 0x20, 0x06, 0x03, 0x55, 0x04,
+ 0x03, 0x0c, 0x19, 0x69, 0x50, 0x58, 0x45, 0x20, 0x73, 0x65,
+ 0x6c, 0x66, 0x2d, 0x74, 0x65, 0x73, 0x74, 0x20, 0x75, 0x73,
+ 0x65, 0x6c, 0x65, 0x73, 0x73, 0x20, 0x43, 0x41, 0x30, 0x1e,
+ 0x17, 0x0d, 0x31, 0x32, 0x30, 0x33, 0x32, 0x32, 0x30, 0x30,
+ 0x30, 0x31, 0x33, 0x34, 0x5a, 0x17, 0x0d, 0x31, 0x33, 0x30,
+ 0x33, 0x32, 0x32, 0x30, 0x30, 0x30, 0x31, 0x33, 0x34, 0x5a,
+ 0x30, 0x81, 0x8c, 0x31, 0x0b, 0x30, 0x09, 0x06, 0x03, 0x55,
+ 0x04, 0x06, 0x13, 0x02, 0x47, 0x42, 0x31, 0x17, 0x30, 0x15,
+ 0x06, 0x03, 0x55, 0x04, 0x08, 0x0c, 0x0e, 0x43, 0x61, 0x6d,
+ 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x73, 0x68, 0x69, 0x72,
+ 0x65, 0x31, 0x12, 0x30, 0x10, 0x06, 0x03, 0x55, 0x04, 0x07,
+ 0x0c, 0x09, 0x43, 0x61, 0x6d, 0x62, 0x72, 0x69, 0x64, 0x67,
+ 0x65, 0x31, 0x18, 0x30, 0x16, 0x06, 0x03, 0x55, 0x04, 0x0a,
+ 0x0c, 0x0f, 0x46, 0x65, 0x6e, 0x20, 0x53, 0x79, 0x73, 0x74,
+ 0x65, 0x6d, 0x73, 0x20, 0x4c, 0x74, 0x64, 0x31, 0x11, 0x30,
+ 0x0f, 0x06, 0x03, 0x55, 0x04, 0x0b, 0x0c, 0x08, 0x69, 0x70,
+ 0x78, 0x65, 0x2e, 0x6f, 0x72, 0x67, 0x31, 0x23, 0x30, 0x21,
+ 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x1a, 0x62, 0x61, 0x64,
+ 0x2e, 0x70, 0x61, 0x74, 0x68, 0x2e, 0x6c, 0x65, 0x6e, 0x2e,
+ 0x74, 0x65, 0x73, 0x74, 0x2e, 0x69, 0x70, 0x78, 0x65, 0x2e,
+ 0x6f, 0x72, 0x67, 0x30, 0x81, 0x9f, 0x30, 0x0d, 0x06, 0x09,
+ 0x2a, 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x01, 0x05,
+ 0x00, 0x03, 0x81, 0x8d, 0x00, 0x30, 0x81, 0x89, 0x02, 0x81,
+ 0x81, 0x00, 0xed, 0xf1, 0xe3, 0xb2, 0x61, 0x68, 0xa0, 0xd5,
+ 0x43, 0xfe, 0xad, 0xee, 0xfb, 0x8e, 0x2c, 0xf0, 0x44, 0xaf,
+ 0x0a, 0x3c, 0x87, 0xc2, 0x56, 0x9b, 0x66, 0x15, 0xc6, 0xbc,
+ 0x5b, 0x96, 0xef, 0xa1, 0x49, 0xd6, 0xe7, 0xeb, 0xb8, 0xf6,
+ 0x3d, 0x62, 0xf5, 0x51, 0xfd, 0xb1, 0xa5, 0x4e, 0x92, 0x7c,
+ 0x7a, 0x31, 0x1b, 0xb8, 0x21, 0x5c, 0xfe, 0x0b, 0x4e, 0x58,
+ 0xd6, 0xd0, 0x8b, 0x81, 0x00, 0x4a, 0xf8, 0xf7, 0x2a, 0xc9,
+ 0xea, 0xfa, 0x9c, 0xc9, 0x33, 0x0b, 0xc4, 0xce, 0x96, 0x4c,
+ 0x30, 0x6e, 0xf0, 0x07, 0xfa, 0x1b, 0x94, 0x1f, 0xe3, 0x3b,
+ 0xb2, 0x7d, 0x31, 0x1a, 0x37, 0x64, 0xe2, 0xc3, 0xf1, 0xe5,
+ 0xb9, 0xcc, 0xd1, 0x02, 0xae, 0x16, 0x39, 0x9b, 0xfc, 0x55,
+ 0xca, 0xdd, 0x33, 0x92, 0xe3, 0x12, 0x40, 0xc5, 0x32, 0x51,
+ 0x62, 0xac, 0x3a, 0xc0, 0x17, 0x36, 0xd0, 0x27, 0x3d, 0xbb,
+ 0x02, 0x03, 0x01, 0x00, 0x01, 0x30, 0x0d, 0x06, 0x09, 0x2a,
+ 0x86, 0x48, 0x86, 0xf7, 0x0d, 0x01, 0x01, 0x05, 0x05, 0x00,
+ 0x03, 0x81, 0x81, 0x00, 0x07, 0x53, 0x2a, 0x80, 0xd6, 0x25,
+ 0x10, 0x37, 0xce, 0x3b, 0x87, 0x87, 0xfc, 0xae, 0xe2, 0x2a,
+ 0x28, 0x3f, 0xf7, 0xa6, 0x32, 0x5b, 0x06, 0xbd, 0x4f, 0x34,
+ 0x6b, 0x47, 0x8a, 0x4b, 0x47, 0x51, 0xe8, 0x45, 0x69, 0xe3,
+ 0xf3, 0xdf, 0xa4, 0x25, 0x8f, 0x34, 0xbe, 0xe5, 0x2c, 0xa4,
+ 0x6c, 0x8c, 0x6e, 0x02, 0x74, 0x23, 0x43, 0x21, 0x4d, 0xe3,
+ 0x75, 0x93, 0x8e, 0xa8, 0x2c, 0x54, 0xba, 0x35, 0xe7, 0xab,
+ 0x44, 0xfa, 0x07, 0x7a, 0x18, 0xb4, 0xa7, 0xce, 0xfa, 0xa6,
+ 0x74, 0x5a, 0x45, 0x2c, 0x6f, 0x86, 0x34, 0x8f, 0x4a, 0x09,
+ 0xe0, 0xf3, 0x4f, 0x37, 0xbb, 0xa3, 0xa0, 0xcb, 0xad, 0x6b,
+ 0xc1, 0x16, 0x06, 0xdf, 0x83, 0x98, 0xaf, 0xa8, 0xc3, 0xa0,
+ 0x5f, 0x33, 0x09, 0x01, 0x12, 0xbd, 0xd3, 0x45, 0x9f, 0x5f,
+ 0x96, 0x93, 0xe9, 0x69, 0xe9, 0xb1, 0x8a, 0xe4, 0x94, 0xce,
+ 0xe4, 0x8d ),
+ FINGERPRINT ( 0xb6, 0x80, 0x84, 0xf1, 0x45, 0x55, 0x1f, 0xbc,
+ 0x15, 0xa6, 0xd8, 0x4b, 0xf3, 0x19, 0x65, 0xef,
+ 0x53, 0x5a, 0xc8, 0x99, 0xe5, 0xdf, 0x79, 0x07,
+ 0x00, 0x2c, 0x9f, 0x49, 0x91, 0x21, 0xeb, 0xfc ) );
+
+/** Valid certificate chain up to boot.test.ipxe.org */
+CHAIN ( server_chain, &server_crt, &leaf_crt, &intermediate_crt, &root_crt );
+
+/** Broken certificate chain up to boot.test.ipxe.org */
+CHAIN ( broken_server_chain, &server_crt, &leaf_crt, &root_crt );
+
+/** Incomplete certificate chain up to boot.test.ipxe.org */
+CHAIN ( incomplete_server_chain, &server_crt, &leaf_crt, &intermediate_crt );
+
+/** Non-functional certificate chain up to not_ca.test.ipxe.org */
+CHAIN ( not_ca_chain,
+ &not_ca_crt, &server_crt, &leaf_crt, &intermediate_crt, &root_crt );
+
+/** Valid certificate chain up to iPXE self-test useless CA */
+CHAIN ( useless_chain, &useless_crt, &leaf_crt, &intermediate_crt, &root_crt );
+
+/** Non-functional certificate chain up to bad.path.len.test.ipxe.org */
+CHAIN ( bad_path_len_chain, &bad_path_len_crt, &useless_crt, &leaf_crt,
+ &intermediate_crt, &root_crt );
+
+/** Empty certificate store */
+static struct x509_chain empty_store = {
+ .refcnt = REF_INIT ( ref_no_free ),
+ .links = LIST_HEAD_INIT ( empty_store.links ),
+};
+
+/** Root certificate list containing the iPXE self-test root CA */
+static struct x509_root test_root = {
+ .digest = &x509_test_algorithm,
+ .count = 1,
+ .fingerprints = root_crt_fingerprint,
+};
+
+/** Root certificate list containing the iPXE self-test intermediate CA */
+static struct x509_root intermediate_root = {
+ .digest = &x509_test_algorithm,
+ .count = 1,
+ .fingerprints = intermediate_crt_fingerprint,
+};
+
+/** Dummy fingerprint (not matching any certificates) */
+static uint8_t dummy_fingerprint[] =
+ FINGERPRINT ( 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff,
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff );
+
+/** Certificate store containing a dummy fingerprint */
+static struct x509_root dummy_root = {
+ .digest = &x509_test_algorithm,
+ .count = 1,
+ .fingerprints = dummy_fingerprint,
+};
+
+/** Time at which all test certificates are valid */
+static time_t test_time = 1332374737ULL; /* Thu Mar 22 00:05:37 2012 */
+
+/** Time at which end-entity test certificates are invalid */
+static time_t test_expired = 1375573111ULL; /* Sat Aug 3 23:38:31 2013 */
+
+/** Time at which CA test certificates are invalid */
+static time_t test_ca_expired = 2205014905ULL; /* Wed Nov 16 00:08:25 2039 */
+
+/**
+ * Report certificate parsing test result
+ *
+ * @v crt Test certificate
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_certificate_okx ( struct x509_test_certificate *crt,
+ const char *file, unsigned int line ) {
+
+ okx ( x509_certificate ( crt->data, crt->len, &crt->cert ) == 0,
+ file, line );
+}
+#define x509_certificate_ok( crt ) \
+ x509_certificate_okx ( crt, __FILE__, __LINE__ )
+
+/**
+ * Report cached certificate parsing test result
+ *
+ * @v crt Test certificate
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_cached_okx ( struct x509_test_certificate *crt,
+ const char *file, unsigned int line ) {
+ struct x509_certificate *temp;
+
+ okx ( x509_certificate ( crt->data, crt->len, &temp ) == 0,
+ file, line );
+ okx ( temp == crt->cert, file, line );
+ x509_put ( temp );
+}
+#define x509_cached_ok( crt ) x509_cached_okx ( crt, __FILE__, __LINE__ )
+
+/**
+ * Report certificate fingerprint test result
+ *
+ * @v crt Test certificate
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_fingerprint_okx ( struct x509_test_certificate *crt,
+ const char *file, unsigned int line ) {
+ uint8_t fingerprint[ x509_test_algorithm.digestsize ];
+
+ x509_fingerprint ( crt->cert, &x509_test_algorithm, fingerprint );
+ okx ( memcmp ( fingerprint, crt->fingerprint,
+ sizeof ( fingerprint ) ) == 0, file, line );
+}
+#define x509_fingerprint_ok( crt ) \
+ x509_fingerprint_okx ( crt, __FILE__, __LINE__ )
+
+/**
+ * Report certificate issuer validation test result
+ *
+ * @v crt Test certificate
+ * @v issuer Test issuer
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_issuer_okx ( struct x509_test_certificate *crt,
+ struct x509_test_certificate *issuer,
+ const char *file, unsigned int line ) {
+
+ okx ( x509_check_issuer ( crt->cert, issuer->cert ) == 0, file, line );
+}
+#define x509_check_issuer_ok( crt, issuer ) \
+ x509_check_issuer_okx ( crt, issuer, __FILE__, __LINE__ )
+
+/**
+ * Report certificate issuer validation failure test result
+ *
+ * @v crt Test certificate
+ * @v issuer Test issuer
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_issuer_fail_okx ( struct x509_test_certificate *crt,
+ struct x509_test_certificate *issuer,
+ const char *file, unsigned int line ) {
+
+ okx ( x509_check_issuer ( crt->cert, issuer->cert ) != 0,
+ file, line );
+}
+#define x509_check_issuer_fail_ok( crt, issuer ) \
+ x509_check_issuer_fail_okx ( crt, issuer, __FILE__, __LINE__ )
+
+/**
+ * Report certificate root validation test result
+ *
+ * @v crt Test certificate
+ * @v root Test root certificate store
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_root_okx ( struct x509_test_certificate *crt,
+ struct x509_root *root, const char *file,
+ unsigned int line ) {
+
+ okx ( x509_check_root ( crt->cert, root ) == 0, file, line );
+}
+#define x509_check_root_ok( crt, root ) \
+ x509_check_root_okx ( crt, root, __FILE__, __LINE__ )
+
+/**
+ * Report certificate root validation failure test result
+ *
+ * @v crt Test certificate
+ * @v root Test root certificate store
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_root_fail_okx ( struct x509_test_certificate *crt,
+ struct x509_root *root,
+ const char *file, unsigned int line ) {
+
+ okx ( x509_check_root ( crt->cert, root ) != 0, file, line );
+}
+#define x509_check_root_fail_ok( crt, root ) \
+ x509_check_root_fail_okx ( crt, root, __FILE__, __LINE__ )
+
+/**
+ * Report certificate time validation test result
+ *
+ * @v crt Test certificate
+ * @v time Test time
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_time_okx ( struct x509_test_certificate *crt,
+ time_t time, const char *file,
+ unsigned int line ) {
+
+ okx ( x509_check_time ( crt->cert, time ) == 0, file, line );
+}
+#define x509_check_time_ok( crt, time ) \
+ x509_check_time_okx ( crt, time, __FILE__, __LINE__ )
+
+/**
+ * Report certificate time validation failure test result
+ *
+ * @v crt Test certificate
+ * @v time Test time
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_time_fail_okx ( struct x509_test_certificate *crt,
+ time_t time, const char *file,
+ unsigned int line ) {
+
+ okx ( x509_check_time ( crt->cert, time ) != 0, file, line );
+}
+#define x509_check_time_fail_ok( crt, time ) \
+ x509_check_time_fail_okx ( crt, time, __FILE__, __LINE__ )
+
+/**
+ * Report certificate name validation test result
+ *
+ * @v crt Test certificate
+ * @v name Test name
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_name_okx ( struct x509_test_certificate *crt,
+ const char *name, const char *file,
+ unsigned int line ) {
+
+ okx ( x509_check_name ( crt->cert, name ) == 0, file, line );
+}
+#define x509_check_name_ok( crt, name ) \
+ x509_check_name_okx ( crt, name, __FILE__, __LINE__ )
+
+/**
+ * Report certificate name validation failure test result
+ *
+ * @v crt Test certificate
+ * @v name Test name
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_check_name_fail_okx ( struct x509_test_certificate *crt,
+ const char *name, const char *file,
+ unsigned int line ) {
+
+ okx ( x509_check_name ( crt->cert, name ) != 0, file, line );
+}
+#define x509_check_name_fail_ok( crt, name ) \
+ x509_check_name_fail_okx ( crt, name, __FILE__, __LINE__ )
+
+/**
+ * Report certificate chain parsing test result
+ *
+ * @v chn Test certificate chain
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_chain_okx ( struct x509_test_chain *chn, const char *file,
+ unsigned int line ) {
+ unsigned int i;
+ struct x509_certificate *first;
+
+ chn->chain = x509_alloc_chain();
+ okx ( chn->chain != NULL, file, line );
+ for ( i = 0 ; i < chn->count ; i++ ) {
+ okx ( x509_append ( chn->chain, chn->certs[i]->cert ) == 0,
+ file, line );
+ }
+ first = x509_first ( chn->chain );
+ okx ( first != NULL, file, line );
+ okx ( first->raw.len == chn->certs[0]->len, file, line );
+ okx ( memcmp ( first->raw.data, chn->certs[0]->data,
+ first->raw.len ) == 0, file, line );
+}
+#define x509_chain_ok( chn ) \
+ x509_chain_okx ( chn, __FILE__, __LINE__ )
+
+/**
+ * Report certificate chain validation test result
+ *
+ * @v chn Test certificate chain
+ * @v time Test certificate validation time
+ * @v store Test certificate store
+ * @v root Test root certificate list
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_validate_chain_okx ( struct x509_test_chain *chn, time_t time,
+ struct x509_chain *store,
+ struct x509_root *root, const char *file,
+ unsigned int line ) {
+
+ x509_invalidate_chain ( chn->chain );
+ okx ( x509_validate_chain ( chn->chain, time, store, root ) == 0,
+ file, line );
+}
+#define x509_validate_chain_ok( chn, time, store, root ) \
+ x509_validate_chain_okx ( chn, time, store, root, __FILE__, __LINE__ )
+
+/**
+ * Report certificate chain validation failure test result
+ *
+ * @v chn Test certificate chain
+ * @v time Test certificate validation time
+ * @v store Test certificate store
+ * @v root Test root certificate list
+ * @v file Test code file
+ * @v line Test code line
+ */
+static void x509_validate_chain_fail_okx ( struct x509_test_chain *chn,
+ time_t time,
+ struct x509_chain *store,
+ struct x509_root *root,
+ const char *file,
+ unsigned int line ) {
+
+ x509_invalidate_chain ( chn->chain );
+ okx ( x509_validate_chain ( chn->chain, time, store, root ) != 0,
+ file, line );
+}
+#define x509_validate_chain_fail_ok( chn, time, store, root ) \
+ x509_validate_chain_fail_okx ( chn, time, store, root, \
+ __FILE__, __LINE__ )
+
+/**
+ * Perform X.509 self-tests
+ *
+ */
+static void x509_test_exec ( void ) {
+
+ /* Parse all certificates */
+ x509_certificate_ok ( &root_crt );
+ x509_certificate_ok ( &intermediate_crt );
+ x509_certificate_ok ( &leaf_crt );
+ x509_certificate_ok ( &useless_crt );
+ x509_certificate_ok ( &server_crt );
+ x509_certificate_ok ( &not_ca_crt );
+ x509_certificate_ok ( &bad_path_len_crt );
+
+ /* Check cache functionality */
+ x509_cached_ok ( &root_crt );
+ x509_cached_ok ( &intermediate_crt );
+ x509_cached_ok ( &leaf_crt );
+ x509_cached_ok ( &useless_crt );
+ x509_cached_ok ( &server_crt );
+ x509_cached_ok ( &not_ca_crt );
+ x509_cached_ok ( &bad_path_len_crt );
+
+ /* Check all certificate fingerprints */
+ x509_fingerprint_ok ( &root_crt );
+ x509_fingerprint_ok ( &intermediate_crt );
+ x509_fingerprint_ok ( &leaf_crt );
+ x509_fingerprint_ok ( &useless_crt );
+ x509_fingerprint_ok ( &server_crt );
+ x509_fingerprint_ok ( &not_ca_crt );
+ x509_fingerprint_ok ( &bad_path_len_crt );
+
+ /* Check pairwise issuing */
+ x509_check_issuer_ok ( &intermediate_crt, &root_crt );
+ x509_check_issuer_ok ( &leaf_crt, &intermediate_crt );
+ x509_check_issuer_ok ( &useless_crt, &leaf_crt );
+ x509_check_issuer_ok ( &server_crt, &leaf_crt );
+ x509_check_issuer_fail_ok ( &not_ca_crt, &server_crt );
+ x509_check_issuer_ok ( &bad_path_len_crt, &useless_crt );
+
+ /* Check root certificate stores */
+ x509_check_root_ok ( &root_crt, &test_root );
+ x509_check_root_fail_ok ( &intermediate_crt, &test_root );
+ x509_check_root_ok ( &intermediate_crt, &intermediate_root );
+ x509_check_root_fail_ok ( &root_crt, &intermediate_root );
+ x509_check_root_fail_ok ( &root_crt, &dummy_root );
+
+ /* Check certificate validity periods */
+ x509_check_time_ok ( &server_crt, test_time );
+ x509_check_time_fail_ok ( &server_crt, test_expired );
+ x509_check_time_ok ( &root_crt, test_time );
+ x509_check_time_ok ( &root_crt, test_expired );
+ x509_check_time_fail_ok ( &root_crt, test_ca_expired );
+
+ /* Check certificate names */
+ x509_check_name_ok ( &server_crt, "boot.test.ipxe.org" );
+ x509_check_name_ok ( &server_crt, "demo.test.ipxe.org" );
+ x509_check_name_fail_ok ( &server_crt, "incorrect.test.ipxe.org" );
+ x509_check_name_ok ( &server_crt, "anything.alt.test.ipxe.org" );
+ x509_check_name_ok ( &server_crt, "wildcard.alt.test.ipxe.org" );
+ x509_check_name_fail_ok ( &server_crt, "sub.domain.alt.test.ipxe.org" );
+ x509_check_name_fail_ok ( &server_crt, "alt.test.ipxe.org" );
+ x509_check_name_fail_ok ( &server_crt, "test.ipxe.org" );
+ x509_check_name_fail_ok ( &server_crt, "ipxe.org" );
+ x509_check_name_fail_ok ( &server_crt, "org" );
+ x509_check_name_fail_ok ( &server_crt, "" );
+ x509_check_name_ok ( &server_crt, "192.168.0.1" );
+ x509_check_name_fail_ok ( &server_crt, "192.168.0.2" );
+ x509_check_name_ok ( &server_crt, "fe80::69ff:fe50:5845" );
+ x509_check_name_ok ( &server_crt, "FE80:0:0:0:0:69FF:FE50:5845" );
+ x509_check_name_fail_ok ( &server_crt, "fe80::69ff:fe50:5846" );
+
+ /* Parse all certificate chains */
+ x509_chain_ok ( &server_chain );
+ x509_chain_ok ( &broken_server_chain );
+ x509_chain_ok ( &incomplete_server_chain );
+ x509_chain_ok ( &not_ca_chain );
+ x509_chain_ok ( &useless_chain );
+ x509_chain_ok ( &bad_path_len_chain );
+
+ /* Check certificate chains */
+ x509_validate_chain_ok ( &server_chain, test_time,
+ &empty_store, &test_root );
+ x509_validate_chain_ok ( &server_chain, test_time,
+ &empty_store, &intermediate_root );
+ x509_validate_chain_fail_ok ( &server_chain, test_time,
+ &empty_store, &dummy_root );
+ x509_validate_chain_fail_ok ( &broken_server_chain, test_time,
+ &empty_store, &test_root );
+ x509_validate_chain_fail_ok ( &incomplete_server_chain, test_time,
+ &empty_store, &test_root );
+ x509_validate_chain_ok ( &incomplete_server_chain, test_time,
+ &empty_store, &intermediate_root );
+ x509_validate_chain_fail_ok ( &not_ca_chain, test_time,
+ &empty_store, &test_root );
+ x509_validate_chain_ok ( &useless_chain, test_time,
+ &empty_store, &test_root );
+ x509_validate_chain_fail_ok ( &bad_path_len_chain, test_time,
+ &empty_store, &test_root );
+
+ /* Check certificate chain expiry times */
+ x509_validate_chain_fail_ok ( &server_chain, test_expired,
+ &empty_store, &test_root );
+ x509_validate_chain_ok ( &useless_chain, test_expired,
+ &empty_store, &test_root );
+ x509_validate_chain_fail_ok ( &useless_chain, test_ca_expired,
+ &empty_store, &test_root );
+
+ /* Sanity check */
+ assert ( list_empty ( &empty_store.links ) );
+
+ /* Drop chain references */
+ x509_chain_put ( bad_path_len_chain.chain );
+ x509_chain_put ( useless_chain.chain );
+ x509_chain_put ( not_ca_chain.chain );
+ x509_chain_put ( incomplete_server_chain.chain );
+ x509_chain_put ( broken_server_chain.chain );
+ x509_chain_put ( server_chain.chain );
+
+ /* Drop certificate references */
+ x509_put ( bad_path_len_crt.cert );
+ x509_put ( not_ca_crt.cert );
+ x509_put ( server_crt.cert );
+ x509_put ( useless_crt.cert );
+ x509_put ( leaf_crt.cert );
+ x509_put ( intermediate_crt.cert );
+ x509_put ( root_crt.cert );
+}
+
+/** X.509 self-test */
+struct self_test x509_test __self_test = {
+ .name = "x509",
+ .exec = x509_test_exec,
+};
+
+/* Drag in algorithms required for tests */
+REQUIRE_OBJECT ( rsa );
+REQUIRE_OBJECT ( sha1 );
+REQUIRE_OBJECT ( sha256 );
+REQUIRE_OBJECT ( ipv4 );
+REQUIRE_OBJECT ( ipv6 );