app/test: check scatter-gather for crypto drivers
authorTomasz Kulasek <tomaszx.kulasek@intel.com>
Fri, 13 Jan 2017 15:23:17 +0000 (16:23 +0100)
committerPablo de Lara <pablo.de.lara.guarch@intel.com>
Wed, 18 Jan 2017 20:48:56 +0000 (21:48 +0100)
This patch provides unit tests for set of cipher/hash combinations covering
currently implemented crypto PMD's and allowing to verify scatter gather
support.

Signed-off-by: Daniel Mrzyglod <danielx.t.mrzyglod@intel.com>
Signed-off-by: Tomasz Kulasek <tomaszx.kulasek@intel.com>
Acked-by: Declan Doherty <declan.doherty@intel.com>
app/test/test_cryptodev.c
app/test/test_cryptodev.h
app/test/test_cryptodev_aes_test_vectors.h
app/test/test_cryptodev_blockcipher.c
app/test/test_cryptodev_blockcipher.h
app/test/test_cryptodev_gcm_test_vectors.h

index 3eaf1b7..5786fde 100644 (file)
@@ -1736,6 +1736,10 @@ create_wireless_algo_cipher_operation_oop(const uint8_t *iv, const uint8_t iv_le
 
        TEST_ASSERT_NOT_NULL(sym_op->cipher.iv.data, "no room to prepend iv");
 
+       /* For OOP operation both buffers must have the same size */
+       if (ut_params->obuf)
+               rte_pktmbuf_prepend(ut_params->obuf, iv_pad_len);
+
        memset(sym_op->cipher.iv.data, 0, iv_pad_len);
        sym_op->cipher.iv.phys_addr = rte_pktmbuf_mtophys(ut_params->ibuf);
        sym_op->cipher.iv.length = iv_pad_len;
@@ -2556,6 +2560,83 @@ test_kasumi_encryption(const struct kasumi_test_data *tdata)
        return 0;
 }
 
+static int
+test_kasumi_encryption_sgl(const struct kasumi_test_data *tdata)
+{
+       struct crypto_testsuite_params *ts_params = &testsuite_params;
+       struct crypto_unittest_params *ut_params = &unittest_params;
+
+       int retval;
+
+       unsigned int plaintext_pad_len;
+       unsigned int plaintext_len;
+
+       uint8_t buffer[10000];
+       const uint8_t *ciphertext;
+
+       struct rte_cryptodev_info dev_info;
+
+       rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
+       if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
+               printf("Device doesn't support scatter-gather. "
+                               "Test Skipped.\n");
+               return 0;
+       }
+
+       /* Create KASUMI session */
+       retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
+                                       RTE_CRYPTO_CIPHER_OP_ENCRYPT,
+                                       RTE_CRYPTO_CIPHER_KASUMI_F8,
+                                       tdata->key.data, tdata->key.len);
+       if (retval < 0)
+               return retval;
+
+       plaintext_len = ceil_byte_length(tdata->plaintext.len);
+
+
+       /* Append data which is padded to a multiple */
+       /* of the algorithms block size */
+       plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
+
+       ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
+                       plaintext_pad_len, 10, 0);
+
+       pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
+
+       /* Create KASUMI operation */
+       retval = create_wireless_algo_cipher_operation(tdata->iv.data,
+                                       tdata->iv.len,
+                                       tdata->plaintext.len,
+                                       tdata->validCipherOffsetLenInBits.len,
+                                       RTE_CRYPTO_CIPHER_KASUMI_F8);
+       if (retval < 0)
+               return retval;
+
+       ut_params->op = process_crypto_request(ts_params->valid_devs[0],
+                                               ut_params->op);
+       TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
+
+       ut_params->obuf = ut_params->op->sym->m_dst;
+
+       if (ut_params->obuf)
+               ciphertext = rte_pktmbuf_read(ut_params->obuf, tdata->iv.len,
+                               plaintext_len, buffer);
+       else
+               ciphertext = rte_pktmbuf_read(ut_params->ibuf, tdata->iv.len,
+                               plaintext_len, buffer);
+
+       /* Validate obuf */
+       TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
+
+               /* Validate obuf */
+               TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
+                       ciphertext,
+                       tdata->ciphertext.data,
+                       tdata->validCipherLenInBits.len,
+                       "KASUMI Ciphertext data not as expected");
+               return 0;
+}
+
 static int
 test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
 {
@@ -2624,6 +2705,81 @@ test_kasumi_encryption_oop(const struct kasumi_test_data *tdata)
        return 0;
 }
 
+static int
+test_kasumi_encryption_oop_sgl(const struct kasumi_test_data *tdata)
+{
+       struct crypto_testsuite_params *ts_params = &testsuite_params;
+       struct crypto_unittest_params *ut_params = &unittest_params;
+
+       int retval;
+       unsigned int plaintext_pad_len;
+       unsigned int plaintext_len;
+
+       const uint8_t *ciphertext;
+       uint8_t buffer[2048];
+
+       struct rte_cryptodev_info dev_info;
+
+       rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
+       if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
+               printf("Device doesn't support scatter-gather. "
+                               "Test Skipped.\n");
+               return 0;
+       }
+
+       /* Create KASUMI session */
+       retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
+                                       RTE_CRYPTO_CIPHER_OP_ENCRYPT,
+                                       RTE_CRYPTO_CIPHER_KASUMI_F8,
+                                       tdata->key.data, tdata->key.len);
+       if (retval < 0)
+               return retval;
+
+       plaintext_len = ceil_byte_length(tdata->plaintext.len);
+       /* Append data which is padded to a multiple */
+       /* of the algorithms block size */
+       plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
+
+       ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
+                       plaintext_pad_len, 10, 0);
+       ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
+                       plaintext_pad_len, 3, 0);
+
+       /* Append data which is padded to a multiple */
+       /* of the algorithms block size */
+       pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
+
+       /* Create KASUMI operation */
+       retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
+                                       tdata->iv.len,
+                                       tdata->plaintext.len,
+                                       tdata->validCipherOffsetLenInBits.len,
+                                       RTE_CRYPTO_CIPHER_KASUMI_F8);
+       if (retval < 0)
+               return retval;
+
+       ut_params->op = process_crypto_request(ts_params->valid_devs[0],
+                                               ut_params->op);
+       TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
+
+       ut_params->obuf = ut_params->op->sym->m_dst;
+       if (ut_params->obuf)
+               ciphertext = rte_pktmbuf_read(ut_params->obuf, tdata->iv.len,
+                               plaintext_pad_len, buffer);
+       else
+               ciphertext = rte_pktmbuf_read(ut_params->ibuf, tdata->iv.len,
+                               plaintext_pad_len, buffer);
+
+       /* Validate obuf */
+       TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
+               ciphertext,
+               tdata->ciphertext.data,
+               tdata->validCipherLenInBits.len,
+               "KASUMI Ciphertext data not as expected");
+       return 0;
+}
+
+
 static int
 test_kasumi_decryption_oop(const struct kasumi_test_data *tdata)
 {
@@ -2897,6 +3053,85 @@ test_snow3g_encryption_oop(const struct snow3g_test_data *tdata)
        return 0;
 }
 
+static int
+test_snow3g_encryption_oop_sgl(const struct snow3g_test_data *tdata)
+{
+       struct crypto_testsuite_params *ts_params = &testsuite_params;
+       struct crypto_unittest_params *ut_params = &unittest_params;
+
+       int retval;
+       unsigned int plaintext_pad_len;
+       unsigned int plaintext_len;
+       uint8_t buffer[10000];
+       const uint8_t *ciphertext;
+
+       struct rte_cryptodev_info dev_info;
+
+       rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
+       if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
+               printf("Device doesn't support scatter-gather. "
+                               "Test Skipped.\n");
+               return 0;
+       }
+
+       /* Create SNOW 3G session */
+       retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
+                                       RTE_CRYPTO_CIPHER_OP_ENCRYPT,
+                                       RTE_CRYPTO_CIPHER_SNOW3G_UEA2,
+                                       tdata->key.data, tdata->key.len);
+       if (retval < 0)
+               return retval;
+
+       plaintext_len = ceil_byte_length(tdata->plaintext.len);
+       /* Append data which is padded to a multiple of */
+       /* the algorithms block size */
+       plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 16);
+
+       ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
+                       plaintext_pad_len, 10, 0);
+       ut_params->obuf = create_segmented_mbuf(ts_params->mbuf_pool,
+                       plaintext_pad_len, 3, 0);
+
+       TEST_ASSERT_NOT_NULL(ut_params->ibuf,
+                       "Failed to allocate input buffer in mempool");
+       TEST_ASSERT_NOT_NULL(ut_params->obuf,
+                       "Failed to allocate output buffer in mempool");
+
+       pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
+
+       /* Create SNOW 3G operation */
+       retval = create_wireless_algo_cipher_operation_oop(tdata->iv.data,
+                                       tdata->iv.len,
+                                       tdata->validCipherLenInBits.len,
+                                       tdata->validCipherOffsetLenInBits.len,
+                                       RTE_CRYPTO_CIPHER_SNOW3G_UEA2);
+       if (retval < 0)
+               return retval;
+
+       ut_params->op = process_crypto_request(ts_params->valid_devs[0],
+                                               ut_params->op);
+       TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
+
+       ut_params->obuf = ut_params->op->sym->m_dst;
+       if (ut_params->obuf)
+               ciphertext = rte_pktmbuf_read(ut_params->obuf, tdata->iv.len,
+                               plaintext_len, buffer);
+       else
+               ciphertext = rte_pktmbuf_read(ut_params->ibuf, tdata->iv.len,
+                               plaintext_len, buffer);
+
+       TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
+
+       /* Validate obuf */
+       TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
+               ciphertext,
+               tdata->ciphertext.data,
+               tdata->validDataLenInBits.len,
+               "SNOW 3G Ciphertext data not as expected");
+
+       return 0;
+}
+
 /* Shift right a buffer by "offset" bits, "offset" < 8 */
 static void
 buffer_shift_right(uint8_t *buffer, uint32_t length, uint8_t offset)
@@ -3551,6 +3786,84 @@ test_zuc_encryption(const struct zuc_test_data *tdata)
        return 0;
 }
 
