summaryrefslogtreecommitdiffstats
path: root/src/spdk/intel-ipsec-mb/LibTestApp/sha_test.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/spdk/intel-ipsec-mb/LibTestApp/sha_test.c')
-rw-r--r--src/spdk/intel-ipsec-mb/LibTestApp/sha_test.c588
1 files changed, 588 insertions, 0 deletions
diff --git a/src/spdk/intel-ipsec-mb/LibTestApp/sha_test.c b/src/spdk/intel-ipsec-mb/LibTestApp/sha_test.c
new file mode 100644
index 000000000..4d914a29b
--- /dev/null
+++ b/src/spdk/intel-ipsec-mb/LibTestApp/sha_test.c
@@ -0,0 +1,588 @@
+/*****************************************************************************
+ Copyright (c) 2018, Intel Corporation
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ * Neither the name of Intel Corporation nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*****************************************************************************/
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <intel-ipsec-mb.h>
+#include "gcm_ctr_vectors_test.h"
+#include "utils.h"
+
+int sha_test(const enum arch_type arch, struct MB_MGR *mb_mgr);
+
+/*
+ * Test vectors come from this NIST document:
+ *
+ * https://csrc.nist.gov/csrc/media/projects/
+ * cryptographic-standards-and-guidelines/documents/examples/sha_all.pdf
+ */
+static const char message1[] = "abc";
+#define message1_len 3
+
+static const char message2[] = "";
+#define message2_len 0
+
+static const char message3[] =
+ "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";
+#define message3_len 56
+
+static const char message4[] =
+ "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmn"
+ "opjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu";
+#define message4_len 112
+
+/* macro converts one 32-bit word into four 8-bit word */
+#define CONVERT_UINT32_TO_4xUINT8(v) \
+ (((v) >> 24) & 0xff), (((v) >> 16) & 0xff), \
+ (((v) >> 8) & 0xff), (((v) >> 0) & 0xff)
+
+/* macro converts one 64-bit word into eight 8-bit word */
+#define CONVERT_UINT64_TO_8xUINT8(v) \
+ (((v) >> 56) & 0xff), (((v) >> 48) & 0xff), \
+ (((v) >> 40) & 0xff), (((v) >> 32) & 0xff), \
+ (((v) >> 24) & 0xff), (((v) >> 16) & 0xff), \
+ (((v) >> 8) & 0xff), (((v) >> 0) & 0xff)
+
+static const char test_case1[] = "SHA-1 MSG1";
+#define data1 ((const uint8_t *)message1)
+#define data_len1 message1_len
+static const uint8_t digest1[] = {
+ /* a9993e36 4706816a ba3e2571 7850c26c 9cd0d89d */
+ CONVERT_UINT32_TO_4xUINT8(0xa9993e36),
+ CONVERT_UINT32_TO_4xUINT8(0x4706816a),
+ CONVERT_UINT32_TO_4xUINT8(0xba3e2571),
+ CONVERT_UINT32_TO_4xUINT8(0x7850c26c),
+ CONVERT_UINT32_TO_4xUINT8(0x9cd0d89d)
+};
+#define digest_len1 sizeof(digest1)
+
+static const char test_case2[] = "SHA-224 MSG1";
+#define data2 ((const uint8_t *)message1)
+#define data_len2 message1_len
+static const uint8_t digest2[] = {
+ /* 23097d22 3405d822 8642a477 bda255b3 */
+ /* 2aadbce4 bda0b3f7 e36c9da7 */
+ CONVERT_UINT32_TO_4xUINT8(0x23097d22),
+ CONVERT_UINT32_TO_4xUINT8(0x3405d822),
+ CONVERT_UINT32_TO_4xUINT8(0x8642a477),
+ CONVERT_UINT32_TO_4xUINT8(0xbda255b3),
+ CONVERT_UINT32_TO_4xUINT8(0x2aadbce4),
+ CONVERT_UINT32_TO_4xUINT8(0xbda0b3f7),
+ CONVERT_UINT32_TO_4xUINT8(0xe36c9da7)
+};
+#define digest_len2 sizeof(digest2)
+
+static const char test_case3[] = "SHA-256 MSG1";
+#define data3 ((const uint8_t *)message1)
+#define data_len3 message1_len
+static const uint8_t digest3[] = {
+ /* ba7816bf 8f01cfea 414140de 5dae2223 */
+ /* b00361a3 96177a9c b410ff61 f20015ad */
+ CONVERT_UINT32_TO_4xUINT8(0xba7816bf),
+ CONVERT_UINT32_TO_4xUINT8(0x8f01cfea),
+ CONVERT_UINT32_TO_4xUINT8(0x414140de),
+ CONVERT_UINT32_TO_4xUINT8(0x5dae2223),
+ CONVERT_UINT32_TO_4xUINT8(0xb00361a3),
+ CONVERT_UINT32_TO_4xUINT8(0x96177a9c),
+ CONVERT_UINT32_TO_4xUINT8(0xb410ff61),
+ CONVERT_UINT32_TO_4xUINT8(0xf20015ad)
+};
+#define digest_len3 sizeof(digest3)
+
+static const char test_case4[] = "SHA-384 MSG1";
+#define data4 ((const uint8_t *)message1)
+#define data_len4 message1_len
+static const uint8_t digest4[] = {
+ /* cb00753f45a35e8b b5a03d699ac65007 */
+ /* 272c32ab0eded163 1a8b605a43ff5bed */
+ /* 8086072ba1e7cc23 58baeca134c825a7 */
+ CONVERT_UINT64_TO_8xUINT8(0xcb00753f45a35e8b),
+ CONVERT_UINT64_TO_8xUINT8(0xb5a03d699ac65007),
+ CONVERT_UINT64_TO_8xUINT8(0x272c32ab0eded163),
+ CONVERT_UINT64_TO_8xUINT8(0x1a8b605a43ff5bed),
+ CONVERT_UINT64_TO_8xUINT8(0x8086072ba1e7cc23),
+ CONVERT_UINT64_TO_8xUINT8(0x58baeca134c825a7)
+};
+#define digest_len4 sizeof(digest4)
+
+static const char test_case5[] = "SHA-512 MSG1";
+#define data5 ((const uint8_t *)message1)
+#define data_len5 message1_len
+static const uint8_t digest5[] = {
+ /* ddaf35a193617aba cc417349ae204131 */
+ /* 12e6fa4e89a97ea2 0a9eeee64b55d39a */
+ /* 2192992a274fc1a8 36ba3c23a3feebbd */
+ /* 454d4423643ce80e 2a9ac94fa54ca49f */
+ CONVERT_UINT64_TO_8xUINT8(0xddaf35a193617aba),
+ CONVERT_UINT64_TO_8xUINT8(0xcc417349ae204131),
+ CONVERT_UINT64_TO_8xUINT8(0x12e6fa4e89a97ea2),
+ CONVERT_UINT64_TO_8xUINT8(0x0a9eeee64b55d39a),
+ CONVERT_UINT64_TO_8xUINT8(0x2192992a274fc1a8),
+ CONVERT_UINT64_TO_8xUINT8(0x36ba3c23a3feebbd),
+ CONVERT_UINT64_TO_8xUINT8(0x454d4423643ce80e),
+ CONVERT_UINT64_TO_8xUINT8(0x2a9ac94fa54ca49f)
+};
+#define digest_len5 sizeof(digest5)
+
+static const char test_case10[] = "SHA-1 MSG2";
+#define data10 ((const uint8_t *)message2)
+#define data_len10 message2_len
+static const uint8_t digest10[] = {
+ CONVERT_UINT32_TO_4xUINT8(0xda39a3ee),
+ CONVERT_UINT32_TO_4xUINT8(0x5e6b4b0d),
+ CONVERT_UINT32_TO_4xUINT8(0x3255bfef),
+ CONVERT_UINT32_TO_4xUINT8(0x95601890),
+ CONVERT_UINT32_TO_4xUINT8(0xafd80709)
+};
+#define digest_len10 sizeof(digest10)
+
+static const char test_case11[] = "SHA-224 MSG2";
+#define data11 ((const uint8_t *)message2)
+#define data_len11 message2_len
+static const uint8_t digest11[] = {
+ CONVERT_UINT32_TO_4xUINT8(0xd14a028c),
+ CONVERT_UINT32_TO_4xUINT8(0x2a3a2bc9),
+ CONVERT_UINT32_TO_4xUINT8(0x476102bb),
+ CONVERT_UINT32_TO_4xUINT8(0x288234c4),
+ CONVERT_UINT32_TO_4xUINT8(0x15a2b01f),
+ CONVERT_UINT32_TO_4xUINT8(0x828ea62a),
+ CONVERT_UINT32_TO_4xUINT8(0xc5b3e42f)
+};
+#define digest_len11 sizeof(digest11)
+
+static const char test_case12[] = "SHA-256 MSG2";
+#define data12 ((const uint8_t *)message2)
+#define data_len12 message2_len
+static const uint8_t digest12[] = {
+ CONVERT_UINT32_TO_4xUINT8(0xe3b0c442),
+ CONVERT_UINT32_TO_4xUINT8(0x98fc1c14),
+ CONVERT_UINT32_TO_4xUINT8(0x9afbf4c8),
+ CONVERT_UINT32_TO_4xUINT8(0x996fb924),
+ CONVERT_UINT32_TO_4xUINT8(0x27ae41e4),
+ CONVERT_UINT32_TO_4xUINT8(0x649b934c),
+ CONVERT_UINT32_TO_4xUINT8(0xa495991b),
+ CONVERT_UINT32_TO_4xUINT8(0x7852b855)
+};
+#define digest_len12 sizeof(digest12)
+
+static const char test_case13[] = "SHA-384 MSG2";
+#define data13 ((const uint8_t *)message2)
+#define data_len13 message2_len
+static const uint8_t digest13[] = {
+ CONVERT_UINT64_TO_8xUINT8(0x38b060a751ac9638),
+ CONVERT_UINT64_TO_8xUINT8(0x4cd9327eb1b1e36a),
+ CONVERT_UINT64_TO_8xUINT8(0x21fdb71114be0743),
+ CONVERT_UINT64_TO_8xUINT8(0x4c0cc7bf63f6e1da),
+ CONVERT_UINT64_TO_8xUINT8(0x274edebfe76f65fb),
+ CONVERT_UINT64_TO_8xUINT8(0xd51ad2f14898b95b)
+};
+#define digest_len13 sizeof(digest13)
+
+static const char test_case14[] = "SHA-512 MSG2";
+#define data14 ((const uint8_t *)message2)
+#define data_len14 message2_len
+static const uint8_t digest14[] = {
+ CONVERT_UINT64_TO_8xUINT8(0xcf83e1357eefb8bd),
+ CONVERT_UINT64_TO_8xUINT8(0xf1542850d66d8007),
+ CONVERT_UINT64_TO_8xUINT8(0xd620e4050b5715dc),
+ CONVERT_UINT64_TO_8xUINT8(0x83f4a921d36ce9ce),
+ CONVERT_UINT64_TO_8xUINT8(0x47d0d13c5d85f2b0),
+ CONVERT_UINT64_TO_8xUINT8(0xff8318d2877eec2f),
+ CONVERT_UINT64_TO_8xUINT8(0x63b931bd47417a81),
+ CONVERT_UINT64_TO_8xUINT8(0xa538327af927da3e)
+};
+#define digest_len14 sizeof(digest14)
+
+static const char test_case20[] = "SHA-1 MSG3";
+#define data20 ((const uint8_t *)message3)
+#define data_len20 message3_len
+static const uint8_t digest20[] = {
+ CONVERT_UINT32_TO_4xUINT8(0x84983e44),
+ CONVERT_UINT32_TO_4xUINT8(0x1c3bd26e),
+ CONVERT_UINT32_TO_4xUINT8(0xbaae4aa1),
+ CONVERT_UINT32_TO_4xUINT8(0xf95129e5),
+ CONVERT_UINT32_TO_4xUINT8(0xe54670f1)
+};
+#define digest_len20 sizeof(digest20)
+
+static const char test_case21[] = "SHA-224 MSG3";
+#define data21 ((const uint8_t *)message3)
+#define data_len21 message3_len
+static const uint8_t digest21[] = {
+ CONVERT_UINT32_TO_4xUINT8(0x75388b16),
+ CONVERT_UINT32_TO_4xUINT8(0x512776cc),
+ CONVERT_UINT32_TO_4xUINT8(0x5dba5da1),
+ CONVERT_UINT32_TO_4xUINT8(0xfd890150),
+ CONVERT_UINT32_TO_4xUINT8(0xb0c6455c),
+ CONVERT_UINT32_TO_4xUINT8(0xb4f58b19),
+ CONVERT_UINT32_TO_4xUINT8(0x52522525)
+};
+#define digest_len21 sizeof(digest21)
+
+static const char test_case22[] = "SHA-256 MSG3";
+#define data22 ((const uint8_t *)message3)
+#define data_len22 message3_len
+static const uint8_t digest22[] = {
+ CONVERT_UINT32_TO_4xUINT8(0x248d6a61),
+ CONVERT_UINT32_TO_4xUINT8(0xd20638b8),
+ CONVERT_UINT32_TO_4xUINT8(0xe5c02693),
+ CONVERT_UINT32_TO_4xUINT8(0x0c3e6039),
+ CONVERT_UINT32_TO_4xUINT8(0xa33ce459),
+ CONVERT_UINT32_TO_4xUINT8(0x64ff2167),
+ CONVERT_UINT32_TO_4xUINT8(0xf6ecedd4),
+ CONVERT_UINT32_TO_4xUINT8(0x19db06c1)
+};
+#define digest_len22 sizeof(digest22)
+
+static const char test_case23[] = "SHA-384 MSG3";
+#define data23 ((const uint8_t *)message3)
+#define data_len23 message3_len
+static const uint8_t digest23[] = {
+ CONVERT_UINT64_TO_8xUINT8(0x3391fdddfc8dc739),
+ CONVERT_UINT64_TO_8xUINT8(0x3707a65b1b470939),
+ CONVERT_UINT64_TO_8xUINT8(0x7cf8b1d162af05ab),
+ CONVERT_UINT64_TO_8xUINT8(0xfe8f450de5f36bc6),
+ CONVERT_UINT64_TO_8xUINT8(0xb0455a8520bc4e6f),
+ CONVERT_UINT64_TO_8xUINT8(0x5fe95b1fe3c8452b)
+};
+#define digest_len23 sizeof(digest23)
+
+static const char test_case24[] = "SHA-512 MSG3";
+#define data24 ((const uint8_t *)message3)
+#define data_len24 message3_len
+static const uint8_t digest24[] = {
+ CONVERT_UINT64_TO_8xUINT8(0x204a8fc6dda82f0a),
+ CONVERT_UINT64_TO_8xUINT8(0x0ced7beb8e08a416),
+ CONVERT_UINT64_TO_8xUINT8(0x57c16ef468b228a8),
+ CONVERT_UINT64_TO_8xUINT8(0x279be331a703c335),
+ CONVERT_UINT64_TO_8xUINT8(0x96fd15c13b1b07f9),
+ CONVERT_UINT64_TO_8xUINT8(0xaa1d3bea57789ca0),
+ CONVERT_UINT64_TO_8xUINT8(0x31ad85c7a71dd703),
+ CONVERT_UINT64_TO_8xUINT8(0x54ec631238ca3445)
+};
+#define digest_len24 sizeof(digest24)
+
+static const char test_case30[] = "SHA-1 MSG4";
+#define data30 ((const uint8_t *)message4)
+#define data_len30 message4_len
+static const uint8_t digest30[] = {
+ CONVERT_UINT32_TO_4xUINT8(0xa49b2446),
+ CONVERT_UINT32_TO_4xUINT8(0xa02c645b),
+ CONVERT_UINT32_TO_4xUINT8(0xf419f995),
+ CONVERT_UINT32_TO_4xUINT8(0xb6709125),
+ CONVERT_UINT32_TO_4xUINT8(0x3a04a259)
+};
+#define digest_len30 sizeof(digest30)
+
+static const char test_case31[] = "SHA-224 MSG4";
+#define data31 ((const uint8_t *)message4)
+#define data_len31 message4_len
+static const uint8_t digest31[] = {
+ CONVERT_UINT32_TO_4xUINT8(0xc97ca9a5),
+ CONVERT_UINT32_TO_4xUINT8(0x59850ce9),
+ CONVERT_UINT32_TO_4xUINT8(0x7a04a96d),
+ CONVERT_UINT32_TO_4xUINT8(0xef6d99a9),
+ CONVERT_UINT32_TO_4xUINT8(0xe0e0e2ab),
+ CONVERT_UINT32_TO_4xUINT8(0x14e6b8df),
+ CONVERT_UINT32_TO_4xUINT8(0x265fc0b3)
+};
+#define digest_len31 sizeof(digest31)
+
+static const char test_case32[] = "SHA-256 MSG4";
+#define data32 ((const uint8_t *)message4)
+#define data_len32 message4_len
+static const uint8_t digest32[] = {
+ CONVERT_UINT32_TO_4xUINT8(0xcf5b16a7),
+ CONVERT_UINT32_TO_4xUINT8(0x78af8380),
+ CONVERT_UINT32_TO_4xUINT8(0x036ce59e),
+ CONVERT_UINT32_TO_4xUINT8(0x7b049237),
+ CONVERT_UINT32_TO_4xUINT8(0x0b249b11),
+ CONVERT_UINT32_TO_4xUINT8(0xe8f07a51),
+ CONVERT_UINT32_TO_4xUINT8(0xafac4503),
+ CONVERT_UINT32_TO_4xUINT8(0x7afee9d1)
+};
+#define digest_len32 sizeof(digest32)
+
+static const char test_case33[] = "SHA-384 MSG4";
+#define data33 ((const uint8_t *)message4)
+#define data_len33 message4_len
+static const uint8_t digest33[] = {
+ CONVERT_UINT64_TO_8xUINT8(0x09330c33f71147e8),
+ CONVERT_UINT64_TO_8xUINT8(0x3d192fc782cd1b47),
+ CONVERT_UINT64_TO_8xUINT8(0x53111b173b3b05d2),
+ CONVERT_UINT64_TO_8xUINT8(0x2fa08086e3b0f712),
+ CONVERT_UINT64_TO_8xUINT8(0xfcc7c71a557e2db9),
+ CONVERT_UINT64_TO_8xUINT8(0x66c3e9fa91746039)
+};
+#define digest_len33 sizeof(digest33)
+
+static const char test_case34[] = "SHA-512 MSG4";
+#define data34 ((const uint8_t *)message4)
+#define data_len34 message4_len
+static const uint8_t digest34[] = {
+ CONVERT_UINT64_TO_8xUINT8(0x8e959b75dae313da),
+ CONVERT_UINT64_TO_8xUINT8(0x8cf4f72814fc143f),
+ CONVERT_UINT64_TO_8xUINT8(0x8f7779c6eb9f7fa1),
+ CONVERT_UINT64_TO_8xUINT8(0x7299aeadb6889018),
+ CONVERT_UINT64_TO_8xUINT8(0x501d289e4900f7e4),
+ CONVERT_UINT64_TO_8xUINT8(0x331b99dec4b5433a),
+ CONVERT_UINT64_TO_8xUINT8(0xc7d329eeb6dd2654),
+ CONVERT_UINT64_TO_8xUINT8(0x5e96e55b874be909)
+};
+#define digest_len34 sizeof(digest34)
+
+#define SHA_TEST_VEC(num, size) \
+ { test_case##num, size, \
+ (const uint8_t *) data##num, data_len##num, \
+ (const uint8_t *) digest##num, digest_len##num }
+
+static const struct sha_vector {
+ const char *test_case;
+ int sha_type; /* 1, 224, 256, 384 or 512 */
+ const uint8_t *data;
+ size_t data_len;
+ const uint8_t *digest;
+ size_t digest_len;
+} sha_vectors[] = {
+ SHA_TEST_VEC(1, 1),
+ SHA_TEST_VEC(2, 224),
+ SHA_TEST_VEC(3, 256),
+ SHA_TEST_VEC(4, 384),
+ SHA_TEST_VEC(5, 512),
+ SHA_TEST_VEC(10, 1),
+ SHA_TEST_VEC(11, 224),
+ SHA_TEST_VEC(12, 256),
+ SHA_TEST_VEC(13, 384),
+ SHA_TEST_VEC(14, 512),
+ SHA_TEST_VEC(20, 1),
+ SHA_TEST_VEC(21, 224),
+ SHA_TEST_VEC(22, 256),
+ SHA_TEST_VEC(23, 384),
+ SHA_TEST_VEC(24, 512),
+ SHA_TEST_VEC(30, 1),
+ SHA_TEST_VEC(31, 224),
+ SHA_TEST_VEC(32, 256),
+ SHA_TEST_VEC(33, 384),
+ SHA_TEST_VEC(34, 512)
+};
+
+static int
+sha_job_ok(const struct sha_vector *vec,
+ const struct JOB_AES_HMAC *job,
+ const uint8_t *auth,
+ const uint8_t *padding,
+ const size_t sizeof_padding)
+{
+ if (job->status != STS_COMPLETED) {
+ printf("line:%d job error status:%d ", __LINE__, job->status);
+ return 0;
+ }
+
+ /* hash checks */
+ if (memcmp(padding, &auth[sizeof_padding + vec->digest_len],
+ sizeof_padding)) {
+ printf("hash overwrite tail\n");
+ hexdump(stderr, "Target",
+ &auth[sizeof_padding + vec->digest_len],
+ sizeof_padding);
+ return 0;
+ }
+
+ if (memcmp(padding, &auth[0], sizeof_padding)) {
+ printf("hash overwrite head\n");
+ hexdump(stderr, "Target", &auth[0], sizeof_padding);
+ return 0;
+ }
+
+ if (memcmp(vec->digest, &auth[sizeof_padding],
+ vec->digest_len)) {
+ printf("hash mismatched\n");
+ hexdump(stderr, "Received", &auth[sizeof_padding],
+ vec->digest_len);
+ hexdump(stderr, "Expected", vec->digest,
+ vec->digest_len);
+ return 0;
+ }
+ return 1;
+}
+
+static int
+test_sha(struct MB_MGR *mb_mgr,
+ const struct sha_vector *vec,
+ const int num_jobs)
+{
+ struct JOB_AES_HMAC *job;
+ uint8_t padding[16];
+ uint8_t **auths = malloc(num_jobs * sizeof(void *));
+ int i = 0, jobs_rx = 0, ret = -1;
+
+ if (auths == NULL) {
+ fprintf(stderr, "Can't allocate buffer memory\n");
+ goto end2;
+ }
+
+ memset(padding, -1, sizeof(padding));
+ memset(auths, 0, num_jobs * sizeof(void *));
+
+ for (i = 0; i < num_jobs; i++) {
+ const size_t alloc_len =
+ vec->digest_len + (sizeof(padding) * 2);
+
+ auths[i] = malloc(alloc_len);
+ if (auths[i] == NULL) {
+ fprintf(stderr, "Can't allocate buffer memory\n");
+ goto end;
+ }
+ memset(auths[i], -1, alloc_len);
+ }
+
+ /* empty the manager */
+ while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL)
+ ;
+
+ for (i = 0; i < num_jobs; i++) {
+ job = IMB_GET_NEXT_JOB(mb_mgr);
+
+ memset(job, 0, sizeof(*job));
+ job->cipher_direction = ENCRYPT;
+ job->chain_order = HASH_CIPHER;
+ job->auth_tag_output = auths[i] + sizeof(padding);
+ job->auth_tag_output_len_in_bytes = vec->digest_len;
+ job->src = vec->data;
+ job->msg_len_to_hash_in_bytes = vec->data_len;
+ job->cipher_mode = NULL_CIPHER;
+ switch (vec->sha_type) {
+ case 1:
+ job->hash_alg = PLAIN_SHA1;
+ break;
+ case 224:
+ job->hash_alg = PLAIN_SHA_224;
+ break;
+ case 256:
+ job->hash_alg = PLAIN_SHA_256;
+ break;
+ case 384:
+ job->hash_alg = PLAIN_SHA_384;
+ break;
+ case 512:
+ default:
+ job->hash_alg = PLAIN_SHA_512;
+ break;
+ }
+
+ job->user_data = auths[i];
+
+ job = IMB_SUBMIT_JOB(mb_mgr);
+ if (job) {
+ jobs_rx++;
+ if (!sha_job_ok(vec, job, job->user_data,
+ padding, sizeof(padding)))
+ goto end;
+ }
+ }
+
+ while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL) {
+ jobs_rx++;
+ if (!sha_job_ok(vec, job, job->user_data,
+ padding, sizeof(padding)))
+ goto end;
+ }
+
+ if (jobs_rx != num_jobs) {
+ printf("Expected %d jobs, received %d\n", num_jobs, jobs_rx);
+ goto end;
+ }
+ ret = 0;
+
+ end:
+ /* empty the manager before next tests */
+ while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL)
+ ;
+
+ for (i = 0; i < num_jobs; i++) {
+ if (auths[i] != NULL)
+ free(auths[i]);
+ }
+
+ end2:
+ if (auths != NULL)
+ free(auths);
+
+ return ret;
+}
+
+static int
+test_sha_vectors(struct MB_MGR *mb_mgr, const int num_jobs)
+{
+ const int vectors_cnt =
+ sizeof(sha_vectors) / sizeof(sha_vectors[0]);
+ int vect;
+ int errors = 0;
+
+ printf("SHA standard test vectors (N jobs = %d):\n", num_jobs);
+ for (vect = 1; vect <= vectors_cnt; vect++) {
+ const int idx = vect - 1;
+#ifdef DEBUG
+ printf("[%d/%d] SHA%d Test Case %s data_len:%d "
+ "digest_len:%d\n",
+ vect, vectors_cnt,
+ sha_vectors[idx].sha_type,
+ sha_vectors[idx].test_case,
+ (int) sha_vectors[idx].data_len,
+ (int) sha_vectors[idx].digest_len);
+#else
+ printf(".");
+#endif
+
+ if (test_sha(mb_mgr, &sha_vectors[idx], num_jobs)) {
+ printf("error #%d\n", vect);
+ errors++;
+ }
+ }
+ printf("\n");
+ return errors;
+}
+
+int
+sha_test(const enum arch_type arch,
+ struct MB_MGR *mb_mgr)
+{
+ int errors = 0;
+
+ (void) arch; /* unused */
+
+ errors += test_sha_vectors(mb_mgr, 1);
+
+ if (0 == errors)
+ printf("...Pass\n");
+ else
+ printf("...Fail\n");
+
+ return errors;
+}