From 5284b54e1534ad67b935f6e3621b83d5080d41de Mon Sep 17 00:00:00 2001 From: Zhi Guan Date: Tue, 9 Jun 2026 20:04:13 +0800 Subject: [PATCH] Add SM4-CBC-Padding test --- tests/sm4_cbc_paddingtest.h | 732 ++++++++++++++++++++++++++++++++++++ tests/sm4_cbctest.c | 98 +++++ 2 files changed, 830 insertions(+) create mode 100644 tests/sm4_cbc_paddingtest.h diff --git a/tests/sm4_cbc_paddingtest.h b/tests/sm4_cbc_paddingtest.h new file mode 100644 index 00000000..593becd5 --- /dev/null +++ b/tests/sm4_cbc_paddingtest.h @@ -0,0 +1,732 @@ +/* + * Copyright 2014-2026 The GmSSL Project. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the License); + * you may not use this file except in compliance with the License. + * + * http://www.apache.org/licenses/LICENSE-2.0 + */ + + +static const TEST_SM4_CBC_PADDING_VECTOR sm4_cbc_padding_tests[] = { + { + 1, + "empty message", + "Pseudorandom", + "e34f15c7bd819930fe9d66e0c166e61c", + "da9520f7d3520277035173299388bee2", + "", + "7694fc6b984c8abf9bbe826099f415f2", + TEST_RESULT_VALID, + }, + { + 2, + "message size divisible by block size", + "Pseudorandom", + "e09eaa5a3f5e56d279d5e7a03373f6ea", + "c9ee3cd746bf208c65ca9e72a266d54f", + "ef4eab37181f98423e53e947e7050fd0", + "dcedae60f03d9d435405aacb8cdab67a2808b529fe970c069e84592571e785eb", + TEST_RESULT_VALID, + }, + { + 3, + "message size divisible by block size", + "Pseudorandom", + "9bd3902ed0996c869b572272e76f3889", + "8b2e86a9a185cfa6f51c7cc595b822bc", + "a7ba19d49ee1ea02f098aa8e30c740d893a4456ccc294040484ed8a00a55f93e", + "e347260a62b24fd11350e8b9414e6d4782571fb3a1f8a53ce16be81182d3813f2fb3772576d67c43d600375b505f57ab", + TEST_RESULT_VALID, + }, + { + 4, + "message size divisible by block size", + "Pseudorandom", + "75ce184447cada672e02290310d224f7", + "2717d10eb2eea3b39ec257e43307a260", + "c774810a31a6421ad8eaafd5c22fa2455e2c167fee4a0b73ff927b2d96c69da1e939407b86b1c19bcfc69c434c3cf8a2", + "8a1ec67097f2f18ee84d4c9fa8842d99a80b20eb8d70f7fbbb01d7310fe38a54277875e32d703a658d7012b3b4d782e38219ca3e0ba2dc47b1a4188875767961", + TEST_RESULT_VALID, + }, + { + 5, + "small plaintext size", + "Pseudorandom", + "e1e726677f4893890f8c027f9d8ef80d", + "155fd397579b0b5d991d42607f2cc9ad", + "3f", + "ff18c9beb5b797ceefe57df2ff841542", + TEST_RESULT_VALID, + }, + { + 6, + "small plaintext size", + "Pseudorandom", + "b151f491c4c006d1f28214aa3da9a985", + "4eb836be6808db264cb1111a3283b394", + "27d9", + "e6b6ca8251528300325dc6d7f24d9aa0", + TEST_RESULT_VALID, + }, + { + 7, + "small plaintext size", + "Pseudorandom", + "c36ff15f72777ee21deec07b63c1a0cd", + "a8446c27ea9068d8d924d5c4eac91157", + "50b428", + "854a25f8d6b6ad4ddfbfff5feb7c72d7", + TEST_RESULT_VALID, + }, + { + 8, + "small plaintext size", + "Pseudorandom", + "32b9c5c78c3a0689a86052420fa1e8fc", + "ef026d27da3702d7bb72e5e364a8f8f2", + "0b9262ec", + "52067802fcf07cf25875baf7f2b6a00b", + TEST_RESULT_VALID, + }, + { + 9, + "small plaintext size", + "Pseudorandom", + "43151bbaef367277ebfc97509d0aa49c", + "c9defd3929dcd6c355c144e9750dd869", + "eaa91273e7", + "f8654c02f0165d3172c65738a9e838ad", + TEST_RESULT_VALID, + }, + { + 10, + "small plaintext size", + "Pseudorandom", + "481440298525cc261f8159159aedf62d", + "ce91e0454b0123f1ead0f158826459e9", + "6123c556c5cc", + "23242edb53dde6626d390462d6c74f2a", + TEST_RESULT_VALID, + }, + { + 11, + "small plaintext size", + "Pseudorandom", + "9ca26eb88731efbf7f810d5d95e196ac", + "1cb7bc8fe00523e7743d3cd9f483d6fe", + "7e48f06183aa40", + "d998cc56d3c76a0d394de477f96dba31", + TEST_RESULT_VALID, + }, + { + 12, + "small plaintext size", + "Pseudorandom", + "48f0d03e41cc55c4b58f737b5acdea32", + "a345f084229dbfe0ceab6c6939571532", + "f4a133aa6d5985a0", + "7a505c820475e02d38de9086a23af43f", + TEST_RESULT_VALID, + }, + { + 13, + "small plaintext size", + "Pseudorandom", + "1c958849f31996b28939ce513087d1be", + "e5b6f73f132355b7be7d977bea068dfc", + "b0d2fee11b8e2f86b7", + "d0b6e8296a29a67c2516f39e8edef12d", + TEST_RESULT_VALID, + }, + { + 14, + "small plaintext size", + "Pseudorandom", + "39de0ebea97c09b2301a90009a423253", + "c7cd10ca949ea03e7d4ba204b69e09b8", + "81e5c33b4c620852f044", + "fc29ffb40fc1662664d755d32e796d32", + TEST_RESULT_VALID, + }, + { + 15, + "small plaintext size", + "Pseudorandom", + "91656d8fc0aced60ddb1c4006d0dde53", + "bb8c9af30821dfeb7124392a554d9f01", + "7b3e440fe566790064b2ec", + "4f6058f3f3c56010baad3261fd63682e", + TEST_RESULT_VALID, + }, + { + 16, + "small plaintext size", + "Pseudorandom", + "af7d5134720b5386158d51ea126e7cf9", + "54c3b90ca6e933f9094334d0263d3775", + "7cc6fcc925c20f3c83b5567c", + "1b8c0fae2851b42a194e7c2ee180bdb2", + TEST_RESULT_VALID, + }, + { + 17, + "small plaintext size", + "Pseudorandom", + "4ed56753de6f75a032ebabca3ce27971", + "9a2c5e91d4f0b9b9da64b46c5c2c8cb2", + "0c8c0f5619d9f8da5339281285", + "5ee6d92cbc37c38d1445d354d3ccdff7", + TEST_RESULT_VALID, + }, + { + 18, + "small plaintext size", + "Pseudorandom", + "beba50c936b696c15e25046dffb23a64", + "cf7951501104e1434309e6b936ec1742", + "821ea8532fbabffb6e3d212e9b46", + "6d9d80702e213ee72dbdd2d665498432", + TEST_RESULT_VALID, + }, + { + 19, + "small plaintext size", + "Pseudorandom", + "501d81ebf912ddb87fbe3b7aac1437bc", + "90f5cf4fbfd2e2a1ab8eef402617bd5c", + "2368e3c3636b5e8e94d2081adbf798", + "35ea626cbf04067e5d71d6ff8c610c3f", + TEST_RESULT_VALID, + }, + { + 20, + "plaintext size > 16", + "Pseudorandom", + "831e664c9e3f0c3094c0b27b9d908eb2", + "54f2459e40e002763144f4752cde2fb5", + "26603bb76dd0a0180791c4ed4d3b058807", + "f6b17ee314ca2f0d9f983aa1871794e92c3de602c87827dbb298e4e2e0d8849d", + TEST_RESULT_VALID, + }, + { + 21, + "plaintext size > 16", + "Pseudorandom", + "cbffc6c8c7f76f46349c32d666f4efb0", + "088e01c2c65b26e7ad6af7b92ea09d73", + "6df067add738195fd55ac2e76b476971b9a0e6d8", + "ad76703fd6c97c5d8aa3b8540aaee57535a6cc8eec9ce5f7ee35c4e22fd9b569", + TEST_RESULT_VALID, + }, + { + 22, + "plaintext size > 16", + "Pseudorandom", + "fda6a01194beb462953d7e6c49b32dac", + "d9c9468796a2f5741b84d2d41430c5d3", + "f60ae3b036abcab78c98fc1d4b67970c0955cb6fe24483f8907fd73319679b", + "a425da38e20996c37a39b5b69471a13fbcd34feeeeb96d94791613cb7c127b31", + TEST_RESULT_VALID, + }, + { + 23, + "plaintext size > 16", + "Pseudorandom", + "efd9caa8ac68e9e29acdae57e93bcea8", + "c98b47808add45c0c891983ec4b09846", + "3e1d2001f1e475b972738936443a5f51eedaf802a66fadf2406cfaadb0549149fcb9f485e534dc2d", + "ac5aa3adae0aebee555d2bb8208cf37bbeeb1352bc0d6c78016d6ea020ba222120ee124abbf967e78010c20e4e5749ef", + TEST_RESULT_VALID, + }, + { + 24, + "plaintext size > 16", + "Pseudorandom", + "37e4dbdc436258d5a9adb9f205c77cf3", + "08e9410de244d3f40607ebae38fa74e7", + "24a874aec067116ad22eb55846ded3f5e86919a135585c929a86d92b2958fed110e52e33804887243584a6a94402cc9a105e0c940ec335bd2890f16dcce3fc8bd02873c80ade6f1ac08683130bcca454", + "6533ff745d1c51519b1fd4f0382e3b65c6561a1f4b116104effde1386ada111e010fb9604d6c5fad4a11484bbb6165b07dccd107fd46415bb2712a67d8b2584f3eb11b3a42421f4eda72efa220c79ae8811d30088ab9cf7fb5d2cf13962163a0", + TEST_RESULT_VALID, + }, + { + 25, + "empty ciphertext", + "NoPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "", + TEST_RESULT_INVALID, + }, + { + 26, + "Using zero padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "6b81b4425cb91c1135ba97f16028afb2", + TEST_RESULT_INVALID, + }, + { + 27, + "Using zero padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "84b7ea830a25215da33d2b823cb77077", + TEST_RESULT_INVALID, + }, + { + 28, + "Using zero padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "303132333435363738396162636465", + "0d3d9d820dbf446a04757026451992cc", + TEST_RESULT_INVALID, + }, + { + 29, + "Using zero padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c30fd0d314c2ee4d8f5debf63c435ef3cf7", + TEST_RESULT_INVALID, + }, + { + 30, + "Using zero padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c30e45c332301a46d7daf78257f0dfc7740", + TEST_RESULT_INVALID, + }, + { + 31, + "Using zero padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803e05e6809caa291b52b7e238c0c402ef2b", + TEST_RESULT_INVALID, + }, + { + 32, + "Using a padding with 0xff instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "4f8527a6f551410b78a68e7efc36df2f", + TEST_RESULT_INVALID, + }, + { + 33, + "Using a padding with 0xff instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "f21b5d079f7c76be68604bbe5b2382f7", + TEST_RESULT_INVALID, + }, + { + 34, + "Using a padding with 0xff instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "303132333435363738396162636465", + "84701dba2c6bede631c095c856bec420", + TEST_RESULT_INVALID, + }, + { + 35, + "Using a padding with 0xff instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c30f46416b3b621f115a69d4ef02e3fcfec", + TEST_RESULT_INVALID, + }, + { + 36, + "Using a padding with 0xff instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c306a63a0fcc48d81b47775e11c085b78b3", + TEST_RESULT_INVALID, + }, + { + 37, + "Using a padding with 0xff instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803ea881c78807a8fbdeff055951896212d9", + TEST_RESULT_INVALID, + }, + { + 38, + "Using ISO/IEC 7816-4 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "1ff93df500e92c9feff895e7db2dea62", + TEST_RESULT_INVALID, + }, + { + 39, + "Using ISO/IEC 7816-4 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "a0b5815b5d102a70b8ca2dc0e0f1365f", + TEST_RESULT_INVALID, + }, + { + 40, + "Using ISO/IEC 7816-4 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "303132333435363738396162636465", + "12a8723e41593567bb70d49032611cbc", + TEST_RESULT_INVALID, + }, + { + 41, + "Using ISO/IEC 7816-4 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c3078ff9fdd6714bf6571ae8967080af516", + TEST_RESULT_INVALID, + }, + { + 42, + "Using ISO/IEC 7816-4 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c30c3f7935834dffff63515955665b7077e", + TEST_RESULT_INVALID, + }, + { + 43, + "Using ISO/IEC 7816-4 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803e1647564a24d922795e5fe709e58437f1", + TEST_RESULT_INVALID, + }, + { + 44, + "The length of the padding is longer than 1 block", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "966a77e2edb8ee304a7f8aec6dfd6cb0fb460a37d028591b6ff8e2a3ba708dfa", + TEST_RESULT_INVALID, + }, + { + 45, + "The length of the padding is longer than 1 block", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "ea62116ba98975c5b00cb8d214a09747e749f5d6295260b43e2523761b1eee80", + TEST_RESULT_INVALID, + }, + { + 46, + "The length of the padding is longer than 1 block", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "303132333435363738396162636465", + "3b09f1f830850168b390fa8456d9ed644c0135aa2438e4e7f2da2f91524d3078", + TEST_RESULT_INVALID, + }, + { + 47, + "The length of the padding is longer than 1 block", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c308cc9205ed6eb928d7c73e8510f446a4dbe7b53960c8ce4f2dc55c698642759a8", + TEST_RESULT_INVALID, + }, + { + 48, + "The length of the padding is longer than 1 block", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c306effa48c70c4e1924fed40a69ea5fe5a4f36e1dc5311129d386eb654e9068005", + TEST_RESULT_INVALID, + }, + { + 49, + "The length of the padding is longer than 1 block", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803e793aa1e3d0f80e66df71a0190c80d209083c09b5463bdfe208fffb8dbaa5df06", + TEST_RESULT_INVALID, + }, + { + 50, + "Using ANSI X.923 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "da814701baf00eef5be3dccb3a3ad4eb", + TEST_RESULT_INVALID, + }, + { + 51, + "Using ANSI X.923 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "1dc8b11608b5f2782158ac13dd0d6312", + TEST_RESULT_INVALID, + }, + { + 52, + "Using ANSI X.923 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c307246b6abf86a5bf4d0b868740597ad15", + TEST_RESULT_INVALID, + }, + { + 53, + "Using ANSI X.923 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c307c3849dbaa2ea976d63fb64c6eae98f8", + TEST_RESULT_INVALID, + }, + { + 54, + "Using ANSI X.923 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803e5b9e39839e279565ef6be71166b9d164", + TEST_RESULT_INVALID, + }, + { + 55, + "Using ISO 10126 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "dcf0bc0b24fafbcddf975cc1260b56cd", + TEST_RESULT_INVALID, + }, + { + 56, + "Using ISO 10126 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "ac9bf7f71c5c60634262c4ee70e565b2", + TEST_RESULT_INVALID, + }, + { + 57, + "Using ISO 10126 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c3017043cd9bb318dcda0420abf3f64036e", + TEST_RESULT_INVALID, + }, + { + 58, + "Using ISO 10126 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c3067c809771a465389490758db6415c70a", + TEST_RESULT_INVALID, + }, + { + 59, + "Using ISO 10126 padding instead of PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803ee1ca0eab2703d8903a5623ab74c22872", + TEST_RESULT_INVALID, + }, + { + 60, + "Padding is longer than the message", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "966a77e2edb8ee304a7f8aec6dfd6cb0", + TEST_RESULT_INVALID, + }, + { + 61, + "Padding is longer than the message", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "b0b3caac565d0f68604393185889599b", + TEST_RESULT_INVALID, + }, + { + 62, + "Padding is longer than the message", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "303132333435363738396162636465", + "45ef5c9ada93e41db3b05f93d96ea3a0", + TEST_RESULT_INVALID, + }, + { + 63, + "Padding is longer than the message", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c30cc1ab4b7fff6883f66b7c2562ec85e92", + TEST_RESULT_INVALID, + }, + { + 64, + "Padding is longer than the message", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c30426a38d6d71fbbc918ba75a742ec830a", + TEST_RESULT_INVALID, + }, + { + 65, + "Padding is longer than the message", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803e27271dc795f2cbea501315fc08c9dcb6", + TEST_RESULT_INVALID, + }, + { + 66, + "Invalid PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "", + "366cdab43793b82900d1a056484166ed", + TEST_RESULT_INVALID, + }, + { + 67, + "Invalid PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "6162636465666768", + "52acfd71ab9fb82e0dc967cfbe5c4066", + TEST_RESULT_INVALID, + }, + { + 68, + "Invalid PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c30aa8e6654563fde2b2b2c70bd083474ef", + TEST_RESULT_INVALID, + }, + { + 69, + "Invalid PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "3031323334353637383941424344454647", + "b88ad20ab7d9ca775ae9f3af9be58c30b2ef7f630f9ada79b1a93fc6d4730df6", + TEST_RESULT_INVALID, + }, + { + 70, + "Invalid PKCS #5 padding", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803e5d67878dddbec48bba8956fa040be690", + TEST_RESULT_INVALID, + }, + { + 71, + "Using no padding at all", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "30313233343536373839414243444546", + "b88ad20ab7d9ca775ae9f3af9be58c30", + TEST_RESULT_INVALID, + }, + { + 72, + "Using no padding at all", + "BadPadding", + "db4f3e5e3795cc09a073fa6a81e5a6bc", + "23468aa734f5f0f19827316ff168e94f", + "404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f", + "c7fff1aba9bb86c8c95da25e6e2f6c714103aa947d77d8026f270b4a273a803e", + TEST_RESULT_INVALID, + }, +}; diff --git a/tests/sm4_cbctest.c b/tests/sm4_cbctest.c index 590a3de3..57725bdb 100644 --- a/tests/sm4_cbctest.c +++ b/tests/sm4_cbctest.c @@ -17,6 +17,30 @@ #include #include +#define TEST_SM4_CBC_PADDING_MAX_KEY_SIZE 16 +#define TEST_SM4_CBC_PADDING_MAX_IV_SIZE 16 +#define TEST_SM4_CBC_PADDING_MAX_MSG_SIZE 80 +#define TEST_SM4_CBC_PADDING_MAX_CT_SIZE 96 + +enum { + TEST_RESULT_VALID, + TEST_RESULT_INVALID, + TEST_RESULT_ACCEPTABLE, +}; + +typedef struct { + int tc_id; + const char *comment; + const char *flags; + const char *key; + const char *iv; + const char *msg; + const char *ct; + int result; +} TEST_SM4_CBC_PADDING_VECTOR; + +#include "sm4_cbc_paddingtest.h" + static int test_sm4_cbc(void) { @@ -185,6 +209,79 @@ static int test_sm4_cbc_padding(void) return 1; } +static int test_sm4_cbc_padding_openssl(void) +{ + size_t i; + + for (i = 0; i < sizeof(sm4_cbc_padding_tests)/sizeof(sm4_cbc_padding_tests[0]); i++) { + const TEST_SM4_CBC_PADDING_VECTOR *tv = &sm4_cbc_padding_tests[i]; + SM4_KEY sm4_key; + uint8_t key[TEST_SM4_CBC_PADDING_MAX_KEY_SIZE]; + uint8_t iv[TEST_SM4_CBC_PADDING_MAX_IV_SIZE]; + uint8_t msg[TEST_SM4_CBC_PADDING_MAX_MSG_SIZE]; + uint8_t ct[TEST_SM4_CBC_PADDING_MAX_CT_SIZE]; + uint8_t out[TEST_SM4_CBC_PADDING_MAX_CT_SIZE]; + size_t keylen, ivlen, msglen, ctlen, outlen; + int ret; + + if (strlen(tv->key)/2 > sizeof(key) + || strlen(tv->iv)/2 > sizeof(iv) + || strlen(tv->msg)/2 > sizeof(msg) + || strlen(tv->ct)/2 > sizeof(ct)) { + error_print(); + return -1; + } + if (hex_to_bytes(tv->key, strlen(tv->key), key, &keylen) != 1 + || hex_to_bytes(tv->iv, strlen(tv->iv), iv, &ivlen) != 1 + || hex_to_bytes(tv->msg, strlen(tv->msg), msg, &msglen) != 1 + || hex_to_bytes(tv->ct, strlen(tv->ct), ct, &ctlen) != 1) { + error_print(); + return -1; + } + if (keylen != SM4_KEY_SIZE || ivlen != SM4_BLOCK_SIZE) { + error_print(); + return -1; + } + + sm4_set_encrypt_key(&sm4_key, key); + if (tv->result == TEST_RESULT_VALID) { + ret = sm4_cbc_padding_encrypt(&sm4_key, iv, msglen ? msg : NULL, msglen, out, &outlen); + if (ret != 1 || outlen != ctlen || memcmp(out, ct, ctlen) != 0) { + fprintf(stderr, "SM4-CBC-Padding encrypt tcId %d failed: %s %s\n", + tv->tc_id, tv->comment, tv->flags); + error_print(); + return -1; + } + } + + sm4_set_decrypt_key(&sm4_key, key); + ret = sm4_cbc_padding_decrypt(&sm4_key, iv, ctlen ? ct : NULL, ctlen, out, &outlen); + if (tv->result == TEST_RESULT_VALID) { + if (ret != 1 || outlen != msglen || memcmp(out, msg, msglen) != 0) { + fprintf(stderr, "SM4-CBC-Padding decrypt tcId %d failed: %s %s\n", + tv->tc_id, tv->comment, tv->flags); + error_print(); + return -1; + } + } else if (tv->result == TEST_RESULT_INVALID) { + if (ret == 1) { + fprintf(stderr, "SM4-CBC-Padding decrypt tcId %d unexpectedly passed: %s %s\n", + tv->tc_id, tv->comment, tv->flags); + error_print(); + return -1; + } + } else { + if (ret != 1 && ret != -1 && ret != 0) { + error_print(); + return -1; + } + } + } + + printf("%s() ok\n", __FUNCTION__); + return 1; +} + static int test_sm4_cbc_ctx(void) { SM4_KEY sm4_key; @@ -326,6 +423,7 @@ int main(void) if (test_sm4_cbc() != 1) goto err; if (test_sm4_cbc_test_vectors() != 1) goto err; if (test_sm4_cbc_padding() != 1) goto err; + if (test_sm4_cbc_padding_openssl() != 1) goto err; if (test_sm4_cbc_ctx() != 1) goto err; printf("%s all tests passed\n", __FILE__); return 0;