1*4f0ce1daSGordon Ross /*
2*4f0ce1daSGordon Ross  * This file and its contents are supplied under the terms of the
3*4f0ce1daSGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
4*4f0ce1daSGordon Ross  * You may only use this file in accordance with the terms of version
5*4f0ce1daSGordon Ross  * 1.0 of the CDDL.
6*4f0ce1daSGordon Ross  *
7*4f0ce1daSGordon Ross  * A full copy of the text of the CDDL should have accompanied this
8*4f0ce1daSGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
9*4f0ce1daSGordon Ross  * http://www.illumos.org/license/CDDL.
10*4f0ce1daSGordon Ross  */
11*4f0ce1daSGordon Ross 
12*4f0ce1daSGordon Ross /*
13*4f0ce1daSGordon Ross  * Copyright 2021 Tintri by DDN, Inc. All rights reserved.
14*4f0ce1daSGordon Ross  */
15*4f0ce1daSGordon Ross 
16*4f0ce1daSGordon Ross #include <sys/types.h>
17*4f0ce1daSGordon Ross #include <smbsrv/smb_kcrypt.h>
18*4f0ce1daSGordon Ross #include <security/cryptoki.h>
19*4f0ce1daSGordon Ross #include <security/pkcs11.h>
20*4f0ce1daSGordon Ross 
21*4f0ce1daSGordon Ross #include <stdio.h>
22*4f0ce1daSGordon Ross #include <stdlib.h>
23*4f0ce1daSGordon Ross #include <string.h>
24*4f0ce1daSGordon Ross #include <strings.h>
25*4f0ce1daSGordon Ross #include <unistd.h>
26*4f0ce1daSGordon Ross 
27*4f0ce1daSGordon Ross #include "test_data.h"
28*4f0ce1daSGordon Ross #include "utils.h"
29*4f0ce1daSGordon Ross 
30*4f0ce1daSGordon Ross /*
31*4f0ce1daSGordon Ross  * Test program for the interfaces used in
32*4f0ce1daSGordon Ross  * smb3_encrypt_reply()
33*4f0ce1daSGordon Ross  */
34*4f0ce1daSGordon Ross int
do_encrypt(uint8_t * outbuf,size_t * outlen,const char * inbuf,size_t inlen,int mid)35*4f0ce1daSGordon Ross do_encrypt(uint8_t *outbuf, size_t *outlen,
36*4f0ce1daSGordon Ross     const char *inbuf, size_t inlen, int mid)
37*4f0ce1daSGordon Ross {
38*4f0ce1daSGordon Ross 	smb_enc_ctx_t ctx;
39*4f0ce1daSGordon Ross 	uio_t uio_in;
40*4f0ce1daSGordon Ross 	uio_t uio_out;
41*4f0ce1daSGordon Ross 	iovec_t iov_in[4];
42*4f0ce1daSGordon Ross 	iovec_t iov_out[4];
43*4f0ce1daSGordon Ross 	int rc;
44*4f0ce1daSGordon Ross 
45*4f0ce1daSGordon Ross 	bzero(&ctx, sizeof (ctx));
46*4f0ce1daSGordon Ross 	ctx.mech.mechanism = mid; // CKM_AES_CCM or CKM_AES_GCM
47*4f0ce1daSGordon Ross 
48*4f0ce1daSGordon Ross 	switch (mid) {
49*4f0ce1daSGordon Ross 
50*4f0ce1daSGordon Ross 	case CKM_AES_CCM:
51*4f0ce1daSGordon Ross 		smb3_crypto_init_ccm_param(&ctx,
52*4f0ce1daSGordon Ross 		    (uint8_t *)nonce, 11,
53*4f0ce1daSGordon Ross 		    (uint8_t *)authdata, 16,
54*4f0ce1daSGordon Ross 		    inlen);
55*4f0ce1daSGordon Ross 		break;
56*4f0ce1daSGordon Ross 
57*4f0ce1daSGordon Ross 	case CKM_AES_GCM:
58*4f0ce1daSGordon Ross 		smb3_crypto_init_gcm_param(&ctx,
59*4f0ce1daSGordon Ross 		    (uint8_t *)nonce, 12,
60*4f0ce1daSGordon Ross 		    (uint8_t *)authdata, 16);
61*4f0ce1daSGordon Ross 		break;
62*4f0ce1daSGordon Ross 
63*4f0ce1daSGordon Ross 	default:
64*4f0ce1daSGordon Ross 		return (1);
65*4f0ce1daSGordon Ross 	}
66*4f0ce1daSGordon Ross 
67*4f0ce1daSGordon Ross 	rc = smb3_encrypt_init(&ctx,
68*4f0ce1daSGordon Ross 	    (uint8_t *)keydata, 16);
69*4f0ce1daSGordon Ross 	if (rc != 0)
70*4f0ce1daSGordon Ross 		return (rc);
71*4f0ce1daSGordon Ross 
72*4f0ce1daSGordon Ross 	make_uio((void *)inbuf, inlen, &uio_in, iov_in, 4);
73*4f0ce1daSGordon Ross 	make_uio(outbuf, *outlen, &uio_out, iov_out, 4);
74*4f0ce1daSGordon Ross 	*outlen = uio_out.uio_resid;
75*4f0ce1daSGordon Ross 
76*4f0ce1daSGordon Ross 	rc = smb3_encrypt_uio(&ctx, &uio_in, &uio_out);
77*4f0ce1daSGordon Ross 	*outlen -= uio_out.uio_resid;
78*4f0ce1daSGordon Ross 
79*4f0ce1daSGordon Ross 	smb3_enc_ctx_done(&ctx);
80*4f0ce1daSGordon Ross 
81*4f0ce1daSGordon Ross 	return (rc);
82*4f0ce1daSGordon Ross }
83*4f0ce1daSGordon Ross 
84*4f0ce1daSGordon Ross uint8_t outbuf[CIPHER_DATA_LEN];
85*4f0ce1daSGordon Ross 
86*4f0ce1daSGordon Ross void
test_encrypt(const uint8_t * ref,int mid)87*4f0ce1daSGordon Ross test_encrypt(const uint8_t *ref, int mid)
88*4f0ce1daSGordon Ross {
89*4f0ce1daSGordon Ross 	size_t outlen;
90*4f0ce1daSGordon Ross 	int rc;
91*4f0ce1daSGordon Ross 
92*4f0ce1daSGordon Ross 	outlen = sizeof (outbuf);
93*4f0ce1daSGordon Ross 	rc = do_encrypt(outbuf, &outlen,
94*4f0ce1daSGordon Ross 	    clear_data_ref, clear_data_len, mid);
95*4f0ce1daSGordon Ross 	if (rc != 0) {
96*4f0ce1daSGordon Ross 		printf("FAIL: encrypt rc= %d\n");
97*4f0ce1daSGordon Ross 		return;
98*4f0ce1daSGordon Ross 	}
99*4f0ce1daSGordon Ross 
100*4f0ce1daSGordon Ross 	if (outlen != CIPHER_DATA_LEN) {
101*4f0ce1daSGordon Ross 		printf("FAIL: out len = %d (want %d)\n",
102*4f0ce1daSGordon Ross 		    outlen, CIPHER_DATA_LEN);
103*4f0ce1daSGordon Ross 		return;
104*4f0ce1daSGordon Ross 	}
105*4f0ce1daSGordon Ross 
106*4f0ce1daSGordon Ross 	if (memcmp(outbuf, ref, CIPHER_DATA_LEN) != 0) {
107*4f0ce1daSGordon Ross 		printf("FAIL: ciphertext:\n");
108*4f0ce1daSGordon Ross 		hexdump(outbuf, CIPHER_DATA_LEN);
109*4f0ce1daSGordon Ross 		return;
110*4f0ce1daSGordon Ross 	}
111*4f0ce1daSGordon Ross 
112*4f0ce1daSGordon Ross 	printf("PASS mid=0x%x\n", mid);
113*4f0ce1daSGordon Ross }
114*4f0ce1daSGordon Ross 
115*4f0ce1daSGordon Ross int
main(int argc,char * argv[])116*4f0ce1daSGordon Ross main(int argc, char *argv[])
117*4f0ce1daSGordon Ross {
118*4f0ce1daSGordon Ross 
119*4f0ce1daSGordon Ross 	test_encrypt(cipher_data_ccm, CKM_AES_CCM);
120*4f0ce1daSGordon Ross 	test_encrypt(cipher_data_gcm, CKM_AES_GCM);
121*4f0ce1daSGordon Ross 
122*4f0ce1daSGordon Ross 	return (0);
123*4f0ce1daSGordon Ross }
124