xref: /illumos-gate/usr/src/test/crypto-tests/tests/common/cryptotest_pkcs.c (revision 77de87d27c7e8b4063deeab95edde5173a6a003d)
1cd964fceSMatt Barden /*
2cd964fceSMatt Barden  * This file and its contents are supplied under the terms of the
3cd964fceSMatt Barden  * Common Development and Distribution License ("CDDL"), version 1.0.
4cd964fceSMatt Barden  * You may only use this file in accordance with the terms of version
5cd964fceSMatt Barden  * 1.0 of the CDDL.
6cd964fceSMatt Barden  *
7cd964fceSMatt Barden  * A full copy of the text of the CDDL should have accompanied this
8cd964fceSMatt Barden  * source.  A copy of the CDDL is also available via the Internet at
9cd964fceSMatt Barden  * http://www.illumos.org/license/CDDL.
10cd964fceSMatt Barden  */
11cd964fceSMatt Barden 
12cd964fceSMatt Barden /*
13cd964fceSMatt Barden  * Copyright 2015 Nexenta Systems, Inc.  All rights reserved.
14*77de87d2SJason King  * Copyright 2019 Joyent, Inc.
15cd964fceSMatt Barden  */
16cd964fceSMatt Barden 
17*77de87d2SJason King #include <errno.h>
18cd964fceSMatt Barden #include <stdio.h>
19*77de87d2SJason King #include <string.h>
20cd964fceSMatt Barden #include <cryptoutil.h>
212cf2b01eSJason King #include <security/cryptoki.h>
22*77de87d2SJason King #include <sys/debug.h>
23cd964fceSMatt Barden 
24cd964fceSMatt Barden #include "cryptotest.h"
25cd964fceSMatt Barden 
26cd964fceSMatt Barden struct crypto_op {
27cd964fceSMatt Barden 	CK_BYTE_PTR in;
28cd964fceSMatt Barden 	CK_BYTE_PTR out;
29cd964fceSMatt Barden 	CK_BYTE_PTR key;
30cd964fceSMatt Barden 	CK_BYTE_PTR param;
31cd964fceSMatt Barden 
32cd964fceSMatt Barden 	size_t inlen;
33cd964fceSMatt Barden 	size_t outlen;
34cd964fceSMatt Barden 	size_t keylen;
35cd964fceSMatt Barden 	size_t paramlen;
36*77de87d2SJason King 	const size_t *updatelens;
37cd964fceSMatt Barden 
38cd964fceSMatt Barden 	char *mechname;
39cd964fceSMatt Barden 
40cd964fceSMatt Barden 	/* internal */
41cd964fceSMatt Barden 	CK_MECHANISM_TYPE mech;
42cd964fceSMatt Barden 	CK_OBJECT_HANDLE keyt;
43cd964fceSMatt Barden 	CK_SESSION_HANDLE hsession;
44cd964fceSMatt Barden 	size_t fg;
45cd964fceSMatt Barden };
46cd964fceSMatt Barden 
47cd964fceSMatt Barden static void
cryptotest_error(char * name,CK_RV rv)48cd964fceSMatt Barden cryptotest_error(char *name, CK_RV rv)
49cd964fceSMatt Barden {
50cd964fceSMatt Barden 	(void) fprintf(stderr, "%s: Error = 0x%.8lX '%s'\n",
51cd964fceSMatt Barden 	    name, rv, pkcs11_strerror(rv));
52cd964fceSMatt Barden }
53cd964fceSMatt Barden 
54cd964fceSMatt Barden crypto_op_t *
cryptotest_init(cryptotest_t * arg,crypto_func_group_t fg)55e75b2cb0SRobert Mustacchi cryptotest_init(cryptotest_t *arg, crypto_func_group_t fg)
56cd964fceSMatt Barden {
57cd964fceSMatt Barden 	crypto_op_t *op = malloc(sizeof (*op));
58cd964fceSMatt Barden 
59*77de87d2SJason King 	if (op == NULL) {
60*77de87d2SJason King 		(void) fprintf(stderr, "malloc failed: %s\n", strerror(errno));
61*77de87d2SJason King 		return (NULL);
62*77de87d2SJason King 	}
63*77de87d2SJason King 
64cd964fceSMatt Barden 	op->in = (CK_BYTE_PTR)arg->in;
65cd964fceSMatt Barden 	op->out = (CK_BYTE_PTR)arg->out;
66cd964fceSMatt Barden 	op->key = (CK_BYTE_PTR)arg->key;
67cd964fceSMatt Barden 	op->param = (CK_BYTE_PTR)arg->param;
68cd964fceSMatt Barden 
69cd964fceSMatt Barden 	op->inlen = arg->inlen;
70cd964fceSMatt Barden 	op->outlen = arg->outlen;
71cd964fceSMatt Barden 	op->keylen = arg->keylen;
72cd964fceSMatt Barden 	op->paramlen = arg->plen;
73*77de87d2SJason King 	op->updatelens = arg->updatelens;
74cd964fceSMatt Barden 
75cd964fceSMatt Barden 	op->mechname = arg->mechname;
76cd964fceSMatt Barden 
772cf2b01eSJason King 	op->hsession = CK_INVALID_HANDLE;
78eed3be88SJason King 	op->keyt = CK_INVALID_HANDLE;
79cd964fceSMatt Barden 	op->fg = fg;
80cd964fceSMatt Barden 
81cd964fceSMatt Barden 	if (op->out == NULL)
82cd964fceSMatt Barden 		op->outlen = op->inlen;
83cd964fceSMatt Barden 	return (op);
84cd964fceSMatt Barden }
85cd964fceSMatt Barden 
86cd964fceSMatt Barden int
cryptotest_close_session(CK_SESSION_HANDLE hsession)87cd964fceSMatt Barden cryptotest_close_session(CK_SESSION_HANDLE hsession)
88cd964fceSMatt Barden {
89cd964fceSMatt Barden 	CK_RV rv;
90cd964fceSMatt Barden 	rv = C_CloseSession(hsession);
91cd964fceSMatt Barden 	if (rv != CKR_OK)
92cd964fceSMatt Barden 		cryptotest_error("cryptotest_close_session", rv);
93cd964fceSMatt Barden 
94cd964fceSMatt Barden 	return (rv);
95cd964fceSMatt Barden }
96cd964fceSMatt Barden 
97*77de87d2SJason King void
cryptotest_close(crypto_op_t * op)98cd964fceSMatt Barden cryptotest_close(crypto_op_t *op)
99cd964fceSMatt Barden {
100eed3be88SJason King 	if (op->keyt != CK_INVALID_HANDLE)
101cd964fceSMatt Barden 		(void) C_DestroyObject(op->hsession, op->keyt);
102eed3be88SJason King 
1032cf2b01eSJason King 	if (op->hsession != CK_INVALID_HANDLE)
104cd964fceSMatt Barden 		(void) cryptotest_close_session(op->hsession);
105cd964fceSMatt Barden 	free(op);
106*77de87d2SJason King 	VERIFY0(C_Finalize(NULL));
107cd964fceSMatt Barden }
108cd964fceSMatt Barden 
109cd964fceSMatt Barden int
get_mech_info(crypto_op_t * op)110cd964fceSMatt Barden get_mech_info(crypto_op_t *op)
111cd964fceSMatt Barden {
112cd964fceSMatt Barden 	CK_RV rv;
113cd964fceSMatt Barden 	rv = pkcs11_str2mech(op->mechname, &op->mech);
114cd964fceSMatt Barden 	if (rv != CKR_OK) {
115cd964fceSMatt Barden 		cryptotest_error("get_mech_info", rv);
116cd964fceSMatt Barden 		(void) fprintf(stderr, "failed to resolve mechanism name %s\n",
117cd964fceSMatt Barden 		    op->mechname);
118cd964fceSMatt Barden 		return (CTEST_NAME_RESOLVE_FAILED);
119cd964fceSMatt Barden 	}
120cd964fceSMatt Barden 	return (rv);
121cd964fceSMatt Barden }
122cd964fceSMatt Barden 
123cd964fceSMatt Barden 
124cd964fceSMatt Barden int
get_hsession_by_mech(crypto_op_t * op)125cd964fceSMatt Barden get_hsession_by_mech(crypto_op_t *op)
126cd964fceSMatt Barden {
127cd964fceSMatt Barden 	CK_RV rv;
128cd964fceSMatt Barden 	rv = SUNW_C_GetMechSession(op->mech, &op->hsession);
129cd964fceSMatt Barden 	if (rv != CKR_OK) {
130cd964fceSMatt Barden 		cryptotest_error("get_hsession_by_mech", rv);
131cd964fceSMatt Barden 		(void) fprintf(stderr,
132cd964fceSMatt Barden 		    "could not find provider for mechanism %lu\n",
133cd964fceSMatt Barden 		    op->mech);
134cd964fceSMatt Barden 		return (CTEST_MECH_NO_PROVIDER);
135cd964fceSMatt Barden 	}
136cd964fceSMatt Barden 	return (rv);
137cd964fceSMatt Barden }
138cd964fceSMatt Barden 
139cd964fceSMatt Barden /*
140cd964fceSMatt Barden  * SIGN_* functions
141cd964fceSMatt Barden  */
142cd964fceSMatt Barden int
sign_init(crypto_op_t * op)143cd964fceSMatt Barden sign_init(crypto_op_t *op)
144cd964fceSMatt Barden {
145cd964fceSMatt Barden 	CK_MECHANISM mech;
146cd964fceSMatt Barden 	CK_RV rv;
147cd964fceSMatt Barden 
148cd964fceSMatt Barden 	mech.mechanism = op->mech;
149cd964fceSMatt Barden 	mech.pParameter = NULL;
150cd964fceSMatt Barden 	mech.ulParameterLen = 0;
151cd964fceSMatt Barden 
152cd964fceSMatt Barden 	rv = SUNW_C_KeyToObject(op->hsession, op->mech,
153cd964fceSMatt Barden 	    op->key, op->keylen, &op->keyt);
154cd964fceSMatt Barden 
155cd964fceSMatt Barden 	if (rv != CKR_OK)
156cd964fceSMatt Barden 		cryptotest_error("SUNW_C_KeyToObject", rv);
157cd964fceSMatt Barden 
158cd964fceSMatt Barden 	rv = C_SignInit(op->hsession, &mech, op->keyt);
159cd964fceSMatt Barden 
160cd964fceSMatt Barden 	if (rv != CKR_OK)
161cd964fceSMatt Barden 		cryptotest_error("C_SignInit", rv);
162cd964fceSMatt Barden 
163cd964fceSMatt Barden 	return (rv);
164cd964fceSMatt Barden }
165cd964fceSMatt Barden 
166cd964fceSMatt Barden int
sign_single(crypto_op_t * op)167cd964fceSMatt Barden sign_single(crypto_op_t *op)
168cd964fceSMatt Barden {
169cd964fceSMatt Barden 	CK_RV rv;
170cd964fceSMatt Barden 
171cd964fceSMatt Barden 	rv = C_Sign(op->hsession, op->in, op->inlen,
172cd964fceSMatt Barden 	    op->out, (CK_ULONG_PTR)&op->outlen);
173cd964fceSMatt Barden 	if (rv != CKR_OK)
174cd964fceSMatt Barden 		cryptotest_error("C_Sign", rv);
175cd964fceSMatt Barden 	return (rv);
176cd964fceSMatt Barden }
177cd964fceSMatt Barden 
178cd964fceSMatt Barden int
sign_update(crypto_op_t * op,size_t offset,size_t len)179*77de87d2SJason King sign_update(crypto_op_t *op, size_t offset, size_t len)
180cd964fceSMatt Barden {
181cd964fceSMatt Barden 	CK_RV rv;
182*77de87d2SJason King 	rv = C_SignUpdate(op->hsession, op->in + offset, len);
183cd964fceSMatt Barden 	if (rv != CKR_OK)
184cd964fceSMatt Barden 		cryptotest_error("C_SignUpdate", rv);
185cd964fceSMatt Barden 
186cd964fceSMatt Barden 	return (rv);
187cd964fceSMatt Barden }
188cd964fceSMatt Barden 
189cd964fceSMatt Barden int
sign_final(crypto_op_t * op)190cd964fceSMatt Barden sign_final(crypto_op_t *op)
191cd964fceSMatt Barden {
192cd964fceSMatt Barden 	CK_RV rv;
193cd964fceSMatt Barden 	rv = C_SignFinal(op->hsession, op->out, (CK_ULONG_PTR)&op->outlen);
194cd964fceSMatt Barden 	if (rv != CKR_OK)
195cd964fceSMatt Barden 		cryptotest_error("C_SignFinal", rv);
196cd964fceSMatt Barden 	return (rv);
197cd964fceSMatt Barden }
198cd964fceSMatt Barden 
199cd964fceSMatt Barden /*
200cd964fceSMatt Barden  * MAC_* functions
201cd964fceSMatt Barden  */
202cd964fceSMatt Barden int
mac_init(crypto_op_t * op)203cd964fceSMatt Barden mac_init(crypto_op_t *op)
204cd964fceSMatt Barden {
205cd964fceSMatt Barden 	return (sign_init(op));
206cd964fceSMatt Barden }
207cd964fceSMatt Barden 
208cd964fceSMatt Barden int
mac_single(crypto_op_t * op)209cd964fceSMatt Barden mac_single(crypto_op_t *op)
210cd964fceSMatt Barden {
211cd964fceSMatt Barden 	return (sign_single(op));
212cd964fceSMatt Barden }
213cd964fceSMatt Barden 
214cd964fceSMatt Barden int
mac_update(crypto_op_t * op,size_t offset,size_t len,size_t * dummy __unused)215*77de87d2SJason King mac_update(crypto_op_t *op, size_t offset, size_t len, size_t *dummy __unused)
216cd964fceSMatt Barden {
217*77de87d2SJason King 	return (sign_update(op, offset, len));
218cd964fceSMatt Barden }
219cd964fceSMatt Barden 
220cd964fceSMatt Barden int
mac_final(crypto_op_t * op,size_t dummy __unused)221*77de87d2SJason King mac_final(crypto_op_t *op, size_t dummy __unused)
222cd964fceSMatt Barden {
223cd964fceSMatt Barden 	return (sign_final(op));
224cd964fceSMatt Barden }
225cd964fceSMatt Barden 
226cd964fceSMatt Barden /*
227cd964fceSMatt Barden  * VERIFY_* functions
228cd964fceSMatt Barden  */
229cd964fceSMatt Barden int
verify_init(crypto_op_t * op)230cd964fceSMatt Barden verify_init(crypto_op_t *op)
231cd964fceSMatt Barden {
232cd964fceSMatt Barden 	CK_MECHANISM mech;
233cd964fceSMatt Barden 	CK_RV rv;
234cd964fceSMatt Barden 
235cd964fceSMatt Barden 	mech.mechanism = op->mech;
236cd964fceSMatt Barden 	mech.pParameter = NULL;
237cd964fceSMatt Barden 	mech.ulParameterLen = 0;
238cd964fceSMatt Barden 
239cd964fceSMatt Barden 	rv = SUNW_C_KeyToObject(op->hsession, op->mech,
240cd964fceSMatt Barden 	    op->key, op->keylen, &op->keyt);
241cd964fceSMatt Barden 
242cd964fceSMatt Barden 	if (rv != CKR_OK)
243cd964fceSMatt Barden 		cryptotest_error("SUNW_C_KeyToObject", rv);
244cd964fceSMatt Barden 
245cd964fceSMatt Barden 	rv = C_VerifyInit(op->hsession, &mech, op->keyt);
246cd964fceSMatt Barden 
247cd964fceSMatt Barden 	if (rv != CKR_OK)
248cd964fceSMatt Barden 		cryptotest_error("C_VerifyInit", rv);
249cd964fceSMatt Barden 
250cd964fceSMatt Barden 	return (rv);
251cd964fceSMatt Barden }
252cd964fceSMatt Barden 
253cd964fceSMatt Barden int
verify_single(crypto_op_t * op)254cd964fceSMatt Barden verify_single(crypto_op_t *op)
255cd964fceSMatt Barden {
256cd964fceSMatt Barden 	CK_RV rv;
257cd964fceSMatt Barden 
258cd964fceSMatt Barden 	rv = C_Verify(op->hsession, op->in, op->inlen, op->out, op->outlen);
259cd964fceSMatt Barden 	if (rv != CKR_OK && rv != CKR_SIGNATURE_INVALID &&
260cd964fceSMatt Barden 	    rv != CKR_SIGNATURE_LEN_RANGE)
261cd964fceSMatt Barden 		cryptotest_error("C_Verify", rv);
262cd964fceSMatt Barden 	return (rv);
263cd964fceSMatt Barden }
264cd964fceSMatt Barden 
265cd964fceSMatt Barden int
verify_update(crypto_op_t * op,size_t offset,size_t len)266*77de87d2SJason King verify_update(crypto_op_t *op, size_t offset, size_t len)
267cd964fceSMatt Barden {
268cd964fceSMatt Barden 	CK_RV rv;
269*77de87d2SJason King 	rv = C_VerifyUpdate(op->hsession, op->in + offset, len);
270cd964fceSMatt Barden 	if (rv != CKR_OK)
271cd964fceSMatt Barden 		cryptotest_error("C_VerifyUpdate", rv);
272cd964fceSMatt Barden 	return (rv);
273cd964fceSMatt Barden }
274cd964fceSMatt Barden 
275cd964fceSMatt Barden int
verify_final(crypto_op_t * op)276cd964fceSMatt Barden verify_final(crypto_op_t *op)
277cd964fceSMatt Barden {
278cd964fceSMatt Barden 	CK_RV rv;
279cd964fceSMatt Barden 	rv = C_VerifyFinal(op->hsession, op->out, op->outlen);
280cd964fceSMatt Barden 	if (rv != CKR_OK && rv != CKR_SIGNATURE_INVALID &&
281cd964fceSMatt Barden 	    rv != CKR_SIGNATURE_LEN_RANGE)
282cd964fceSMatt Barden 		cryptotest_error("C_VerifyFinal", rv);
283cd964fceSMatt Barden 	return (rv);
284cd964fceSMatt Barden }
285cd964fceSMatt Barden 
286cd964fceSMatt Barden /*
287cd964fceSMatt Barden  * ENCRYPT_* functions
288cd964fceSMatt Barden  */
289cd964fceSMatt Barden int
encrypt_init(crypto_op_t * op)290cd964fceSMatt Barden encrypt_init(crypto_op_t *op)
291cd964fceSMatt Barden {
292cd964fceSMatt Barden 	CK_MECHANISM mech;
293cd964fceSMatt Barden 	CK_RV rv;
294cd964fceSMatt Barden 
295cd964fceSMatt Barden 	mech.mechanism = op->mech;
296cd964fceSMatt Barden 	mech.pParameter = op->param;
297cd964fceSMatt Barden 	mech.ulParameterLen = op->paramlen;
298cd964fceSMatt Barden 
299cd964fceSMatt Barden 	rv = SUNW_C_KeyToObject(op->hsession, op->mech,
300cd964fceSMatt Barden 	    op->key, op->keylen, &op->keyt);
301cd964fceSMatt Barden 
302cd964fceSMatt Barden 	if (rv != CKR_OK)
303cd964fceSMatt Barden 		cryptotest_error("SUNW_C_KeyToObject", rv);
304cd964fceSMatt Barden 
305cd964fceSMatt Barden 	rv = C_EncryptInit(op->hsession, &mech, op->keyt);
306cd964fceSMatt Barden 
307cd964fceSMatt Barden 	if (rv != CKR_OK)
308cd964fceSMatt Barden 		cryptotest_error("C_EncryptInit", rv);
309cd964fceSMatt Barden 
310cd964fceSMatt Barden 	return (rv);
311cd964fceSMatt Barden }
312cd964fceSMatt Barden 
313cd964fceSMatt Barden int
encrypt_single(crypto_op_t * op)314cd964fceSMatt Barden encrypt_single(crypto_op_t *op)
315cd964fceSMatt Barden {
316cd964fceSMatt Barden 	CK_RV rv;
317cd964fceSMatt Barden 
318cd964fceSMatt Barden 	rv = C_Encrypt(op->hsession, op->in, op->inlen,
319cd964fceSMatt Barden 	    op->out, (CK_ULONG_PTR)&op->outlen);
320cd964fceSMatt Barden 	if (rv != CKR_OK)
321cd964fceSMatt Barden 		cryptotest_error("C_Encrypt", rv);
322cd964fceSMatt Barden 	return (rv);
323cd964fceSMatt Barden }
324cd964fceSMatt Barden 
325cd964fceSMatt Barden int
encrypt_update(crypto_op_t * op,size_t offset,size_t plainlen,size_t * encrlen)326*77de87d2SJason King encrypt_update(crypto_op_t *op, size_t offset, size_t plainlen, size_t *encrlen)
327cd964fceSMatt Barden {
328cd964fceSMatt Barden 	CK_RV rv;
329cd964fceSMatt Barden 	CK_ULONG outlen = op->outlen - *encrlen;
330*77de87d2SJason King 	rv = C_EncryptUpdate(op->hsession, op->in + offset, plainlen,
331cd964fceSMatt Barden 	    op->out + *encrlen, &outlen);
332cd964fceSMatt Barden 	if (rv != CKR_OK)
333cd964fceSMatt Barden 		cryptotest_error("C_EncryptUpdate", rv);
334cd964fceSMatt Barden 
335cd964fceSMatt Barden 	*encrlen += outlen;
336cd964fceSMatt Barden 	return (rv);
337cd964fceSMatt Barden }
338cd964fceSMatt Barden 
339cd964fceSMatt Barden int
encrypt_final(crypto_op_t * op,size_t encrlen)340cd964fceSMatt Barden encrypt_final(crypto_op_t *op, size_t encrlen)
341cd964fceSMatt Barden {
342cd964fceSMatt Barden 	CK_RV rv;
343cd964fceSMatt Barden 	CK_ULONG outlen = op->outlen - encrlen;
344cd964fceSMatt Barden 	rv = C_EncryptFinal(op->hsession, op->out + encrlen, &outlen);
345cd964fceSMatt Barden 	if (rv != CKR_OK)
346cd964fceSMatt Barden 		cryptotest_error("C_EncryptFinal", rv);
347cd964fceSMatt Barden 	return (rv);
348cd964fceSMatt Barden }
349cd964fceSMatt Barden 
350cd964fceSMatt Barden /*
351cd964fceSMatt Barden  * DECRYPT_* functions
352cd964fceSMatt Barden  */
353cd964fceSMatt Barden int
decrypt_init(crypto_op_t * op)354cd964fceSMatt Barden decrypt_init(crypto_op_t *op)
355cd964fceSMatt Barden {
356cd964fceSMatt Barden 	CK_MECHANISM mech;
357cd964fceSMatt Barden 	CK_RV rv;
358cd964fceSMatt Barden 
359cd964fceSMatt Barden 	mech.mechanism = op->mech;
360cd964fceSMatt Barden 	mech.pParameter = op->param;
361cd964fceSMatt Barden 	mech.ulParameterLen = op->paramlen;
362cd964fceSMatt Barden 
363cd964fceSMatt Barden 	rv = SUNW_C_KeyToObject(op->hsession, op->mech,
364cd964fceSMatt Barden 	    op->key, op->keylen, &op->keyt);
365cd964fceSMatt Barden 
366cd964fceSMatt Barden 	if (rv != CKR_OK)
367cd964fceSMatt Barden 		cryptotest_error("SUNW_C_KeyToObject", rv);
368cd964fceSMatt Barden 
369cd964fceSMatt Barden 	rv = C_DecryptInit(op->hsession, &mech, op->keyt);
370cd964fceSMatt Barden 
371cd964fceSMatt Barden 	if (rv != CKR_OK)
372cd964fceSMatt Barden 		cryptotest_error("C_DecryptInit", rv);
373cd964fceSMatt Barden 
374cd964fceSMatt Barden 	return (rv);
375cd964fceSMatt Barden }
376cd964fceSMatt Barden 
377cd964fceSMatt Barden int
decrypt_single(crypto_op_t * op)378cd964fceSMatt Barden decrypt_single(crypto_op_t *op)
379cd964fceSMatt Barden {
380cd964fceSMatt Barden 	CK_RV rv;
381cd964fceSMatt Barden 
382cd964fceSMatt Barden 	rv = C_Decrypt(op->hsession, op->in, op->inlen,
383cd964fceSMatt Barden 	    op->out, (CK_ULONG_PTR)&op->outlen);
384cd964fceSMatt Barden 	if (rv != CKR_OK)
385cd964fceSMatt Barden 		cryptotest_error("C_Decrypt", rv);
386cd964fceSMatt Barden 	return (rv);
387cd964fceSMatt Barden }
388cd964fceSMatt Barden 
389cd964fceSMatt Barden int
decrypt_update(crypto_op_t * op,size_t offset,size_t len,size_t * encrlen)390*77de87d2SJason King decrypt_update(crypto_op_t *op, size_t offset, size_t len, size_t *encrlen)
391cd964fceSMatt Barden {
392cd964fceSMatt Barden 	CK_RV rv;
393cd964fceSMatt Barden 	CK_ULONG outlen = op->outlen - *encrlen;
394*77de87d2SJason King 	rv = C_DecryptUpdate(op->hsession, op->in + offset, len,
395cd964fceSMatt Barden 	    op->out + *encrlen, &outlen);
396cd964fceSMatt Barden 	if (rv != CKR_OK)
397cd964fceSMatt Barden 		cryptotest_error("C_DecryptUpdate", rv);
398cd964fceSMatt Barden 
399cd964fceSMatt Barden 	*encrlen += outlen;
400cd964fceSMatt Barden 	return (rv);
401cd964fceSMatt Barden }
402cd964fceSMatt Barden 
403cd964fceSMatt Barden int
decrypt_final(crypto_op_t * op,size_t encrlen)404cd964fceSMatt Barden decrypt_final(crypto_op_t *op, size_t encrlen)
405cd964fceSMatt Barden {
406cd964fceSMatt Barden 	CK_RV rv;
407cd964fceSMatt Barden 	CK_ULONG outlen = op->outlen - encrlen;
408cd964fceSMatt Barden 	rv = C_DecryptFinal(op->hsession, op->out + encrlen, &outlen);
409cd964fceSMatt Barden 	if (rv != CKR_OK)
410cd964fceSMatt Barden 		cryptotest_error("C_DecryptFinal", rv);
411cd964fceSMatt Barden 	return (rv);
412cd964fceSMatt Barden }
413f3041bfaSJason King 
414f3041bfaSJason King /*
415f3041bfaSJason King  * DIGEST_ functions
416f3041bfaSJason King  */
417f3041bfaSJason King int
digest_init(crypto_op_t * op)418f3041bfaSJason King digest_init(crypto_op_t *op)
419f3041bfaSJason King {
420f3041bfaSJason King 	CK_MECHANISM mech;
421f3041bfaSJason King 	CK_RV rv;
422f3041bfaSJason King 
423f3041bfaSJason King 	mech.mechanism = op->mech;
424f3041bfaSJason King 	mech.pParameter = op->param;
425f3041bfaSJason King 	mech.ulParameterLen = op->paramlen;
426f3041bfaSJason King 
427f3041bfaSJason King 	rv = C_DigestInit(op->hsession, &mech);
428f3041bfaSJason King 	if (rv != CKR_OK)
429f3041bfaSJason King 		cryptotest_error("C_DigestInit", rv);
430f3041bfaSJason King 	return (rv);
431f3041bfaSJason King }
432f3041bfaSJason King 
433f3041bfaSJason King int
digest_single(crypto_op_t * op)434f3041bfaSJason King digest_single(crypto_op_t *op)
435f3041bfaSJason King {
436f3041bfaSJason King 	CK_RV rv;
437f3041bfaSJason King 
438f3041bfaSJason King 	rv = C_Digest(op->hsession, op->in, op->inlen,
439f3041bfaSJason King 	    op->out, (CK_ULONG_PTR)&op->outlen);
440f3041bfaSJason King 	if (rv != CKR_OK)
441f3041bfaSJason King 		cryptotest_error("C_Digest", rv);
442f3041bfaSJason King 	return (rv);
443f3041bfaSJason King }
444f3041bfaSJason King 
445f3041bfaSJason King int
digest_update(crypto_op_t * op,size_t offset,size_t len,size_t * dummy __unused)446*77de87d2SJason King digest_update(crypto_op_t *op, size_t offset, size_t len,
447*77de87d2SJason King     size_t *dummy __unused)
448f3041bfaSJason King {
449f3041bfaSJason King 	CK_RV rv;
450f3041bfaSJason King 
451*77de87d2SJason King 	rv = C_DigestUpdate(op->hsession, op->in + offset, len);
452f3041bfaSJason King 	if (rv != CKR_OK)
453f3041bfaSJason King 		cryptotest_error("C_DigestUpdate", rv);
454f3041bfaSJason King 	return (rv);
455f3041bfaSJason King }
456f3041bfaSJason King 
457f3041bfaSJason King int
digest_final(crypto_op_t * op,size_t dummy __unused)458*77de87d2SJason King digest_final(crypto_op_t *op, size_t dummy __unused)
459f3041bfaSJason King {
460f3041bfaSJason King 	CK_RV rv;
461f3041bfaSJason King 
462f3041bfaSJason King 	rv = C_DigestFinal(op->hsession, op->out, (CK_ULONG_PTR)&op->outlen);
463f3041bfaSJason King 	if (rv != CKR_OK)
464f3041bfaSJason King 		cryptotest_error("C_DigestFinal", rv);
465f3041bfaSJason King 	return (rv);
466f3041bfaSJason King }
467fb261280SJason King 
468fb261280SJason King void
ccm_init_params(void * buf,ulong_t ulDataLen,uchar_t * pNonce,ulong_t ulNonceLen,uchar_t * pAAD,ulong_t ulAADLen,ulong_t ulMACLen)469fb261280SJason King ccm_init_params(void *buf, ulong_t ulDataLen, uchar_t *pNonce,
470fb261280SJason King     ulong_t ulNonceLen, uchar_t *pAAD, ulong_t ulAADLen, ulong_t ulMACLen)
471fb261280SJason King {
472fb261280SJason King 	CK_CCM_PARAMS *pp = buf;
473fb261280SJason King 
474fb261280SJason King 	pp->ulDataLen = ulDataLen;
475fb261280SJason King 	pp->pNonce = pNonce;
476fb261280SJason King 	pp->ulNonceLen = ulNonceLen;
477fb261280SJason King 	pp->pAAD = pAAD;
478fb261280SJason King 	pp->ulAADLen = ulAADLen;
479fb261280SJason King 	pp->ulMACLen = ulMACLen;
480fb261280SJason King }
481fb261280SJason King 
482fb261280SJason King size_t
ccm_param_len(void)483fb261280SJason King ccm_param_len(void)
484fb261280SJason King {
485fb261280SJason King 	return (sizeof (CK_CCM_PARAMS));
486fb261280SJason King }
487*77de87d2SJason King 
488*77de87d2SJason King const char *
cryptotest_errstr(int e,char * buf,size_t buflen)489*77de87d2SJason King cryptotest_errstr(int e, char *buf, size_t buflen)
490*77de87d2SJason King {
491*77de87d2SJason King 	char *valstr = NULL;
492*77de87d2SJason King 
493*77de87d2SJason King 	valstr = pkcs11_strerror(e);
494*77de87d2SJason King 
495*77de87d2SJason King 	/*
496*77de87d2SJason King 	 * We'd like both the symbolic and numeric value for every error
497*77de87d2SJason King 	 * value.  pkcs11_strerror() already includes the numeric value
498*77de87d2SJason King 	 * for unknown error values (but not for known values), so we take
499*77de87d2SJason King 	 * advantage of all known PKCS#11 error values starting with 'CKR_'
500*77de87d2SJason King 	 * to determine if we need to include the numeric value or not.
501*77de87d2SJason King 	 */
502*77de87d2SJason King 	if (strcmp(valstr, "CKR_") == 0) {
503*77de87d2SJason King 		(void) snprintf(buf, buflen, "%s (%08x)", valstr, e);
504*77de87d2SJason King 	} else {
505*77de87d2SJason King 		(void) strlcpy(buf, valstr, buflen);
506*77de87d2SJason King 	}
507*77de87d2SJason King 
508*77de87d2SJason King 	return (buf);
509*77de87d2SJason King }
510