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