From 4ee53ce2ac2e32aa9ae9c2334f0770d7f5f28fa8 Mon Sep 17 00:00:00 2001 From: Kévin Le Gouguec Date: Thu, 29 Nov 2018 15:21:39 +0100 Subject: Ajout d'une cible dans le Makefile pour la livraison NIST MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Et aussi : - extraction des sources de TestVectorGen.zip (la flemme de m'assurer que le conteneur GCC aura unzip) - dépôt dans le dossier results ; on laissera Gitlab archiver le résultat pour nous --- Makefile | 11 ++- collect-traces.sh | 2 +- nist/README.md | 10 +-- nist/TestVectorGen.zip | Bin 10393 -> 0 bytes nist/TestVectorGen/crypto_aead.h | 18 +++++ nist/TestVectorGen/genkat_aead.c | 159 +++++++++++++++++++++++++++++++++++++++ nist/make-package.sh | 4 +- 7 files changed, 194 insertions(+), 10 deletions(-) delete mode 100644 nist/TestVectorGen.zip create mode 100644 nist/TestVectorGen/crypto_aead.h create mode 100644 nist/TestVectorGen/genkat_aead.c diff --git a/Makefile b/Makefile index 7b25332..7502c08 100644 --- a/Makefile +++ b/Makefile @@ -4,7 +4,10 @@ implementations = $(dir \ delegated = clean test -.PHONY: $(delegated) +.PHONY: $(delegated) nist + +results: + mkdir $@ $(delegated):: status=0; \ @@ -16,6 +19,7 @@ $(delegated):: clean:: - rm traces*.tgz + - rm -r results # To generate complete traces, apply this patch before running "make traces": # $ git apply traces.patch @@ -23,6 +27,9 @@ clean:: # $ git diff src > traces.patch traces: traces-ae traces-tbc -traces-%: +traces-%: | results @ echo "Collecting traces" @ ./collect-traces.sh $@ + +nist: | results + ./nist/make-package.sh diff --git a/collect-traces.sh b/collect-traces.sh index f4dc847..79d6c95 100755 --- a/collect-traces.sh +++ b/collect-traces.sh @@ -21,7 +21,7 @@ do cp ${implem_dir}/results/traces*.txt ${d} done -tar czf ${trace_type}.tgz -C ${d} . +tar czf results/${trace_type}.tgz -C ${d} . rm -r ${d} diff --git a/nist/README.md b/nist/README.md index 674e9dd..51eca24 100644 --- a/nist/README.md +++ b/nist/README.md @@ -1,9 +1,9 @@ -`TestVectorGen.zip` was retrieved on [NIST's website] ([direct link]). +`TestVectorGen` was retrieved from [NIST's website] ([direct link]). -`make-package.sh` will take create the directory structure specified -by [NIST's requirements], compile and run `TestVectorGen.zip`'s -`genkat_aead.c` against every member of the Lilliput-AE family, and -bundle the sources and the vectors into a tarball. +`make-package.sh` will create the directory structure specified by +[NIST's requirements], compile and run `TestVectorGen/genkat_aead.c` +against every member of the Lilliput-AE family, and bundle the sources +and vectors into a folder. [NIST's website]: https://csrc.nist.gov/projects/lightweight-cryptography diff --git a/nist/TestVectorGen.zip b/nist/TestVectorGen.zip deleted file mode 100644 index 938d9a8..0000000 Binary files a/nist/TestVectorGen.zip and /dev/null differ diff --git a/nist/TestVectorGen/crypto_aead.h b/nist/TestVectorGen/crypto_aead.h new file mode 100644 index 0000000..e2ca9b0 --- /dev/null +++ b/nist/TestVectorGen/crypto_aead.h @@ -0,0 +1,18 @@ + +int crypto_aead_encrypt( + unsigned char *c, unsigned long long *clen, + const unsigned char *m, unsigned long long mlen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *nsec, + const unsigned char *npub, + const unsigned char *k +); + +int crypto_aead_decrypt( + unsigned char *m, unsigned long long *mlen, + unsigned char *nsec, + const unsigned char *c, unsigned long long clen, + const unsigned char *ad, unsigned long long adlen, + const unsigned char *npub, + const unsigned char *k +); \ No newline at end of file diff --git a/nist/TestVectorGen/genkat_aead.c b/nist/TestVectorGen/genkat_aead.c new file mode 100644 index 0000000..666df24 --- /dev/null +++ b/nist/TestVectorGen/genkat_aead.c @@ -0,0 +1,159 @@ +// +// NIST-developed software is provided by NIST as a public service. +// You may use, copy and distribute copies of the software in any medium, +// provided that you keep intact this entire notice. You may improve, +// modify and create derivative works of the software or any portion of +// the software, and you may copy and distribute such modifications or +// works. Modified works should carry a notice stating that you changed +// the software and should note the date and nature of any such change. +// Please explicitly acknowledge the National Institute of Standards and +// Technology as the source of the software. +// +// NIST-developed software is expressly provided "AS IS." NIST MAKES NO +// WARRANTY OF ANY KIND, EXPRESS, IMPLIED, IN FACT OR ARISING BY OPERATION +// OF LAW, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTY OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE, NON-INFRINGEMENT AND DATA ACCURACY. NIST +// NEITHER REPRESENTS NOR WARRANTS THAT THE OPERATION OF THE SOFTWARE WILL BE +// UNINTERRUPTED OR ERROR-FREE, OR THAT ANY DEFECTS WILL BE CORRECTED. NIST +// DOES NOT WARRANT OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF THE SOFTWARE +// OR THE RESULTS THEREOF, INCLUDING BUT NOT LIMITED TO THE CORRECTNESS, ACCURACY, +// RELIABILITY, OR USEFULNESS OF THE SOFTWARE. +// +// You are solely responsible for determining the appropriateness of using and +// distributing the software and you assume all risks associated with its use, +// including but not limited to the risks and costs of program errors, compliance +// with applicable laws, damage to or loss of data, programs or equipment, and +// the unavailability or interruption of operation. This software is not intended +// to be used in any situation where a failure could cause risk of injury or +// damage to property. The software developed by NIST employees is not subject to +// copyright protection within the United States. +// + +// disable deprecation for sprintf and fopen +#ifdef _MSC_VER +#define _CRT_SECURE_NO_WARNINGS +#endif + +#include +#include + +#include "crypto_aead.h" +#include "api.h" + +#define KAT_SUCCESS 0 +#define KAT_FILE_OPEN_ERROR -1 +#define KAT_DATA_ERROR -3 +#define KAT_CRYPTO_FAILURE -4 + +#define MAX_FILE_NAME 256 +#define MAX_MESSAGE_LENGTH 32 +#define MAX_ASSOCIATED_DATA_LENGTH 32 + +void init_buffer(unsigned char *buffer, unsigned long long numbytes); + +void fprint_bstr(FILE *fp, const char *label, const unsigned char *data, unsigned long long length); + +int generate_test_vectors(); + +int main() +{ + int ret = generate_test_vectors(); + + if (ret != KAT_SUCCESS) { + fprintf(stderr, "test vector generation failed with code %d\n", ret); + } + + return ret; +} + +int generate_test_vectors() +{ + FILE *fp; + char fileName[MAX_FILE_NAME]; + unsigned char key[CRYPTO_KEYBYTES]; + unsigned char nonce[CRYPTO_NPUBBYTES]; + unsigned char msg[MAX_MESSAGE_LENGTH]; + unsigned char msg2[MAX_MESSAGE_LENGTH]; + unsigned char ad[MAX_ASSOCIATED_DATA_LENGTH]; + unsigned char ct[MAX_MESSAGE_LENGTH + CRYPTO_ABYTES]; + unsigned long long clen, mlen2; + int count = 1; + int func_ret, ret_val = KAT_SUCCESS; + + init_buffer(key, sizeof(key)); + init_buffer(nonce, sizeof(nonce)); + init_buffer(msg, sizeof(msg)); + init_buffer(ad, sizeof(ad)); + + sprintf(fileName, "LWC_AEAD_KAT_%d_%d.txt", (CRYPTO_KEYBYTES * 8), (CRYPTO_NPUBBYTES * 8)); + + if ((fp = fopen(fileName, "w")) == NULL) { + fprintf(stderr, "Couldn't open <%s> for write\n", fileName); + return KAT_FILE_OPEN_ERROR; + } + + for (unsigned long long mlen = 0; (mlen <= MAX_MESSAGE_LENGTH) && (ret_val == KAT_SUCCESS); mlen++) { + + for (unsigned long long adlen = 0; adlen <= MAX_ASSOCIATED_DATA_LENGTH; adlen++) { + + fprintf(fp, "Count = %d\n", count++); + + fprint_bstr(fp, "Key = ", key, CRYPTO_KEYBYTES); + + fprint_bstr(fp, "Nonce = ", nonce, CRYPTO_NPUBBYTES); + + fprint_bstr(fp, "PT = ", msg, mlen); + + fprint_bstr(fp, "AD = ", ad, adlen); + + if ((func_ret = crypto_aead_encrypt(ct, &clen, msg, mlen, ad, adlen, NULL, nonce, key)) != 0) { + fprintf(fp, "crypto_aead_encrypt returned <%d>\n", func_ret); + ret_val = KAT_CRYPTO_FAILURE; + break; + } + + fprint_bstr(fp, "CT = ", ct, clen); + + fprintf(fp, "\n"); + + if ((func_ret = crypto_aead_decrypt(msg2, &mlen2, NULL, ct, clen, ad, adlen, nonce, key)) != 0) { + fprintf(fp, "crypto_aead_decrypt returned <%d>\n", func_ret); + ret_val = KAT_CRYPTO_FAILURE; + break; + } + + if (mlen != mlen2) { + fprintf(fp, "crypto_aead_decrypt returned bad 'mlen': Got <%llu>, expected <%llu>\n", mlen2, mlen); + ret_val = KAT_CRYPTO_FAILURE; + break; + } + + if (memcmp(msg, msg2, mlen)) { + fprintf(fp, "crypto_aead_decrypt did not recover the plaintext\n"); + ret_val = KAT_CRYPTO_FAILURE; + break; + } + } + } + + fclose(fp); + + return ret_val; +} + + +void fprint_bstr(FILE *fp, const char *label, const unsigned char *data, unsigned long long length) +{ + fprintf(fp, "%s", label); + + for (unsigned long long i = 0; i < length; i++) + fprintf(fp, "%02X", data[i]); + + fprintf(fp, "\n"); +} + +void init_buffer(unsigned char *buffer, unsigned long long numbytes) +{ + for (unsigned long long i = 0; i < numbytes; i++) + buffer[i] = (unsigned char)i; +} diff --git a/nist/make-package.sh b/nist/make-package.sh index 009d997..4a4ae13 100755 --- a/nist/make-package.sh +++ b/nist/make-package.sh @@ -81,7 +81,7 @@ test-variant () } -unzip ${NIST_DIR}/TestVectorGen.zip -d ${TMP_DIR} +cp ${NIST_DIR}/TestVectorGen/* ${TMP_DIR} for mode in i ii do @@ -92,6 +92,6 @@ do done done -tar czf lilliput-ae.tgz -C ${TMP_DIR} crypto_aead +cp -r ${TMP_DIR}/crypto_aead results/ cleanup -- cgit v1.2.3