+static int
+test_zuc_encryption_sgl(const struct zuc_test_data *tdata)
+{
+       struct crypto_testsuite_params *ts_params = &testsuite_params;
+       struct crypto_unittest_params *ut_params = &unittest_params;
+
+       int retval;
+
+       unsigned int plaintext_pad_len;
+       unsigned int plaintext_len;
+       const uint8_t *ciphertext;
+       uint8_t ciphertext_buffer[2048];
+       struct rte_cryptodev_info dev_info;
+
+       rte_cryptodev_info_get(ts_params->valid_devs[0], &dev_info);
+       if (!(dev_info.feature_flags & RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
+               printf("Device doesn't support scatter-gather. "
+                               "Test Skipped.\n");
+               return 0;
+       }
+
+       plaintext_len = ceil_byte_length(tdata->plaintext.len);
+
+       /* Append data which is padded to a multiple */
+       /* of the algorithms block size */
+       plaintext_pad_len = RTE_ALIGN_CEIL(plaintext_len, 8);
+
+       ut_params->ibuf = create_segmented_mbuf(ts_params->mbuf_pool,
+                       plaintext_pad_len, 10, 0);
+
+       pktmbuf_write(ut_params->ibuf, 0, plaintext_len,
+                       tdata->plaintext.data);
+
+       /* Create ZUC session */
+       retval = create_wireless_algo_cipher_session(ts_params->valid_devs[0],
+                       RTE_CRYPTO_CIPHER_OP_ENCRYPT,
+                       RTE_CRYPTO_CIPHER_ZUC_EEA3,
+                       tdata->key.data, tdata->key.len);
+       if (retval < 0)
+               return retval;
+
+       /* Clear mbuf payload */
+
+       pktmbuf_write(ut_params->ibuf, 0, plaintext_len, tdata->plaintext.data);
+
+       /* Create ZUC operation */
+       retval = create_wireless_algo_cipher_operation(tdata->iv.data,
+                       tdata->iv.len, tdata->plaintext.len,
+                       tdata->validCipherOffsetLenInBits.len,
+                       RTE_CRYPTO_CIPHER_ZUC_EEA3);
+       if (retval < 0)
+               return retval;
+
+       ut_params->op = process_crypto_request(ts_params->valid_devs[0],
+                                               ut_params->op);
+       TEST_ASSERT_NOT_NULL(ut_params->op, "failed to retrieve obuf");
+
+       ut_params->obuf = ut_params->op->sym->m_dst;
+       if (ut_params->obuf)
+               ciphertext = rte_pktmbuf_read(ut_params->obuf,
+                       tdata->iv.len, plaintext_len, ciphertext_buffer);
+       else
+               ciphertext = rte_pktmbuf_read(ut_params->ibuf,
+                       tdata->iv.len, plaintext_len, ciphertext_buffer);
+
+       /* Validate obuf */
+       TEST_HEXDUMP(stdout, "ciphertext:", ciphertext, plaintext_len);
+
+       /* Validate obuf */
+       TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(
+               ciphertext,
+               tdata->ciphertext.data,
+               tdata->validCipherLenInBits.len,
+               "ZUC Ciphertext data not as expected");
+
+       return 0;
+}
+
 static int
 test_zuc_authentication(const struct zuc_hash_test_data *tdata)
 {
@@ -3618,12 +3931,24 @@ test_kasumi_encryption_test_case_1(void)
        return test_kasumi_encryption(&kasumi_test_case_1);
 }
 
+static int
+test_kasumi_encryption_test_case_1_sgl(void)
+{
+       return test_kasumi_encryption_sgl(&kasumi_test_case_1);
+}
+
 static int
 test_kasumi_encryption_test_case_1_oop(void)
 {
        return test_kasumi_encryption_oop(&kasumi_test_case_1);
 }
 
+static int
+test_kasumi_encryption_test_case_1_oop_sgl(void)
+{
+       return test_kasumi_encryption_oop_sgl(&kasumi_test_case_1);
+}
+
 static int
 test_kasumi_encryption_test_case_2(void)
 {
@@ -3695,6 +4020,13 @@ test_snow3g_encryption_test_case_1_oop(void)
        return test_snow3g_encryption_oop(&snow3g_test_case_1);
 }
 
+static int
+test_snow3g_encryption_test_case_1_oop_sgl(void)
+{
+       return test_snow3g_encryption_oop_sgl(&snow3g_test_case_1);
+}
+
+
 static int
 test_snow3g_encryption_test_case_1_offset_oop(void)
 {
@@ -3814,6 +4146,12 @@ test_zuc_encryption_test_case_5(void)
        return test_zuc_encryption(&zuc_test_case_5);
 }
 
+static int
+test_zuc_encryption_test_case_6_sgl(void)
+{
+       return test_zuc_encryption_sgl(&zuc_test_case_1);
+}
+
 static int
 test_zuc_hash_generate_test_case_1(void)
 {
@@ -3998,12 +4336,21 @@ create_gcm_operation(enum rte_crypto_cipher_operation op,
 
        struct rte_crypto_sym_op *sym_op = ut_params->op->sym;
 
-       sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
-                       ut_params->ibuf, auth_tag_len);
-       TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
-                       "no room to append digest");
-       sym_op->auth.digest.phys_addr = rte_pktmbuf_mtophys_offset(
-                       ut_params->ibuf, data_pad_len);
+       if (ut_params->obuf) {
+               sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
+                               ut_params->obuf, auth_tag_len);
+               TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
+                               "no room to append digest");
+               sym_op->auth.digest.phys_addr = pktmbuf_mtophys_offset(
+                               ut_params->obuf, data_pad_len);
+       } else {
+               sym_op->auth.digest.data = (uint8_t *)rte_pktmbuf_append(
+                               ut_params->ibuf, auth_tag_len);
+               TEST_ASSERT_NOT_NULL(sym_op->auth.digest.data,
+                               "no room to append digest");
+               sym_op->auth.digest.phys_addr = pktmbuf_mtophys_offset(
+                               ut_params->ibuf, data_pad_len);
+       }
        sym_op->auth.digest.length = auth_tag_len;
 
        if (op == RTE_CRYPTO_CIPHER_OP_DECRYPT) {
@@ -4050,6 +4397,11 @@ create_gcm_operation(enum rte_crypto_cipher_operation op,
        TEST_HEXDUMP(stdout, "aad:",
                        sym_op->auth.aad.data, aad_len);
 
+       if (ut_params->obuf) {
+               rte_pktmbuf_prepend(ut_params->obuf, iv_pad_len);
+               rte_pktmbuf_prepend(ut_params->obuf, aad_buffer_len);
+       }
+
        sym_op->cipher.data.length = data_len;
        sym_op->cipher.data.offset = aad_buffer_len + iv_pad_len;
 
@@ -6311,6 +6663,14 @@ test_AES_GCM_auth_encrypt_SGL_out_of_place_1500B_2000B(void)
                        &gcm_test_case_SGL_1, OUT_OF_PLACE, 1500, 2000);
 }
 
+static int
+test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg(void)
+{
+       return test_AES_GCM_authenticated_encryption_SGL(
+                       &gcm_test_case_8, OUT_OF_PLACE, 400,
+                       gcm_test_case_8.plaintext.len);
+}
+
 static int
 test_AES_GCM_auth_encrypt_SGL_in_place_1500B(void)
 {
@@ -6683,6 +7043,10 @@ static struct unit_test_suite cryptodev_openssl_testsuite  = {
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_AES_GMAC_authentication_verify_test_case_4),
 
+               /** Scatter-Gather */
+               TEST_CASE_ST(ut_setup, ut_teardown,
+                       test_AES_GCM_auth_encrypt_SGL_out_of_place_400B_1seg),
+
                /** Negative tests */
                TEST_CASE_ST(ut_setup, ut_teardown,
                        authentication_verify_HMAC_SHA1_fail_data_corrupt),
@@ -6750,6 +7114,8 @@ static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {
                /** KASUMI encrypt only (UEA1) */
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_kasumi_encryption_test_case_1),
+               TEST_CASE_ST(ut_setup, ut_teardown,
+                       test_kasumi_encryption_test_case_1_sgl),
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_kasumi_encryption_test_case_2),
                TEST_CASE_ST(ut_setup, ut_teardown,
@@ -6772,6 +7138,10 @@ static struct unit_test_suite cryptodev_sw_kasumi_testsuite  = {
 
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_kasumi_encryption_test_case_1_oop),
+               TEST_CASE_ST(ut_setup, ut_teardown,
+                       test_kasumi_encryption_test_case_1_oop_sgl),
+
+
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_kasumi_decryption_test_case_1_oop),
 
@@ -6824,6 +7194,8 @@ static struct unit_test_suite cryptodev_sw_snow3g_testsuite  = {
 
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_snow3g_encryption_test_case_1_oop),
+               TEST_CASE_ST(ut_setup, ut_teardown,
+                               test_snow3g_encryption_test_case_1_oop_sgl),
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_snow3g_decryption_test_case_1_oop),
 
@@ -6902,6 +7274,8 @@ static struct unit_test_suite cryptodev_sw_zuc_testsuite  = {
                        test_zuc_hash_generate_test_case_4),
                TEST_CASE_ST(ut_setup, ut_teardown,
                        test_zuc_hash_generate_test_case_5),
+               TEST_CASE_ST(ut_setup, ut_teardown,
+                       test_zuc_encryption_test_case_6_sgl),
                TEST_CASES_END() /**< NULL terminate unit test array */
        }
 };
index a9089aa..67354a9 100644 (file)
 #define TRUNCATED_DIGEST_BYTE_LENGTH_SHA384            (24)
 #define TRUNCATED_DIGEST_BYTE_LENGTH_SHA512            (32)
 
+/**
+ * Write (spread) data from buffer to mbuf data
+ *
+ * @param mbuf
+ *   Destination mbuf
+ * @param offset
+ *   Start offset in mbuf
+ * @param len
+ *   Number of bytes to copy
+ * @param buffer
+ *   Continuous source buffer
+ */
+static inline void
+pktmbuf_write(struct rte_mbuf *mbuf, int offset, int len, const uint8_t *buffer)
+{
+       int n = len;
+       int l;
+       struct rte_mbuf *m;
+       char *dst;
+
+       for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next)
+               offset -= m->data_len;
+
+       l = m->data_len - offset;
+
+       /* copy data from first segment */
+       dst = rte_pktmbuf_mtod_offset(m, char *, offset);
+       if (len <= l) {
+               rte_memcpy(dst, buffer, len);
+               return;
+       }
+
+       rte_memcpy(dst, buffer, l);
+       buffer += l;
+       n -= l;
+
+       for (m = m->next; (m != NULL) && (n > 0); m = m->next) {
+               dst = rte_pktmbuf_mtod(m, char *);
+               l = m->data_len;
+               if (n < l) {
+                       rte_memcpy(dst, buffer, n);
+                       return;
+               }
+               rte_memcpy(dst, buffer, l);
+               buffer += l;
+               n -= l;
+       }
+}
+
+static inline uint8_t *
+pktmbuf_mtod_offset(struct rte_mbuf *mbuf, int offset) {
+       struct rte_mbuf *m;
+
+       for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next)
+               offset -= m->data_len;
+
+       if (m == NULL) {
+               printf("pktmbuf_mtod_offset: offset out of buffer\n");
+               return NULL;
+       }
+       return rte_pktmbuf_mtod_offset(m, uint8_t *, offset);
+}
+
+static inline phys_addr_t
+pktmbuf_mtophys_offset(struct rte_mbuf *mbuf, int offset) {
+       struct rte_mbuf *m;
+
+       for (m = mbuf; (m != NULL) && (offset > m->data_len); m = m->next)
+               offset -= m->data_len;
+
+       if (m == NULL) {
+               printf("pktmbuf_mtophys_offset: offset out of buffer\n");
+               return 0;
+       }
+       return rte_pktmbuf_mtophys_offset(m, offset);
+}
+
+static inline struct rte_mbuf *
+create_segmented_mbuf(struct rte_mempool *mbuf_pool, int pkt_len,
+               int nb_segs, uint8_t pattern) {
+
+       struct rte_mbuf *m = NULL, *mbuf = NULL;
+       uint8_t *dst;
+       int data_len = 0;
+       int i, size;
+       int t_len;
+
+       if (pkt_len < 1) {
+               printf("Packet size must be 1 or more (is %d)\n", pkt_len);
+               return NULL;
+       }
+
+       if (nb_segs < 1) {
+               printf("Number of segments must be 1 or more (is %d)\n",
+                               nb_segs);
+               return NULL;
+       }
+
+       t_len = pkt_len >= nb_segs ? pkt_len / nb_segs : 1;
+       size = pkt_len;
+
+       /* Create chained mbuf_src and fill it generated data */
+       for (i = 0; size > 0; i++) {
+
+               m = rte_pktmbuf_alloc(mbuf_pool);
+               if (i == 0)
+                       mbuf = m;
+
+               if (m == NULL) {
+                       printf("Cannot create segment for source mbuf");
+                       goto fail;
+               }
+
+               /* Make sure if tailroom is zeroed */
+               memset(m->buf_addr, pattern, m->buf_len);
+
+               data_len = size > t_len ? t_len : size;
+               dst = (uint8_t *)rte_pktmbuf_append(m, data_len);
+               if (dst == NULL) {
+                       printf("Cannot append %d bytes to the mbuf\n",
+                                       data_len);
+                       goto fail;
+               }
+
+               if (mbuf != m)
+                       rte_pktmbuf_chain(mbuf, m);
+
+               size -= data_len;
+
+       }
+       return mbuf;
+
+fail:
+       if (mbuf)
+               rte_pktmbuf_free(mbuf);
+       return NULL;
+}
+
 #endif /* TEST_CRYPTODEV_H_ */
index 898aae1..e566548 100644 (file)
@@ -857,6 +857,16 @@ static const struct blockcipher_test_case aes_chain_test_cases[] = {
                .pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB |
                        BLOCKCIPHER_TEST_TARGET_PMD_QAT
        },
