mirror of
https://github.com/apache/nuttx.git
synced 2025-01-13 06:18:40 +08:00
Beginning of a crypto/ subsystem from Max Neklyudov
This commit is contained in:
parent
6bfa7c1afa
commit
bb3dcccd98
13 changed files with 1251 additions and 0 deletions
11
Kconfig
11
Kconfig
|
@ -405,6 +405,13 @@ config DEBUG_NET
|
|||
---help---
|
||||
Enable network debug SYSLOG output (disabled by default)
|
||||
|
||||
config DEBUG_CRYPTO
|
||||
bool "Crypto Debug Output"
|
||||
default n
|
||||
depends on CRYPTO
|
||||
---help---
|
||||
Enable Crypto debug SYSLOG output (disabled by default)
|
||||
|
||||
config DEBUG_USB
|
||||
bool "USB Debug Output"
|
||||
default n
|
||||
|
@ -685,6 +692,10 @@ menu "Networking Support"
|
|||
source net/Kconfig
|
||||
endmenu
|
||||
|
||||
menu "Crypto API"
|
||||
source crypto/Kconfig
|
||||
endmenu
|
||||
|
||||
menu "File Systems"
|
||||
source fs/Kconfig
|
||||
endmenu
|
||||
|
|
|
@ -183,6 +183,11 @@ KERNDEPDIRS += net
|
|||
endif
|
||||
CLEANDIRS += net
|
||||
|
||||
ifeq ($(CONFIG_CRYPTO),y)
|
||||
KERNDEPDIRS += crypto
|
||||
endif
|
||||
CLEANDIRS += crypto
|
||||
|
||||
#
|
||||
# Extra objects used in the final link.
|
||||
#
|
||||
|
@ -244,6 +249,12 @@ ifeq ($(CONFIG_NET),y)
|
|||
NUTTXLIBS += lib/libnet$(LIBEXT)
|
||||
endif
|
||||
|
||||
# Add libraries for Crypto API support
|
||||
|
||||
ifeq ($(CONFIG_CRYPTO),y)
|
||||
NUTTXLIBS += lib/libcrypto$(LIBEXT)
|
||||
endif
|
||||
|
||||
# Add libraries for file system support
|
||||
|
||||
ifeq ($(CONFIG_NFILE_DESCRIPTORS),0)
|
||||
|
@ -513,6 +524,12 @@ net/libnet$(LIBEXT): context
|
|||
lib/libnet$(LIBEXT): net/libnet$(LIBEXT)
|
||||
$(Q) install net/libnet$(LIBEXT) lib/libnet$(LIBEXT)
|
||||
|
||||
crypto/libcrypto$(LIBEXT): context
|
||||
$(Q) $(MAKE) -C crypto TOPDIR="$(TOPDIR)" libcrypto$(LIBEXT) EXTRADEFINES=$(KDEFINE)
|
||||
|
||||
lib/libcrypto$(LIBEXT): crypto/libcrypto$(LIBEXT)
|
||||
$(Q) install crypto/libcrypto$(LIBEXT) lib/libcrypto$(LIBEXT)
|
||||
|
||||
fs/libfs$(LIBEXT): context
|
||||
$(Q) $(MAKE) -C fs TOPDIR="$(TOPDIR)" libfs$(LIBEXT) EXTRADEFINES=$(KDEFINE)
|
||||
|
||||
|
|
17
Makefile.win
17
Makefile.win
|
@ -176,6 +176,11 @@ KERNDEPDIRS += net
|
|||
endif
|
||||
CLEANDIRS += net
|
||||
|
||||
ifeq ($(CONFIG_CRYPTO),y)
|
||||
KERNDEPDIRS += crypto
|
||||
endif
|
||||
CLEANDIRS += crypto
|
||||
|
||||
#
|
||||
# Extra objects used in the final link.
|
||||
#
|
||||
|
@ -237,6 +242,12 @@ ifeq ($(CONFIG_NET),y)
|
|||
NUTTXLIBS += lib\libnet$(LIBEXT)
|
||||
endif
|
||||
|
||||
# Add libraries for Crypto API support
|
||||
|
||||
ifeq ($(CONFIG_CRYPTO),y)
|
||||
NUTTXLIBS += lib\libcrypto$(LIBEXT)
|
||||
endif
|
||||
|
||||
# Add libraries for file system support
|
||||
|
||||
ifeq ($(CONFIG_NFILE_DESCRIPTORS),0)
|
||||
|
@ -534,6 +545,12 @@ net\libnet$(LIBEXT): context
|
|||
lib\libnet$(LIBEXT): net\libnet$(LIBEXT)
|
||||
$(Q) install net\libnet$(LIBEXT) lib\libnet$(LIBEXT)
|
||||
|
||||
crypto\libcrypto$(LIBEXT): context
|
||||
$(Q) $(MAKE) -C crypto TOPDIR="$(TOPDIR)" libcrypto$(LIBEXT) EXTRADEFINES=$(KDEFINE)
|
||||
|
||||
lib\libcrypto$(LIBEXT): crypto\libcrypto$(LIBEXT)
|
||||
$(Q) install crypto\libcrypto$(LIBEXT) lib\libcrypto$(LIBEXT)
|
||||
|
||||
fs\libfs$(LIBEXT): context
|
||||
$(Q) $(MAKE) -C fs TOPDIR="$(TOPDIR)" libfs$(LIBEXT) EXTRADEFINES=$(KDEFINE)
|
||||
|
||||
|
|
|
@ -194,6 +194,14 @@ void up_initialize(void)
|
|||
devnull_register(); /* Standard /dev/null */
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CRYPTO)
|
||||
up_cryptoinitialize();
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CRYPTO_CRYPTODEV)
|
||||
devcrypto_register(); /* /dev/crypto */
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_DEV_ZERO)
|
||||
devzero_register(); /* Standard /dev/zero */
|
||||
#endif
|
||||
|
|
26
crypto/Kconfig
Normal file
26
crypto/Kconfig
Normal file
|
@ -0,0 +1,26 @@
|
|||
#
|
||||
# For a description of the syntax of this configuration file,
|
||||
# see misc/tools/kconfig-language.txt.
|
||||
#
|
||||
|
||||
config CRYPTO
|
||||
bool "Crypto API support"
|
||||
default n
|
||||
---help---
|
||||
Enable or disable Crypto API features
|
||||
|
||||
if CRYPTO
|
||||
|
||||
config CRYPTO_AES
|
||||
bool "AES cypher support"
|
||||
default n
|
||||
|
||||
config CRYPTO_ALGTEST
|
||||
bool "Perform automatic crypto algorithms test on startup"
|
||||
default n
|
||||
|
||||
config CRYPTO_CRYPTODEV
|
||||
bool "cryptodev support"
|
||||
default n
|
||||
|
||||
endif
|
91
crypto/Makefile
Normal file
91
crypto/Makefile
Normal file
|
@ -0,0 +1,91 @@
|
|||
############################################################################
|
||||
# crypto/Makefile
|
||||
#
|
||||
# Copyright (C) 2007, 2008, 2011-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.
|
||||
#
|
||||
############################################################################
|
||||
|
||||
-include $(TOPDIR)/Make.defs
|
||||
|
||||
ifeq ($(CONFIG_CRYPTO),y)
|
||||
|
||||
# Basic
|
||||
|
||||
CRYPTO_ASRCS =
|
||||
CRYPTO_CSRCS = crypto.c testmngr.c
|
||||
|
||||
# cryptodev support
|
||||
|
||||
ifeq ($(CONFIG_CRYPTO_CRYPTODEV),y)
|
||||
CRYPTO_CSRCS += cryptodev.c
|
||||
endif
|
||||
|
||||
endif # CONFIG_CRYPTO
|
||||
|
||||
ASRCS = $(CRYPTO_ASRCS)
|
||||
AOBJS = $(ASRCS:.S=$(OBJEXT))
|
||||
|
||||
CSRCS = $(CRYPTO_CSRCS)
|
||||
COBJS = $(CSRCS:.c=$(OBJEXT))
|
||||
|
||||
SRCS = $(ASRCS) $(CSRCS)
|
||||
OBJS = $(AOBJS) $(COBJS)
|
||||
|
||||
BIN = libcrypto$(LIBEXT)
|
||||
|
||||
all: $(BIN)
|
||||
|
||||
$(AOBJS): %$(OBJEXT): %.S
|
||||
$(call ASSEMBLE, $<, $@)
|
||||
|
||||
$(COBJS): %$(OBJEXT): %.c
|
||||
$(call COMPILE, $<, $@)
|
||||
|
||||
$(BIN): $(OBJS)
|
||||
$(call ARCHIVE, $@, $(OBJS))
|
||||
|
||||
.depend: Makefile $(SRCS)
|
||||
ifeq ($(CONFIG_CRYPTO),y)
|
||||
$(Q) $(MKDEP) --dep-path . "$(CC)" -- $(CFLAGS) -- $(SRCS) >Make.dep
|
||||
endif
|
||||
$(Q) touch $@
|
||||
|
||||
depend: .depend
|
||||
|
||||
clean:
|
||||
$(call DELFILE, $(BIN))
|
||||
$(call CLEAN)
|
||||
|
||||
distclean: clean
|
||||
$(call DELFILE, Make.dep)
|
||||
$(call DELFILE, .depend)
|
||||
|
||||
-include Make.dep
|
85
crypto/crypto.c
Normal file
85
crypto/crypto.c
Normal file
|
@ -0,0 +1,85 @@
|
|||
/****************************************************************************
|
||||
* crypto/crypto.c
|
||||
*
|
||||
* Copyright (C) 2007, 2008, 2013 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>
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
void up_cryptoinitialize(void)
|
||||
{
|
||||
int res = OK;
|
||||
|
||||
#if defined(CONFIG_CRYPTO_AES)
|
||||
res = up_aesinitialize();
|
||||
if (res)
|
||||
return res;
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CRYPTO_ALGTEST)
|
||||
res = crypto_test();
|
||||
if (res)
|
||||
cryptdbg("crypto test failed\n");
|
||||
else
|
||||
cryptvdbg("crypto test OK\n");
|
||||
#endif
|
||||
|
||||
return res;
|
||||
}
|
168
crypto/cryptodev.c
Normal file
168
crypto/cryptodev.c
Normal file
|
@ -0,0 +1,168 @@
|
|||
/****************************************************************************
|
||||
* crypto/cryptodev.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 <crypto/cryptodev.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Private Function Prototypes
|
||||
****************************************************************************/
|
||||
|
||||
/* Character driver methods */
|
||||
|
||||
static ssize_t cryptodev_read(FAR struct file *filep, FAR char *buffer,
|
||||
size_t len);
|
||||
static ssize_t cryptodev_write(FAR struct file *filep, FAR const char *buffer,
|
||||
size_t len);
|
||||
static int cryptodev_ioctl(FAR struct file *filep, int cmd,
|
||||
unsigned long arg);
|
||||
|
||||
/****************************************************************************
|
||||
* Private Data
|
||||
****************************************************************************/
|
||||
|
||||
static const struct file_operations g_cryptodevops =
|
||||
{
|
||||
0, /* open */
|
||||
0, /* close */
|
||||
cryptodev_read, /* read */
|
||||
cryptodev_write, /* write */
|
||||
0, /* seek */
|
||||
cryptodev_ioctl, /* ioctl */
|
||||
0, /* poll */
|
||||
};
|
||||
|
||||
/****************************************************************************
|
||||
* Private Functions
|
||||
****************************************************************************/
|
||||
|
||||
static ssize_t cryptodev_read(FAR struct file *filep, FAR char *buffer,
|
||||
size_t len)
|
||||
{
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
static ssize_t cryptodev_write(FAR struct file *filep, FAR const char *buffer,
|
||||
size_t len)
|
||||
{
|
||||
return -EACCES;
|
||||
}
|
||||
|
||||
static int cryptodev_ioctl(FAR struct file *filep, int cmd, unsigned long arg)
|
||||
{
|
||||
switch(cmd)
|
||||
{
|
||||
case CIOCGSESSION:
|
||||
{
|
||||
struct session_op *ses = (struct session_op*)arg;
|
||||
ses->ses = (uint32_t)ses;
|
||||
return OK;
|
||||
}
|
||||
|
||||
case CIOCFSESSION:
|
||||
{
|
||||
return OK;
|
||||
}
|
||||
|
||||
case CIOCCRYPT:
|
||||
{
|
||||
FAR struct crypt_op *op = (struct crypt_op*)arg;
|
||||
FAR struct session_op *ses = (struct session_op*)op->ses;
|
||||
int encrypt;
|
||||
|
||||
switch (op->op)
|
||||
{
|
||||
case COP_ENCRYPT:
|
||||
encrypt = 1;
|
||||
break;
|
||||
|
||||
case COP_DECRYPT:
|
||||
encrypt = 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (ses->cipher)
|
||||
{
|
||||
|
||||
#if defined(CONFIG_CRYPTO_AES)
|
||||
# define AES_CYPHER(mode) aes_cypher(op->dst, op->src, op->len, op->iv, ses->key, ses->keylen, mode, encrypt)
|
||||
|
||||
case CRYPTO_AES_ECB:
|
||||
return AES_CYPHER(AES_MODE_ECB);
|
||||
|
||||
case CRYPTO_AES_CBC:
|
||||
return AES_CYPHER(AES_MODE_CBC);
|
||||
|
||||
case CRYPTO_AES_CTR:
|
||||
return AES_CYPHER(AES_MODE_CTR);
|
||||
|
||||
# undef AES_CYPHER
|
||||
#endif
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
|
||||
void devcrypto_register(void)
|
||||
{
|
||||
(void)register_driver("/dev/crypto", &g_cryptodevops, 0666, NULL);
|
||||
}
|
125
crypto/testmngr.c
Normal file
125
crypto/testmngr.c
Normal file
|
@ -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
|
491
crypto/testmngr.h
Normal file
491
crypto/testmngr.h
Normal file
|
@ -0,0 +1,491 @@
|
|||
/****************************************************************************
|
||||
* include/crypto/testmngr.h
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __CRYPTO_TESTMNGR_H
|
||||
#define __CRYPTO_TESTMNGR_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-Processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
struct cipher_testvec
|
||||
{
|
||||
FAR char *key;
|
||||
FAR char *iv;
|
||||
FAR char *input;
|
||||
FAR char *result;
|
||||
int np;
|
||||
unsigned char fail;
|
||||
unsigned char wk;
|
||||
unsigned char klen;
|
||||
unsigned short ilen;
|
||||
unsigned short rlen;
|
||||
};
|
||||
|
||||
#if defined(CONFIG_CRYPTO_AES)
|
||||
|
||||
/* AES test vectors */
|
||||
|
||||
#define AES_ENC_TEST_VECTORS 3
|
||||
#define AES_DEC_TEST_VECTORS 3
|
||||
#define AES_CBC_ENC_TEST_VECTORS 4
|
||||
#define AES_CBC_DEC_TEST_VECTORS 4
|
||||
#define AES_CTR_ENC_TEST_VECTORS 3
|
||||
#define AES_CTR_DEC_TEST_VECTORS 3
|
||||
|
||||
static struct cipher_testvec aes_enc_tv_template[] =
|
||||
{
|
||||
{ /* From FIPS-197 */
|
||||
.key = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
||||
.klen = 16,
|
||||
.input = "\x00\x11\x22\x33\x44\x55\x66\x77"
|
||||
"\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
|
||||
.ilen = 16,
|
||||
.result = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
|
||||
"\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
|
||||
.rlen = 16,
|
||||
},
|
||||
{
|
||||
.key = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17",
|
||||
.klen = 24,
|
||||
.input = "\x00\x11\x22\x33\x44\x55\x66\x77"
|
||||
"\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
|
||||
.ilen = 16,
|
||||
.result = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
|
||||
"\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
|
||||
.rlen = 16,
|
||||
},
|
||||
{
|
||||
.key = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17"
|
||||
"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
|
||||
.klen = 32,
|
||||
.input = "\x00\x11\x22\x33\x44\x55\x66\x77"
|
||||
"\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
|
||||
.ilen = 16,
|
||||
.result = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
|
||||
"\xea\xfc\x49\x90\x4b\x49\x60\x89",
|
||||
.rlen = 16,
|
||||
},
|
||||
};
|
||||
|
||||
static struct cipher_testvec aes_dec_tv_template[] =
|
||||
{
|
||||
{ /* From FIPS-197 */
|
||||
.key = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
||||
.klen = 16,
|
||||
.input = "\x69\xc4\xe0\xd8\x6a\x7b\x04\x30"
|
||||
"\xd8\xcd\xb7\x80\x70\xb4\xc5\x5a",
|
||||
.ilen = 16,
|
||||
.result = "\x00\x11\x22\x33\x44\x55\x66\x77"
|
||||
"\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
|
||||
.rlen = 16,
|
||||
},
|
||||
{
|
||||
.key = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17",
|
||||
.klen = 24,
|
||||
.input = "\xdd\xa9\x7c\xa4\x86\x4c\xdf\xe0"
|
||||
"\x6e\xaf\x70\xa0\xec\x0d\x71\x91",
|
||||
.ilen = 16,
|
||||
.result = "\x00\x11\x22\x33\x44\x55\x66\x77"
|
||||
"\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
|
||||
.rlen = 16,
|
||||
},
|
||||
{
|
||||
.key = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17"
|
||||
"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
|
||||
.klen = 32,
|
||||
.input = "\x8e\xa2\xb7\xca\x51\x67\x45\xbf"
|
||||
"\xea\xfc\x49\x90\x4b\x49\x60\x89",
|
||||
.ilen = 16,
|
||||
.result = "\x00\x11\x22\x33\x44\x55\x66\x77"
|
||||
"\x88\x99\xaa\xbb\xcc\xdd\xee\xff",
|
||||
.rlen = 16,
|
||||
},
|
||||
};
|
||||
|
||||
static struct cipher_testvec aes_cbc_enc_tv_template[] =
|
||||
{
|
||||
{ /* From RFC 3602 */
|
||||
.key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
|
||||
"\x51\x2e\x03\xd5\x34\x12\x00\x06",
|
||||
.klen = 16,
|
||||
.iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
|
||||
"\xb4\x22\xda\x80\x2c\x9f\xac\x41",
|
||||
.input = "Single block msg",
|
||||
.ilen = 16,
|
||||
.result = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
|
||||
"\x27\x08\x94\x2d\xbe\x77\x18\x1a",
|
||||
.rlen = 16,
|
||||
},
|
||||
{
|
||||
.key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
|
||||
"\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
|
||||
.klen = 16,
|
||||
.iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
|
||||
"\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
|
||||
.input = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17"
|
||||
"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
|
||||
.ilen = 32,
|
||||
.result = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
|
||||
"\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
|
||||
"\x75\x86\x60\x2d\x25\x3c\xff\xf9"
|
||||
"\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
|
||||
.rlen = 32,
|
||||
},
|
||||
{ /* From NIST SP800-38A */
|
||||
.key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
|
||||
"\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
|
||||
"\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
|
||||
.klen = 24,
|
||||
.iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
||||
.input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.ilen = 64,
|
||||
.result = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
|
||||
"\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
|
||||
"\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
|
||||
"\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
|
||||
"\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
|
||||
"\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
|
||||
"\x08\xb0\xe2\x79\x88\x59\x88\x81"
|
||||
"\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
|
||||
.rlen = 64,
|
||||
},
|
||||
{
|
||||
.key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
|
||||
"\x2b\x73\xae\xf0\x85\x7d\x77\x81"
|
||||
"\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
|
||||
"\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
|
||||
.klen = 32,
|
||||
.iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
||||
.input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.ilen = 64,
|
||||
.result = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
|
||||
"\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
|
||||
"\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
|
||||
"\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
|
||||
"\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
|
||||
"\xa5\x30\xe2\x63\x04\x23\x14\x61"
|
||||
"\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
|
||||
"\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
|
||||
.rlen = 64,
|
||||
},
|
||||
};
|
||||
|
||||
static struct cipher_testvec aes_cbc_dec_tv_template[] =
|
||||
{
|
||||
{ /* From RFC 3602 */
|
||||
.key = "\x06\xa9\x21\x40\x36\xb8\xa1\x5b"
|
||||
"\x51\x2e\x03\xd5\x34\x12\x00\x06",
|
||||
.klen = 16,
|
||||
.iv = "\x3d\xaf\xba\x42\x9d\x9e\xb4\x30"
|
||||
"\xb4\x22\xda\x80\x2c\x9f\xac\x41",
|
||||
.input = "\xe3\x53\x77\x9c\x10\x79\xae\xb8"
|
||||
"\x27\x08\x94\x2d\xbe\x77\x18\x1a",
|
||||
.ilen = 16,
|
||||
.result = "Single block msg",
|
||||
.rlen = 16,
|
||||
},
|
||||
{
|
||||
.key = "\xc2\x86\x69\x6d\x88\x7c\x9a\xa0"
|
||||
"\x61\x1b\xbb\x3e\x20\x25\xa4\x5a",
|
||||
.klen = 16,
|
||||
.iv = "\x56\x2e\x17\x99\x6d\x09\x3d\x28"
|
||||
"\xdd\xb3\xba\x69\x5a\x2e\x6f\x58",
|
||||
.input = "\xd2\x96\xcd\x94\xc2\xcc\xcf\x8a"
|
||||
"\x3a\x86\x30\x28\xb5\xe1\xdc\x0a"
|
||||
"\x75\x86\x60\x2d\x25\x3c\xff\xf9"
|
||||
"\x1b\x82\x66\xbe\xa6\xd6\x1a\xb1",
|
||||
.ilen = 32,
|
||||
.result = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
|
||||
"\x10\x11\x12\x13\x14\x15\x16\x17"
|
||||
"\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f",
|
||||
.rlen = 32,
|
||||
},
|
||||
{ /* From NIST SP800-38A */
|
||||
.key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
|
||||
"\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
|
||||
"\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
|
||||
.klen = 24,
|
||||
.iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
||||
.input = "\x4f\x02\x1d\xb2\x43\xbc\x63\x3d"
|
||||
"\x71\x78\x18\x3a\x9f\xa0\x71\xe8"
|
||||
"\xb4\xd9\xad\xa9\xad\x7d\xed\xf4"
|
||||
"\xe5\xe7\x38\x76\x3f\x69\x14\x5a"
|
||||
"\x57\x1b\x24\x20\x12\xfb\x7a\xe0"
|
||||
"\x7f\xa9\xba\xac\x3d\xf1\x02\xe0"
|
||||
"\x08\xb0\xe2\x79\x88\x59\x88\x81"
|
||||
"\xd9\x20\xa9\xe6\x4f\x56\x15\xcd",
|
||||
.ilen = 64,
|
||||
.result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.rlen = 64,
|
||||
},
|
||||
{
|
||||
.key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
|
||||
"\x2b\x73\xae\xf0\x85\x7d\x77\x81"
|
||||
"\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
|
||||
"\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
|
||||
.klen = 32,
|
||||
.iv = "\x00\x01\x02\x03\x04\x05\x06\x07"
|
||||
"\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
|
||||
.input = "\xf5\x8c\x4c\x04\xd6\xe5\xf1\xba"
|
||||
"\x77\x9e\xab\xfb\x5f\x7b\xfb\xd6"
|
||||
"\x9c\xfc\x4e\x96\x7e\xdb\x80\x8d"
|
||||
"\x67\x9f\x77\x7b\xc6\x70\x2c\x7d"
|
||||
"\x39\xf2\x33\x69\xa9\xd9\xba\xcf"
|
||||
"\xa5\x30\xe2\x63\x04\x23\x14\x61"
|
||||
"\xb2\xeb\x05\xe2\xc3\x9b\xe9\xfc"
|
||||
"\xda\x6c\x19\x07\x8c\x6a\x9d\x1b",
|
||||
.ilen = 64,
|
||||
.result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.rlen = 64,
|
||||
},
|
||||
};
|
||||
|
||||
static struct cipher_testvec aes_ctr_enc_tv_template[] =
|
||||
{
|
||||
{ /* From NIST Special Publication 800-38A, Appendix F.5 */
|
||||
.key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6"
|
||||
"\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
|
||||
.klen = 16,
|
||||
.iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
|
||||
"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
|
||||
.input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.ilen = 64,
|
||||
.result = "\x87\x4d\x61\x91\xb6\x20\xe3\x26"
|
||||
"\x1b\xef\x68\x64\x99\x0d\xb6\xce"
|
||||
"\x98\x06\xf6\x6b\x79\x70\xfd\xff"
|
||||
"\x86\x17\x18\x7b\xb9\xff\xfd\xff"
|
||||
"\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e"
|
||||
"\x5b\x4f\x09\x02\x0d\xb0\x3e\xab"
|
||||
"\x1e\x03\x1d\xda\x2f\xbe\x03\xd1"
|
||||
"\x79\x21\x70\xa0\xf3\x00\x9c\xee",
|
||||
.rlen = 64,
|
||||
},
|
||||
{
|
||||
.key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
|
||||
"\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
|
||||
"\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
|
||||
.klen = 24,
|
||||
.iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
|
||||
"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
|
||||
.input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.ilen = 64,
|
||||
.result = "\x1a\xbc\x93\x24\x17\x52\x1c\xa2"
|
||||
"\x4f\x2b\x04\x59\xfe\x7e\x6e\x0b"
|
||||
"\x09\x03\x39\xec\x0a\xa6\xfa\xef"
|
||||
"\xd5\xcc\xc2\xc6\xf4\xce\x8e\x94"
|
||||
"\x1e\x36\xb2\x6b\xd1\xeb\xc6\x70"
|
||||
"\xd1\xbd\x1d\x66\x56\x20\xab\xf7"
|
||||
"\x4f\x78\xa7\xf6\xd2\x98\x09\x58"
|
||||
"\x5a\x97\xda\xec\x58\xc6\xb0\x50",
|
||||
.rlen = 64,
|
||||
},
|
||||
{
|
||||
.key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
|
||||
"\x2b\x73\xae\xf0\x85\x7d\x77\x81"
|
||||
"\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
|
||||
"\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
|
||||
.klen = 32,
|
||||
.iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
|
||||
"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
|
||||
.input = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.ilen = 64,
|
||||
.result = "\x60\x1e\xc3\x13\x77\x57\x89\xa5"
|
||||
"\xb7\xa7\xf5\x04\xbb\xf3\xd2\x28"
|
||||
"\xf4\x43\xe3\xca\x4d\x62\xb5\x9a"
|
||||
"\xca\x84\xe9\x90\xca\xca\xf5\xc5"
|
||||
"\x2b\x09\x30\xda\xa2\x3d\xe9\x4c"
|
||||
"\xe8\x70\x17\xba\x2d\x84\x98\x8d"
|
||||
"\xdf\xc9\xc5\x8d\xb6\x7a\xad\xa6"
|
||||
"\x13\xc2\xdd\x08\x45\x79\x41\xa6",
|
||||
.rlen = 64,
|
||||
}
|
||||
};
|
||||
|
||||
static struct cipher_testvec aes_ctr_dec_tv_template[] =
|
||||
{
|
||||
{ /* From NIST Special Publication 800-38A, Appendix F.5 */
|
||||
.key = "\x2b\x7e\x15\x16\x28\xae\xd2\xa6"
|
||||
"\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
|
||||
.klen = 16,
|
||||
.iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
|
||||
"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
|
||||
.input = "\x87\x4d\x61\x91\xb6\x20\xe3\x26"
|
||||
"\x1b\xef\x68\x64\x99\x0d\xb6\xce"
|
||||
"\x98\x06\xf6\x6b\x79\x70\xfd\xff"
|
||||
"\x86\x17\x18\x7b\xb9\xff\xfd\xff"
|
||||
"\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e"
|
||||
"\x5b\x4f\x09\x02\x0d\xb0\x3e\xab"
|
||||
"\x1e\x03\x1d\xda\x2f\xbe\x03\xd1"
|
||||
"\x79\x21\x70\xa0\xf3\x00\x9c\xee",
|
||||
.ilen = 64,
|
||||
.result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.rlen = 64,
|
||||
},
|
||||
{
|
||||
.key = "\x8e\x73\xb0\xf7\xda\x0e\x64\x52"
|
||||
"\xc8\x10\xf3\x2b\x80\x90\x79\xe5"
|
||||
"\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
|
||||
.klen = 24,
|
||||
.iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
|
||||
"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
|
||||
.input = "\x1a\xbc\x93\x24\x17\x52\x1c\xa2"
|
||||
"\x4f\x2b\x04\x59\xfe\x7e\x6e\x0b"
|
||||
"\x09\x03\x39\xec\x0a\xa6\xfa\xef"
|
||||
"\xd5\xcc\xc2\xc6\xf4\xce\x8e\x94"
|
||||
"\x1e\x36\xb2\x6b\xd1\xeb\xc6\x70"
|
||||
"\xd1\xbd\x1d\x66\x56\x20\xab\xf7"
|
||||
"\x4f\x78\xa7\xf6\xd2\x98\x09\x58"
|
||||
"\x5a\x97\xda\xec\x58\xc6\xb0\x50",
|
||||
.ilen = 64,
|
||||
.result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.rlen = 64,
|
||||
},
|
||||
{
|
||||
.key = "\x60\x3d\xeb\x10\x15\xca\x71\xbe"
|
||||
"\x2b\x73\xae\xf0\x85\x7d\x77\x81"
|
||||
"\x1f\x35\x2c\x07\x3b\x61\x08\xd7"
|
||||
"\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
|
||||
.klen = 32,
|
||||
.iv = "\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7"
|
||||
"\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
|
||||
.input = "\x60\x1e\xc3\x13\x77\x57\x89\xa5"
|
||||
"\xb7\xa7\xf5\x04\xbb\xf3\xd2\x28"
|
||||
"\xf4\x43\xe3\xca\x4d\x62\xb5\x9a"
|
||||
"\xca\x84\xe9\x90\xca\xca\xf5\xc5"
|
||||
"\x2b\x09\x30\xda\xa2\x3d\xe9\x4c"
|
||||
"\xe8\x70\x17\xba\x2d\x84\x98\x8d"
|
||||
"\xdf\xc9\xc5\x8d\xb6\x7a\xad\xa6"
|
||||
"\x13\xc2\xdd\x08\x45\x79\x41\xa6",
|
||||
.ilen = 64,
|
||||
.result = "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96"
|
||||
"\xe9\x3d\x7e\x11\x73\x93\x17\x2a"
|
||||
"\xae\x2d\x8a\x57\x1e\x03\xac\x9c"
|
||||
"\x9e\xb7\x6f\xac\x45\xaf\x8e\x51"
|
||||
"\x30\xc8\x1c\x46\xa3\x5c\xe4\x11"
|
||||
"\xe5\xfb\xc1\x19\x1a\x0a\x52\xef"
|
||||
"\xf6\x9f\x24\x45\xdf\x4f\x9b\x17"
|
||||
"\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
|
||||
.rlen = 64,
|
||||
}
|
||||
};
|
||||
|
||||
#endif /* CONFIG_CRYPTO_AES */
|
||||
#endif /* __CRYPTO_TESTMNGR_H */
|
106
include/crypto/crypto.h
Normal file
106
include/crypto/crypto.h
Normal file
|
@ -0,0 +1,106 @@
|
|||
/****************************************************************************
|
||||
* include/crypto/crypto.h
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __INCLUDE_CRYPTO_CRYPTO_H
|
||||
#define __INCLUDE_CRYPTO_CRYPTO_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
#include <debug.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-Processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#if defined(CONFIG_CRYPTO_AES)
|
||||
# define AES_MODE_MIN 1
|
||||
|
||||
# define AES_MODE_ECB 1
|
||||
# define AES_MODE_CBC 2
|
||||
# define AES_MODE_CTR 3
|
||||
|
||||
# define AES_MODE_MAX 3
|
||||
#endif
|
||||
|
||||
#define CYPHER_ENCRYPT 1
|
||||
#define CYPHER_DECRYPT 0
|
||||
|
||||
#ifdef CONFIG_DEBUG_CRYPTO
|
||||
# define cryptdbg lldbg
|
||||
# ifdef CONFIG_DEBUG_VERBOSE
|
||||
# define cryptvdbg lldbg
|
||||
# else
|
||||
# define cryptvdbg(x...)
|
||||
# endif
|
||||
#else
|
||||
# define cryptdbg(x...)
|
||||
# define cryptvdbg(x...)
|
||||
#endif
|
||||
|
||||
#ifndef __ASSEMBLY__
|
||||
|
||||
/************************************************************************************
|
||||
* Public Data
|
||||
************************************************************************************/
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
#define EXTERN extern "C"
|
||||
extern "C"
|
||||
{
|
||||
#else
|
||||
#define EXTERN extern
|
||||
#endif
|
||||
|
||||
/************************************************************************************
|
||||
* Public Function Prototypes
|
||||
************************************************************************************/
|
||||
|
||||
#if defined(CONFIG_CRYPTO_AES)
|
||||
int up_aesinitialize(void);
|
||||
int aes_cypher(FAR void *out, FAR const void *in, uint32_t size, FAR const void *iv,
|
||||
FAR const void *key, uint32_t keysize, int mode, int encrypt);
|
||||
#endif
|
||||
|
||||
#undef EXTERN
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
#endif /* __INCLUDE_CRYPTO_CRYPTO_H */
|
95
include/crypto/cryptodev.h
Normal file
95
include/crypto/cryptodev.h
Normal file
|
@ -0,0 +1,95 @@
|
|||
/****************************************************************************
|
||||
* include/crypto/cryptodev.h
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
#ifndef __INCLUDE_CRYPTO_CRYPTODEV_H
|
||||
#define __INCLUDE_CRYPTO_CRYPTODEV_H
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
/****************************************************************************
|
||||
* Pre-Processor Definitions
|
||||
****************************************************************************/
|
||||
|
||||
#define RIJNDAEL128_BLOCK_LEN 16
|
||||
#define AES_BLOCK_LEN RIJNDAEL128_BLOCK_LEN
|
||||
|
||||
#define CRYPTO_ALGORITHM_MIN 1
|
||||
#define CRYPTO_AES_ECB 1
|
||||
#define CRYPTO_AES_CBC 2
|
||||
#define CRYPTO_AES_CTR 3
|
||||
#define CRYPTO_ALGORITHM_MAX 1
|
||||
|
||||
#define CRYPTO_FLAG_HARDWARE 0x01000000 /* hardware accelerated */
|
||||
#define CRYPTO_FLAG_SOFTWARE 0x02000000 /* software implementation */
|
||||
|
||||
#define COP_ENCRYPT 1
|
||||
#define COP_DECRYPT 2
|
||||
#define COP_F_BATCH 0x0008 /* Batch op if possible */
|
||||
|
||||
#define CIOCGSESSION 101
|
||||
#define CIOCFSESSION 102
|
||||
#define CIOCCRYPT 103
|
||||
|
||||
typedef char* caddr_t;
|
||||
|
||||
struct session_op
|
||||
{
|
||||
uint32_t cipher; /* ie. CRYPTO_AES_EBC */
|
||||
uint32_t mac;
|
||||
|
||||
uint32_t keylen; /* cipher key */
|
||||
caddr_t key;
|
||||
int mackeylen; /* mac key */
|
||||
caddr_t mackey;
|
||||
|
||||
uint32_t ses; /* returns: session # */
|
||||
};
|
||||
|
||||
struct crypt_op
|
||||
{
|
||||
uint32_t ses;
|
||||
uint16_t op; /* i.e. COP_ENCRYPT */
|
||||
uint16_t flags;
|
||||
unsigned len;
|
||||
caddr_t src, dst; /* become iov[] inside kernel */
|
||||
caddr_t mac; /* must be big enough for chosen MAC */
|
||||
caddr_t iv;
|
||||
};
|
||||
|
||||
#endif /* __INCLUDE_CRYPTO_CRYPTODEV_H */
|
|
@ -662,6 +662,17 @@ off_t file_seek(FAR struct file *filep, off_t offset, int whence);
|
|||
|
||||
void devnull_register(void);
|
||||
|
||||
/* crypto/cryptodev.c *******************************************************/
|
||||
/****************************************************************************
|
||||
* Name: devcrypto_register
|
||||
*
|
||||
* Description:
|
||||
* Register /dev/crypto
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void devcrypto_register(void);
|
||||
|
||||
/* drivers/dev_zero.c *******************************************************/
|
||||
/****************************************************************************
|
||||
* Name: devzero_register
|
||||
|
|
Loading…
Reference in a new issue