1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License, Version 1.0 only
6  * (the "License").  You may not use this file except in compliance
7  * with the License.
8  *
9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10  * or http://www.opensolaris.org/os/licensing.
11  * See the License for the specific language governing permissions
12  * and limitations under the License.
13  *
14  * When distributing Covered Code, include this CDDL HEADER in each
15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16  * If applicable, add the following below this CDDL HEADER, with the
17  * fields enclosed by brackets "[]" replaced with your own identifying
18  * information: Portions Copyright [yyyy] [name of copyright owner]
19  *
20  * CDDL HEADER END
21  */
22 /*
23  * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  * Copyright 2012 Milan Jurik. All rights reserved.
26  * Copyright 2015 Jason King.
27  */
28 
29 /*
30  * Block comment which describes the contents of this file.
31  */
32 
33 #include <stdio.h>
34 #include <security/cryptoki.h>
35 
36 /*
37  * pkcs11_strerror: returns a string representation of the given return code.
38  * The string returned is static pointer.  It doesn't need to be free'd
39  * by the caller.
40  */
41 char *
pkcs11_strerror(CK_RV rv)42 pkcs11_strerror(CK_RV rv)
43 {
44 	static char errstr[128];
45 
46 	switch (rv) {
47 		case CKR_OK:
48 			return ("CKR_OK");
49 		case CKR_CANCEL:
50 			return ("CKR_CANCEL");
51 		case CKR_HOST_MEMORY:
52 			return ("CKR_HOST_MEMORY");
53 		case CKR_SLOT_ID_INVALID:
54 			return ("CKR_SLOT_ID_INVALID");
55 		case CKR_GENERAL_ERROR:
56 			return ("CKR_GENERAL_ERROR");
57 		case CKR_FUNCTION_FAILED:
58 			return ("CKR_FUNCTION_FAILED");
59 		case CKR_ARGUMENTS_BAD:
60 			return ("CKR_ARGUMENTS_BAD");
61 		case CKR_NO_EVENT:
62 			return ("CKR_NO_EVENT");
63 		case CKR_NEED_TO_CREATE_THREADS:
64 			return ("CKR_NEED_TO_CREATE_THREADS");
65 		case CKR_CANT_LOCK:
66 			return ("CKR_CANT_LOCK");
67 		case CKR_ATTRIBUTE_READ_ONLY:
68 			return ("CKR_ATTRIBUTE_READ_ONLY");
69 		case CKR_ATTRIBUTE_SENSITIVE:
70 			return ("CKR_ATTRIBUTE_SENSITIVE");
71 		case CKR_ATTRIBUTE_TYPE_INVALID:
72 			return ("CKR_ATTRIBUTE_TYPE_INVALID");
73 		case CKR_ATTRIBUTE_VALUE_INVALID:
74 			return ("CKR_ATTRIBUTE_VALUE_INVALID");
75 		case CKR_ACTION_PROHIBITED:
76 			return ("CKR_ACTION_PROHIBITED");
77 		case CKR_DATA_INVALID:
78 			return ("CKR_DATA_INVALID");
79 		case CKR_DATA_LEN_RANGE:
80 			return ("CKR_DATA_LEN_RANGE");
81 		case CKR_DEVICE_ERROR:
82 			return ("CKR_DEVICE_ERROR");
83 		case CKR_DEVICE_MEMORY:
84 			return ("CKR_DEVICE_MEMORY");
85 		case CKR_DEVICE_REMOVED:
86 			return ("CKR_DEVICE_REMOVED");
87 		case CKR_ENCRYPTED_DATA_INVALID:
88 			return ("CKR_ENCRYPTED_DATA_INVALID");
89 		case CKR_ENCRYPTED_DATA_LEN_RANGE:
90 			return ("CKR_ENCRYPTED_DATA_LEN_RANGE");
91 		case CKR_FUNCTION_CANCELED:
92 			return ("CKR_FUNCTION_CANCELED");
93 		case CKR_FUNCTION_NOT_PARALLEL:
94 			return ("CKR_FUNCTION_NOT_PARALLEL");
95 		case CKR_FUNCTION_NOT_SUPPORTED:
96 			return ("CKR_FUNCTION_NOT_SUPPORTED");
97 		case CKR_KEY_HANDLE_INVALID:
98 			return ("CKR_KEY_HANDLE_INVALID");
99 		case CKR_KEY_SIZE_RANGE:
100 			return ("CKR_KEY_SIZE_RANGE");
101 		case CKR_KEY_TYPE_INCONSISTENT:
102 			return ("CKR_KEY_TYPE_INCONSISTENT");
103 		case CKR_KEY_NOT_NEEDED:
104 			return ("CKR_KEY_NOT_NEEDED");
105 		case CKR_KEY_CHANGED:
106 			return ("CKR_KEY_CHANGED");
107 		case CKR_KEY_NEEDED:
108 			return ("CKR_KEY_NEEDED");
109 		case CKR_KEY_INDIGESTIBLE:
110 			return ("CKR_KEY_INDIGESTIBLE");
111 		case CKR_KEY_FUNCTION_NOT_PERMITTED:
112 			return ("CKR_KEY_FUNCTION_NOT_PERMITTED");
113 		case CKR_KEY_NOT_WRAPPABLE:
114 			return ("CKR_KEY_NOT_WRAPPABLE");
115 		case CKR_KEY_UNEXTRACTABLE:
116 			return ("CKR_KEY_UNEXTRACTABLE");
117 		case CKR_MECHANISM_INVALID:
118 			return ("CKR_MECHANISM_INVALID");
119 		case CKR_MECHANISM_PARAM_INVALID:
120 			return ("CKR_MECHANISM_PARAM_INVALID");
121 		case CKR_OBJECT_HANDLE_INVALID:
122 			return ("CKR_OBJECT_HANDLE_INVALID");
123 		case CKR_OPERATION_ACTIVE:
124 			return ("CKR_OPERATION_ACTIVE");
125 		case CKR_OPERATION_NOT_INITIALIZED:
126 			return ("CKR_OPERATION_NOT_INITIALIZED");
127 		case CKR_PIN_INCORRECT:
128 			return ("CKR_PIN_INCORRECT");
129 		case CKR_PIN_INVALID:
130 			return ("CKR_PIN_INVALID");
131 		case CKR_PIN_LEN_RANGE:
132 			return ("CKR_PIN_LEN_RANGE");
133 		case CKR_PIN_EXPIRED:
134 			return ("CKR_PIN_EXPIRED");
135 		case CKR_PIN_LOCKED:
136 			return ("CKR_PIN_LOCKED");
137 		case CKR_SESSION_CLOSED:
138 			return ("CKR_SESSION_CLOSED");
139 		case CKR_SESSION_COUNT:
140 			return ("CKR_SESSION_COUNT");
141 		case CKR_SESSION_HANDLE_INVALID:
142 			return ("CKR_SESSION_HANDLE_INVALID");
143 		case CKR_SESSION_PARALLEL_NOT_SUPPORTED:
144 			return ("CKR_SESSION_PARALLEL_NOT_SUPPORTED");
145 		case CKR_SESSION_READ_ONLY:
146 			return ("CKR_SESSION_READ_ONLY");
147 		case CKR_SESSION_EXISTS:
148 			return ("CKR_SESSION_EXISTS");
149 		case CKR_SESSION_READ_ONLY_EXISTS:
150 			return ("CKR_SESSION_READ_ONLY_EXISTS");
151 		case CKR_SESSION_READ_WRITE_SO_EXISTS:
152 			return ("CKR_SESSION_READ_WRITE_SO_EXISTS");
153 		case CKR_SIGNATURE_INVALID:
154 			return ("CKR_SIGNATURE_INVALID");
155 		case CKR_SIGNATURE_LEN_RANGE:
156 			return ("CKR_SIGNATURE_LEN_RANGE");
157 		case CKR_TEMPLATE_INCOMPLETE:
158 			return ("CKR_TEMPLATE_INCOMPLETE");
159 		case CKR_TEMPLATE_INCONSISTENT:
160 			return ("CKR_TEMPLATE_INCONSISTENT");
161 		case CKR_TOKEN_NOT_PRESENT:
162 			return ("CKR_TOKEN_NOT_PRESENT");
163 		case CKR_TOKEN_NOT_RECOGNIZED:
164 			return ("CKR_TOKEN_NOT_RECOGNIZED");
165 		case CKR_TOKEN_WRITE_PROTECTED:
166 			return ("CKR_TOKEN_WRITE_PROTECTED");
167 		case CKR_UNWRAPPING_KEY_HANDLE_INVALID:
168 			return ("CKR_UNWRAPPING_KEY_HANDLE_INVALID");
169 		case CKR_UNWRAPPING_KEY_SIZE_RANGE:
170 			return ("CKR_UNWRAPPING_KEY_SIZE_RANGE");
171 		case CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT:
172 			return ("CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT");
173 		case CKR_USER_ALREADY_LOGGED_IN:
174 			return ("CKR_USER_ALREADY_LOGGED_IN");
175 		case CKR_USER_NOT_LOGGED_IN:
176 			return ("CKR_USER_NOT_LOGGED_IN");
177 		case CKR_USER_PIN_NOT_INITIALIZED:
178 			return ("CKR_USER_PIN_NOT_INITIALIZED");
179 		case CKR_USER_TYPE_INVALID:
180 			return ("CKR_USER_TYPE_INVALID");
181 		case CKR_USER_ANOTHER_ALREADY_LOGGED_IN:
182 			return ("CKR_USER_ANOTHER_ALREADY_LOGGED_IN");
183 		case CKR_USER_TOO_MANY_TYPES:
184 			return ("CKR_USER_TOO_MANY_TYPES");
185 		case CKR_WRAPPED_KEY_INVALID:
186 			return ("CKR_WRAPPED_KEY_INVALID");
187 		case CKR_WRAPPED_KEY_LEN_RANGE:
188 			return ("CKR_WRAPPED_KEY_LEN_RANGE");
189 		case CKR_WRAPPING_KEY_HANDLE_INVALID:
190 			return ("CKR_WRAPPING_KEY_HANDLE_INVALID");
191 		case CKR_WRAPPING_KEY_SIZE_RANGE:
192 			return ("CKR_WRAPPING_KEY_SIZE_RANGE");
193 		case CKR_WRAPPING_KEY_TYPE_INCONSISTENT:
194 			return ("CKR_WRAPPING_KEY_TYPE_INCONSISTENT");
195 		case CKR_RANDOM_SEED_NOT_SUPPORTED:
196 			return ("CKR_RANDOM_SEED_NOT_SUPPORTED");
197 		case CKR_RANDOM_NO_RNG:
198 			return ("CKR_RANDOM_NO_RNG");
199 		case CKR_DOMAIN_PARAMS_INVALID:
200 			return ("CKR_DOMAIN_PARAMS_INVALID");
201 		case CKR_CURVE_NOT_SUPPORTED:
202 			return ("CLR_CURVE_NOT_SUPPORTED");
203 		case CKR_BUFFER_TOO_SMALL:
204 			return ("CKR_BUFFER_TOO_SMALL");
205 		case CKR_SAVED_STATE_INVALID:
206 			return ("CKR_SAVED_STATE_INVALID");
207 		case CKR_INFORMATION_SENSITIVE:
208 			return ("CKR_INFORMATION_SENSITIVE");
209 		case CKR_STATE_UNSAVEABLE:
210 			return ("CKR_STATE_UNSAVEABLE");
211 		case CKR_CRYPTOKI_NOT_INITIALIZED:
212 			return ("CKR_CRYPTOKI_NOT_INITIALIZED");
213 		case CKR_CRYPTOKI_ALREADY_INITIALIZED:
214 			return ("CKR_CRYPTOKI_ALREADY_INITIALIZED");
215 		case CKR_MUTEX_BAD:
216 			return ("CKR_MUTEX_BAD");
217 		case CKR_MUTEX_NOT_LOCKED:
218 			return ("CKR_MUTEX_NOT_LOCKED");
219 		case CKR_NEW_PIN_MODE:
220 			return ("CKR_NEW_PIN_MODE");
221 		case CKR_NEXT_OTP:
222 			return ("CKR_NEXT_OTP");
223 		case CKR_EXCEEDED_MAX_ITERATIONS:
224 			return ("CKR_EXCEEDED_MAX_ITERATIONS");
225 		case CKR_FIPS_SELF_TEST_FAILED:
226 			return ("CKR_FIPS_SELF_TEST_FAILED");
227 		case CKR_LIBRARY_LOAD_FAILED:
228 			return ("CKR_LIBRARY_LOAD_FAILED");
229 		case CKR_PIN_TOO_WEAK:
230 			return ("CKR_PIN_TOO_WEAK");
231 		case CKR_PUBLIC_KEY_INVALID:
232 			return ("CKR_PUBLIC_KEY_INVALID");
233 		case CKR_FUNCTION_REJECTED:
234 			return ("CKR_FUNCTION_REJECTED");
235 		case CKR_VENDOR_DEFINED:
236 			return ("CKR_VENDOR_DEFINED");
237 		default:
238 			/* rv not found */
239 			(void) snprintf(errstr, sizeof (errstr),
240 			    "Unknown return code: 0x%lx", rv);
241 			return (errstr);
242 	}
243 }
244