Files
nuttx/include/crypto/cryptodev.h
T
makejian 5b52a32f5a crypto/crypto.c: Determine the order of obtained crypto drivers
After adding the cross-core crypto driver, there are now three encryption modes:
1. Hardware driver in local core
2. Crypto driver in remote core
3. Software encryption in local core

This prioritizes local hardware driver first, then remote driver (typically hardware),
and finally local software encryption as a fallback.

Signed-off-by: makejian <makejian@xiaomi.com>
2026-01-21 00:25:07 +08:00

454 lines
16 KiB
C

/****************************************************************************
* include/crypto/cryptodev.h
*
* SPDX-License-Identifier: OAR AND BSD-2 Clause
* SPDX-FileCopyrightText: 2000 Angelos D. Keromytis
* SPDX-FileCopyrightText: 2001 Theo de Raadt
* SPDX-FileContributor: Angelos D. Keromytis (angelos@cis.upenn.edu)
*
* The author of this code is Angelos D. Keromytis (angelos@cis.upenn.edu)
*
* This code was written by Angelos D. Keromytis in Athens, Greece, in
* February 2000. Network Security Technologies Inc. (NSTI) kindly
* supported the development of this code.
*
* Copyright (c) 2000 Angelos D. Keromytis
*
* Permission to use, copy, and modify this software with or without fee
* is hereby granted, provided that this entire notice is included in
* all source code copies of any software which is or includes a copy or
* modification of this software.
*
* THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
* IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
* REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
* MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
* PURPOSE.
*
* Copyright (c) 2001 Theo de Raadt
*
* 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 ``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 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.
*
* Effort sponsored in part by the Defense Advanced Research Projects
* Agency (DARPA) and Air Force Research Laboratory, Air Force
* Materiel Command, USAF, under agreement number F30602-01-2-0537.
*
****************************************************************************/
#ifndef __INCLUDE_CRYPTO_CRYPTODEV_H
#define __INCLUDE_CRYPTO_CRYPTODEV_H
/****************************************************************************
* Included Files
****************************************************************************/
#include <sys/types.h>
#include <sys/queue.h>
/* Some initial values */
#define CRYPTO_DRIVERS_INITIAL 4
#define CRYPTO_DRIVERS_MAX 128
#define CRYPTO_SW_SESSIONS 32
/* HMAC values */
#define HMAC_MD5_BLOCK_LEN 64
#define HMAC_SHA1_BLOCK_LEN 64
#define HMAC_RIPEMD160_BLOCK_LEN 64
#define HMAC_SHA2_256_BLOCK_LEN 64
#define HMAC_SHA2_384_BLOCK_LEN 128
#define HMAC_SHA2_512_BLOCK_LEN 128
#define HMAC_MAX_BLOCK_LEN HMAC_SHA2_512_BLOCK_LEN
/* keep in sync */
#define HMAC_IPAD_VAL 0x36
#define HMAC_OPAD_VAL 0x5C
/* Encryption algorithm block sizes */
#define DES_BLOCK_LEN 8
#define DES3_BLOCK_LEN 8
#define BLOWFISH_BLOCK_LEN 8
#define CAST128_BLOCK_LEN 8
#define RIJNDAEL128_BLOCK_LEN 16
#define EALG_MAX_BLOCK_LEN 16
/* Keep this updated */
/* Maximum hash algorithm result length */
#define AALG_MAX_RESULT_LEN 64 /* Keep this updated */
#define CRYPTO_3DES_CBC 1
#define CRYPTO_BLF_CBC 2
#define CRYPTO_CAST_CBC 3
#define CRYPTO_MD5_HMAC 4
#define CRYPTO_SHA1_HMAC 5
#define CRYPTO_RIPEMD160_HMAC 6
#define CRYPTO_RIJNDAEL128_CBC 7 /* 128 bit blocksize */
#define CRYPTO_AES_CBC 7 /* 128 bit blocksize -- the same as above */
#define CRYPTO_AES_192_CBC 8 /* 192 bit keysize */
#define CRYPTO_AES_256_CBC 9 /* 256 bit keysize */
#define CRYPTO_DEFLATE_COMP 10 /* Deflate compression algorithm */
#define CRYPTO_NULL 11
#define CRYPTO_SHA2_256_HMAC 12
#define CRYPTO_SHA2_384_HMAC 13
#define CRYPTO_SHA2_512_HMAC 14
#define CRYPTO_AES_CTR 15
#define CRYPTO_AES_XTS 16
#define CRYPTO_AES_GCM_16 17
#define CRYPTO_AES_128_GMAC 18
#define CRYPTO_AES_192_GMAC 19
#define CRYPTO_AES_256_GMAC 20
#define CRYPTO_AES_GMAC 21
#define CRYPTO_AES_OFB 22
#define CRYPTO_AES_CFB_8 23
#define CRYPTO_AES_CFB_128 24
#define CRYPTO_CHACHA20_POLY1305 25
#define CRYPTO_CHACHA20_POLY1305_MAC 26
#define CRYPTO_MD5 27
#define CRYPTO_POLY1305 28
#define CRYPTO_RIPEMD160 29
#define CRYPTO_SHA1 30
#define CRYPTO_SHA2_224 31
#define CRYPTO_SHA2_256 32
#define CRYPTO_SHA2_384 33
#define CRYPTO_SHA2_512 34
#define CRYPTO_CRC32 35
#define CRYPTO_AES_CMAC 36
#define CRYPTO_AES_128_CMAC 37
#define CRYPTO_ESN 38 /* Support for Extended Sequence Numbers */
#define CRYPTO_ALGORITHM_MAX 38 /* Keep updated */
/* Algorithm flags */
#define CRYPTO_ALG_FLAG_SUPPORTED 0x01 /* Algorithm is supported */
#define CRYPTO_ALG_FLAG_RNG_ENABLE 0x02 /* Has HW RNG for DH/DSA */
#define CRYPTO_ALG_FLAG_DSA_SHA 0x04 /* Can do SHA on msg */
/* Standard initialization structure beginning */
struct cryptoini
{
int cri_alg; /* Algorithm to use */
int cri_klen; /* Key length, in bits */
int cri_rnd; /* Algorithm rounds, where relevant */
int cri_sid;
int cri_op;
caddr_t cri_key; /* key to use */
union
{
uint8_t iv[EALG_MAX_BLOCK_LEN]; /* IV to use */
uint8_t esn[4]; /* high-order ESN */
} u;
#define cri_iv u.iv
#define cri_esn u.esn
FAR struct cryptoini *cri_next;
};
/* Describe boundaries of a single crypto operation */
struct cryptodesc
{
int crd_skip; /* How many bytes to ignore from start */
int crd_len; /* How many bytes to process */
int crd_inject; /* Where to inject results, if applicable */
int crd_flags;
#define CRD_F_ENCRYPT 0x01 /* Set when doing encryption */
#define CRD_F_IV_PRESENT 0x02 /* When encrypting, IV is already in
* place, so don't copy.
*/
#define CRD_F_IV_EXPLICIT 0x04 /* IV explicitly provided */
#define CRD_F_COMP 0x10 /* Set when doing compression */
#define CRD_F_ESN 0x20 /* Set when ESN field is provided */
#define CRD_F_UPDATE 0x40 /* Set just update source */
#define CRD_F_UPDATE_AAD 0x80 /* Set just update aad */
struct cryptoini CRD_INI; /* Initialization/context data */
#define crd_esn CRD_INI.cri_esn
#define crd_iv CRD_INI.cri_iv
#define crd_key CRD_INI.cri_key
#define crd_rnd CRD_INI.cri_rnd
#define crd_alg CRD_INI.cri_alg
#define crd_klen CRD_INI.cri_klen
FAR struct cryptodesc *crd_next;
};
/* Structure describing complete operation */
struct cryptop
{
uint64_t crp_sid; /* Session ID */
int crp_ilen; /* Input data total length */
int crp_olen; /* Result total length */
int crp_ivlen; /* IV length */
int crp_alloctype; /* Type of buf to allocate if needed */
int crp_etype; /* Error type (zero means no error).
* All error codes except EAGAIN
* indicate possible data corruption (as in,
* the data have been touched). On all
* errors, the crp_sid may have changed
* (reset to a new one), so the caller
* should always check and use the new
* value on future requests.
*/
int crp_flags;
int crp_aadlen;
#define CRYPTO_F_IMBUF 0x0001 /* Input/output are mbuf chains, otherwise contig */
#define CRYPTO_F_IOV 0x0002 /* Input/output are uio */
#define CRYPTO_F_REL 0x0004 /* Must return data in same place */
#define CRYPTO_F_NOQUEUE 0x0008 /* Don't use crypto queue/thread */
#define CRYPTO_F_DONE 0x0010 /* request completed */
#define CRYPTO_F_CBIMM 0x0020 /* Do callback immediately */
#define CRYPTO_F_CANCEL 0x0040 /* Cancel the current crypto operation */
#define CRYPTO_F_NOT_EXPORTABLE 0x0080 /* Mark key unexportable from secure module */
FAR void *crp_buf; /* Data to be processed */
FAR void *crp_opaque; /* Opaque pointer, passed along */
FAR struct cryptodesc *crp_desc; /* Linked list of processing descriptors */
CODE int (*crp_callback)(FAR struct cryptop *); /* Callback function */
caddr_t crp_mac;
caddr_t crp_dst;
caddr_t crp_iv;
caddr_t crp_aad;
};
#define CRYPTO_BUF_IOV 0x1
#define CRYPTO_BUF_MBUF 0x2
#define CRYPTO_OP_DECRYPT 0x0
#define CRYPTO_OP_ENCRYPT 0x1
/* bignum parameter, in packed bytes, ... */
struct crparam
{
caddr_t crp_p;
u_int crp_nbits;
};
#define CRK_MAXPARAM 8
struct crypt_kop
{
u_int crk_op; /* ie. CRK_MOD_EXP or other */
u_int crk_status; /* return status */
u_short crk_iparams; /* # of input parameters */
u_short crk_oparams; /* # of output parameters */
u_int crk_flags;
struct crparam crk_param[CRK_MAXPARAM];
uint32_t crk_reqid;
};
#define CRK_MOD_EXP 0
#define CRK_MOD_EXP_CRT 1
#define CRK_DSA_SIGN 2
#define CRK_DSA_VERIFY 3
#define CRK_DH_MAKE_PUBLIC 4
#define CRK_DH_COMPUTE_KEY 5
#define CRK_RSA_PKCS15_VERIFY 6
#define CRK_ECDSA_SECP256R1_SIGN 7
#define CRK_ECDSA_SECP256R1_VERIFY 8
#define CRK_ECDSA_SECP256R1_GENKEY 9
/* key management */
#define CRK_ALLOCATE_KEY 10 /* Request an available keyid from the driver */
#define CRK_VALIDATE_KEYID 11 /* Check the specified keyid is available */
#define CRK_IMPORT_KEY 12 /* Import key data into driver */
#define CRK_DELETE_KEY 13 /* Request to remove key with specified keyid */
#define CRK_EXPORT_KEY 14 /* Export raw data or private key if keypair */
#define CRK_EXPORT_PUBLIC_KEY 15 /* Export public key of keypair */
#define CRK_GENERATE_AES_KEY 16 /* Generate key data for AES with specified keyid */
#define CRK_GENERATE_RSA_KEY 17 /* Generate keypair for RSA with specified keyid */
#define CRK_GENERATE_SECP256R1_KEY 18 /* Generate keypair for ECC256 with specified keyid */
#define CRK_SAVE_KEY 19 /* Save key data into FLASH */
#define CRK_LOAD_KEY 20 /* Load key data from FLASH into RAM */
#define CRK_UNLOAD_KEY 21 /* Unload key data from RAM */
#define CRK_ALGORITHM_MAX 21 /* Keep updated */
#define CRF_MOD_EXP (1 << CRK_MOD_EXP)
#define CRF_MOD_EXP_CRT (1 << CRK_MOD_EXP_CRT)
#define CRF_DSA_SIGN (1 << CRK_DSA_SIGN)
#define CRF_DSA_VERIFY (1 << CRK_DSA_VERIFY)
#define CRF_DH_COMPUTE_KEY (1 << CRK_DH_COMPUTE_KEY)
#define CRF_RSA_PKCS15_VERIFY (1 << CRK_RSA_PKCS15_VERIFY)
#define CRF_ECDSA_SECP256R1_SIGN (1 << CRK_ECDSA_SECP256R1_SIGN)
#define CRF_ECDSA_SECP256R1_VERIFY (1 << CRK_ECDSA_SECP256R1_VERIFY)
#define CRF_ECDSA_SECP256R1_GENKEY (1 << CRK_ECDSA_SECP256R1_GENKEY)
#define CRF_ALLOCATE_KEY (1 << CRK_ALLOCATE_KEY)
#define CRF_VALIDATE_KEYID (1 << CRK_VALIDATE_KEYID)
#define CRF_IMPORT_KEY (1 << CRK_IMPORT_KEY)
#define CRF_DELETE_KEY (1 << CRK_DELETE_KEY)
#define CRF_EXPORT_KEY (1 << CRK_EXPORT_KEY)
#define CRF_EXPORT_PUBLIC_KEY (1 << CRK_EXPORT_PUBLIC_KEY)
#define CRF_GENERATE_AES_KEY (1 << CRK_GENERATE_AES_KEY)
#define CRF_GENERATE_RSA_KEY (1 << CRK_GENERATE_RSA_KEY)
#define CRF_GENERATE_SECP256R1_KEY (1 << CRK_GENERATE_SECP256R1_KEY)
#define CRF_SAVE_KEY (1 << CRK_SAVE_KEY)
#define CRF_LOAD_KEY (1 << CRK_LOAD_KEY)
#define CRF_UNLOAD_KEY (1 << CRK_UNLOAD_KEY)
struct cryptkop
{
TAILQ_ENTRY(cryptkop) krp_next;
u_int krp_op; /* ie. CRK_MOD_EXP or other */
u_int krp_status; /* return status */
u_short krp_iparams; /* # of input parameters */
u_short krp_oparams; /* # of output parameters */
uint32_t krp_hid;
struct crparam krp_param[CRK_MAXPARAM]; /* kvm */
CODE int (*krp_callback)(FAR struct cryptkop *);
FAR struct fcrypt *krp_fcr;
u_int krp_flags; /* same as cryptop */
uint32_t krp_reqid; /* distinguish tasks in asynchronous calling */
};
/* Crypto capabilities structure */
struct cryptocap
{
uint64_t cc_operations; /* Counter of how many ops done */
uint64_t cc_bytes; /* Counter of how many bytes done */
uint64_t cc_koperations; /* How many PK ops done */
uint32_t cc_sessions; /* How many sessions allocated */
/* Symmetric/hash algorithms supported */
int cc_alg[CRYPTO_ALGORITHM_MAX + 1];
/* Asymmetric algorithms supported */
int cc_kalg[CRK_ALGORITHM_MAX + 1];
uint8_t cc_flags;
#define CRYPTOCAP_F_CLEANUP 0x01
#define CRYPTOCAP_F_SOFTWARE 0x02
#define CRYPTOCAP_F_ENCRYPT_MAC 0x04 /* Can do encrypt-then-MAC (IPsec) */
#define CRYPTOCAP_F_MAC_ENCRYPT 0x08 /* Can do MAC-then-encrypt (TLS) */
#define CRYPTOCAP_F_REMOTE 0x10 /* Remote core driver */
CODE int (*cc_newsession)(FAR uint32_t *, FAR struct cryptoini *);
CODE int (*cc_process)(FAR struct cryptop *);
CODE int (*cc_freesession)(uint64_t);
CODE int (*cc_kprocess)(FAR struct cryptkop *);
FAR void *priv;
};
/* ioctl parameter to request creation of a session. */
struct session_op
{
uint32_t cipher; /* ie. CRYPTO_AES_EBC */
uint16_t op; /* i.e. COP_ENCRYPT */
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;
#define COP_ENCRYPT 1
#define COP_DECRYPT 2
uint16_t op; /* i.e. COP_ENCRYPT */
#define COP_FLAG_UPDATE (1 << 0) /* Indicates that this operation is a
* stream operation. This operation will not get
* the final result of hash. If the iv is not equal,
* only the iv initialized for the first time will
* be used, and the subsequent iv will be saved
* in the driver.
*/
#define COP_FLAG_UPDATE_AAD (1 << 1)
/* Indicates that this operation processes aad
* (Additional Authenticated Data), which is only used
* in the authentication algorithm.
*/
uint16_t flags;
unsigned len;
unsigned olen;
unsigned ivlen;
unsigned aadlen;
caddr_t src, dst; /* become iov[] inside kernel */
caddr_t mac; /* must be big enough for chosen MAC */
caddr_t iv;
caddr_t aad;
};
/* hamc buffer, software & hardware need it */
extern const uint8_t hmac_ipad_buffer[HMAC_MAX_BLOCK_LEN];
extern const uint8_t hmac_opad_buffer[HMAC_MAX_BLOCK_LEN];
#define CRYPTO_MAX_MAC_LEN 20
/* done against open of /dev/crypto, to get a cloned descriptor.
* Please use F_SETFD against the cloned descriptor.
*/
#define CRIOGET 100
/* the following are done against the cloned descriptor */
#define CIOCGSESSION 101
#define CIOCFSESSION 102
#define CIOCCRYPT 103
#define CIOCKEY 104
#define CIOCKEYRET 105
#define CIOCASYMFEAT 106
int crypto_newsession(FAR uint64_t *, FAR struct cryptoini *, int);
int crypto_freesession(uint64_t);
int crypto_register(uint32_t, FAR int *,
CODE int (*)(FAR uint32_t *, FAR struct cryptoini *),
CODE int (*)(uint64_t),
CODE int (*)(FAR struct cryptop *));
int crypto_kregister(uint32_t, FAR int *,
CODE int (*)(FAR struct cryptkop *));
int crypto_unregister(uint32_t, int);
int crypto_get_driverid(uint8_t);
int crypto_invoke(FAR struct cryptop *);
int crypto_kinvoke(FAR struct cryptkop *);
int crypto_getfeat(FAR int *);
int crypto_driver_set_priv(uint32_t, FAR void *);
FAR void *crypto_driver_get_priv(uint32_t);
#ifdef CONFIG_CRYPTO_CRYPTODEV_HARDWARE
void hwcr_init(void);
#endif
#endif /* __INCLUDE_CRYPTO_CRYPTODEV_H */