+       {
+               .test_descr = "AES-192-CTR XCBC Decryption Digest Verify "
+                               "Scatter Gather",
+               .test_data = &aes_test_data_2,
+               .op_mask = BLOCKCIPHER_TEST_OP_AUTH_VERIFY_DEC,
+               .feature_mask = BLOCKCIPHER_TEST_FEATURE_SG |
+                       BLOCKCIPHER_TEST_FEATURE_OOP,
+               .pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB |
+                       BLOCKCIPHER_TEST_TARGET_PMD_QAT
+       },
        {
                .test_descr = "AES-256-CTR HMAC-SHA1 Encryption Digest",
                .test_data = &aes_test_data_3,
@@ -882,6 +892,18 @@ static const struct blockcipher_test_case aes_chain_test_cases[] = {
                        BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL |
                        BLOCKCIPHER_TEST_TARGET_PMD_QAT
        },
+       {
+               .test_descr = "AES-128-CBC HMAC-SHA1 Encryption Digest "
+                               "Scatter Gather",
+               .test_data = &aes_test_data_4,
+               .op_mask = BLOCKCIPHER_TEST_OP_ENC_AUTH_GEN,
+               .feature_mask = BLOCKCIPHER_TEST_FEATURE_SG |
+                       BLOCKCIPHER_TEST_FEATURE_OOP,
+               .pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB |
+                       BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL |
+                       BLOCKCIPHER_TEST_TARGET_PMD_QAT
+
+       },
        {
                .test_descr = "AES-128-CBC HMAC-SHA1 Decryption Digest "
                        "Verify",
@@ -925,6 +947,17 @@ static const struct blockcipher_test_case aes_chain_test_cases[] = {
                .pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB |
                        BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL
        },
+       {
+               .test_descr = "AES-128-CBC HMAC-SHA512 Encryption Digest "
+                               "Scatter Gather Sessionless",
+               .test_data = &aes_test_data_6,
+               .op_mask = BLOCKCIPHER_TEST_OP_ENC_AUTH_GEN,
+               .feature_mask = BLOCKCIPHER_TEST_FEATURE_SESSIONLESS |
+                       BLOCKCIPHER_TEST_FEATURE_SG |
+                       BLOCKCIPHER_TEST_FEATURE_OOP,
+               .pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB |
+                       BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL
+       },
        {
                .test_descr = "AES-128-CBC HMAC-SHA512 Decryption Digest "
                        "Verify",
@@ -934,6 +967,17 @@ static const struct blockcipher_test_case aes_chain_test_cases[] = {
                        BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL |
                        BLOCKCIPHER_TEST_TARGET_PMD_QAT
        },
+       {
+               .test_descr = "AES-128-CBC HMAC-SHA512 Decryption Digest "
+                       "Verify Scatter Gather",
+               .test_data = &aes_test_data_6,
+               .op_mask = BLOCKCIPHER_TEST_OP_AUTH_VERIFY_DEC,
+               .feature_mask = BLOCKCIPHER_TEST_FEATURE_SG |
+                       BLOCKCIPHER_TEST_FEATURE_OOP,
+               .pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_MB |
+                       BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL |
+                       BLOCKCIPHER_TEST_TARGET_PMD_QAT
+       },
        {
                .test_descr = "AES-128-CBC XCBC Encryption Digest",
                .test_data = &aes_test_data_7,
@@ -1044,6 +1088,14 @@ static const struct blockcipher_test_case aes_cipheronly_test_cases[] = {
                        BLOCKCIPHER_TEST_TARGET_PMD_QAT |
                        BLOCKCIPHER_TEST_TARGET_PMD_MB
        },
+       {
+               .test_descr = "AES-192-CBC Encryption Scater gather",
+               .test_data = &aes_test_data_10,
+               .op_mask = BLOCKCIPHER_TEST_OP_ENCRYPT,
+               .feature_mask = BLOCKCIPHER_TEST_FEATURE_SG |
+                       BLOCKCIPHER_TEST_FEATURE_OOP,
+               .pmd_mask = BLOCKCIPHER_TEST_TARGET_PMD_OPENSSL
+       },
        {
                .test_descr = "AES-192-CBC Decryption",
                .test_data = &aes_test_data_10,
index f1fe624..01aef3b 100644 (file)
@@ -41,6 +41,7 @@
 #include <rte_cryptodev_pmd.h>
 
 #include "test.h"
+#include "test_cryptodev.h"
 #include "test_cryptodev_blockcipher.h"
 #include "test_cryptodev_aes_test_vectors.h"
 #include "test_cryptodev_des_test_vectors.h"
@@ -64,6 +65,7 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,
        struct rte_crypto_sym_op *sym_op = NULL;
        struct rte_crypto_op *op = NULL;
        struct rte_cryptodev_sym_session *sess = NULL;
+       struct rte_cryptodev_info dev_info;
 
        int status = TEST_SUCCESS;
        const struct blockcipher_test_data *tdata = t->test_data;
@@ -77,6 +79,19 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,
        uint8_t tmp_src_buf[MBUF_SIZE];
        uint8_t tmp_dst_buf[MBUF_SIZE];
 
+       int nb_segs = 1;
+
+       if (t->feature_mask & BLOCKCIPHER_TEST_FEATURE_SG) {
+               rte_cryptodev_info_get(dev_id, &dev_info);
+               if (!(dev_info.feature_flags &
+                               RTE_CRYPTODEV_FF_MBUF_SCATTER_GATHER)) {
+                       printf("Device doesn't support scatter-gather. "
+                                       "Test Skipped.\n");
+                       return 0;
+               }
+               nb_segs = 3;
+       }
+
        if (tdata->cipher_key.len)
                memcpy(cipher_key, tdata->cipher_key.data,
                        tdata->cipher_key.len);
@@ -101,49 +116,38 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,
        }
 
        /* preparing data */
-       ibuf = rte_pktmbuf_alloc(mbuf_pool);
-       if (!ibuf) {
-               snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
-                       "line %u FAILED: %s",
-                       __LINE__, "Allocation of rte_mbuf failed");
-               status = TEST_FAILED;
-               goto error_exit;
-       }
-       memset(ibuf->buf_addr, src_pattern, ibuf->buf_len);
-
        if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER)
                buf_len += tdata->iv.len;
        if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH)
                buf_len += digest_len;
 
-       buf_p = rte_pktmbuf_append(ibuf, buf_len);
-       if (!buf_p) {
+       /* for contiguous mbuf, nb_segs is 1 */
+       ibuf = create_segmented_mbuf(mbuf_pool,
+                       tdata->ciphertext.len, nb_segs, src_pattern);
+       if (ibuf == NULL) {
                snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN,
                        "line %u FAILED: %s",
-                       __LINE__, "No room to append mbuf");
+                       __LINE__, "Cannot create source mbuf");
                status = TEST_FAILED;
                goto error_exit;
        }
 
-       if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
-               rte_memcpy(buf_p, tdata->iv.data, tdata->iv.len);
-               buf_p += tdata->iv.len;
-       }
-
        /* only encryption requires plaintext.data input,
         * decryption/(digest gen)/(digest verify) use ciphertext.data
         * to be computed
         */
-       if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) {
-               rte_memcpy(buf_p, tdata->plaintext.data,
-                       tdata->plaintext.len);
-               buf_p += tdata->plaintext.len;
-       } else {
-               rte_memcpy(buf_p, tdata->ciphertext.data,
-                       tdata->ciphertext.len);
-               buf_p += tdata->ciphertext.len;
-       }
+       if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT)
+               pktmbuf_write(ibuf, 0, tdata->plaintext.len,
+                               tdata->plaintext.data);
+       else
+               pktmbuf_write(ibuf, 0, tdata->ciphertext.len,
+                               tdata->ciphertext.data);
 
+       if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
+               rte_memcpy(rte_pktmbuf_prepend(ibuf, tdata->iv.len),
+                               tdata->iv.data, tdata->iv.len);
+       }
+       buf_p = rte_pktmbuf_append(ibuf, digest_len);
        if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_VERIFY)
                rte_memcpy(buf_p, tdata->digest.data, digest_len);
        else
