1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
14  * Copyright 2019 Joyent, Inc.
15  */
16 
17 #ifndef _CRYPTOTEST_H
18 #define	_CRYPTOTEST_H
19 
20 #ifdef __cplusplus
21 extern "C" {
22 #endif
23 
24 #include <inttypes.h>
25 #include <sys/crypto/ioctl.h>
26 
27 #define	CTEST_INIT_FAILED (-1)
28 #define	CTEST_NAME_RESOLVE_FAILED (-2)
29 #define	CTEST_MECH_NO_PROVIDER (-3)
30 
31 #define	CTEST_UPDATELEN_WHOLE	SIZE_MAX
32 #define	CTEST_UPDATELEN_END	0
33 
34 typedef struct cryptotest {
35 	uint8_t *in;
36 	uint8_t *out;
37 	uint8_t *key;
38 	void *param;
39 
40 	size_t inlen;
41 	size_t outlen;
42 	size_t keylen;
43 	size_t plen;
44 
45 	char *mechname;
46 	size_t *updatelens;
47 } cryptotest_t;
48 
49 typedef struct crypto_op crypto_op_t;
50 
51 typedef struct test_fg {
52 	crypto_func_group_t tf_fg;
53 	int (*tf_init)(crypto_op_t *);
54 	int (*tf_single)(crypto_op_t *);
55 	int (*tf_update)(crypto_op_t *, size_t, size_t, size_t *);
56 	int (*tf_final)(crypto_op_t *, size_t);
57 } test_fg_t;
58 
59 #define	CRYPTO_INVALID_SESSION ((crypto_session_id_t)-1)
60 
61 int run_test(cryptotest_t *args, uint8_t *cmp, size_t cmplen, test_fg_t *funcs);
62 
63 const char *cryptotest_errstr(int e, char *buf, size_t buflen);
64 
65 /* utils */
66 crypto_op_t *cryptotest_init(cryptotest_t *args, crypto_func_group_t fg);
67 void cryptotest_close(crypto_op_t *op);
68 int get_mech_info(crypto_op_t *op);
69 int get_hsession_by_mech(crypto_op_t *op);
70 
71 /* CRYPTO_MAC */
72 int mac_init(crypto_op_t *op);
73 int mac_single(crypto_op_t *op);
74 int mac_update(crypto_op_t *op, size_t offset, size_t len, size_t *dummy);
75 int mac_final(crypto_op_t *op, size_t dummy);
76 
77 /* CRYPTO_ENCRYPT */
78 int encrypt_init(crypto_op_t *op);
79 int encrypt_single(crypto_op_t *op);
80 int encrypt_update(crypto_op_t *op, size_t offset, size_t plainlen,
81     size_t *encrlen);
82 int encrypt_final(crypto_op_t *op, size_t encrlen);
83 
84 /* CRYPTO_DECRYPT */
85 int decrypt_init(crypto_op_t *op);
86 int decrypt_single(crypto_op_t *op);
87 int decrypt_update(crypto_op_t *op, size_t offset, size_t cipherlen,
88     size_t *encrlen);
89 int decrypt_final(crypto_op_t *op, size_t encrlen);
90 
91 /* CRYPTO_DIGEST */
92 int digest_init(crypto_op_t *op);
93 int digest_single(crypto_op_t *op);
94 int digest_update(crypto_op_t *op, size_t offset, size_t len, size_t *dummy);
95 int digest_final(crypto_op_t *op, size_t dummy);
96 
97 extern test_fg_t cryptotest_decr_fg;
98 extern test_fg_t cryptotest_encr_fg;
99 extern test_fg_t cryptotest_mac_fg;
100 extern test_fg_t cryptotest_digest_fg;
101 
102 #define	MAC_FG (&cryptotest_mac_fg)
103 #define	ENCR_FG (&cryptotest_encr_fg)
104 #define	DECR_FG (&cryptotest_decr_fg)
105 #define	DIGEST_FG (&cryptotest_digest_fg)
106 
107 /*
108  * KCF and PKCS11 use different structures for the CCM params (CK_AES_CCM_PARAMS
109  * and CK_CCM_PARAMS respectively.  Each cryptotest_*.c file implements this
110  * for their respective structs.
111  */
112 void ccm_init_params(void *, ulong_t, uchar_t *, ulong_t, uchar_t *, ulong_t,
113     ulong_t);
114 size_t ccm_param_len(void);
115 
116 #ifdef __cplusplus
117 }
118 #endif
119 
120 #endif /* _CRYPTOTEST_H */
121