Skip to content

Commit b595ff7

Browse files
authored
Merge pull request #142 from hug-dev/response-status-checks
Modify error translation coming from providers
2 parents b35ae50 + 926c96b commit b595ff7

File tree

4 files changed

+56
-204
lines changed

4 files changed

+56
-204
lines changed

src/providers/pkcs11_provider/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ impl Provide for Pkcs11Provider {
586586
&mut *store_handle,
587587
&mut local_ids_handle,
588588
)?;
589-
Err(ResponseStatus::PsaErrorHardwareFailure)
589+
Err(utils::to_response_status(e))
590590
}
591591
}
592592
}

src/providers/pkcs11_provider/utils.rs

Lines changed: 19 additions & 95 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@ use parsec_interface::requests::ResponseStatus;
1818
use pkcs11::errors::Error;
1919
use pkcs11::types::*;
2020

21+
/// Convert the PKCS 11 library specific error values to ResponseStatus values that are returned on
22+
/// the wire protocol
23+
///
24+
/// Most of them are PsaErrorCommunicationFailure as, in the general case, the calls to the PKCS11
25+
/// library should suceed with the values crafted by the provider.
26+
/// If an error happens in the PKCS11 library, it means that it was badly used by the provider or
27+
/// that it failed in an unexpected way and hence the PsaErrorCommunicationFailure error.
28+
/// The errors translated to response status are related with signature verification failure, lack
29+
/// of memory, hardware failure, corruption detection, lack of entropy and unsupported operations.
2130
pub fn to_response_status(error: Error) -> ResponseStatus {
2231
match error {
2332
Error::Io(e) => ResponseStatus::from(e),
24-
Error::Module(e) => {
33+
Error::Module(e) | Error::InvalidInput(e) => {
2534
error!("Conversion of error \"{}\"", e);
26-
ResponseStatus::PsaErrorGenericError
27-
}
28-
Error::InvalidInput(e) => {
29-
error!("Conversion of error \"{}\"", e);
30-
ResponseStatus::PsaErrorInvalidArgument
35+
ResponseStatus::PsaErrorCommunicationFailure
3136
}
3237
Error::Pkcs11(ck_rv) => rv_to_response_status(ck_rv),
3338
}
@@ -36,106 +41,25 @@ pub fn to_response_status(error: Error) -> ResponseStatus {
3641
pub fn rv_to_response_status(rv: CK_RV) -> ResponseStatus {
3742
match rv {
3843
CKR_OK => ResponseStatus::Success,
39-
CKR_CANCEL => ResponseStatus::PsaErrorGenericError,
4044
CKR_HOST_MEMORY => ResponseStatus::PsaErrorInsufficientMemory,
41-
CKR_SLOT_ID_INVALID => ResponseStatus::PsaErrorInvalidArgument,
42-
CKR_GENERAL_ERROR => ResponseStatus::PsaErrorGenericError,
43-
CKR_FUNCTION_FAILED => ResponseStatus::PsaErrorGenericError,
44-
CKR_ARGUMENTS_BAD => ResponseStatus::PsaErrorInvalidArgument,
45-
CKR_NO_EVENT => ResponseStatus::PsaErrorGenericError,
46-
CKR_NEED_TO_CREATE_THREADS => ResponseStatus::PsaErrorInvalidArgument,
47-
CKR_CANT_LOCK => ResponseStatus::PsaErrorInvalidArgument,
48-
CKR_ATTRIBUTE_READ_ONLY => ResponseStatus::PsaErrorNotPermitted,
49-
CKR_ATTRIBUTE_SENSITIVE => ResponseStatus::PsaErrorNotPermitted,
50-
CKR_ATTRIBUTE_TYPE_INVALID => ResponseStatus::PsaErrorInvalidArgument,
51-
CKR_ATTRIBUTE_VALUE_INVALID => ResponseStatus::PsaErrorInvalidArgument,
52-
CKR_ACTION_PROHIBITED => ResponseStatus::PsaErrorNotPermitted,
53-
CKR_DATA_INVALID => ResponseStatus::PsaErrorInvalidArgument,
54-
CKR_DATA_LEN_RANGE => ResponseStatus::PsaErrorInvalidArgument,
5545
CKR_DEVICE_ERROR => ResponseStatus::PsaErrorHardwareFailure,
5646
CKR_DEVICE_MEMORY => ResponseStatus::PsaErrorInsufficientStorage,
5747
CKR_DEVICE_REMOVED => ResponseStatus::PsaErrorHardwareFailure,
58-
CKR_ENCRYPTED_DATA_INVALID => ResponseStatus::PsaErrorInvalidArgument,
59-
CKR_ENCRYPTED_DATA_LEN_RANGE => ResponseStatus::PsaErrorInvalidArgument,
60-
CKR_FUNCTION_CANCELED => ResponseStatus::PsaErrorGenericError,
61-
CKR_FUNCTION_NOT_PARALLEL => ResponseStatus::PsaErrorGenericError,
62-
CKR_FUNCTION_NOT_SUPPORTED => ResponseStatus::PsaErrorNotSupported,
63-
CKR_KEY_HANDLE_INVALID => ResponseStatus::PsaErrorInvalidHandle,
64-
CKR_KEY_SIZE_RANGE => ResponseStatus::PsaErrorNotSupported,
65-
CKR_KEY_TYPE_INCONSISTENT => ResponseStatus::PsaErrorInvalidArgument,
66-
CKR_KEY_NOT_NEEDED => ResponseStatus::PsaErrorInvalidArgument,
67-
CKR_KEY_CHANGED => ResponseStatus::PsaErrorInvalidArgument,
68-
CKR_KEY_NEEDED => ResponseStatus::PsaErrorInvalidArgument,
69-
CKR_KEY_INDIGESTIBLE => ResponseStatus::PsaErrorGenericError,
70-
CKR_KEY_FUNCTION_NOT_PERMITTED => ResponseStatus::PsaErrorNotPermitted,
71-
CKR_KEY_NOT_WRAPPABLE => ResponseStatus::PsaErrorNotSupported,
72-
CKR_KEY_UNEXTRACTABLE => ResponseStatus::PsaErrorNotPermitted,
73-
CKR_MECHANISM_INVALID => ResponseStatus::PsaErrorInvalidArgument,
74-
CKR_MECHANISM_PARAM_INVALID => ResponseStatus::PsaErrorInvalidArgument,
75-
CKR_OBJECT_HANDLE_INVALID => ResponseStatus::PsaErrorInvalidHandle,
76-
CKR_OPERATION_ACTIVE => ResponseStatus::PsaErrorBadState,
77-
CKR_OPERATION_NOT_INITIALIZED => ResponseStatus::PsaErrorGenericError,
78-
CKR_PIN_INCORRECT => ResponseStatus::PsaErrorNotPermitted,
79-
CKR_PIN_INVALID => ResponseStatus::PsaErrorInvalidArgument,
80-
CKR_PIN_LEN_RANGE => ResponseStatus::PsaErrorInvalidArgument,
81-
CKR_PIN_EXPIRED => ResponseStatus::PsaErrorBadState,
82-
CKR_PIN_LOCKED => ResponseStatus::PsaErrorNotPermitted,
83-
CKR_SESSION_CLOSED => ResponseStatus::PsaErrorBadState,
84-
CKR_SESSION_COUNT => ResponseStatus::PsaErrorBadState,
85-
CKR_SESSION_HANDLE_INVALID => ResponseStatus::PsaErrorInvalidHandle,
86-
CKR_SESSION_PARALLEL_NOT_SUPPORTED => ResponseStatus::PsaErrorNotSupported,
87-
CKR_SESSION_READ_ONLY => ResponseStatus::PsaErrorNotPermitted,
88-
CKR_SESSION_EXISTS => ResponseStatus::PsaErrorBadState,
89-
CKR_SESSION_READ_ONLY_EXISTS => ResponseStatus::PsaErrorBadState,
90-
CKR_SESSION_READ_WRITE_SO_EXISTS => ResponseStatus::PsaErrorBadState,
9148
CKR_SIGNATURE_INVALID => ResponseStatus::PsaErrorInvalidSignature,
9249
CKR_SIGNATURE_LEN_RANGE => ResponseStatus::PsaErrorInvalidSignature,
93-
CKR_TEMPLATE_INCOMPLETE => ResponseStatus::PsaErrorInvalidArgument,
94-
CKR_TEMPLATE_INCONSISTENT => ResponseStatus::PsaErrorInvalidArgument,
9550
CKR_TOKEN_NOT_PRESENT => ResponseStatus::PsaErrorHardwareFailure,
9651
CKR_TOKEN_NOT_RECOGNIZED => ResponseStatus::PsaErrorHardwareFailure,
97-
CKR_TOKEN_WRITE_PROTECTED => ResponseStatus::PsaErrorNotPermitted,
98-
CKR_UNWRAPPING_KEY_HANDLE_INVALID => ResponseStatus::PsaErrorInvalidArgument,
99-
CKR_UNWRAPPING_KEY_SIZE_RANGE => ResponseStatus::PsaErrorNotSupported,
100-
CKR_UNWRAPPING_KEY_TYPE_INCONSISTENT => ResponseStatus::PsaErrorInvalidArgument,
101-
CKR_USER_ALREADY_LOGGED_IN => ResponseStatus::PsaErrorBadState,
102-
CKR_USER_NOT_LOGGED_IN => ResponseStatus::PsaErrorBadState,
103-
CKR_USER_PIN_NOT_INITIALIZED => ResponseStatus::PsaErrorBadState,
104-
CKR_USER_TYPE_INVALID => ResponseStatus::PsaErrorInvalidArgument,
105-
CKR_USER_ANOTHER_ALREADY_LOGGED_IN => ResponseStatus::PsaErrorBadState,
106-
CKR_USER_TOO_MANY_TYPES => ResponseStatus::PsaErrorBadState,
107-
CKR_WRAPPED_KEY_INVALID => ResponseStatus::PsaErrorInvalidArgument,
108-
CKR_WRAPPED_KEY_LEN_RANGE => ResponseStatus::PsaErrorInvalidArgument,
109-
CKR_WRAPPING_KEY_HANDLE_INVALID => ResponseStatus::PsaErrorInvalidArgument,
110-
CKR_WRAPPING_KEY_SIZE_RANGE => ResponseStatus::PsaErrorNotSupported,
111-
CKR_WRAPPING_KEY_TYPE_INCONSISTENT => ResponseStatus::PsaErrorInvalidArgument,
112-
CKR_RANDOM_SEED_NOT_SUPPORTED => ResponseStatus::PsaErrorInvalidArgument,
11352
CKR_RANDOM_NO_RNG => ResponseStatus::PsaErrorInsufficientEntropy,
114-
CKR_DOMAIN_PARAMS_INVALID => ResponseStatus::PsaErrorInvalidArgument,
115-
CKR_CURVE_NOT_SUPPORTED => ResponseStatus::PsaErrorNotSupported,
116-
CKR_BUFFER_TOO_SMALL => ResponseStatus::PsaErrorBufferTooSmall,
117-
CKR_SAVED_STATE_INVALID => ResponseStatus::PsaErrorInvalidArgument,
118-
CKR_INFORMATION_SENSITIVE => ResponseStatus::PsaErrorNotPermitted,
11953
CKR_STATE_UNSAVEABLE => ResponseStatus::PsaErrorHardwareFailure,
120-
CKR_CRYPTOKI_NOT_INITIALIZED => ResponseStatus::PsaErrorBadState,
121-
CKR_CRYPTOKI_ALREADY_INITIALIZED => ResponseStatus::PsaErrorBadState,
122-
CKR_MUTEX_BAD => ResponseStatus::PsaErrorInvalidArgument,
123-
CKR_MUTEX_NOT_LOCKED => ResponseStatus::PsaErrorBadState,
124-
CKR_NEW_PIN_MODE => ResponseStatus::PsaErrorGenericError,
125-
CKR_NEXT_OTP => ResponseStatus::PsaErrorGenericError,
126-
CKR_EXCEEDED_MAX_ITERATIONS => ResponseStatus::PsaErrorGenericError,
127-
CKR_FIPS_SELF_TEST_FAILED => ResponseStatus::PsaErrorGenericError,
128-
CKR_LIBRARY_LOAD_FAILED => ResponseStatus::ConnectionError,
129-
CKR_PIN_TOO_WEAK => ResponseStatus::PsaErrorInvalidArgument,
130-
CKR_PUBLIC_KEY_INVALID => ResponseStatus::PsaErrorInvalidArgument,
131-
CKR_FUNCTION_REJECTED => ResponseStatus::PsaErrorGenericError,
132-
CKR_VENDOR_DEFINED => ResponseStatus::PsaErrorGenericError,
54+
s @ CKR_CURVE_NOT_SUPPORTED
55+
| s @ CKR_DOMAIN_PARAMS_INVALID
56+
| s @ CKR_FUNCTION_NOT_SUPPORTED => {
57+
error!("Not supported value ({:?})", s);
58+
ResponseStatus::PsaErrorNotSupported
59+
}
13360
e => {
134-
error!(
135-
"Can not encode value {} into on of the possible PKCS#11 return values.",
136-
e
137-
);
138-
ResponseStatus::InvalidEncoding
61+
error!("Error \"{}\" converted to PsaErrorCommunicationFailure.", e);
62+
ResponseStatus::PsaErrorCommunicationFailure
13963
}
14064
}
14165
}

src/providers/tpm_provider/mod.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -363,8 +363,8 @@ impl Provide for TpmProvider {
363363

364364
let len = hash.len();
365365
if len > 64 {
366-
error!("The buffer given to sign is too big. Its length is {} and maximum authorised is 64.", len);
367-
return Err(ResponseStatus::PsaErrorInvalidArgument);
366+
error!("The buffer given to sign is too big. Its length is {} and maximum authorised in the TPM provider is 64.", len);
367+
return Err(ResponseStatus::PsaErrorNotSupported);
368368
}
369369

370370
let (password_context, key_attributes) = get_password_context(&*store_handle, key_triple)?;
@@ -419,8 +419,8 @@ impl Provide for TpmProvider {
419419

420420
let len = hash.len();
421421
if len > 64 {
422-
error!("The buffer given to sign is too big. Its length is {} and maximum authorised is 64.", len);
423-
return Err(ResponseStatus::PsaErrorInvalidArgument);
422+
error!("The buffer given to sign is too big. Its length is {} and maximum authorised is 64 in the TPM provider.", len);
423+
return Err(ResponseStatus::PsaErrorNotSupported);
424424
}
425425

426426
let signature = Signature {

0 commit comments

Comments
 (0)