1 // Copyright 2017 Marcus Heese
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 //
7 // http://www.apache.org/licenses/LICENSE-2.0
8 //
9 // Unless required by applicable law or agreed to in writing, software
10 // distributed under the License is distributed on an "AS IS" BASIS,
11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 // See the License for the specific language governing permissions and
13 // limitations under the License.
14
15 use std;
16 use types::*;
17
18 #[derive(Debug)]
19 pub enum Error {
20 Io(std::io::Error),
21 Module(&'static str),
22 InvalidInput(&'static str),
23 Pkcs11(CK_RV),
24 }
25
26 impl From<std::io::Error> for Error {
from(err: std::io::Error) -> Error27 fn from(err: std::io::Error) -> Error {
28 Error::Io(err)
29 }
30 }
31
32 impl std::fmt::Display for Error {
fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result33 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
34 match *self {
35 Error::Io(ref err) => write!(f, "IO: {}", err),
36 Error::Module(ref err) => write!(f, "PKCS#11 Module: {}", err),
37 Error::InvalidInput(ref err) => write!(f, "PKCS#11 Invalid Input: {}", err),
38 Error::Pkcs11(ref err) => write!(f, "PKCS#11: {} (0x{:x})", strerror(*err), err),
39 }
40 }
41 }
42
43 impl std::error::Error for Error {
cause(&self) -> Option<&std::error::Error>44 fn cause(&self) -> Option<&std::error::Error> {
45 if let Error::Io(ref err) = self {
46 Some(err)
47 } else {
48 None
49 }
50 }
51 }
52
strerror(err: CK_RV) -> &'static str53 fn strerror(err: CK_RV) -> &'static str {
54 match err {
55 CKR_OK => "CKR_OK",
56 CKR_CANCEL => "CKR_CANCEL",
57 CKR_HOST_MEMORY => "CKR_HOST_MEMORY",
58 CKR_SLOT_ID_INVALID => "CKR_SLOT_ID_INVALID",
59 CKR_GENERAL_ERROR => "CKR_GENERAL_ERROR",
60 CKR_FUNCTION_FAILED => "CKR_FUNCTION_FAILED",
61 CKR_ARGUMENTS_BAD => "CKR_ARGUMENTS_BAD",
62 CKR_NO_EVENT => "CKR_NO_EVENT",
63 CKR_NEED_TO_CREATE_THREADS => "CKR_NEED_TO_CREATE_THREADS",
64 CKR_CANT_LOCK => "CKR_CANT_LOCK",
65 CKR_ATTRIBUTE_READ_ONLY => "CKR_ATTRIBUTE_READ_ONLY",
66 CKR_ATTRIBUTE_SENSITIVE => "CKR_ATTRIBUTE_SENSITIVE",
67 CKR_ATTRIBUTE_TYPE_INVALID => "CKR_ATTRIBUTE_TYPE_INVALID",
68 CKR_ATTRIBUTE_VALUE_INVALID => "CKR_ATTRIBUTE_VALUE_INVALID",
69 CKR_ACTION_PROHIBITED => "CKR_ACTION_PROHIBITED",
70 CKR_DATA_INVALID => "CKR_DATA_INVALID",
71 CKR_DATA_LEN_RANGE => "CKR_DATA_LEN_RANGE",
72 CKR_DEVICE_ERROR => "CKR_DEVICE_ERROR",
73 CKR_DEVICE_MEMORY => "CKR_DEVICE_MEMORY",
74 CKR_DEVICE_REMOVED => "CKR_DEVICE_REMOVED",
75 CKR_ENCRYPTED_DATA_INVALID => "CKR_ENCRYPTED_DATA_INVALID",
76 CKR_ENCRYPTED_DATA_LEN_RANGE => "CKR_ENCRYPTED_DATA_LEN_RANGE",
77 CKR_FUNCTION_CANCELED => "CKR_FUNCTION_CANCELED",
78 CKR_FUNCTION_NOT_PARALLEL => "CKR_FUNCTION_NOT_PARALLEL",
79 CKR_FUNCTION_NOT_SUPPORTED => "CKR_FUNCTION_NOT_SUPPORTED",
80 CKR_KEY_HANDLE_INVALID => "CKR_KEY_HANDLE_INVALID",
81 CKR_KEY_SIZE_RANGE => "CKR_KEY_SIZE_RANGE",
82 CKR_KEY_TYPE_INCONSISTENT => "CKR_KEY_TYPE_INCONSISTENT",
83 CKR_KEY_NOT_NEEDED => "CKR_KEY_NOT_NEEDED",
84 CKR_KEY_CHANGED => "CKR_KEY_CHANGED",
85 CKR_KEY_NEEDED => "CKR_KEY_NEEDED",
86 CKR_KEY_INDIGESTIBLE => "CKR_KEY_INDIGESTIBLE",
87 CKR_KEY_FUNCTION_NOT_PERMITTED => "CKR_KEY_FUNCTION_NOT_PERMITTED",
88 CKR_KEY_NOT_WRAPPABLE => "CKR_KEY_NOT_WRAPPABLE",
89 CKR_KEY_UNEXTRACTABLE => "CKR_KEY_UNEXTRACTABLE",
90 CKR_MECHANISM_INVALID => "CKR_MECHANISM_INVALID",
91 CKR_MECHANISM_PARAM_INVALID => "CKR_MECHANISM_PARAM_INVALID",
92 CKR_OBJECT_HANDLE_INVALID => "CKR_OBJECT_HANDLE_INVALID",
93 CKR_OPERATION_ACTIVE => "CKR_OPERATION_ACTIVE",
94 CKR_OPERATION_NOT_INITIALIZED => "CKR_OPERATION_NOT_INITIALIZED",
95 CKR_PIN_INCORRECT => "CKR_PIN_INCORRECT",
96 CKR_PIN_INVALID => "CKR_PIN_INVALID",
97 CKR_PIN_LEN_RANGE => "CKR_PIN_LEN_RANGE",
98 CKR_PIN_EXPIRED => "CKR_PIN_EXPIRED",
99 CKR_PIN_LOCKED => "CKR_PIN_LOCKED",
100 CKR_SESSION_CLOSED => "CKR_SESSION_CLOSED",
101 CKR_SESSION_COUNT => "CKR_SESSION_COUNT",
102 CKR_SESSION_HANDLE_INVALID => "CKR_SESSION_HANDLE_INVALID",
103 CKR_SESSION_PARALLEL_NOT_SUPPORTED => "CKR_SESSION_PARALLEL_NOT_SUPPORTED",
104 CKR_SESSION_READ_ONLY => "CKR_SESSION_READ_ONLY",
105 CKR_SESSION_EXISTS => "CKR_SESSION_EXISTS",
106 CKR_SESSION_READ_ONLY_EXISTS => "CKR_SESSION_READ_ONLY_EXISTS",
107 CKR_SESSION_READ_WRITE_SO_EXISTS => "CKR_SESSION_READ_WRITE_SO_EXISTS",
108 CKR_SIGNATURE_INVALID => "CKR_SIGNATURE_INVALID",
109 CKR_SIGNATURE_LEN_RANGE => "CKR_SIGNATURE_LEN_RANGE",
110 CKR_TEMPLATE_INCOMPLETE => "CKR_TEMPLATE_INCOMPLETE",
111 CKR_TEMPLATE_INCONSISTENT => "CKR_TEMPLATE_INCONSISTENT",
112 CKR_TOKEN_NOT_PRESENT => "CKR_TOKEN_NOT_PRESENT",
113 CKR_TOKEN_NOT_RECOGNIZED => "CKR_TOKEN_NOT_RECOGNIZED",
114 CKR_TOKEN_WRITE_PROTECTED => "CKR_TOKEN_WRITE_PROTECTED",
115 CKR_UNWRAPPING_KEY_HANDLE_INVALID => "CKR_UNWRAPPING_KEY_HANDLE_INVALID",
116 CKR_UNWRAPPING_KEY_SIZE_RANGE => "CKR_UNWRAPPING_KEY_SIZE_RANGE",
117 CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT => "CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT",
118 CKR_USER_ALREADY_LOGGED_IN => "CKR_USER_ALREADY_LOGGED_IN",
119 CKR_USER_NOT_LOGGED_IN => "CKR_USER_NOT_LOGGED_IN",
120 CKR_USER_PIN_NOT_INITIALIZED => "CKR_USER_PIN_NOT_INITIALIZED",
121 CKR_USER_TYPE_INVALID => "CKR_USER_TYPE_INVALID",
122 CKR_USER_ANOTHER_ALREADY_LOGGED_IN => "CKR_USER_ANOTHER_ALREADY_LOGGED_IN",
123 CKR_USER_TOO_MANY_TYPES => "CKR_USER_TOO_MANY_TYPES",
124 CKR_WRAPPED_KEY_INVALID => "CKR_WRAPPED_KEY_INVALID",
125 CKR_WRAPPED_KEY_LEN_RANGE => "CKR_WRAPPED_KEY_LEN_RANGE",
126 CKR_WRAPPING_KEY_HANDLE_INVALID => "CKR_WRAPPING_KEY_HANDLE_INVALID",
127 CKR_WRAPPING_KEY_SIZE_RANGE => "CKR_WRAPPING_KEY_SIZE_RANGE",
128 CKR_WRAPPING_KEY_TYPE_INCONSISTENT => "CKR_WRAPPING_KEY_TYPE_INCONSISTENT",
129 CKR_RANDOM_SEED_NOT_SUPPORTED => "CKR_RANDOM_SEED_NOT_SUPPORTED",
130 CKR_RANDOM_NO_RNG => "CKR_RANDOM_NO_RNG",
131 CKR_DOMAIN_PARAMS_INVALID => "CKR_DOMAIN_PARAMS_INVALID",
132 CKR_CURVE_NOT_SUPPORTED => "CKR_CURVE_NOT_SUPPORTED",
133 CKR_BUFFER_TOO_SMALL => "CKR_BUFFER_TOO_SMALL",
134 CKR_SAVED_STATE_INVALID => "CKR_SAVED_STATE_INVALID",
135 CKR_INFORMATION_SENSITIVE => "CKR_INFORMATION_SENSITIVE",
136 CKR_STATE_UNSAVEABLE => "CKR_STATE_UNSAVEABLE",
137 CKR_CRYPTOKI_NOT_INITIALIZED => "CKR_CRYPTOKI_NOT_INITIALIZED",
138 CKR_CRYPTOKI_ALREADY_INITIALIZED => "CKR_CRYPTOKI_ALREADY_INITIALIZED",
139 CKR_MUTEX_BAD => "CKR_MUTEX_BAD",
140 CKR_MUTEX_NOT_LOCKED => "CKR_MUTEX_NOT_LOCKED",
141 CKR_NEW_PIN_MODE => "CKR_NEW_PIN_MODE",
142 CKR_NEXT_OTP => "CKR_NEXT_OTP",
143 CKR_EXCEEDED_MAX_ITERATIONS => "CKR_EXCEEDED_MAX_ITERATIONS",
144 CKR_FIPS_SELF_TEST_FAILED => "CKR_FIPS_SELF_TEST_FAILED",
145 CKR_LIBRARY_LOAD_FAILED => "CKR_LIBRARY_LOAD_FAILED",
146 CKR_PIN_TOO_WEAK => "CKR_PIN_TOO_WEAK",
147 CKR_PUBLIC_KEY_INVALID => "CKR_PUBLIC_KEY_INVALID",
148 CKR_FUNCTION_REJECTED => "CKR_FUNCTION_REJECTED",
149 CKR_VENDOR_DEFINED => "CKR_VENDOR_DEFINED",
150 _ => "unknown",
151 }
152 }
153