@@ -314,17 +318,17 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,
 
                if (t->op_mask & BLOCKCIPHER_TEST_OP_AUTH_GEN) {
                        auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_GENERATE;
-                       sym_op->auth.digest.data = rte_pktmbuf_mtod_offset
-                               (iobuf, uint8_t *, digest_offset);
+                       sym_op->auth.digest.data = pktmbuf_mtod_offset
+                               (iobuf, digest_offset);
                        sym_op->auth.digest.phys_addr =
-                               rte_pktmbuf_mtophys_offset(iobuf,
+                               pktmbuf_mtophys_offset(iobuf,
                                        digest_offset);
                } else {
                        auth_xform->auth.op = RTE_CRYPTO_AUTH_OP_VERIFY;
-                       sym_op->auth.digest.data = rte_pktmbuf_mtod_offset
-                               (sym_op->m_src, uint8_t *, digest_offset);
+                       sym_op->auth.digest.data = pktmbuf_mtod_offset
+                               (sym_op->m_src, digest_offset);
                        sym_op->auth.digest.phys_addr =
-                               rte_pktmbuf_mtophys_offset(sym_op->m_src,
+                               pktmbuf_mtophys_offset(sym_op->m_src,
                                        digest_offset);
                }
 
@@ -403,13 +407,10 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,
        }
 
        if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER) {
-               uint8_t *crypto_res;
+               uint8_t buffer[2048];
                const uint8_t *compare_ref;
                uint32_t compare_len;
 
-               crypto_res = rte_pktmbuf_mtod_offset(iobuf, uint8_t *,
-                       tdata->iv.len);
-
                if (t->op_mask & BLOCKCIPHER_TEST_OP_ENCRYPT) {
                        compare_ref = tdata->ciphertext.data;
                        compare_len = tdata->ciphertext.len;
@@ -418,7 +419,8 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,
                        compare_len = tdata->plaintext.len;
                }
 
-               if (memcmp(crypto_res, compare_ref, compare_len)) {
+               if (memcmp(rte_pktmbuf_read(iobuf, tdata->iv.len, compare_len,
+                               buffer), compare_ref, compare_len)) {
                        snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
                                "FAILED: %s", __LINE__,
                                "Crypto data not as expected");
@@ -431,12 +433,11 @@ test_blockcipher_one_case(const struct blockcipher_test_case *t,
                uint8_t *auth_res;
 
                if (t->op_mask & BLOCKCIPHER_TEST_OP_CIPHER)
-                       auth_res = rte_pktmbuf_mtod_offset(iobuf,
-                               uint8_t *,
-                               tdata->iv.len + tdata->ciphertext.len);
+                       auth_res = pktmbuf_mtod_offset(iobuf,
+                                       tdata->iv.len + tdata->ciphertext.len);
                else
-                       auth_res = rte_pktmbuf_mtod_offset(iobuf,
-                               uint8_t *, tdata->ciphertext.len);
+                       auth_res = pktmbuf_mtod_offset(iobuf,
+                                       tdata->ciphertext.len);
 
                if (memcmp(auth_res, tdata->digest.data, digest_len)) {
                        snprintf(test_msg, BLOCKCIPHER_TEST_MSG_LEN, "line %u "
index fe97e4c..7256f6b 100644 (file)
@@ -45,6 +45,7 @@
 #define BLOCKCIPHER_TEST_FEATURE_OOP                   0x01
 #define BLOCKCIPHER_TEST_FEATURE_SESSIONLESS   0x02
 #define BLOCKCIPHER_TEST_FEATURE_STOPPER       0x04 /* stop upon failing */
+#define BLOCKCIPHER_TEST_FEATURE_SG            0x08 /* Scatter Gather */
 
 #define BLOCKCIPHER_TEST_TARGET_PMD_MB         0x0001 /* Multi-buffer flag */
 #define BLOCKCIPHER_TEST_TARGET_PMD_QAT                        0x0002 /* QAT flag */
index df984fc..45ea3d4 100644 (file)
@@ -450,6 +450,559 @@ static const struct gcm_test_data gcm_test_case_7 = {
        }
 };
 
+static const struct gcm_test_data gcm_test_case_8 = {
+       .key = {
+               .data = {
+                       0xfe, 0xff, 0xe9, 0x92, 0x86, 0x65, 0x73, 0x1c,
+                       0x6d, 0x6a, 0x8f, 0x94, 0x67, 0x30, 0x83, 0x08
+               },
+               .len = 16
+       },
+       .iv = {
+               .data = {
+                       0xca, 0xfe, 0xba, 0xbe, 0xfa, 0xce, 0xdb, 0xad,
+                       0xde, 0xca, 0xf8, 0x88
+               },
+               .len = 12
+       },
+       .aad = {
+               .data = {
+                       0xfe, 0xed, 0xfa, 0xce, 0xde, 0xad, 0xbe, 0xef,
+                       0xfe, 0xed, 0xfa, 0xce
+               },
+               .len = 12
+       },
+       .plaintext = {
+               .data = {
+                       0xC5, 0x34, 0x2E, 0x83, 0xEB, 0x4C, 0x02, 0x03,
+                       0xF7, 0xB2, 0x57, 0x35, 0x26, 0x81, 0x63, 0xAE,
+                       0x1F, 0xCD, 0x2D, 0x02, 0x91, 0x5A, 0xDB, 0x3A,
+                       0xF1, 0x38, 0xD8, 0x75, 0x86, 0x20, 0xCC, 0x1E,
+                       0xE6, 0xDC, 0xFF, 0xB5, 0xEA, 0x0E, 0x18, 0x7A,
+                       0x86, 0x6C, 0xAB, 0x39, 0x2D, 0x90, 0xAC, 0x77,
+                       0x5D, 0xED, 0x65, 0xB3, 0x05, 0x29, 0xBB, 0x09,
+                       0xD0, 0x21, 0x74, 0x6A, 0x67, 0x1C, 0x95, 0x42,
+                       0x55, 0xAD, 0xC8, 0x91, 0x28, 0xFE, 0x16, 0x9A,
+                       0xE1, 0xCB, 0xCD, 0x68, 0x3B, 0xDF, 0x3E, 0x3A,
+                       0x34, 0xFE, 0x9B, 0xFB, 0xF5, 0x15, 0x2A, 0x29,
+                       0x18, 0x99, 0x24, 0xBF, 0xB6, 0x43, 0xDB, 0xD1,
+                       0x69, 0x26, 0x1E, 0x31, 0x2C, 0x8C, 0x3C, 0x6B,
+                       0x7F, 0x06, 0xA6, 0x03, 0xE2, 0x1A, 0x50, 0xFE,
+                       0x7C, 0x69, 0xE5, 0x5F, 0x35, 0x93, 0xE9, 0x20,
+                       0x14, 0xB1, 0xCA, 0x61, 0xE7, 0x9C, 0x89, 0x08,
+                       0xD6, 0xB1, 0xC2, 0x63, 0x1B, 0x86, 0x5E, 0xF1,
+                       0xF5, 0x23, 0x0E, 0x9B, 0xE5, 0xBD, 0x5D, 0x04,
+                       0xF7, 0xEF, 0x8E, 0x46, 0xB0, 0x11, 0x4F, 0x69,
+                       0x62, 0x35, 0x51, 0xB7, 0x24, 0xA2, 0x31, 0xD0,
+                       0x32, 0x4E, 0xB8, 0x44, 0xC7, 0x59, 0xDE, 0x25,
+                       0xEA, 0x2D, 0x00, 0x0E, 0xF1, 0x07, 0xBA, 0xBB,
+                       0x9A, 0xBC, 0x4F, 0x57, 0xB7, 0x13, 0x57, 0xEF,
+                       0xD9, 0xF6, 0x80, 0x69, 0xEA, 0xE8, 0x47, 0x9C,
+                       0x51, 0x71, 0xE6, 0x8F, 0x69, 0x29, 0xB4, 0x60,
+                       0xE8, 0x50, 0xE5, 0xD0, 0x9B, 0xD2, 0x62, 0x6F,
+                       0x09, 0x5C, 0xD1, 0x4B, 0x85, 0xE2, 0xFD, 0xD3,
+                       0xEB, 0x28, 0x55, 0x77, 0x97, 0xCA, 0xD6, 0xA8,
+                       0xDC, 0x35, 0x68, 0xF7, 0x6A, 0xCF, 0x48, 0x3F,
+                       0x49, 0x31, 0x00, 0x65, 0xB7, 0x31, 0x1A, 0x49,
+                       0x75, 0xDE, 0xCE, 0x7F, 0x18, 0xB5, 0x31, 0x9A,
+                       0x64, 0x6D, 0xE5, 0x49, 0x1D, 0x6D, 0xF2, 0x21,
+                       0x9F, 0xF5, 0xFF, 0x7C, 0x41, 0x30, 0x33, 0x06,
+                       0x7B, 0xA4, 0xD8, 0x99, 0xF6, 0xCC, 0xDF, 0xC4,
+                       0x3F, 0xF3, 0xCD, 0xE7, 0x74, 0xC4, 0x4A, 0x19,
+                       0x5C, 0xCA, 0x42, 0x31, 0xF1, 0x3B, 0x65, 0x1C,
+                       0x3D, 0x56, 0x08, 0xBE, 0x15, 0x37, 0x23, 0x50,
+                       0xD6, 0xA3, 0x57, 0x64, 0x25, 0xBE, 0xDA, 0xC2,
+                       0x4E, 0xF5, 0x1A, 0xAD, 0x6F, 0x43, 0x78, 0x21,
+                       0xF9, 0x36, 0x39, 0x1F, 0x5F, 0xF7, 0x1B, 0xA0,
+                       0xEE, 0x8B, 0x4F, 0x8A, 0x9D, 0xD8, 0xED, 0x37,
+                       0xCE, 0x0D, 0x70, 0xE0, 0x3F, 0xE7, 0x11, 0x30,
+                       0x17, 0x1D, 0x03, 0x5E, 0xA0, 0x3D, 0x3F, 0x9E,
+                       0xF5, 0xD3, 0x74, 0x2E, 0xC1, 0xD6, 0xFF, 0xF7,
+                       0x2E, 0xE7, 0x80, 0x88, 0xCF, 0x0E, 0x7F, 0x12,
+                       0x71, 0x62, 0xC7, 0xF1, 0xC4, 0x2B, 0x64, 0x5D,
+                       0x1C, 0x9A, 0xB4, 0xCB, 0xB8, 0x24, 0xB3, 0x0B,
+                       0x33, 0xF2, 0x8A, 0x8F, 0x76, 0xC8, 0x81, 0xDA,
+                       0x1A, 0x10, 0xB5, 0xA9, 0xCD, 0xDC, 0x1A, 0x02,
+                       0xC1, 0xAE, 0x4F, 0x02, 0x1B, 0x13, 0x96, 0x5A,
+                       0x2E, 0x03, 0xA2, 0x68, 0xB2, 0x29, 0xAC, 0x28,
+                       0xB8, 0xDC, 0xD5, 0x27, 0x55, 0xEC, 0x43, 0xDC,
+                       0xB7, 0x49, 0x1D, 0xE1, 0x30, 0x25, 0x81, 0xA6,
+                       0x90, 0x1F, 0x75, 0xBA, 0x19, 0x1E, 0xF7, 0xC5,
+                       0x77, 0x35, 0xEE, 0x68, 0x71, 0x22, 0xA0, 0xB4,
+                       0xCC, 0x99, 0x86, 0x1B, 0x1B, 0xC8, 0x27, 0xFC,
+                       0x6D, 0x8D, 0xE7, 0x8B, 0xC3, 0x40, 0x3D, 0xA8,
+                       0xCB, 0x9B, 0xC4, 0x12, 0x07, 0xDD, 0xA1, 0x92,
+                       0xE5, 0x80, 0x7A, 0xF4, 0xDB, 0x4C, 0xE6, 0xEE,
+                       0xF9, 0xD5, 0x1C, 0x20, 0x18, 0xD3, 0x8F, 0xDF,
+                       0x1C, 0xD3, 0x51, 0x4E, 0x0E, 0xED, 0x06, 0x61,
+                       0xF7, 0xBA, 0x81, 0x3A, 0x2F, 0xEA, 0xED, 0x70,
+                       0xA9, 0xD9, 0x54, 0x4D, 0xFC, 0x1D, 0x19, 0xEA,
+                       0xA6, 0x39, 0x8C, 0x6C, 0x78, 0xA8, 0x05, 0xEB,
+                       0xF2, 0xB5, 0xDE, 0x06, 0x9D, 0x8A, 0x78, 0x2A,
+                       0xF5, 0x50, 0xA4, 0xBD, 0x9B, 0xDA, 0xCA, 0x66,
+                       0xC0, 0x23, 0xAB, 0xE8, 0x95, 0x7E, 0xC9, 0xD2,
+                       0x6F, 0x09, 0xF2, 0x9A, 0x17, 0x89, 0xDA, 0x47,
+                       0x65, 0x8C, 0x20, 0xFA, 0x4E, 0x86, 0x18, 0xEB,
+                       0x7C, 0x08, 0xEC, 0x8A, 0x05, 0x54, 0x96, 0xD2,
+                       0x7A, 0x8A, 0x81, 0x58, 0x75, 0x8C, 0x7B, 0x02,
+                       0xEE, 0x1F, 0x51, 0x88, 0xD0, 0xD1, 0x90, 0x99,
+                       0x0C, 0xAE, 0x51, 0x2E, 0x54, 0x3E, 0xB1, 0x7D,
+                       0xBC, 0xE8, 0x54, 0x93, 0x6D, 0x10, 0x3C, 0xC6,
+                       0x71, 0xF6, 0xF5, 0x0B, 0x07, 0x0A, 0x6E, 0x59,
+                       0x20, 0x45, 0x21, 0x7D, 0x37, 0x64, 0x92, 0x09,
+                       0xA7, 0xE2, 0x34, 0x6F, 0xFC, 0xCC, 0x66, 0x0E,
+                       0x88, 0x1B, 0x19, 0x86, 0x11, 0xD7, 0x81, 0x25,
+                       0xF1, 0x8A, 0x03, 0xB7, 0x7A, 0xF0, 0x98, 0x4A,
+                       0x5C, 0xA1, 0x6D, 0x85, 0xA4, 0x8C, 0x4B, 0x65,
+                       0x9F, 0x72, 0x64, 0x14, 0xBA, 0x74, 0xEE, 0xA3,
+                       0x88, 0xFE, 0x1B, 0xCF, 0x11, 0x4F, 0xD1, 0xAC,
+                       0xFA, 0x14, 0xC3, 0xA7, 0xDD, 0x06, 0x85, 0x4E,
+                       0x64, 0x06, 0x92, 0x9C, 0xDF, 0x06, 0x09, 0xF1,
+                       0x4D, 0xE8, 0xF8, 0x2F, 0x69, 0xB6, 0x8A, 0xAF,
+                       0x25, 0x21, 0xB5, 0x48, 0x59, 0xF8, 0x9D, 0x60,
+                       0xAE, 0x42, 0x11, 0x7A, 0x68, 0x4D, 0x7E, 0x76,
+                       0xB0, 0xD2, 0xE3, 0xD9, 0x24, 0x16, 0x20, 0x0A,
+                       0xEB, 0xE0, 0x68, 0xCB, 0xBC, 0xAB, 0x67, 0xE4,
+                       0xF3, 0x25, 0x1F, 0xD3, 0x85, 0xA7, 0x1D, 0x7E,
+                       0x3C, 0x63, 0xCB, 0xC2, 0x50, 0x90, 0x0F, 0x4B,
+                       0x6E, 0x68, 0x06, 0x84, 0x65, 0xF7, 0xD0, 0xD4,
+                       0x12, 0xED, 0xFA, 0xC9, 0x40, 0xE2, 0xC0, 0xC9,
+                       0x46, 0x22, 0x47, 0x5E, 0x6D, 0xC1, 0x63, 0xDB,
+                       0x51, 0x98, 0xDA, 0x1A, 0xC4, 0xB9, 0xED, 0xE9,
+                       0x09, 0xB9, 0xCF, 0x91, 0x04, 0x1C, 0x63, 0xD8,
+                       0xC5, 0xA5, 0xAE, 0x53, 0x7B, 0xA1, 0x29, 0x83,
+                       0x37, 0xFB, 0xBF, 0x96, 0xBB, 0x24, 0x3D, 0x77,
+                       0x8C, 0x0F, 0xB3, 0x4B, 0x66, 0x9C, 0x54, 0xBB,
+                       0xF6, 0xDD, 0xD1, 0xB4, 0xD2, 0xF6, 0xAA, 0xED,
+                       0x18, 0x56, 0x63, 0x3E, 0x0B, 0xCA, 0xAB, 0x70,
+                       0xBB, 0x63, 0xEA, 0xB1, 0x00, 0x65, 0x90, 0x18,
+                       0xB8, 0x63, 0xA2, 0xF2, 0xB6, 0x1E, 0x61, 0x7B,
+                       0xD5, 0x01, 0xD9, 0x4D, 0xC9, 0x9D, 0x99, 0xC1,
+                       0x57, 0x9D, 0x6F, 0xAE, 0x64, 0xE4, 0x0C, 0x7E,
+                       0xFA, 0x15, 0x5E, 0xB6, 0x43, 0xB8, 0x8B, 0x89,
+                       0x87, 0xCD, 0x4F, 0xAD, 0x30, 0x1E, 0xA5, 0x03,
+                       0x7A, 0xC2, 0x10, 0x42, 0x14, 0x88, 0xD6, 0x7A,
+                       0x6D, 0x56, 0x52, 0x2E, 0x8D, 0x1B, 0x5D, 0x36,
+                       0x27, 0xA0, 0x21, 0x4B, 0x64, 0xF0, 0xC5, 0x41,
+                       0xAD, 0x05, 0x4A, 0x24, 0xE4, 0x70, 0x88, 0x63,
+                       0x12, 0xD0, 0xBC, 0x05, 0x38, 0xD9, 0x41, 0x68,
+                       0x9F, 0x16, 0x9A, 0x54, 0x09, 0x21, 0x64, 0x36,
+                       0x63, 0x97, 0x3A, 0xB5, 0xE0, 0x25, 0x43, 0x8A,
+                       0x6A, 0x59, 0x97, 0xC1, 0x31, 0xA5, 0x66, 0xD2,
+                       0xF0, 0x1C, 0xDF, 0x97, 0x51, 0xD0, 0x61, 0xBA,
+                       0x55, 0x5F, 0xD7, 0x0D, 0xD4, 0x75, 0x8E, 0x79,
+                       0x04, 0x75, 0x00, 0xB9, 0xC0, 0x7A, 0x66, 0x05,
+                       0x9F, 0x2B, 0x44, 0x42, 0x75, 0x0F, 0xD5, 0x15,
+                       0xD6, 0x16, 0x8F, 0x6C, 0x6E, 0xD4, 0x37, 0xCF,
+                       0xB4, 0xDA, 0x93, 0x00, 0x11, 0xFB, 0xBE, 0xEE,
+                       0x3B, 0x6D, 0x1D, 0xBA, 0x33, 0xD1, 0x52, 0x8B,
+                       0x16, 0x39, 0x42, 0x27, 0xE6, 0x56, 0x4C, 0x41,
+                       0x91, 0xB0, 0x98, 0xAE, 0x9B, 0x2D, 0x9B, 0x23,
+                       0x80, 0x4C, 0xEA, 0x98, 0x57, 0x95, 0x28, 0x94,
+                       0x43, 0xD3, 0x88, 0x12, 0xDF, 0x89, 0x5A, 0x7B,
+                       0xC5, 0xCB, 0x36, 0x54, 0x65, 0x74, 0xB8, 0x4E,
+                       0xE2, 0x4D, 0x01, 0xD5, 0x9C, 0x82, 0xB9, 0x1A,
+                       0x09, 0xD2, 0xCE, 0x04, 0x36, 0xD8, 0x41, 0xAC,
+                       0x4C, 0xAD, 0xC6, 0x52, 0x91, 0x1A, 0x06, 0x6D,
+                       0xFC, 0xAB, 0x29, 0x93, 0x87, 0x88, 0xB9, 0x8C,
+                       0xFA, 0x57, 0x2B, 0x05, 0x03, 0xD0, 0x18, 0xED,
+                       0x7A, 0x7B, 0x81, 0x6A, 0x97, 0x65, 0x5B, 0x90,
+                       0xDE, 0xA9, 0xFC, 0x8F, 0xFC, 0xBB, 0x98, 0xD8,
+                       0xFA, 0x32, 0x3F, 0x3F, 0x7F, 0x74, 0x65, 0x38,
+                       0xC4, 0x28, 0xEC, 0x27, 0x1F, 0x28, 0x01, 0xB1,
+                       0xAF, 0x2B, 0x8A, 0x05, 0x38, 0x7B, 0x77, 0xC9,
+                       0x61, 0x77, 0x34, 0x2C, 0x22, 0xE5, 0xEB, 0xDC,
+                       0x9D, 0x18, 0x6E, 0x23, 0x25, 0x52, 0x69, 0xB7,
+                       0x05, 0xDB, 0x66, 0x5D, 0xEA, 0x76, 0x83, 0x82,
+                       0x97, 0x39, 0xAF, 0xC0, 0x50, 0x81, 0x18, 0x0D,
+                       0x22, 0xFA, 0xB7, 0x44, 0x5C, 0x3F, 0x69, 0xF3,
+                       0xAC, 0xC5, 0x63, 0x9F, 0xD8, 0x72, 0x7E, 0x9A,
+                       0xC2, 0xEB, 0x79, 0xD0, 0x74, 0x65, 0xE8, 0xCA,
+                       0xFD, 0xA8, 0x7D, 0x23, 0x07, 0x99, 0x3E, 0xAF,
+                       0xDB, 0x67, 0x10, 0xC0, 0xE5, 0x61, 0x77, 0xC6,
+                       0x8D, 0xC4, 0x0E, 0xAA, 0x55, 0xE3, 0xC0, 0xC7,
+                       0xA5, 0x36, 0x28, 0x61, 0xDB, 0x16, 0x96, 0x5E,
+                       0x01, 0x47, 0x82, 0xE3, 0xEB, 0x20, 0x3F, 0x10,
+                       0xFA, 0x5A, 0xBC, 0xD3, 0xF9, 0xCE, 0x04, 0x87,
+                       0x51, 0x07, 0xF9, 0xD0, 0xE7, 0x6D, 0xCB, 0xCC,
+                       0xC4, 0x15, 0x00, 0xE2, 0xDC, 0x8E, 0x7B, 0x5C,
+                       0x9A, 0xF2, 0x78, 0x70, 0x4D, 0xA1, 0xAA, 0xB5,
+                       0x13, 0xCC, 0x71, 0x66, 0x5A, 0x79, 0x13, 0x3B,
+                       0x12, 0xCD, 0x40, 0x30, 0x5A, 0x49, 0xD4, 0x20,
+                       0xED, 0xCF, 0x4A, 0x75, 0xE6, 0xD5, 0xDD, 0x0F,
+                       0xD4, 0xBE, 0x98, 0x9F, 0xD7, 0x1F, 0xC0, 0x02,
+                       0x31, 0xFA, 0x67, 0x37, 0x25, 0x86, 0x56, 0x85,
+                       0x2B, 0xA2, 0x57, 0xCD, 0x8E, 0x74, 0xE7, 0x69,
+                       0xEE, 0x33, 0x5A, 0x3F, 0xCD, 0x1E, 0xE3, 0xB9,
+                       0xAA, 0x52, 0xF5, 0x22, 0x4E, 0xE3, 0xFF, 0xC8,
+                       0xE3, 0x13, 0xA3, 0x9A, 0x63, 0x23, 0xC3, 0xD7,
+                       0xE5, 0x88, 0x3E, 0x0A, 0x4B, 0xA5, 0x01, 0xE6,
+                       0x13, 0xCF, 0xED, 0xEE, 0x2A, 0x58, 0x09, 0x3F,
+                       0x2F, 0x28, 0xE7, 0xC4, 0x6B, 0xEC, 0x49, 0x51,
+                       0x79, 0x8F, 0xD5, 0x19, 0x5D, 0xA5, 0x10, 0xCE,
+                       0x8E, 0xF6, 0x26, 0x78, 0x7A, 0xA8, 0x11, 0x52,
+                       0x5F, 0x97, 0x14, 0xC9, 0x29, 0x87, 0xB8, 0xA0,
+                       0x2D, 0xE6, 0xA7, 0x2A, 0xD4, 0xFF, 0xEB, 0xBA,
+                       0xFD, 0x58, 0x39, 0x33, 0xB1, 0xCE, 0x0E, 0x78,
+                       0x67, 0x1E, 0xA1, 0x92, 0x77, 0x63, 0xF8, 0xC0,
+                       0x02, 0x49, 0x73, 0xC0, 0xA1, 0x26, 0x83, 0x04,
+                       0x9A, 0x5D, 0x85, 0x68, 0x2A, 0x2F, 0xCB, 0x88,
+                       0x8D, 0x14, 0xB1, 0x33, 0xFA, 0xFB, 0xE9, 0x05,
+                       0xBE, 0x24, 0x1A, 0x6B, 0x29, 0x2B, 0x3F, 0x52,
+                       0x8F, 0xFB, 0xE6, 0x02, 0x77, 0x50, 0x71, 0xDB,
+                       0xE9, 0x92, 0x3F, 0xE1, 0x20, 0x62, 0x80, 0xAE,
+                       0xA4, 0x98, 0xC6, 0xCD, 0xE0, 0xB1, 0xC3, 0x33,
+                       0xB1, 0xC5, 0x91, 0x3C, 0x19, 0x34, 0xA8, 0xD9,
+                       0xB3, 0x25, 0x69, 0xE3, 0x9C, 0x5F, 0x78, 0xD0,
+                       0x83, 0x1F, 0xAB, 0x85, 0x13, 0x56, 0x69, 0xB5,
+                       0x06, 0x47, 0x62, 0x37, 0x27, 0x15, 0x14, 0x05,
+                       0x4A, 0xF4, 0x6A, 0x68, 0x2A, 0x6A, 0xC3, 0x5A,
+                       0xDF, 0xB5, 0xAE, 0x2F, 0x8D, 0x8F, 0x21, 0xDB,
+                       0x33, 0x00, 0x9B, 0xD4, 0xC4, 0x08, 0x3B, 0x81,
+                       0x63, 0x4C, 0xB0, 0x39, 0x4C, 0x0A, 0xD5, 0x71,
+                       0x3E, 0x5A, 0x50, 0x58, 0x9C, 0x07, 0x89, 0x79,
+                       0x79, 0x2F, 0x0B, 0xD9, 0x50, 0xBC, 0xCF, 0x46,
+                       0x7A, 0x68, 0x5C, 0xBF, 0x1E, 0x49, 0x77, 0x92,
+                       0x85, 0x11, 0x39, 0xA6, 0x2F, 0xDA, 0x7B, 0xFA,
+                       0x72, 0x87, 0x06, 0xCD, 0x84, 0x41, 0x20, 0x1B,
+                       0x66, 0x3F, 0x42, 0x0C, 0x9E, 0x19, 0xD3, 0x18,
+                       0x57, 0xA0, 0xEE, 0x16, 0x3A, 0xC7, 0xF9, 0xD3,
+                       0x8B, 0xC9, 0x24, 0x70, 0x70, 0x51, 0x7C, 0x06,
+                       0x68, 0xD3, 0x29, 0xC9, 0x85, 0x9A, 0x1C, 0xE6,
+                       0x8C, 0x17, 0xF4, 0x88, 0xDF, 0xEA, 0xFF, 0x44,
+                       0x8D, 0x54, 0xBE, 0x22, 0x07, 0xA5, 0x7C, 0x0C,
+                       0xF4, 0x8D, 0xB1, 0x0C, 0x07, 0xED, 0xBD, 0x28,
+                       0x19, 0xDA, 0x07, 0x71, 0xA8, 0xA1, 0xE0, 0xDD,
+                       0xEE, 0x08, 0x18, 0xA5, 0xBD, 0xDD, 0x32, 0x0B,
+                       0x70, 0x1C, 0xD9, 0xEE, 0x19, 0xC2, 0xAE, 0x5C,
+                       0xE3, 0x02, 0x74, 0x70, 0x96, 0x61, 0xB1, 0x73,
+                       0x3B, 0xD6, 0x74, 0xC0, 0x82, 0xA9, 0x1F, 0xE0,
+                       0xF1, 0x22, 0x50, 0xF3, 0x9F, 0xE5, 0x13, 0x92,
+                       0xFC, 0x0A, 0x1A, 0x3C, 0xB4, 0x46, 0xFB, 0x81,
+                       0x00, 0x84, 0xA4, 0x5E, 0x6B, 0x8C, 0x25, 0x6E,
+                       0xD7, 0xB7, 0x3B, 0x01, 0x65, 0xFB, 0x0B, 0x46,
+                       0x67, 0x27, 0x2D, 0x51, 0xAD, 0xB5, 0xE0, 0x85,
+                       0xC2, 0x95, 0xA3, 0xE3, 0x68, 0x4D, 0x9E, 0x8C,
+                       0x11, 0x53, 0xF0, 0xB2, 0x85, 0xFA, 0x52, 0x4E,
+                       0xEC, 0xF9, 0xB7, 0x3C, 0x89, 0x2C, 0x4D, 0x32,
+                       0x9A, 0xCB, 0x17, 0xF3, 0x16, 0xBF, 0x44, 0x40,
+                       0xE9, 0x5E, 0x51, 0x8C, 0x1E, 0x52, 0x0A, 0xC2,
+                       0xCD, 0xA5, 0xAA, 0x03, 0x27, 0xB0, 0x8F, 0x64,
+                       0xDB, 0xD7, 0x03, 0x01, 0x8A, 0x24, 0x28, 0x7E,
+                       0x53, 0x6F, 0x24, 0xFD, 0xAA, 0xE3, 0x78, 0xB6,
+                       0xA5, 0x5D, 0x5A, 0x67, 0x20, 0xE2, 0xBE, 0x3A,
+                       0x2B, 0xE7, 0x86, 0x11, 0xDD, 0x96, 0xCB, 0x09,
+                       0x65, 0xA0, 0x36, 0xF9, 0xB0, 0x20, 0x21, 0x8E,
+                       0xDB, 0xC0, 0x73, 0xC7, 0x79, 0xD8, 0xDA, 0xC2,
+                       0x66, 0x13, 0x64, 0x34, 0x0C, 0xE1, 0x22, 0x24,
+                       0x61, 0x67, 0x08, 0x39, 0x97, 0x3F, 0x33, 0x96,
+                       0xF2, 0x44, 0x18, 0x75, 0xBB, 0xF5, 0x6A, 0x5C,
+                       0x2C, 0xAE, 0x2A, 0x79, 0x3D, 0x47, 0x19, 0x53,
+                       0x50, 0x6C, 0x9F, 0xB3, 0x82, 0x55, 0x09, 0x78,
+                       0x7B, 0xAD, 0xBC, 0x05, 0x6F, 0xC8, 0x3D, 0xB6,
+                       0x7B, 0x30, 0xE6, 0xBB, 0x8B, 0xD0, 0x2F, 0xA6,
+                       0x15, 0xCC, 0x77, 0x8C, 0x21, 0xBA, 0x03, 0xED,
+                       0x56, 0x85, 0x82, 0x4F, 0x97, 0x8C, 0x59, 0x4F,
+                       0x53, 0x5A, 0xD2, 0x70, 0xD9, 0x07, 0xB3, 0xBD,
+                       0x1D, 0x3E, 0x97, 0xD4, 0x7D, 0x93, 0x35, 0xA4,
+                       0x82, 0x6E, 0xEA, 0x4B, 0xC8, 0x6C, 0xF5, 0xE6,
+                       0xEB, 0xAF, 0x11, 0xB0, 0xB4, 0x71, 0x8F, 0x7B,
+                       0xC4, 0x8C, 0xE2, 0x66, 0x51, 0x31, 0x99, 0x01,
+                       0x5B, 0xE7, 0x48, 0xF8, 0x4C, 0xE3, 0x9A, 0x77,
+                       0xF1, 0xC6, 0x09, 0xDE, 0x76, 0xD4, 0xE3, 0x5C,
+                       0xDF, 0xA3, 0xEC, 0x3C, 0x86, 0x7C, 0xA5, 0x3F,
+                       0x8D, 0x2A, 0xF3, 0x0B, 0x54, 0xB7, 0x54, 0xA2,
+                       0xC1, 0x69, 0xC0, 0x6F, 0x1C, 0x1C, 0x76, 0xD8,
+                       0x9F, 0x7A, 0x32, 0xB0, 0xA1, 0xA6, 0x9B, 0xB7,
+                       0x21, 0x56, 0x28, 0x2D, 0xB6, 0x97, 0x03, 0x5E,
+                       0x65, 0xE3, 0x74, 0x9A, 0x96, 0x7A, 0xF9, 0xF5,
+                       0xDD, 0x85, 0xCA, 0x4C, 0xB4, 0x03, 0x6A, 0xCD,
+                       0xB6, 0x01, 0xDC, 0x8B, 0xD8, 0x73, 0x8F, 0x4D,
+                       0x7F, 0xD6, 0x71, 0xEC, 0xD7, 0xC6, 0x0B, 0x5F,
+                       0x09, 0x21, 0xB2, 0x78, 0xA8, 0xAF, 0xAD, 0x2C,
+                       0xD4, 0x93, 0x9F, 0x71, 0xF7, 0x05, 0x89, 0x42,
+                       0xC9, 0x15, 0x6F, 0x2D, 0xE0, 0xBA, 0xC3, 0xD6,
+                       0xBF, 0xAC, 0xF8, 0x24, 0x58, 0x79, 0xA9, 0xC4,
+                       0xB4, 0x49, 0x3E, 0x0B, 0x9E, 0x5E, 0xE4, 0xA6,
+                       0x8B, 0xE8, 0xDE, 0xFB, 0x4A, 0xF1, 0x69, 0x9D,
+                       0x4F, 0x77, 0x83, 0x78, 0x55, 0x19, 0x42, 0x45,
+                       0xBF, 0xBD, 0xBD, 0x12, 0x0F, 0xEF, 0x8D, 0x04,
+                       0xD8, 0x5C, 0xF2, 0xC9, 0xF1, 0xA6, 0xE0, 0x3E,
+                       0x22, 0xA8, 0xA2, 0x5E, 0x66, 0xE9, 0xAB, 0xB4,
+                       0x71, 0xBE, 0x4B, 0x3F, 0xBE, 0xC4, 0xBA, 0x4A
+               },
+               .len = 2048
+       },
+       .ciphertext = {
+               .data = {
+                       0x5E, 0x86, 0x02, 0x64, 0x32, 0xBF, 0x70, 0xC2,
+                       0x19, 0x99, 0x7F, 0x47, 0x0D, 0xA4, 0x91, 0xA8,
+                       0x7A, 0xC0, 0xA5, 0x7E, 0xA8, 0x6C, 0x88, 0x00,
+                       0xEA, 0xB5, 0x96, 0x6B, 0x25, 0xBD, 0xE7, 0x42,
+                       0xDB, 0x35, 0xE7, 0x92, 0x2B, 0x00, 0x82, 0x35,
+                       0xD4, 0x2C, 0xCF, 0x47, 0xC8, 0xB2, 0xB3, 0x57,
+                       0xF7, 0x24, 0x83, 0x7F, 0xC5, 0x2E, 0xF1, 0xC9,
+                       0x57, 0x1A, 0xEF, 0xC2, 0x3A, 0x8C, 0x1E, 0x92,
+                       0x88, 0x05, 0xAF, 0x55, 0xE6, 0x0C, 0xA7, 0x6B,
+                       0x59, 0x62, 0x32, 0x21, 0xF1, 0xFF, 0xB5, 0x5B,
+                       0x22, 0x26, 0x6F, 0x0A, 0x36, 0xDC, 0x0D, 0x16,
+                       0x3B, 0x4E, 0x7C, 0xA3, 0x75, 0x30, 0x3F, 0xB0,
+                       0x99, 0x38, 0x42, 0x8E, 0x89, 0xA3, 0x7C, 0x99,
+                       0x2F, 0x0A, 0xA1, 0xC7, 0xFD, 0x2D, 0x21, 0x8F,
+                       0xBD, 0xD4, 0x11, 0xEA, 0x55, 0xF5, 0x6A, 0x50,
+                       0x90, 0x3B, 0x60, 0x57, 0xE1, 0x86, 0x1E, 0x50,
+                       0x28, 0x67, 0x3F, 0xD2, 0xF3, 0xBD, 0xFA, 0xEE,
+                       0xD6, 0x5A, 0x38, 0x30, 0xA3, 0xDD, 0x78, 0xC4,
+                       0x37, 0x59, 0x52, 0xC0, 0x92, 0x54, 0xC7, 0x53,
+                       0xF0, 0xE6, 0xA9, 0x63, 0x1F, 0x9B, 0x97, 0xFB,
+                       0x40, 0x23, 0xFE, 0x52, 0x6A, 0xF0, 0x3A, 0x94,
+                       0xEB, 0x6A, 0x9E, 0x8F, 0xC5, 0x05, 0x9C, 0x04,
+                       0x1B, 0x00, 0x34, 0x96, 0x12, 0xDA, 0x60, 0xC6,
+                       0xAA, 0x1A, 0x3E, 0xEB, 0x70, 0x17, 0x10, 0xBC,
+                       0xF5, 0xC2, 0xE2, 0x71, 0xF3, 0xB8, 0x1D, 0xCE,
+                       0x47, 0x94, 0x21, 0x71, 0x34, 0x8C, 0xCC, 0xDD,
+                       0x27, 0xCE, 0x6F, 0x68, 0xFF, 0x91, 0x4E, 0xC4,
+                       0xA0, 0xCA, 0xB0, 0x4F, 0x17, 0x53, 0x73, 0x92,
+                       0x6C, 0xA8, 0x16, 0x06, 0xE3, 0xD9, 0x92, 0x99,
+                       0xBE, 0xB0, 0x7D, 0x56, 0xF2, 0x72, 0x30, 0xDA,
+                       0xC4, 0x4E, 0xF4, 0xA6, 0x8F, 0xD2, 0xC7, 0x8A,
+                       0xA2, 0xFC, 0xF5, 0x63, 0x17, 0x48, 0x56, 0x4D,
+                       0xBE, 0x94, 0xFE, 0xF5, 0xB1, 0xA9, 0x96, 0xAB,
+                       0x3F, 0x2D, 0xD4, 0x15, 0xEE, 0x4F, 0xFA, 0x2C,
+                       0xBE, 0x91, 0xB7, 0xBC, 0x18, 0xC8, 0xDB, 0x02,
+                       0x20, 0x29, 0xF1, 0xC1, 0x88, 0x8C, 0x8D, 0xD1,
+                       0xB3, 0x4E, 0x93, 0x96, 0xDD, 0x22, 0xAB, 0x55,
+                       0xB5, 0x9F, 0x8B, 0x20, 0xAE, 0xC6, 0x0E, 0x26,
+                       0xC6, 0xFE, 0x2D, 0x5F, 0x95, 0x89, 0x06, 0x15,
+                       0x3D, 0x88, 0x16, 0xEC, 0x9B, 0x4A, 0x1B, 0x5D,
+                       0x2E, 0xB2, 0x13, 0x56, 0x9F, 0x33, 0xB3, 0x45,
+                       0xBF, 0x5F, 0x25, 0x7E, 0x75, 0x22, 0xD2, 0xE6,
+                       0x9F, 0xAC, 0x2D, 0xFD, 0x99, 0xC2, 0x9B, 0xFC,
+                       0xD7, 0x7A, 0x9B, 0x05, 0x30, 0x0F, 0xB7, 0x4A,
+                       0xFE, 0x24, 0xDD, 0x39, 0x9B, 0xBB, 0x2F, 0xDD,
+                       0xF9, 0xFB, 0xCA, 0x6C, 0x87, 0xBA, 0x73, 0xD4,
+                       0x85, 0x7B, 0xB2, 0x6F, 0x5C, 0xD8, 0xFB, 0xE9,
+                       0x41, 0x24, 0x3A, 0x3B, 0x4F, 0x91, 0x77, 0xA2,
+                       0x35, 0x78, 0xE5, 0x4C, 0xFE, 0x8B, 0x04, 0x03,
+                       0xD3, 0x84, 0xA9, 0x1C, 0xA7, 0x7C, 0x45, 0x13,
+                       0x7D, 0xC5, 0x0A, 0x2F, 0x02, 0xF8, 0x56, 0xD5,
+                       0x5F, 0x35, 0xED, 0x06, 0xBF, 0x67, 0xBA, 0x51,
+                       0x02, 0x95, 0x36, 0xF2, 0x9A, 0xBA, 0x9D, 0xF6,
+                       0xD6, 0x77, 0x50, 0xC9, 0xFC, 0x1E, 0x32, 0xB5,
+                       0x2F, 0xEA, 0x3C, 0x76, 0xB4, 0xE1, 0xCC, 0x42,
+                       0xEB, 0x71, 0x79, 0xD3, 0x7D, 0xB7, 0xC0, 0x88,
+                       0x25, 0x81, 0xE8, 0xC0, 0xB8, 0x38, 0x7E, 0x7B,
+                       0xFD, 0x18, 0xAB, 0x08, 0xB2, 0x71, 0xA5, 0xAD,
+                       0xA7, 0xBE, 0x48, 0x5F, 0x86, 0xE2, 0x41, 0x3D,
+                       0x7C, 0x37, 0x7A, 0xAB, 0xDB, 0xE0, 0x3B, 0x3D,
+                       0xB6, 0xE8, 0x23, 0x7C, 0xF1, 0x8F, 0xBA, 0xB7,
+                       0xE9, 0x78, 0x0B, 0xCA, 0x67, 0xA8, 0x10, 0x36,
+                       0xEB, 0x72, 0xED, 0xDD, 0xF0, 0x5C, 0x74, 0x8E,
+                       0xE5, 0x2A, 0xAE, 0x6E, 0xC4, 0xF1, 0xFC, 0xD8,
+                       0xEE, 0x56, 0x07, 0x88, 0x02, 0xDC, 0x9D, 0xB7,
+                       0xF9, 0x13, 0xE1, 0xE1, 0x9D, 0x89, 0x26, 0x0B,
+                       0x23, 0x74, 0x4A, 0x43, 0xAA, 0xA0, 0xA8, 0x97,
+                       0x85, 0x15, 0x58, 0xAB, 0x2B, 0xB5, 0xDA, 0x1A,
+                       0xBA, 0x29, 0x62, 0xCF, 0xDD, 0xA3, 0xBA, 0x9D,
+                       0x7D, 0x83, 0xA5, 0x18, 0xD4, 0x03, 0x0F, 0x61,
+                       0x9F, 0xB1, 0x7E, 0xEC, 0xD2, 0x6E, 0xAF, 0xCF,
+                       0x1E, 0xC1, 0x88, 0x97, 0x99, 0xD6, 0xBF, 0x47,
+                       0xB9, 0x0A, 0x69, 0x11, 0x3A, 0x55, 0x8B, 0x1D,
+                       0x2D, 0xFF, 0x78, 0xC8, 0xDE, 0x82, 0x29, 0xD6,
+                       0x08, 0x3C, 0xC4, 0xCB, 0x2F, 0x01, 0xD0, 0xE8,
+                       0xB1, 0x75, 0x5E, 0x23, 0xE0, 0x37, 0x7C, 0x1C,
+                       0xB6, 0xD9, 0x47, 0xDE, 0x23, 0x87, 0xD3, 0x68,
+                       0x47, 0x46, 0x78, 0xF3, 0xBF, 0x54, 0xA3, 0xB9,
+                       0x54, 0xD5, 0xC5, 0x0A, 0x7C, 0x92, 0x2A, 0xC2,
+                       0x14, 0x76, 0xA6, 0x5C, 0x6D, 0x0B, 0x94, 0x56,
+                       0x00, 0x6B, 0x5C, 0x27, 0xDE, 0x77, 0x9B, 0xF1,
+                       0xB1, 0x8C, 0xA7, 0x49, 0x77, 0xFC, 0x4E, 0x29,
+                       0x23, 0x8F, 0x2F, 0xF7, 0x83, 0x8D, 0x36, 0xD9,
+                       0xAB, 0x0E, 0x78, 0xF5, 0x90, 0x05, 0xB9, 0x79,
+                       0x70, 0x88, 0x59, 0x6F, 0xE2, 0xC5, 0xD7, 0x80,
+                       0x95, 0x04, 0x29, 0xE0, 0xFA, 0x37, 0xE8, 0x8B,
+                       0xC5, 0x21, 0x51, 0x1A, 0x62, 0xCE, 0x93, 0xAF,
+                       0x1A, 0xFE, 0xC3, 0x6F, 0x86, 0x94, 0x5E, 0x13,
+                       0xA6, 0x9A, 0x26, 0xF0, 0xB5, 0x7C, 0x41, 0x9A,
+                       0x80, 0xB8, 0x84, 0x5A, 0x55, 0xA9, 0xB0, 0x6A,
+                       0xFA, 0xEB, 0x46, 0x32, 0x0B, 0xE2, 0x9C, 0x65,
+                       0x86, 0x11, 0x39, 0x7E, 0xAF, 0x93, 0x19, 0x09,
+                       0x70, 0x40, 0x80, 0x14, 0xBA, 0x1D, 0xB3, 0x62,
+                       0x5B, 0xF3, 0x9A, 0x21, 0x98, 0x7E, 0x63, 0xB6,
+                       0x1A, 0xBD, 0x65, 0x98, 0x35, 0x2A, 0xA9, 0x76,
+                       0x29, 0x59, 0x84, 0x25, 0x81, 0xB8, 0xDE, 0x25,
+                       0x32, 0x10, 0x50, 0xB7, 0xD3, 0xB3, 0x69, 0xC8,
+                       0xE1, 0x33, 0xCB, 0x9E, 0x9C, 0x7A, 0x7C, 0xD2,
+                       0x6C, 0x92, 0x97, 0xA9, 0xFA, 0xAF, 0x30, 0xBA,
+                       0x9A, 0xB3, 0x3D, 0x9A, 0xE5, 0x0A, 0x9B, 0x8D,
+                       0x89, 0xE2, 0x2B, 0xB8, 0xBC, 0xF0, 0x23, 0xFF,
+                       0x7B, 0x0D, 0x00, 0x36, 0xEE, 0x79, 0xCB, 0xA5,
+                       0x70, 0x4C, 0x66, 0x02, 0x79, 0x2E, 0x5B, 0x83,
+                       0xCE, 0x55, 0x8B, 0x89, 0xD6, 0xE3, 0x71, 0x63,
+                       0xBC, 0xB1, 0x5F, 0x67, 0xB4, 0x7E, 0x05, 0x0D,
+                       0xAC, 0x6D, 0x4E, 0x2C, 0xA5, 0xF4, 0x47, 0x89,
+                       0xAC, 0x5E, 0xBE, 0x2F, 0xFC, 0x9B, 0x2F, 0x0B,
+                       0xBE, 0x63, 0x54, 0x97, 0xBB, 0x23, 0x27, 0xCD,
+                       0xB9, 0xB2, 0x28, 0x0D, 0xA4, 0x78, 0x2C, 0xAB,
+                       0xD1, 0xC9, 0x94, 0x40, 0x54, 0xF2, 0x35, 0x61,
+                       0x49, 0x01, 0x87, 0x55, 0xA5, 0xB5, 0x1E, 0x84,
+                       0x92, 0x9E, 0xC1, 0xA4, 0x0B, 0x66, 0x2B, 0xF8,
+                       0xAF, 0xC3, 0x1E, 0xAF, 0x66, 0x3F, 0x6F, 0x5F,
+                       0x70, 0xEC, 0x25, 0x29, 0xE4, 0x65, 0xB2, 0x04,
+                       0x47, 0xF6, 0x3C, 0xB5, 0x5F, 0x66, 0x9F, 0xA4,
+                       0x1B, 0xFC, 0xA2, 0xD5, 0x3E, 0x84, 0xBA, 0x88,
+                       0x0D, 0xF1, 0x6A, 0xF2, 0xF6, 0x1D, 0xF1, 0xA3,
+                       0x45, 0xB2, 0x51, 0xD8, 0xA2, 0x8F, 0x55, 0xA6,
+                       0x89, 0xC4, 0x15, 0xD5, 0x73, 0xA8, 0xB1, 0x31,
+                       0x66, 0x9E, 0xC1, 0x43, 0xE1, 0x5D, 0x4E, 0x04,
+                       0x84, 0x8F, 0xF2, 0xBC, 0xE1, 0x4E, 0x4D, 0x60,
+                       0x81, 0xCA, 0x53, 0x34, 0x95, 0x17, 0x3B, 0xAE,
+                       0x8F, 0x95, 0xA7, 0xC6, 0x47, 0xC6, 0xAC, 0x32,
+                       0x12, 0x39, 0xCA, 0xEF, 0xE0, 0x07, 0xBF, 0x17,
+                       0x4F, 0xDC, 0x1B, 0x4E, 0x3C, 0x84, 0xF1, 0x9F,
+                       0x43, 0x70, 0x19, 0xE6, 0xF3, 0x8B, 0x8B, 0x5D,
+                       0xDB, 0xD2, 0x9D, 0xD4, 0xB2, 0x30, 0x45, 0x55,
+                       0xA2, 0x67, 0xA2, 0x76, 0x4A, 0x74, 0xAD, 0x88,
+                       0x71, 0xE6, 0x3E, 0x13, 0x06, 0x30, 0x17, 0xE1,
+                       0xEF, 0xAC, 0x71, 0xFB, 0x43, 0xCD, 0xF6, 0xFA,
+                       0x0E, 0x4C, 0x4E, 0x16, 0xF6, 0x6A, 0x09, 0x86,
+                       0x6B, 0xEA, 0x47, 0x6C, 0x70, 0xE7, 0xAD, 0xA2,
+                       0xE0, 0xFD, 0x7F, 0xF0, 0x5C, 0x21, 0x53, 0x0F,
+                       0x28, 0xA1, 0x43, 0xE1, 0x06, 0xCA, 0x0B, 0x31,
+                       0x88, 0x22, 0xA6, 0xE6, 0x34, 0x5B, 0xE6, 0xCF,
+                       0x25, 0x81, 0x63, 0xFF, 0x78, 0x66, 0x85, 0x19,
+                       0xE2, 0x0A, 0x7E, 0x81, 0x8A, 0x17, 0x1A, 0x18,
+                       0x8A, 0x5F, 0x5D, 0x9E, 0x82, 0x13, 0x10, 0xB9,
+                       0xD3, 0xE6, 0x93, 0x1C, 0xE4, 0x2C, 0xCB, 0x49,
+                       0x1E, 0xB6, 0x36, 0x13, 0xBF, 0x28, 0xEE, 0xCC,
+                       0x49, 0xF5, 0x79, 0xFC, 0x20, 0x65, 0xBD, 0xE8,
+                       0xF0, 0x1B, 0x4E, 0xC0, 0x0D, 0x3E, 0x89, 0x91,
+                       0xCC, 0x64, 0x10, 0xC0, 0x2A, 0x2B, 0xA3, 0xFA,
+                       0x60, 0x3D, 0xC3, 0x52, 0x2F, 0x93, 0xDE, 0xB7,
+                       0x6E, 0x8A, 0xDF, 0x6C, 0x08, 0xCC, 0x8B, 0x3B,
+                       0xC8, 0x50, 0xEF, 0x58, 0x64, 0x9A, 0x3D, 0x16,
+                       0x70, 0x94, 0x11, 0xD8, 0x94, 0x2B, 0x70, 0x91,
+                       0x10, 0x70, 0x88, 0xF0, 0x40, 0x75, 0x9A, 0x2B,
+                       0x39, 0xA1, 0x27, 0x3F, 0x2E, 0x91, 0xEA, 0xA1,
+                       0xCC, 0x12, 0xC1, 0x7F, 0x73, 0x8C, 0x5C, 0x6B,
+                       0xFC, 0xC5, 0x6A, 0x1C, 0x05, 0xF1, 0x3D, 0x30,
+                       0x82, 0x4A, 0x65, 0x35, 0xCE, 0x80, 0x10, 0xBB,
+                       0x41, 0x94, 0xFB, 0x84, 0x80, 0x7B, 0x91, 0xC4,
+                       0x4D, 0xA3, 0x5F, 0xB9, 0xFB, 0xF9, 0xC9, 0x1D,
+                       0x4F, 0x99, 0x1C, 0x1F, 0x47, 0x44, 0x89, 0x0E,
+                       0xED, 0x6D, 0xB5, 0x85, 0x41, 0x94, 0xEF, 0xF9,
+                       0x2E, 0xA0, 0xC8, 0xCA, 0xFB, 0x44, 0x02, 0xC6,
+                       0xBF, 0x96, 0x87, 0x80, 0x1D, 0xEF, 0x2A, 0x81,
+                       0xAB, 0xB2, 0x56, 0xDF, 0x54, 0x8B, 0xAB, 0xAF,
+                       0xFE, 0x18, 0x8C, 0xAA, 0xD4, 0x00, 0x17, 0xBE,
+                       0xCF, 0x06, 0xE5, 0xA6, 0xBF, 0x5A, 0x52, 0x3B,
+                       0x4E, 0xF5, 0x65, 0x60, 0x95, 0xDE, 0x8A, 0x25,
+                       0x88, 0xA5, 0x24, 0x96, 0x29, 0x13, 0x0D, 0x19,
+                       0x45, 0x95, 0x91, 0x08, 0xD2, 0x9C, 0x4C, 0x34,
+                       0x42, 0xF0, 0xA5, 0x72, 0xEB, 0xFB, 0x5E, 0xAA,
+                       0x68, 0x80, 0x82, 0xAC, 0x34, 0xAD, 0x89, 0xF6,
+                       0xAF, 0x54, 0x82, 0xCF, 0x98, 0x8C, 0x75, 0x63,
+                       0x8D, 0xBD, 0x1C, 0x2A, 0xD7, 0x00, 0xA7, 0x8E,
+                       0xB9, 0x33, 0xB6, 0x3B, 0x95, 0x9A, 0x59, 0x1D,
+                       0x3F, 0x23, 0x6B, 0x18, 0xF8, 0x4F, 0x1A, 0x8D,
+                       0xC0, 0x26, 0x9F, 0x87, 0x61, 0xB6, 0xC6, 0x60,
+                       0x38, 0x22, 0x73, 0x1C, 0x99, 0x23, 0xEF, 0xD9,
+                       0xFD, 0xCB, 0x54, 0x74, 0xBB, 0x77, 0x14, 0xA3,
+                       0xA9, 0xE6, 0x7C, 0x7E, 0x03, 0x3A, 0x13, 0x6E,
+                       0x1D, 0x6F, 0x64, 0xB3, 0xFA, 0xFB, 0x52, 0xDE,
+                       0xDF, 0x08, 0xFB, 0x6F, 0xC5, 0xFA, 0x51, 0x6A,
+                       0x69, 0x29, 0x9B, 0x96, 0xE8, 0x16, 0xC8, 0xD1,
+                       0xE4, 0x19, 0xBD, 0x14, 0x74, 0x27, 0xE7, 0x10,
+                       0xF0, 0xC3, 0xE2, 0xA7, 0x60, 0x48, 0xBF, 0xDD,
+                       0xC4, 0x0D, 0xD0, 0xF2, 0xEF, 0xA6, 0xC9, 0xA2,
+                       0x73, 0xD1, 0xCF, 0x41, 0xE1, 0x3B, 0xE5, 0x49,
+                       0x91, 0x5D, 0x09, 0xFD, 0x1D, 0x95, 0x29, 0xDB,
+                       0x52, 0x48, 0xEB, 0xF5, 0x1D, 0xF8, 0x06, 0x67,
+                       0x75, 0xF2, 0x57, 0xA4, 0x20, 0x60, 0xEA, 0xB0,
+                       0x85, 0x93, 0x7C, 0xDD, 0x52, 0x01, 0xD4, 0x57,
+                       0xA8, 0x31, 0x2D, 0xF9, 0x0A, 0xD2, 0x2A, 0xD1,
+                       0x34, 0x18, 0x35, 0x16, 0xB6, 0x8B, 0x0F, 0x0B,
+                       0xCF, 0x50, 0x80, 0xFE, 0x76, 0xCC, 0x4F, 0x30,
+                       0x98, 0x19, 0x16, 0x3D, 0x01, 0xEA, 0x8D, 0x8A,
+                       0x3D, 0xDC, 0xFB, 0x1F, 0x77, 0x8D, 0x72, 0x76,
+                       0x02, 0x3C, 0x5D, 0xEE, 0x55, 0x13, 0x5B, 0x6E,
+                       0x5A, 0x2D, 0xD5, 0x77, 0xD7, 0x01, 0x84, 0x7D,
+                       0x21, 0x8C, 0xDD, 0x94, 0x7D, 0x31, 0x3D, 0xF0,
+                       0xE7, 0x28, 0xF5, 0x72, 0x36, 0x60, 0xE0, 0x59,
+                       0x5F, 0xFE, 0x38, 0xF8, 0x2F, 0xDB, 0x9E, 0x55,
+                       0x5A, 0xD6, 0xBA, 0x6C, 0x87, 0xF3, 0xC0, 0x76,
+                       0x5F, 0xA3, 0x0A, 0xC3, 0xA3, 0x8D, 0x0E, 0x52,
+                       0xA8, 0xDA, 0x26, 0x3A, 0xF9, 0x3E, 0x36, 0xB1,
+                       0x06, 0xF8, 0x20, 0x2D, 0x1C, 0x0B, 0x93, 0xBB,
+                       0xD3, 0x64, 0x77, 0xCE, 0x11, 0xFC, 0xA2, 0x0E,
+                       0x1B, 0x5B, 0x9E, 0x13, 0x9F, 0x20, 0x8B, 0xAA,
+                       0xCD, 0x72, 0xD7, 0xA6, 0xF3, 0x1E, 0x4F, 0x72,
+                       0xC6, 0x49, 0x0F, 0x7B, 0xF0, 0x4C, 0x61, 0x1F,
+                       0x43, 0x0D, 0x4F, 0x0D, 0x33, 0x13, 0xED, 0x63,
+                       0xE5, 0xDB, 0x71, 0xAB, 0xA4, 0x83, 0xEF, 0xDC,
+                       0x86, 0x9D, 0x4B, 0xBD, 0x1B, 0x8A, 0xFE, 0x39,
+                       0xA8, 0x8B, 0xBA, 0x4C, 0x85, 0x28, 0xFC, 0xB3,
+                       0x62, 0x85, 0xD2, 0xF0, 0x38, 0xD0, 0x4B, 0xA4,
+                       0xD1, 0x3B, 0xD4, 0xD0, 0x2C, 0x78, 0x6C, 0x6A,
+                       0xC2, 0x64, 0x2C, 0x31, 0x4A, 0xD8, 0x69, 0x24,
+                       0xED, 0x77, 0x7D, 0x68, 0x9A, 0xA1, 0x78, 0x81,
+                       0xD9, 0x7E, 0x6C, 0xFE, 0x0A, 0x0D, 0x76, 0xF7,
+                       0x4B, 0x58, 0xE7, 0xC9, 0xB5, 0x11, 0x07, 0x87,
+                       0x88, 0x6A, 0x9F, 0x3D, 0xE0, 0xEE, 0xCC, 0x60,
+                       0x6B, 0x6B, 0xE6, 0xB5, 0x54, 0x8B, 0x32, 0x1F,
+                       0x04, 0x1D, 0x0E, 0x9E, 0xFA, 0x6D, 0xB0, 0xE0,
+                       0x6D, 0xF9, 0x79, 0xB4, 0xAB, 0x5E, 0xDF, 0x23,
+                       0x7F, 0x95, 0xAD, 0x80, 0x17, 0x23, 0x90, 0x1F,
+                       0xF0, 0xC3, 0xD9, 0x2D, 0xAC, 0x3F, 0x63, 0xF5,
+                       0x77, 0xC5, 0x05, 0xAC, 0x06, 0xB6, 0xA1, 0xB4,
+                       0xA2, 0x40, 0xB3, 0x99, 0x34, 0x7D, 0x31, 0xD4,
+                       0xB1, 0xD4, 0xC1, 0xBB, 0x71, 0x1E, 0xDA, 0x3F,
+                       0xA9, 0x12, 0x68, 0xFA, 0x5B, 0x20, 0x24, 0x6D,
+                       0x4D, 0x72, 0x43, 0x18, 0xBF, 0x66, 0x71, 0x69,
+                       0x26, 0x7D, 0x77, 0x78, 0xF8, 0xE5, 0x20, 0xAE,
+                       0x56, 0x6C, 0x0F, 0x72, 0x94, 0x42, 0x85, 0x4F,
+                       0xE4, 0xFB, 0x32, 0x26, 0x1B, 0x1C, 0x6E, 0x0B,
+                       0xF0, 0xB8, 0x58, 0x00, 0xD2, 0x36, 0x64, 0xAD,
+                       0xA9, 0x00, 0xCE, 0x35, 0x3C, 0x88, 0x79, 0x94,
+                       0x0C, 0x0C, 0x9B, 0xF2, 0xDA, 0xBD, 0xCA, 0x93,
+                       0x37, 0x26, 0xD3, 0x08, 0x54, 0xD2, 0x0D, 0xBC,
+                       0x5D, 0x43, 0x5F, 0xCF, 0x28, 0xB5, 0xAA, 0x15,
+                       0x28, 0x46, 0x45, 0x6B, 0xE8, 0xDF, 0xE8, 0xCE,
+                       0x8F, 0xC0, 0x1A, 0x53, 0x63, 0x3B, 0x53, 0x75,
+                       0xDD, 0x43, 0x1F, 0x07, 0x0A, 0xD5, 0xA1, 0x2A,
+                       0x6E, 0x28, 0xE1, 0xD7, 0xD0, 0x09, 0xCF, 0x62,
+                       0xC1, 0x5F, 0x21, 0xDB, 0xC5, 0x40, 0x99, 0x48,
+                       0x87, 0x6E, 0x11, 0xF5, 0x5A, 0x4E, 0xBC, 0xF9,
+                       0xA8, 0x02, 0x7C, 0x47, 0x39, 0xA5, 0xD8, 0x52,
+                       0xB1, 0x80, 0xDC, 0xFE, 0x08, 0x4B, 0x5D, 0x09,
+                       0xDE, 0x06, 0xF3, 0x2A, 0xAD, 0x14, 0x76, 0x40,
+                       0x2F, 0x82, 0x28, 0x6A, 0xB6, 0x43, 0xEF, 0x71,
+                       0x63, 0xC2, 0x56, 0xEB, 0x3B, 0x4B, 0x52, 0x2F,
+                       0x93, 0xD3, 0x18, 0x3E, 0x18, 0xA8, 0xF7, 0x58,
+                       0xFC, 0x8B, 0x3D, 0x4D, 0x4B, 0x72, 0xBD, 0xF7,
+                       0x04, 0xC9, 0xB8, 0xD7, 0x6C, 0x8C, 0x67, 0xBB,
+                       0x4C, 0x9B, 0x57, 0xF7, 0x22, 0x4E, 0x41, 0xB6,
+                       0xFD, 0xD9, 0xF8, 0x41, 0x62, 0x0F, 0xFF, 0xAA,
+                       0xC6, 0x87, 0x95, 0xFF, 0xFD, 0x58, 0xD9, 0xB2,
+                       0xBA, 0x47, 0x61, 0x24, 0xEA, 0x92, 0x6E, 0x74,
+                       0xB3, 0xDA, 0xE5, 0x83, 0x99, 0x24, 0xB1, 0x71,
+                       0x2A, 0x33, 0xB2, 0xD5, 0x8F, 0xF0, 0x32, 0xCE,
+                       0x37, 0xCF, 0xC7, 0x1C, 0xE8, 0xDE, 0x46, 0x78,
+                       0x96, 0x97, 0xF6, 0x73, 0x90, 0xE5, 0x71, 0x05,
+                       0xEA, 0x0D, 0xC2, 0x1D, 0x9E, 0x43, 0x34, 0xBC,
+                       0x8F, 0x45, 0xE5, 0x08, 0xCA, 0x20, 0x0C, 0x84
+               },
+               .len = 2048
+       },
+       .auth_tag = {
+               .data = {
+                       0xD0, 0x62, 0x1F, 0x20, 0x1C, 0xE8, 0xDD, 0x36,
+                       0x00, 0x74, 0xF6, 0xD7, 0xFD, 0x2C, 0xA0, 0xAF
+               },
+               .len = 16
+       }
+};
+
 /** GMAC Test Vectors */
 static uint8_t gmac_plaintext[GMAC_LARGE_PLAINTEXT_LENGTH] = {
                        0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,