diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-21 11:54:28 +0000 |
commit | e6918187568dbd01842d8d1d2c808ce16a894239 (patch) | |
tree | 64f88b554b444a49f656b6c656111a145cbbaa28 /src/spdk/intel-ipsec-mb/LibTestApp/pon_test.c | |
parent | Initial commit. (diff) | |
download | ceph-upstream/18.2.2.tar.xz ceph-upstream/18.2.2.zip |
Adding upstream version 18.2.2.upstream/18.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/spdk/intel-ipsec-mb/LibTestApp/pon_test.c')
-rw-r--r-- | src/spdk/intel-ipsec-mb/LibTestApp/pon_test.c | 694 |
1 files changed, 694 insertions, 0 deletions
diff --git a/src/spdk/intel-ipsec-mb/LibTestApp/pon_test.c b/src/spdk/intel-ipsec-mb/LibTestApp/pon_test.c new file mode 100644 index 000000000..e5091a94e --- /dev/null +++ b/src/spdk/intel-ipsec-mb/LibTestApp/pon_test.c @@ -0,0 +1,694 @@ +/***************************************************************************** + Copyright (c) 2019, 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 pon_test(const enum arch_type arch, struct MB_MGR *mb_mgr); + +/* === vector 1 */ + +static const uint8_t KEY1_PON[] = { + 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, + 0x99, 0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF, 0x00 +}; + +static const uint8_t IV1_PON[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04 +}; + +static const uint8_t IN1_PON[] = { + 0x00, 0x20, 0x27, 0x11, 0x00, 0x00, 0x21, 0x23, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, /* Ethernet frame */ + 0xcd, 0xfb, 0x3c, 0xb6 /* CRC value */ +}; + +static const uint8_t OUT1_PON[] = { + 0x00, 0x20, 0x27, 0x11, 0x00, 0x00, 0x21, 0x23, /* XGEM header */ + 0xC7, 0x62, 0x82, 0xCA, /* Ethernet frame */ + 0x3E, 0x92, 0xC8, 0x5A /* CRC value */ +}; +#define BIPOUT1_PON 0xA24CD0F9 +#define OFFSET1_PON 8 +#define LENBIP1_PON sizeof(IN1_PON) +#define LENCIPH1_PON (LENBIP1_PON - OFFSET1_PON) + +/* === vector 2 */ + +static const uint8_t IN2_PON[] = { + 0x00, 0x40, 0x27, 0x11, 0x00, 0x00, 0x29, 0x3C, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* Ethernet frame */ + 0x01, 0x01, 0x01, 0x01, + 0x00, 0x14, 0xa9, 0x04 /* CRC value */ +}; + +static const uint8_t OUT2_PON[] = { + 0x00, 0x40, 0x27, 0x11, 0x00, 0x00, 0x29, 0x3C, /* XGEM header */ + 0xC7, 0x62, 0x82, 0xCA, 0xF6, 0x6F, 0xF5, 0xED, + 0xB7, 0x90, 0x1E, 0x02, + 0xEA, 0x38, 0xA1, 0x78 +}; + +#define KEY2_PON KEY1_PON +#define IV2_PON IV1_PON +#define BIPOUT2_PON 0x70C6E56C +#define OFFSET2_PON 8 +#define LENBIP2_PON sizeof(IN2_PON) +#define LENCIPH2_PON (LENBIP2_PON - OFFSET2_PON) + +/* === vector 3 */ + +static const uint8_t IN3_PON[] = { + 0x01, 0x00, 0x27, 0x11, 0x00, 0x00, 0x33, 0x0B, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* Ethernet frame */ + 0x01, 0x01, 0x01, 0x01, 0x81, 0x00, 0x00, 0x01, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x6A, 0xB0, 0x7E, + 0x00, 0x00, 0x04, 0x06, 0x83, 0xBD, 0xC0, 0xA8, + 0x00, 0x01, 0xC0, 0xA8, 0x01, 0x01, 0x04, 0xD2, + 0x16, 0x2E, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, + 0x56, 0x90, 0x50, 0x10, 0x20, 0x00, 0xA6, 0x33, + 0x00, 0x00, 0x30, 0x31, + 0x53, 0xc1, 0xe6, 0x0c /* CRC value */ +}; + +static const uint8_t OUT3_PON[] = { + 0x01, 0x00, 0x27, 0x11, 0x00, 0x00, 0x33, 0x0B, /* XGEM header */ + 0xC7, 0x62, 0x82, 0xCA, 0xF6, 0x6F, 0xF5, 0xED, + 0xB7, 0x90, 0x1E, 0x02, 0x6B, 0x2C, 0x08, 0x7D, + 0x3C, 0x90, 0xE8, 0x2C, 0x44, 0x30, 0x03, 0x29, + 0x5F, 0x88, 0xA9, 0xD6, 0x1E, 0xF9, 0xD1, 0xF1, + 0xD6, 0x16, 0x8C, 0x72, 0xA4, 0xCD, 0xD2, 0x8F, + 0x63, 0x26, 0xC9, 0x66, 0xB0, 0x65, 0x24, 0x9B, + 0x60, 0x5B, 0x18, 0x60, 0xBD, 0xD5, 0x06, 0x13, + 0x40, 0xC9, 0x60, 0x64, + 0x36, 0x5F, 0x86, 0x8C +}; +#define KEY3_PON KEY1_PON +#define IV3_PON IV1_PON +#define BIPOUT3_PON 0xFBADE0DF +#define OFFSET3_PON 8 +#define LENBIP3_PON sizeof(IN3_PON) +#define LENCIPH3_PON (LENBIP3_PON - OFFSET3_PON) + +/* === vector 4 */ + +static const uint8_t IN4_PON[] = { + 0x01, 0x10, 0x27, 0x11, 0x00, 0x00, 0x3C, 0x18, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* Ethernet frame */ + 0x01, 0x01, 0x01, 0x01, 0x81, 0x00, 0x00, 0x01, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x6A, 0x70, 0x63, + 0x00, 0x00, 0x04, 0x06, 0xC3, 0xD8, 0xC0, 0xA8, + 0x00, 0x01, 0xC0, 0xA8, 0x01, 0x01, 0x04, 0xD2, + 0x16, 0x2E, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, + 0x56, 0x90, 0x50, 0x10, 0x20, 0x00, 0xA6, 0x33, + 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x49, 0x0d, 0x52, 0xab /* CRC value */ +}; + +static const uint8_t OUT4_PON[] = { + 0x01, 0x10, 0x27, 0x11, 0x00, 0x00, 0x3C, 0x18, /* XGEM header */ + 0xC7, 0x62, 0x82, 0xCA, 0xF6, 0x6F, 0xF5, 0xED, /* Ethernet frame */ + 0xB7, 0x90, 0x1E, 0x02, 0x6B, 0x2C, 0x08, 0x7D, + 0x3C, 0x90, 0xE8, 0x2C, 0x44, 0x30, 0xC3, 0x34, + 0x5F, 0x88, 0xA9, 0xD6, 0x5E, 0x9C, 0xD1, 0xF1, + 0xD6, 0x16, 0x8C, 0x72, 0xA4, 0xCD, 0xD2, 0x8F, + 0x63, 0x26, 0xC9, 0x66, 0xB0, 0x65, 0x24, 0x9B, + 0x60, 0x5B, 0x18, 0x60, 0xBD, 0xD5, 0x06, 0x13, + 0x40, 0xC9, 0x60, 0x64, 0x57, 0xAD, 0x54, 0xB5, + 0xD9, 0xEA, 0x01, 0xB2 +}; +#define KEY4_PON KEY1_PON +#define IV4_PON IV1_PON +#define BIPOUT4_PON 0x7EB18D27 +#define OFFSET4_PON 8 +#define LENBIP4_PON sizeof(IN4_PON) +#define LENCIPH4_PON (LENBIP4_PON - OFFSET4_PON) + +/* Vectors with no encryption */ +static const uint8_t IN5_PON[] = { + 0x00, 0x20, 0x27, 0x11, 0x00, 0x00, 0x21, 0x23, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, /* Ethernet frame */ + 0xCD, 0xFB, 0x3C, 0xB6 /* CRC value */ +}; + +static const uint8_t OUT5_PON[] = { + 0x00, 0x20, 0x27, 0x11, 0x00, 0x00, 0x21, 0x23, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, /* Ethernet frame */ + 0xCD, 0xFB, 0x3C, 0xB6 /* CRC value */ +}; +#define BIPOUT5_PON 0x8039D9CC +#define OFFSET5_PON 8 +#define LENBIP5_PON sizeof(IN5_PON) +#define LENCIPH5_PON (LENBIP5_PON - OFFSET5_PON) + +static const uint8_t IN6_PON[] = { + 0x00, 0x40, 0x27, 0x11, 0x00, 0x00, 0x29, 0x3C, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* Ethernet frame */ + 0x01, 0x01, 0x01, 0x01, + 0x00, 0x14, 0xa9, 0x04 /* CRC value */ +}; + +static const uint8_t OUT6_PON[] = { + 0x00, 0x40, 0x27, 0x11, 0x00, 0x00, 0x29, 0x3C, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* Ethernet frame */ + 0x01, 0x01, 0x01, 0x01, + 0x00, 0x14, 0xa9, 0x04 +}; + +#define BIPOUT6_PON 0x2DA45105 +#define OFFSET6_PON 8 +#define LENBIP6_PON sizeof(IN6_PON) +#define LENCIPH6_PON (LENBIP6_PON - OFFSET6_PON) + +static const uint8_t IN7_PON[] = { + 0x01, 0x00, 0x27, 0x11, 0x00, 0x00, 0x33, 0x0B, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* ethernet frame */ + 0x01, 0x01, 0x01, 0x01, 0x81, 0x00, 0x00, 0x01, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x6a, 0xb0, 0x7e, + 0x00, 0x00, 0x04, 0x06, 0x83, 0xbd, 0xc0, 0xa8, + 0x00, 0x01, 0xc0, 0xa8, 0x01, 0x01, 0x04, 0xd2, + 0x16, 0x2e, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, + 0x56, 0x90, 0x50, 0x10, 0x20, 0x00, 0xa6, 0x33, + 0x00, 0x00, 0x30, 0x31, + 0x53, 0xC1, 0xE6, 0x0C /* CRC value */ +}; + +static const uint8_t OUT7_PON[] = { + 0x01, 0x00, 0x27, 0x11, 0x00, 0x00, 0x33, 0x0B, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* ethernet frame */ + 0x01, 0x01, 0x01, 0x01, 0x81, 0x00, 0x00, 0x01, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x6a, 0xb0, 0x7e, + 0x00, 0x00, 0x04, 0x06, 0x83, 0xbd, 0xc0, 0xa8, + 0x00, 0x01, 0xc0, 0xa8, 0x01, 0x01, 0x04, 0xd2, + 0x16, 0x2e, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, + 0x56, 0x90, 0x50, 0x10, 0x20, 0x00, 0xa6, 0x33, + 0x00, 0x00, 0x30, 0x31, + 0x53, 0xC1, 0xE6, 0x0C +}; +#define BIPOUT7_PON 0xABC2D56A +#define OFFSET7_PON 8 +#define LENBIP7_PON sizeof(IN7_PON) +#define LENCIPH7_PON (LENBIP7_PON - OFFSET7_PON) + +static const uint8_t IN8_PON[] = { + 0x01, 0x10, 0x27, 0x11, 0x00, 0x00, 0x3C, 0x18, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* Ethernet frame */ + 0x01, 0x01, 0x01, 0x01, 0x81, 0x00, 0x00, 0x01, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x6A, 0x70, 0x63, + 0x00, 0x00, 0x04, 0x06, 0xC3, 0xD8, 0xC0, 0xA8, + 0x00, 0x01, 0xC0, 0xA8, 0x01, 0x01, 0x04, 0xD2, + 0x16, 0x2E, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, + 0x56, 0x90, 0x50, 0x10, 0x20, 0x00, 0xA6, 0x33, + 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x49, 0x0D, 0x52, 0xAB /* CRC value */ +}; + +static const uint8_t OUT8_PON[] = { + 0x01, 0x10, 0x27, 0x11, 0x00, 0x00, 0x3C, 0x18, /* XGEM header */ + 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x01, 0x01, /* Ethernet frame */ + 0x01, 0x01, 0x01, 0x01, 0x81, 0x00, 0x00, 0x01, + 0x08, 0x00, 0x45, 0x00, 0x00, 0x6A, 0x70, 0x63, + 0x00, 0x00, 0x04, 0x06, 0xC3, 0xD8, 0xC0, 0xA8, + 0x00, 0x01, 0xC0, 0xA8, 0x01, 0x01, 0x04, 0xD2, + 0x16, 0x2E, 0x12, 0x34, 0x56, 0x78, 0x12, 0x34, + 0x56, 0x90, 0x50, 0x10, 0x20, 0x00, 0xA6, 0x33, + 0x00, 0x00, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, + 0x49, 0x0D, 0x52, 0xAB /* CRC value */ +}; +#define BIPOUT8_PON 0x378D5F02 +#define OFFSET8_PON 8 +#define LENBIP8_PON sizeof(IN8_PON) +#define LENCIPH8_PON (LENBIP8_PON - OFFSET8_PON) + +/* Vectors with encryption and with padding */ +/* === vector 9 */ +static const uint8_t IN9_PON[] = { + 0x00, 0x39, 0x03, 0xfd, 0x00, 0x00, 0xb3, 0x6a, /* XGEM header */ + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* Ethernet frame */ + 0x10, 0x11, + 0x8c, 0xd0, 0x9a, 0x8b, /* CRC value */ + 0x55, 0x55 /* XGEM padding */ +}; + +static const uint8_t OUT9_PON[] = { + 0x00, 0x39, 0x03, 0xfd, 0x00, 0x00, 0xb3, 0x6a, /* XGEM header */ + 0x73, 0xe0, 0x5d, 0x5d, 0x32, 0x9c, 0x3b, 0xfa, /* Ethernet frame */ + 0x6b, 0x66, + 0xf6, 0x8e, 0x5b, 0xd5, /* CRC value */ + 0xab, 0xcd /* XGEM padding */ +}; + +#define KEY9_PON KEY1_PON + +static const uint8_t IV9_PON[] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; +#define BIPOUT9_PON 0x738bf671 +#define OFFSET9_PON 8 +#define LENBIP9_PON sizeof(IN9_PON) +#define LENCIPH9_PON (LENBIP9_PON - OFFSET9_PON) + +/* === vector 10 */ + +/* This is fragmented frame (1 bytes payload + padding) + * - computed CRC will not match value in the message + * - on encrypt CRC should not be written into the message + */ +static const uint8_t IN10_PON[] = { + 0x00, 0x05, 0x03, 0xfd, 0x00, 0x00, 0xb9, 0xb4, /* XGEM header */ + 0x08, /* Ethernet frame */ + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 /* XGEM padding */ +}; + +static const uint8_t OUT10_PON[] = { + 0x00, 0x05, 0x03, 0xfd, 0x00, 0x00, 0xb9, 0xb4, /* XGEM header */ + 0x73, /* Ethernet frame */ + 0xbc, 0x02, 0x03, 0x6b, 0xc4, 0x60, 0xa0 /* XGEM padding */ +}; + +#define KEY10_PON KEY1_PON +#define IV10_PON IV9_PON +#define BIPOUT10_PON 0xead87d18 +#define OFFSET10_PON 8 +#define LENBIP10_PON sizeof(IN10_PON) +#define LENCIPH10_PON (LENBIP10_PON - OFFSET10_PON) + +/* Vectors with no encryption and with padding */ +/* === vector 11 */ +static const uint8_t IN11_PON[] = { + 0x00, 0x39, 0x03, 0xfd, 0x00, 0x00, 0xb3, 0x6a, /* XGEM header */ + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* Ethernet frame */ + 0x10, 0x11, + 0x8c, 0xd0, 0x9a, 0x8b, /* CRC value */ + 0x55, 0x55 /* XGEM padding */ +}; + +static const uint8_t OUT11_PON[] = { + 0x00, 0x39, 0x03, 0xfd, 0x00, 0x00, 0xb3, 0x6a, /* XGEM header */ + 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, /* Ethernet frame */ + 0x10, 0x11, + 0x8c, 0xd0, 0x9a, 0x8b, /* CRC value */ + 0x55, 0x55 /* XGEM padding */ +}; + +#define KEY11_PON KEY1_PON +#define BIPOUT11_PON 0x166da78e +#define OFFSET11_PON 8 +#define LENBIP11_PON sizeof(IN11_PON) +#define LENCIPH11_PON (LENBIP11_PON - OFFSET11_PON) + +/* === vector 12 */ + +/* This is fragmented frame (1 bytes payload + padding) + * - computed CRC will not match value in the message + * - on encrypt CRC should not be written into the message + */ +static const uint8_t IN12_PON[] = { + 0x00, 0x05, 0x03, 0xfd, 0x00, 0x00, 0xb9, 0xb4, /* XGEM header */ + 0x08, /* Ethernet frame */ + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 /* XGEM padding */ +}; + +static const uint8_t OUT12_PON[] = { + 0x00, 0x05, 0x03, 0xfd, 0x00, 0x00, 0xb9, 0xb4, /* XGEM header */ + 0x08, /* Ethernet frame */ + 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55 /* XGEM padding */ +}; + +#define KEY12_PON KEY1_PON +#define BIPOUT12_PON 0x49ba055d +#define OFFSET12_PON 8 +#define LENBIP12_PON sizeof(IN12_PON) +#define LENCIPH12_PON (LENBIP12_PON - OFFSET12_PON) + +/* === vector 13 */ + +/* This is fragmented frame (4 bytes payload + padding) + * - computed CRC will not match value in the message + * - on encrypt CRC should not be written into the message + */ +static const uint8_t IN13_PON[] = { + 0x00, 0x11, 0x03, 0xfd, 0x00, 0x00, 0xbf, 0xff, /* XGEM header */ + 0x08, 0x09, 0x0a, 0x0b, /* Ethernet frame */ + 0x55, 0x55, 0x55, 0x55 /* XGEM padding */ +}; + +static const uint8_t OUT13_PON[] = { + 0x00, 0x11, 0x03, 0xfd, 0x00, 0x00, 0xbf, 0xff, /* XGEM header */ + 0x73, 0xe0, 0x5d, 0x5d, /* Ethernet frame */ + 0x6b, 0xc4, 0x60, 0xa0 /* XGEM padding */ +}; + +#define KEY13_PON KEY1_PON +#define IV13_PON IV9_PON +#define BIPOUT13_PON 0xff813518 +#define OFFSET13_PON 8 +#define LENBIP13_PON sizeof(IN13_PON) +#define LENCIPH13_PON (LENBIP13_PON - OFFSET13_PON) + + +#define ponvector(tname) \ + { KEY ## tname, IV ## tname, IN ## tname, OUT ## tname, \ + BIPOUT ## tname, LENBIP ## tname, \ + LENCIPH ## tname, OFFSET ## tname } + +#define pon_no_ctr_vector(tname) \ + { NULL, NULL, IN ## tname, OUT ## tname, \ + BIPOUT ## tname, LENBIP ## tname, \ + LENCIPH ## tname, OFFSET ## tname } + + +static const struct pon_test_vector { + const uint8_t *key; + const uint8_t *iv; + const uint8_t *in; + const uint8_t *out; + const uint32_t bip_out; + size_t length_to_bip; + size_t length_to_cipher; + size_t offset_to_crc_cipher; +} pon_vectors[] = { + ponvector(1_PON), + ponvector(2_PON), + ponvector(3_PON), + ponvector(4_PON), + pon_no_ctr_vector(5_PON), + pon_no_ctr_vector(6_PON), + pon_no_ctr_vector(7_PON), + pon_no_ctr_vector(8_PON), + ponvector(9_PON), + ponvector(10_PON), + pon_no_ctr_vector(11_PON), + pon_no_ctr_vector(12_PON), + ponvector(13_PON), +}; + +static int +test_pon(struct MB_MGR *mb_mgr, + const void *expkey, + const void *iv, + const uint8_t *in_text, + const uint8_t *out_text, + const size_t len_to_cipher, + const size_t len_to_bip, + const size_t offset_to_cipher_crc, + const uint32_t bip_out, + const int dir, + const int order) +{ + struct JOB_AES_HMAC *job; + uint8_t padding[16]; + uint8_t *target = malloc(len_to_bip + (sizeof(padding) * 2)); + int ret = -1; + uint64_t tag_output = 0; + uint32_t bip_output = 0; + uint32_t crc_output = 0; + + if (target == NULL) { + fprintf(stderr, "Can't allocate buffer memory\n"); + return ret; + } + + memset(target, -1, len_to_bip + (sizeof(padding) * 2)); + memset(padding, -1, sizeof(padding)); + + if (dir == ENCRYPT) { + const uint16_t pli = ((((uint16_t) in_text[0]) << 8) | + ((uint16_t) in_text[1])) >> 2; + + memcpy(target + sizeof(padding), in_text, len_to_bip); + + /* Corrupt HEC on encrypt direction + * This is to make sure HEC gets updated by the library + */ + target[sizeof(padding) + 7] ^= 0xff; + + /* Corrupt Ethernet FCS/CRC on encrypt direction + * This is to make sure CRC gets updated by the library + */ + if (pli > 4) { + uint8_t *p_crc = &target[sizeof(padding) + 8 + pli - 4]; + + p_crc[0] ^= 0xff; + p_crc[1] ^= 0xff; + p_crc[2] ^= 0xff; + p_crc[3] ^= 0xff; + } + } else { + memcpy(target + sizeof(padding), out_text, len_to_bip); + } + + while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL) + ; + + job = IMB_GET_NEXT_JOB(mb_mgr); + job->cipher_direction = dir; + job->chain_order = order; + job->dst = target + sizeof(padding) + offset_to_cipher_crc; + job->src = target + sizeof(padding) /* in_text */; + job->cipher_mode = PON_AES_CNTR; + job->cipher_start_src_offset_in_bytes = (uint64_t) offset_to_cipher_crc; + + /* If IV == NULL, NO CTR is done */ + if (iv != NULL) { + job->aes_enc_key_expanded = expkey; + job->aes_dec_key_expanded = expkey; + job->aes_key_len_in_bytes = AES_128_BYTES; + job->iv = iv; + job->iv_len_in_bytes = 16; + job->msg_len_to_cipher_in_bytes = (uint64_t) len_to_cipher; + } else { + job->aes_enc_key_expanded = NULL; + job->aes_dec_key_expanded = NULL; + job->aes_key_len_in_bytes = 0; + job->iv = NULL; + job->iv_len_in_bytes = 0; + job->msg_len_to_cipher_in_bytes = 0; + } + + job->hash_alg = PON_CRC_BIP; + job->hash_start_src_offset_in_bytes = 0; + job->msg_len_to_hash_in_bytes = (uint64_t) len_to_bip; + job->auth_tag_output = (void *) &tag_output; + job->auth_tag_output_len_in_bytes = (uint64_t) sizeof(tag_output); + job = IMB_SUBMIT_JOB(mb_mgr); + + if (job == NULL) { + printf("%d NULL job after submit()", __LINE__); + goto end; + } + + if (job->status != STS_COMPLETED) { + printf("%d Error status:%d", __LINE__, job->status); + goto end; + } + + bip_output = (uint32_t) tag_output; + crc_output = (uint32_t) (tag_output >> 32); + +#ifdef DEBUG + printf("CRC received 0x%08x\n", crc_output); + printf("BIP received 0x%08x\n", bip_output); +#endif + +#ifdef DEBUG + int is_error = 0; +#endif + + if (dir == DECRYPT) { + const uint16_t pli = ((((uint16_t) in_text[0]) << 8) | + ((uint16_t) in_text[1])) >> 2; + + if (pli > 4) { + const uint32_t crc_in_msg = + *((const uint32_t *)&in_text[8 + pli - 4]); + if (crc_in_msg != crc_output) { + printf("CRC mismatch on decrypt! " + "expected 0x%08x, received 0x%08x\n", + crc_in_msg, crc_output); +#ifdef DEBUG + is_error = 1; +#else + goto end; +#endif + } + } + } + + if (bip_output != bip_out) { + printf("BIP mismatch! expected 0x%08x, received 0x%08x\n", + bip_out, bip_output); +#ifdef DEBUG + is_error = 1; +#else + goto end; +#endif + } + + if (dir == ENCRYPT) { + if (memcmp(out_text, target + sizeof(padding), len_to_bip)) { + printf("output mismatch\n"); + hexdump(stderr, "Target", + target, len_to_bip + (2 * sizeof(padding))); +#ifdef DEBUG + is_error = 1; +#else + goto end; +#endif + } + } else { + if (memcmp(in_text, target + sizeof(padding), len_to_bip - 4)) { + printf("output mismatch\n"); + hexdump(stderr, "Target", target, + len_to_bip + (2 * sizeof(padding))); +#ifdef DEBUG + is_error = 1; +#else + goto end; +#endif + } + } + + if (memcmp(padding, target, sizeof(padding))) { + printf("overwrite head\n"); + hexdump(stderr, "Target", target, + len_to_bip + (2 * sizeof(padding))); +#ifdef DEBUG + is_error = 1; +#else + goto end; +#endif + } + + if (memcmp(padding, target + sizeof(padding) + len_to_bip, + sizeof(padding))) { + printf("overwrite tail\n"); + hexdump(stderr, "Target", target, + len_to_bip + (2 * sizeof(padding))); +#ifdef DEBUG + is_error = 1; +#else + goto end; +#endif + } + +#ifdef DEBUG + if (is_error) + goto end; +#endif + + /* all checks passed */ + ret = 0; + + while ((job = IMB_FLUSH_JOB(mb_mgr)) != NULL) + ; + end: + if (target != NULL) + free(target); + + return ret; +} + +static int +test_pon_std_vectors(struct MB_MGR *mb_mgr) +{ + const int vectors_cnt = sizeof(pon_vectors) / sizeof(pon_vectors[0]); + int vect; + int errors = 0; + DECLARE_ALIGNED(uint32_t expkey[4*15], 16); + DECLARE_ALIGNED(uint32_t dust[4*15], 16); + + printf("PON (AES128-CTR/CRC/BIP) test vectors:\n"); + + for (vect = 0; vect < vectors_cnt; vect++) { +#ifdef DEBUG + printf("Vector %d/%d CIPHLen:%d BIPLen:%d\n", + vect + 1, vectors_cnt, + (int) pon_vectors[vect].length_to_cipher, + (int) pon_vectors[vect].length_to_bip); +#else + printf("."); +#endif + + if (pon_vectors[vect].key != NULL) + IMB_AES_KEYEXP_128(mb_mgr, pon_vectors[vect].key, + expkey, dust); + + if (test_pon(mb_mgr, + expkey, + pon_vectors[vect].iv, + pon_vectors[vect].in, + pon_vectors[vect].out, + pon_vectors[vect].length_to_cipher, + pon_vectors[vect].length_to_bip, + pon_vectors[vect].offset_to_crc_cipher, + pon_vectors[vect].bip_out, + ENCRYPT, HASH_CIPHER)) { + printf("error #%d encrypt\n", vect + 1); + errors++; + } + + if (test_pon(mb_mgr, + expkey, + pon_vectors[vect].iv, + pon_vectors[vect].in, + pon_vectors[vect].out, + pon_vectors[vect].length_to_cipher, + pon_vectors[vect].length_to_bip, + pon_vectors[vect].offset_to_crc_cipher, + pon_vectors[vect].bip_out, + DECRYPT, CIPHER_HASH)) { + printf("error #%d decrypt\n", vect + 1); + errors++; + } + } + printf("\n"); + return errors; +} + +int pon_test(const enum arch_type arch, struct MB_MGR *mb_mgr) +{ + int errors = 0; + + if (arch != ARCH_NO_AESNI) + errors = test_pon_std_vectors(mb_mgr); + + if (0 == errors) + printf("...Pass\n"); + else + printf("...Fail\n"); + + return errors; +} |