diff options
author | Gregory Nutt <gnutt@nuttx.org> | 2014-07-03 07:42:44 -0600 |
---|---|---|
committer | Gregory Nutt <gnutt@nuttx.org> | 2014-07-03 07:42:44 -0600 |
commit | 9163867d163790af2cef584211c8a8c856370193 (patch) | |
tree | 8f37a5323feb9d3d41213a916d96f3cbf7b08f3d /nuttx/crypto/testmngr.c | |
parent | 90cf526960b520fc663df8f8d5c854961db5cecd (diff) | |
download | px4-nuttx-9163867d163790af2cef584211c8a8c856370193.tar.gz px4-nuttx-9163867d163790af2cef584211c8a8c856370193.tar.bz2 px4-nuttx-9163867d163790af2cef584211c8a8c856370193.zip |
Beginning of a crypto/ subsystem from Max Neklyudov
Diffstat (limited to 'nuttx/crypto/testmngr.c')
-rw-r--r-- | nuttx/crypto/testmngr.c | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/nuttx/crypto/testmngr.c b/nuttx/crypto/testmngr.c new file mode 100644 index 000000000..2b44bc560 --- /dev/null +++ b/nuttx/crypto/testmngr.c @@ -0,0 +1,125 @@ +/**************************************************************************** + * crypto/testmngr.c + * + * Copyright (C) 2014 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt <gnutt@nuttx.org> + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. 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. + * 3. Neither the name NuttX 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. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include <nuttx/config.h> + +#include <sys/types.h> +#include <stdbool.h> +#include <string.h> +#include <poll.h> +#include <errno.h> + +#include <nuttx/fs/fs.h> + +#include <crypto/crypto.h> +#include <nuttx/kmalloc.h> +#include <debug.h> + +#ifdef CONFIG_CRYPTO_ALGTEST + +#include "testmngr.h" + +#if defined(CONFIG_CRYPTO_AES) + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static int do_test_aes(FAR struct cipher_testvec* test, int mode, int encrypt) +{ + FAR void *out = kzalloc(test->rlen); + int res = aes_cypher(out, test->input, test->ilen, test->iv, test->key, + test->klen, mode, encrypt); + if (res == OK) + { + res = memcmp(out, test->result, test->rlen); + } + + kfree(out); + return res; +} + +#define AES_CYPHER_TEST_ENCRYPT(mode, mode_str, count, template) \ + for (i = 0; i < count; i++) { \ + if (do_test_aes(template + i, mode, CYPHER_ENCRYPT)) { \ + cryptdbg("Failed " mode_str " encrypt test #%i\n", i); \ + return -1; \ + } \ + } + +#define AES_CYPHER_TEST_DECRYPT(mode, mode_str, count, template) \ + for (i = 0; i < count; i++) { \ + if (do_test_aes(template + i, mode, CYPHER_DECRYPT)) { \ + cryptdbg("Failed " mode_str " decrypt test #%i\n", i); \ + return -1; \ + } \ + } + +#define AES_CYPHER_TEST(mode, mode_str, enc_count, dec_count, enc_template, dec_template) \ + AES_CYPHER_TEST_ENCRYPT(mode, mode_str, enc_count, enc_template)\ + AES_CYPHER_TEST_DECRYPT(mode, mode_str, dec_count, dec_template) + +static int test_aes(void) +{ + int i; + + AES_CYPHER_TEST(AES_MODE_ECB, "ECB", AES_ENC_TEST_VECTORS, AES_DEC_TEST_VECTORS, aes_enc_tv_template, aes_dec_tv_template) + AES_CYPHER_TEST(AES_MODE_CBC, "CBC", AES_CBC_ENC_TEST_VECTORS, AES_CBC_DEC_TEST_VECTORS, aes_cbc_enc_tv_template, aes_cbc_dec_tv_template) + AES_CYPHER_TEST(AES_MODE_CTR, "CTR", AES_CTR_ENC_TEST_VECTORS, AES_CTR_DEC_TEST_VECTORS, aes_ctr_enc_tv_template, aes_ctr_dec_tv_template) + + return OK; +} +#endif + +int crypto_test(void) +{ +#if defined(CONFIG_CRYPTO_AES) + if (test_aes()) return -1; +#endif + return OK; +} + +#else + +int crypto_test(void) +{ + return OK; +} + +#endif |