Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F145962547
D37420.id113772.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
10 KB
Referenced Files
None
Subscribers
None
D37420.id113772.diff
View Options
Index: sys/arm/conf/ARMADA38X
===================================================================
--- sys/arm/conf/ARMADA38X
+++ sys/arm/conf/ARMADA38X
@@ -35,6 +35,7 @@
device pty
device loop
device md
+device ossl
# Serial ports
device uart
@@ -56,7 +57,6 @@
# Interrupt controllers
device gic
-device ossl
# Timers
device mpcore_timer
Index: sys/conf/files.arm
===================================================================
--- sys/conf/files.arm
+++ sys/conf/files.arm
@@ -129,6 +129,15 @@
libkern/udivdi3.c standard
libkern/umoddi3.c standard
+crypto/openssl/ossl_arm.c optional ossl
+crypto/openssl/arm/chacha-armv4.S optional ossl
+crypto/openssl/arm/poly1305-armv4.S optional ossl
+crypto/openssl/arm/sha1-armv4-large.S optional ossl
+crypto/openssl/arm/sha256-armv4.S optional ossl
+crypto/openssl/arm/sha512-armv4.S optional ossl
+crypto/openssl/arm/aes-armv4.S optional ossl
+crypto/openssl/arm/bsaes-armv7.S optional ossl
+
# Annapurna support
arm/annapurna/alpine/alpine_ccu.c optional al_ccu fdt
arm/annapurna/alpine/alpine_nb_service.c optional al_nb_service fdt
Index: sys/crypto/openssl/arm/arm_arch.h
===================================================================
--- /dev/null
+++ sys/crypto/openssl/arm/arm_arch.h
@@ -0,0 +1,84 @@
+/*
+ * Copyright 2011-2018 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the OpenSSL license (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#ifndef OSSL_CRYPTO_ARM_ARCH_H
+# define OSSL_CRYPTO_ARM_ARCH_H
+
+# if !defined(__ARM_ARCH__)
+# if defined(__CC_ARM)
+# define __ARM_ARCH__ __TARGET_ARCH_ARM
+# if defined(__BIG_ENDIAN)
+# define __ARMEB__
+# else
+# define __ARMEL__
+# endif
+# elif defined(__GNUC__)
+# if defined(__aarch64__)
+# define __ARM_ARCH__ 8
+# if __BYTE_ORDER__==__ORDER_BIG_ENDIAN__
+# define __ARMEB__
+# else
+# define __ARMEL__
+# endif
+ /*
+ * Why doesn't gcc define __ARM_ARCH__? Instead it defines
+ * bunch of below macros. See all_architectures[] table in
+ * gcc/config/arm/arm.c. On a side note it defines
+ * __ARMEL__/__ARMEB__ for little-/big-endian.
+ */
+# elif defined(__ARM_ARCH)
+# define __ARM_ARCH__ __ARM_ARCH
+# elif defined(__ARM_ARCH_8A__)
+# define __ARM_ARCH__ 8
+# elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) || \
+ defined(__ARM_ARCH_7R__)|| defined(__ARM_ARCH_7M__) || \
+ defined(__ARM_ARCH_7EM__)
+# define __ARM_ARCH__ 7
+# elif defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J__) || \
+ defined(__ARM_ARCH_6K__)|| defined(__ARM_ARCH_6M__) || \
+ defined(__ARM_ARCH_6Z__)|| defined(__ARM_ARCH_6ZK__) || \
+ defined(__ARM_ARCH_6T2__)
+# define __ARM_ARCH__ 6
+# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) || \
+ defined(__ARM_ARCH_5E__)|| defined(__ARM_ARCH_5TE__) || \
+ defined(__ARM_ARCH_5TEJ__)
+# define __ARM_ARCH__ 5
+# elif defined(__ARM_ARCH_4__) || defined(__ARM_ARCH_4T__)
+# define __ARM_ARCH__ 4
+# else
+# error "unsupported ARM architecture"
+# endif
+# endif
+# endif
+
+# if !defined(__ARM_MAX_ARCH__)
+# define __ARM_MAX_ARCH__ __ARM_ARCH__
+# endif
+
+# if __ARM_MAX_ARCH__<__ARM_ARCH__
+# error "__ARM_MAX_ARCH__ can't be less than __ARM_ARCH__"
+# elif __ARM_MAX_ARCH__!=__ARM_ARCH__
+# if __ARM_ARCH__<7 && __ARM_MAX_ARCH__>=7 && defined(__ARMEB__)
+# error "can't build universal big-endian binary"
+# endif
+# endif
+
+# ifndef __ASSEMBLER__
+extern unsigned int OPENSSL_armcap_P;
+# endif
+
+# define ARMV7_NEON (1<<0)
+# define ARMV7_TICK (1<<1)
+# define ARMV8_AES (1<<2)
+# define ARMV8_SHA1 (1<<3)
+# define ARMV8_SHA256 (1<<4)
+# define ARMV8_PMULL (1<<5)
+# define ARMV8_SHA512 (1<<6)
+
+#endif
Index: sys/crypto/openssl/ossl.h
===================================================================
--- sys/crypto/openssl/ossl.h
+++ sys/crypto/openssl/ossl.h
@@ -51,12 +51,18 @@
};
/* Needs to be big enough to hold any hash context. */
+#if defined (__arm__)
+#define CONTEXT_DUMMY_SIZE 512
+#else
+#define CONTEXT_DUMMY_SIZE 61
+#endif
+
struct ossl_hash_context {
- uint32_t dummy[61];
+ uint32_t dummy[CONTEXT_DUMMY_SIZE];
} __aligned(32);
struct ossl_cipher_context {
- uint32_t dummy[61];
+ uint32_t dummy[CONTEXT_DUMMY_SIZE];
} __aligned(32);
struct ossl_session_hash {
Index: sys/crypto/openssl/ossl_aes.c
===================================================================
--- sys/crypto/openssl/ossl_aes.c
+++ sys/crypto/openssl/ossl_aes.c
@@ -40,6 +40,8 @@
#include <crypto/openssl/ossl_x86.h>
#elif defined (__aarch64__)
#include <crypto/openssl/ossl_aarch64.h>
+#elif defined (__arm__)
+#include <crypto/openssl/ossl_arm.h>
#endif
static ossl_cipher_process_t ossl_aes_cbc;
@@ -95,7 +97,6 @@
}
crypto_read_iv(crp, iv);
-
/* Derived from ossl_chacha20.c */
crypto_cursor_init(&cc_in, &crp->crp_buf);
crypto_cursor_advance(&cc_in, crp->crp_payload_start);
Index: sys/crypto/openssl/ossl_arm.h
===================================================================
--- /dev/null
+++ sys/crypto/openssl/ossl_arm.h
@@ -0,0 +1,48 @@
+/*
+ * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the OpenSSL license (the "License"). You may not use
+ * this file except in compliance with the License. You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#ifndef __OSSL_ARM__
+#define __OSSL_ARM__
+
+#include <crypto/openssl/ossl.h>
+#include <crypto/openssl/ossl_cipher.h>
+
+ossl_cipher_encrypt_t bsaes_cbc_encrypt;
+
+void AES_encrypt(void *, void *, const void *);
+
+static void
+AES_CBC_ENCRYPT(const unsigned char *in, unsigned char *out,
+ size_t length, const void *key, unsigned char *iv, int encrypt)
+{
+ KASSERT(!(length % AES_BLOCK_LEN), "AES_CBC_ENCRYPT: size error");
+ if (encrypt) {
+ size_t i;
+
+ for(i = 0; i < length / AES_BLOCK_LEN; i++){
+ uint32_t buf[4];
+ int a;
+
+ /* XOR IV with plaintext */
+ for (a = 0; a < 4; a++)
+ buf[a] = ((const uint32_t *)in)[a] ^
+ ((const uint32_t *)iv)[a];
+
+ AES_encrypt(buf, out, (const void*)key);
+
+ /* Ciphertext is our new IV */
+ memcpy(iv, out, 16);
+ in += AES_BLOCK_LEN;
+ out += AES_BLOCK_LEN;
+ }
+ } else
+ bsaes_cbc_encrypt(in, out, length, key, iv, encrypt);
+
+}
+#endif
Index: sys/crypto/openssl/ossl_arm.c
===================================================================
--- /dev/null
+++ sys/crypto/openssl/ossl_arm.c
@@ -0,0 +1,64 @@
+/*-
+ * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+ *
+ * Copyright (c) 2020 The FreeBSD Foundation
+ *
+ * This software was developed by Mitchell Horne <mhorne@FreeBSD.org>
+ * under sponsorship from the FreeBSD Foundation.
+ *
+ * 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.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+
+#include <machine/armreg.h>
+#include <machine/elf.h>
+#include <machine/md_var.h>
+#include <machine/pcb.h>
+#include <machine/vfp.h>
+
+#include <crypto/openssl/ossl.h>
+#include <crypto/openssl/ossl_cipher.h>
+#include <crypto/openssl/arm/arm_arch.h>
+
+ossl_cipher_setkey_t AES_set_encrypt_key;
+ossl_cipher_setkey_t AES_set_decrypt_key;
+
+void
+ossl_cpuid(struct ossl_softc *sc)
+{
+
+ if (elf_hwcap & HWCAP_NEON) {
+ OPENSSL_armcap_P |= ARMV7_NEON;
+
+ sc->has_aes = true;
+ ossl_cipher_aes_cbc.set_encrypt_key = AES_set_encrypt_key;
+ ossl_cipher_aes_cbc.set_decrypt_key = AES_set_decrypt_key;
+ }
+}
Index: sys/modules/ossl/Makefile
===================================================================
--- sys/modules/ossl/Makefile
+++ sys/modules/ossl/Makefile
@@ -17,6 +17,16 @@
ossl_sha512.c \
${SRCS.${MACHINE_CPUARCH}}
+SRCS.arm= \
+ ossl_arm.c \
+ chacha-armv4.S \
+ poly1305-armv4.S \
+ sha1-armv4-large.S \
+ sha256-armv4.S \
+ sha512-armv4.S \
+ aes-armv4.S \
+ bsaes-armv7.S
+
SRCS.aarch64= \
chacha-armv8.S \
poly1305-armv8.S \
Index: sys/opencrypto/cbc_mac.c
===================================================================
--- sys/opencrypto/cbc_mac.c
+++ sys/opencrypto/cbc_mac.c
@@ -32,6 +32,9 @@
#include <opencrypto/cbc_mac.h>
#include <opencrypto/xform_auth.h>
+#include <crypto/openssl/arm/arm_arch.h>
+
+
/*
* Given two CCM_CBC_BLOCK_LEN blocks, xor
* them into dst, and then encrypt dst.
@@ -116,13 +119,14 @@
* least a full block, encrypt the full block without
* copying to the staging block.
*/
- if (ctx->blockIndex == 0 && length >= CCM_CBC_BLOCK_LEN) {
- xor_and_encrypt(ctx, data, ctx->block);
- length -= CCM_CBC_BLOCK_LEN;
- data += CCM_CBC_BLOCK_LEN;
- continue;
+ if (!(OPENSSL_armcap_P & ARMV7_NEON)) {
+ if (ctx->blockIndex == 0 && length >= CCM_CBC_BLOCK_LEN) {
+ xor_and_encrypt(ctx, data, ctx->block);
+ length -= CCM_CBC_BLOCK_LEN;
+ data += CCM_CBC_BLOCK_LEN;
+ continue;
+ }
}
-
copy_amt = MIN(sizeof(ctx->staging_block) - ctx->blockIndex,
length);
ptr = ctx->staging_block + ctx->blockIndex;
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Feb 27, 2:09 PM (3 h, 52 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
29032374
Default Alt Text
D37420.id113772.diff (10 KB)
Attached To
Mode
D37420: ossl: add supprot for ARMv7
Attached
Detach File
Event Timeline
Log In to Comment