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