1*7c478bd9Sstevel@tonic-gate /*
2*7c478bd9Sstevel@tonic-gate  * CDDL HEADER START
3*7c478bd9Sstevel@tonic-gate  *
4*7c478bd9Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*7c478bd9Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*7c478bd9Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*7c478bd9Sstevel@tonic-gate  * with the License.
8*7c478bd9Sstevel@tonic-gate  *
9*7c478bd9Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*7c478bd9Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*7c478bd9Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*7c478bd9Sstevel@tonic-gate  * and limitations under the License.
13*7c478bd9Sstevel@tonic-gate  *
14*7c478bd9Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*7c478bd9Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*7c478bd9Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*7c478bd9Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*7c478bd9Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*7c478bd9Sstevel@tonic-gate  *
20*7c478bd9Sstevel@tonic-gate  * CDDL HEADER END
21*7c478bd9Sstevel@tonic-gate  */
22*7c478bd9Sstevel@tonic-gate /*
23*7c478bd9Sstevel@tonic-gate  * Copyright 2003 Sun Microsystems, Inc.  All rights reserved.
24*7c478bd9Sstevel@tonic-gate  * Use is subject to license terms.
25*7c478bd9Sstevel@tonic-gate  */
26*7c478bd9Sstevel@tonic-gate 
27*7c478bd9Sstevel@tonic-gate /*
28*7c478bd9Sstevel@tonic-gate  * mdb dcmds for selected structures from
29*7c478bd9Sstevel@tonic-gate  * usr/src/uts/common/sys/crypto/common.h
30*7c478bd9Sstevel@tonic-gate  */
31*7c478bd9Sstevel@tonic-gate 
32*7c478bd9Sstevel@tonic-gate #include <sys/mdb_modapi.h>
33*7c478bd9Sstevel@tonic-gate #include <sys/modctl.h>
34*7c478bd9Sstevel@tonic-gate #include <sys/types.h>
35*7c478bd9Sstevel@tonic-gate #include <sys/crypto/api.h>
36*7c478bd9Sstevel@tonic-gate #include <sys/crypto/common.h>
37*7c478bd9Sstevel@tonic-gate #include <sys/crypto/spi.h>
38*7c478bd9Sstevel@tonic-gate #include <sys/crypto/impl.h>
39*7c478bd9Sstevel@tonic-gate #include "crypto_cmds.h"
40*7c478bd9Sstevel@tonic-gate 
41*7c478bd9Sstevel@tonic-gate /*ARGSUSED*/
42*7c478bd9Sstevel@tonic-gate int
crypto_mechanism(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)43*7c478bd9Sstevel@tonic-gate crypto_mechanism(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
44*7c478bd9Sstevel@tonic-gate {
45*7c478bd9Sstevel@tonic-gate 	crypto_mechanism_t mch;
46*7c478bd9Sstevel@tonic-gate 
47*7c478bd9Sstevel@tonic-gate 	if (!(flags & DCMD_ADDRSPEC))
48*7c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
49*7c478bd9Sstevel@tonic-gate 
50*7c478bd9Sstevel@tonic-gate 	if (mdb_vread(&mch, sizeof (crypto_mechanism_t), addr) == -1) {
51*7c478bd9Sstevel@tonic-gate 		mdb_warn("cannot read %p", addr);
52*7c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
53*7c478bd9Sstevel@tonic-gate 	}
54*7c478bd9Sstevel@tonic-gate 	/* XXX a future RFE will interpret cm_type */
55*7c478bd9Sstevel@tonic-gate 	mdb_printf("cm_type\t%ll#x\n", mch.cm_type);
56*7c478bd9Sstevel@tonic-gate 	mdb_printf("cm_param\t%p\n", mch.cm_param);
57*7c478bd9Sstevel@tonic-gate 	mdb_printf("cm_param_len\t%u\n", mch.cm_param_len);
58*7c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
59*7c478bd9Sstevel@tonic-gate }
60*7c478bd9Sstevel@tonic-gate 
61*7c478bd9Sstevel@tonic-gate /*ARGSUSED*/
62*7c478bd9Sstevel@tonic-gate static void
iovec_prt(iovec_t * addr)63*7c478bd9Sstevel@tonic-gate iovec_prt(iovec_t *addr)
64*7c478bd9Sstevel@tonic-gate {
65*7c478bd9Sstevel@tonic-gate 	mdb_printf("iov_base\t%p\n", addr->iov_base);
66*7c478bd9Sstevel@tonic-gate 	mdb_printf("iov_len\t\t%d\n", addr->iov_len);
67*7c478bd9Sstevel@tonic-gate }
68*7c478bd9Sstevel@tonic-gate 
69*7c478bd9Sstevel@tonic-gate /*ARGSUSED*/
70*7c478bd9Sstevel@tonic-gate static void
uio_prt(uio_t * addr)71*7c478bd9Sstevel@tonic-gate uio_prt(uio_t *addr)
72*7c478bd9Sstevel@tonic-gate {
73*7c478bd9Sstevel@tonic-gate 	char *segstrings[] = {
74*7c478bd9Sstevel@tonic-gate 		"UIO_USERSPACE",
75*7c478bd9Sstevel@tonic-gate 		"UIO_SYSSPACE",
76*7c478bd9Sstevel@tonic-gate 		"UIO_USERISPACE"
77*7c478bd9Sstevel@tonic-gate 	};
78*7c478bd9Sstevel@tonic-gate 	iovec_t iov;
79*7c478bd9Sstevel@tonic-gate 	uio_t uio;
80*7c478bd9Sstevel@tonic-gate 	int i;
81*7c478bd9Sstevel@tonic-gate 
82*7c478bd9Sstevel@tonic-gate 	mdb_printf("uio\t%p\n", addr);
83*7c478bd9Sstevel@tonic-gate 	if (mdb_vread(&uio, sizeof (uio_t), (uintptr_t)addr)
84*7c478bd9Sstevel@tonic-gate 		== -1) {
85*7c478bd9Sstevel@tonic-gate 		mdb_warn("uio_prt: could not read uio");
86*7c478bd9Sstevel@tonic-gate 	}
87*7c478bd9Sstevel@tonic-gate 	mdb_inc_indent(4);
88*7c478bd9Sstevel@tonic-gate 	for (i = 0; i < uio.uio_iovcnt; i++) {
89*7c478bd9Sstevel@tonic-gate 		if (mdb_vread(&iov, sizeof (iovec_t),
90*7c478bd9Sstevel@tonic-gate 		    (uintptr_t)(uio.uio_iov +i))
91*7c478bd9Sstevel@tonic-gate 			== -1) {
92*7c478bd9Sstevel@tonic-gate 			mdb_printf("uio_iov\t?????");
93*7c478bd9Sstevel@tonic-gate 			mdb_warn("uio_prt: could not read uio_iov[%s]", i);
94*7c478bd9Sstevel@tonic-gate 		} else
95*7c478bd9Sstevel@tonic-gate 		    iovec_prt(&iov);
96*7c478bd9Sstevel@tonic-gate 	}
97*7c478bd9Sstevel@tonic-gate 	mdb_dec_indent(4);
98*7c478bd9Sstevel@tonic-gate 	mdb_printf("uio_iovcnt\t%d\n", uio.uio_iovcnt);
99*7c478bd9Sstevel@tonic-gate 	mdb_printf("uio_offset\t%lld\n", uio.uio_offset);
100*7c478bd9Sstevel@tonic-gate 	mdb_printf("uio_segflg\t%s", segstrings[uio.uio_segflg]);
101*7c478bd9Sstevel@tonic-gate 	mdb_printf("uio_fmode\t0%o", (int)uio.uio_fmode);
102*7c478bd9Sstevel@tonic-gate 	mdb_printf("uio_limit\t%lld", uio.uio_limit);
103*7c478bd9Sstevel@tonic-gate 	mdb_printf("uio_resid\t%ld", uio.uio_resid);
104*7c478bd9Sstevel@tonic-gate }
105*7c478bd9Sstevel@tonic-gate 
106*7c478bd9Sstevel@tonic-gate static char *cdstrings[] = {
107*7c478bd9Sstevel@tonic-gate 	"INVALID FORMAT",
108*7c478bd9Sstevel@tonic-gate 	"CRYPTO_DATA_RAW",
109*7c478bd9Sstevel@tonic-gate 	"CRYPTO_DATA_UIO",
110*7c478bd9Sstevel@tonic-gate 	"CRYPTO_DATA_MBLK"
111*7c478bd9Sstevel@tonic-gate };
112*7c478bd9Sstevel@tonic-gate 
113*7c478bd9Sstevel@tonic-gate /*
114*7c478bd9Sstevel@tonic-gate  * Routine to print either of two structrually identical sub-structures --
115*7c478bd9Sstevel@tonic-gate  * with different naming conventions.  Might be changed if we decide
116*7c478bd9Sstevel@tonic-gate  * to merge the two.  They are the cdu union from crypto_data_t and
117*7c478bd9Sstevel@tonic-gate  * the one from crypto_dual_data_t.
118*7c478bd9Sstevel@tonic-gate  */
119*7c478bd9Sstevel@tonic-gate 
120*7c478bd9Sstevel@tonic-gate typedef union crypto_data_union {
121*7c478bd9Sstevel@tonic-gate 	iovec_t	cdu_raw;		/* Raw format */
122*7c478bd9Sstevel@tonic-gate 	uio_t	*cdu_uio;		/* uio scatter-gather format */
123*7c478bd9Sstevel@tonic-gate 	mblk_t	*cdu_mp;		/* The mblk chain */
124*7c478bd9Sstevel@tonic-gate } crypto_data_union_t;
125*7c478bd9Sstevel@tonic-gate 
126*7c478bd9Sstevel@tonic-gate /*ARGSUSED*/
127*7c478bd9Sstevel@tonic-gate static void
prt_cdu(crypto_data_union_t * cdu,int format,const char * prefix)128*7c478bd9Sstevel@tonic-gate prt_cdu(crypto_data_union_t *cdu, int format, const char *prefix)
129*7c478bd9Sstevel@tonic-gate {
130*7c478bd9Sstevel@tonic-gate 
131*7c478bd9Sstevel@tonic-gate 	switch (format) {
132*7c478bd9Sstevel@tonic-gate 		case CRYPTO_DATA_RAW:
133*7c478bd9Sstevel@tonic-gate 		    mdb_printf("%s_raw:\n", prefix);
134*7c478bd9Sstevel@tonic-gate 		    mdb_inc_indent(4);
135*7c478bd9Sstevel@tonic-gate 		    iovec_prt(&cdu->cdu_raw);
136*7c478bd9Sstevel@tonic-gate 		    mdb_dec_indent(4);
137*7c478bd9Sstevel@tonic-gate 		    break;
138*7c478bd9Sstevel@tonic-gate 
139*7c478bd9Sstevel@tonic-gate 		case CRYPTO_DATA_UIO:
140*7c478bd9Sstevel@tonic-gate 		    mdb_printf("%s_uio:\n", prefix);
141*7c478bd9Sstevel@tonic-gate 		    mdb_inc_indent(4);
142*7c478bd9Sstevel@tonic-gate 		    uio_prt(cdu->cdu_uio);
143*7c478bd9Sstevel@tonic-gate 		    mdb_dec_indent(4);
144*7c478bd9Sstevel@tonic-gate 		    break;
145*7c478bd9Sstevel@tonic-gate 
146*7c478bd9Sstevel@tonic-gate 		case CRYPTO_DATA_MBLK:
147*7c478bd9Sstevel@tonic-gate 		    mdb_printf("%s_mp:\t\t%p\n", prefix, cdu->cdu_mp);
148*7c478bd9Sstevel@tonic-gate 		    break;
149*7c478bd9Sstevel@tonic-gate 
150*7c478bd9Sstevel@tonic-gate 		default:
151*7c478bd9Sstevel@tonic-gate 		    mdb_printf("cm_format\t??????\n");
152*7c478bd9Sstevel@tonic-gate 		    break;
153*7c478bd9Sstevel@tonic-gate 	}
154*7c478bd9Sstevel@tonic-gate }
155*7c478bd9Sstevel@tonic-gate 
156*7c478bd9Sstevel@tonic-gate /*ARGSUSED*/
157*7c478bd9Sstevel@tonic-gate int
crypto_data(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)158*7c478bd9Sstevel@tonic-gate crypto_data(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
159*7c478bd9Sstevel@tonic-gate {
160*7c478bd9Sstevel@tonic-gate 	crypto_data_t data;
161*7c478bd9Sstevel@tonic-gate 
162*7c478bd9Sstevel@tonic-gate 	if (!(flags & DCMD_ADDRSPEC))
163*7c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
164*7c478bd9Sstevel@tonic-gate 
165*7c478bd9Sstevel@tonic-gate 	if (mdb_vread(&data, sizeof (crypto_data_t), addr) == -1) {
166*7c478bd9Sstevel@tonic-gate 		mdb_warn("cannot read %p", addr);
167*7c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
168*7c478bd9Sstevel@tonic-gate 	}
169*7c478bd9Sstevel@tonic-gate 	if ((data.cd_format >= CRYPTO_DATA_RAW) &&
170*7c478bd9Sstevel@tonic-gate 	    (data.cd_format <= CRYPTO_DATA_MBLK))
171*7c478bd9Sstevel@tonic-gate 		mdb_printf("cm_format\t%s\n", cdstrings[data.cd_format]);
172*7c478bd9Sstevel@tonic-gate 	else
173*7c478bd9Sstevel@tonic-gate 		mdb_printf("bad cm_format\t%d\n", data.cd_format);
174*7c478bd9Sstevel@tonic-gate 	mdb_printf("cm_offset\t%ld\n", data.cd_offset);
175*7c478bd9Sstevel@tonic-gate 	mdb_printf("cm_length\t%ld\n", data.cd_length);
176*7c478bd9Sstevel@tonic-gate 	mdb_printf("cm_miscdata\t%p\n", data.cd_miscdata);
177*7c478bd9Sstevel@tonic-gate 	mdb_inc_indent(4);
178*7c478bd9Sstevel@tonic-gate 	prt_cdu((crypto_data_union_t *)&data.cdu, data.cd_format, "cdu");
179*7c478bd9Sstevel@tonic-gate 	mdb_dec_indent(4);
180*7c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
181*7c478bd9Sstevel@tonic-gate }
182*7c478bd9Sstevel@tonic-gate 
183*7c478bd9Sstevel@tonic-gate /*ARGSUSED*/
184*7c478bd9Sstevel@tonic-gate int
crypto_dual_data(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)185*7c478bd9Sstevel@tonic-gate crypto_dual_data(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
186*7c478bd9Sstevel@tonic-gate {
187*7c478bd9Sstevel@tonic-gate 	crypto_dual_data_t ddata;
188*7c478bd9Sstevel@tonic-gate 
189*7c478bd9Sstevel@tonic-gate 	if (!(flags & DCMD_ADDRSPEC))
190*7c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
191*7c478bd9Sstevel@tonic-gate 
192*7c478bd9Sstevel@tonic-gate 	if (mdb_vread(&ddata, sizeof (crypto_dual_data_t), addr) == -1) {
193*7c478bd9Sstevel@tonic-gate 		mdb_warn("cannot read %p", addr);
194*7c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
195*7c478bd9Sstevel@tonic-gate 	}
196*7c478bd9Sstevel@tonic-gate 	if ((ddata.dd_format > CRYPTO_DATA_RAW) &&
197*7c478bd9Sstevel@tonic-gate 	    (ddata.dd_format <= CRYPTO_DATA_MBLK))
198*7c478bd9Sstevel@tonic-gate 		mdb_printf("dd_format\t%s\n", cdstrings[ddata.dd_format]);
199*7c478bd9Sstevel@tonic-gate 	else
200*7c478bd9Sstevel@tonic-gate 		mdb_printf("bad dd_format\t%d\n", ddata.dd_format);
201*7c478bd9Sstevel@tonic-gate 	mdb_printf("dd_offset1\t%ld\n", ddata.dd_offset1);
202*7c478bd9Sstevel@tonic-gate 	mdb_printf("dd_len1\t%ld\n", ddata.dd_len1);
203*7c478bd9Sstevel@tonic-gate 	mdb_printf("dd_offset2\t%ld\n", ddata.dd_offset2);
204*7c478bd9Sstevel@tonic-gate 	mdb_printf("dd_len2\t%ld\n", ddata.dd_len2);
205*7c478bd9Sstevel@tonic-gate 	mdb_printf("dd_miscdata\t%p\n", ddata.dd_miscdata);
206*7c478bd9Sstevel@tonic-gate 	mdb_printf("cdu:\n");
207*7c478bd9Sstevel@tonic-gate 	mdb_inc_indent(4);
208*7c478bd9Sstevel@tonic-gate 	prt_cdu((crypto_data_union_t *)&ddata.dd_data.cdu, ddata.dd_format,
209*7c478bd9Sstevel@tonic-gate 	    "ddu");
210*7c478bd9Sstevel@tonic-gate 	mdb_dec_indent(4);
211*7c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
212*7c478bd9Sstevel@tonic-gate }
213*7c478bd9Sstevel@tonic-gate 
214*7c478bd9Sstevel@tonic-gate 
215*7c478bd9Sstevel@tonic-gate /*ARGSUSED*/
216*7c478bd9Sstevel@tonic-gate int
crypto_key(uintptr_t addr,uint_t flags,int argc,const mdb_arg_t * argv)217*7c478bd9Sstevel@tonic-gate crypto_key(uintptr_t addr, uint_t flags, int argc, const mdb_arg_t *argv)
218*7c478bd9Sstevel@tonic-gate {
219*7c478bd9Sstevel@tonic-gate 	crypto_key_t key;
220*7c478bd9Sstevel@tonic-gate 
221*7c478bd9Sstevel@tonic-gate 	if (!(flags & DCMD_ADDRSPEC))
222*7c478bd9Sstevel@tonic-gate 		return (DCMD_USAGE);
223*7c478bd9Sstevel@tonic-gate 
224*7c478bd9Sstevel@tonic-gate 	if (mdb_vread(&key, sizeof (crypto_key_t), addr) == -1) {
225*7c478bd9Sstevel@tonic-gate 		mdb_warn("cannot read %p", addr);
226*7c478bd9Sstevel@tonic-gate 		return (DCMD_ERR);
227*7c478bd9Sstevel@tonic-gate 	}
228*7c478bd9Sstevel@tonic-gate 	switch (key.ck_format) {
229*7c478bd9Sstevel@tonic-gate 		case CRYPTO_KEY_RAW:
230*7c478bd9Sstevel@tonic-gate 		    mdb_printf("ck_format:\tCRYPTO_KEY_RAW\n");
231*7c478bd9Sstevel@tonic-gate 		    mdb_printf(
232*7c478bd9Sstevel@tonic-gate 			"cku_data.cku_key_value.cku_data.cku_v_length:\t%d\n",
233*7c478bd9Sstevel@tonic-gate 			    key.cku_data.cku_key_value.cku_v_length);
234*7c478bd9Sstevel@tonic-gate 		    mdb_printf("cku_data.cku_key_value.cku_v_data:\t%p\n",
235*7c478bd9Sstevel@tonic-gate 			key.cku_data.cku_key_value.cku_v_data);
236*7c478bd9Sstevel@tonic-gate 		    break;
237*7c478bd9Sstevel@tonic-gate 		case CRYPTO_KEY_REFERENCE:
238*7c478bd9Sstevel@tonic-gate 		    mdb_printf("ck_format:\tCRYPTO_KEY_REFERENCE\n");
239*7c478bd9Sstevel@tonic-gate 		    mdb_printf("cku_data.cku_key_id:\t%u\n",
240*7c478bd9Sstevel@tonic-gate 			key.cku_data.cku_key_id);
241*7c478bd9Sstevel@tonic-gate 		    break;
242*7c478bd9Sstevel@tonic-gate 		case CRYPTO_KEY_ATTR_LIST:
243*7c478bd9Sstevel@tonic-gate 			mdb_printf("ck_format:\tCRYPTO_KEY_ATTR_LIST\n");
244*7c478bd9Sstevel@tonic-gate 			mdb_printf("cku_data.cku_key_attrs.cku_a_count:\t%u\n",
245*7c478bd9Sstevel@tonic-gate 				key.cku_data.cku_key_attrs.cku_a_count);
246*7c478bd9Sstevel@tonic-gate 			mdb_printf("cku_data.cku_key_attrs.cku_o_oattr:\t%p\n",
247*7c478bd9Sstevel@tonic-gate 				key.cku_data.cku_key_attrs.cku_a_oattr);
248*7c478bd9Sstevel@tonic-gate 			break;
249*7c478bd9Sstevel@tonic-gate 		default:
250*7c478bd9Sstevel@tonic-gate 			mdb_printf("ck_format:\t\t?????\n");
251*7c478bd9Sstevel@tonic-gate 			break;
252*7c478bd9Sstevel@tonic-gate 	}
253*7c478bd9Sstevel@tonic-gate 	return (DCMD_OK);
254*7c478bd9Sstevel@tonic-gate }
255