Edit

IABSD.fr/src/sys/crypto/cryptodev.h

Branch :

  • Show log

    Commit

  • Author : tobhe
    Date : 2021-10-24 14:50:42
    Hash : 87edded1
    Message : Remove crp_etype and return errors directly from crypto_invoke() ok patrick@

  • sys/crypto/cryptodev.h
  • /*	$OpenBSD: cryptodev.h,v 1.81 2021/10/24 14:50:42 tobhe Exp $	*/
    
    /*
     * 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 _CRYPTO_CRYPTO_H_
    #define _CRYPTO_CRYPTO_H_
    
    #include <sys/task.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 DES3_BLOCK_LEN		8
    #define BLOWFISH_BLOCK_LEN	8
    #define CAST128_BLOCK_LEN	8
    #define RIJNDAEL128_BLOCK_LEN	16
    #define CHACHA20_BLOCK_LEN	64
    #define EALG_MAX_BLOCK_LEN	64 /* 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_DEFLATE_COMP	8  /* Deflate compression algorithm */
    #define CRYPTO_NULL		9
    #define CRYPTO_SHA2_256_HMAC	11
    #define CRYPTO_SHA2_384_HMAC	12
    #define CRYPTO_SHA2_512_HMAC	13
    #define CRYPTO_AES_CTR		14
    #define CRYPTO_AES_XTS		15
    #define CRYPTO_AES_GCM_16	16
    #define CRYPTO_AES_128_GMAC	17
    #define CRYPTO_AES_192_GMAC	18
    #define CRYPTO_AES_256_GMAC	19
    #define CRYPTO_AES_GMAC		20
    #define CRYPTO_CHACHA20_POLY1305	21
    #define CRYPTO_CHACHA20_POLY1305_MAC	22
    #define CRYPTO_ESN		23 /* Support for Extended Sequence Numbers */
    #define CRYPTO_ALGORITHM_MAX	23 /* Keep updated */
    
    /* Algorithm flags */
    #define	CRYPTO_ALG_FLAG_SUPPORTED	0x01 /* Algorithm is supported */
    
    /* 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 */
    	caddr_t		cri_key;	/* key to use */
    	union {
    		u_int8_t	iv[EALG_MAX_BLOCK_LEN];	/* IV to use */
    		u_int8_t	esn[4];			/* high-order ESN */
    	} u;
    #define cri_iv		u.iv
    #define cri_esn		u.esn
    	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 */
    
    	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
    };
    
    /* Structure describing complete operation */
    struct cryptop {
    	u_int64_t	crp_sid;	/* Session ID */
    	int		crp_ilen;	/* Input data total length */
    	int		crp_olen;	/* Result total length */
    	int		crp_alloctype;	/* Type of buf to allocate if needed */
    
    	int		crp_flags;
    
    #define CRYPTO_F_IMBUF	0x0001	/* Input/output are mbuf chains, otherwise contig */
    #define CRYPTO_F_IOV	0x0002	/* Input/output are uio */
    #define CRYPTO_F_MPSAFE	0x0004	/* Do not use kernel lock for callback */
    
    	void 		*crp_buf;	/* Data to be processed */
    
    	struct cryptodesc *crp_desc;	/* List of processing descriptors */
    	struct cryptodesc crp_sdesc[2];	/* Static array for small ops */
    	int		 crp_ndesc;	/* Amount of descriptors to use */
    	int		 crp_ndescalloc;/* Amount of descriptors allocated */
    
    	caddr_t		crp_mac;
    };
    
    #define CRYPTO_BUF_IOV		0x1
    #define CRYPTO_BUF_MBUF		0x2
    
    #define CRYPTO_OP_DECRYPT	0x0
    #define CRYPTO_OP_ENCRYPT	0x1
    
    /* Crypto capabilities structure */
    struct cryptocap {
    	u_int64_t	cc_operations;	/* Counter of how many ops done */
    	u_int64_t	cc_bytes;	/* Counter of how many bytes done */
    
    	u_int32_t	cc_sessions;	/* How many sessions allocated */
    
    	/* Symmetric/hash algorithms supported */
    	int		cc_alg[CRYPTO_ALGORITHM_MAX + 1];
    
    	u_int8_t	cc_flags;
    #define CRYPTOCAP_F_CLEANUP     0x01
    #define CRYPTOCAP_F_SOFTWARE    0x02
    #define CRYPTOCAP_F_MPSAFE      0x04
    
    	int		(*cc_newsession) (u_int32_t *, struct cryptoini *);
    	int		(*cc_process) (struct cryptop *);
    	int		(*cc_freesession) (u_int64_t);
    };
    
    void	crypto_init(void);
    
    int	crypto_newsession(u_int64_t *, struct cryptoini *, int);
    int	crypto_freesession(u_int64_t);
    int	crypto_register(u_int32_t, int *,
    	    int (*)(u_int32_t *, struct cryptoini *), int (*)(u_int64_t),
    	    int (*)(struct cryptop *));
    int	crypto_unregister(u_int32_t, int);
    int32_t	crypto_get_driverid(u_int8_t);
    int	crypto_invoke(struct cryptop *);
    
    void	cuio_copydata(struct uio *, int, int, caddr_t);
    void	cuio_copyback(struct uio *, int, int, const void *);
    int	cuio_getptr(struct uio *, int, int *);
    int	cuio_apply(struct uio *, int, int,
    	    int (*f)(caddr_t, caddr_t, unsigned int), caddr_t);
    
    struct	cryptop *crypto_getreq(int);
    void	crypto_freereq(struct cryptop *);
    #endif /* _CRYPTO_CRYPTO_H_ */