Skip to content

Commit 926c96b

Browse files
committed
Modify error translation coming from providers
Replaces most error translations with PsaErrorCommunicationFailure. The reason for that is that Parsec controls which inputs are given to the Provider library and should not give it data that triggers an error. Defines some genuine errors that it is hard to detect before. Signed-off-by: Hugues de Valon <hugues.devalon@arm.com>
1 parent 863eec1 commit 926c96b

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
@@ -582,7 +582,7 @@ impl Provide for Pkcs11Provider {
582582
&mut *store_handle,
583583
&mut local_ids_handle,
584584
)?;
585-
Err(ResponseStatus::PsaErrorHardwareFailure)
585+
Err(utils::to_response_status(e))
586586
}
587587
}
588588
}

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
@@ -365,8 +365,8 @@ impl Provide for TpmProvider {
365365

366366
let len = hash.len();
367367
if len > 64 {
368-
error!("The buffer given to sign is too big. Its length is {} and maximum authorised is 64.", len);
369-
return Err(ResponseStatus::PsaErrorInvalidArgument);
368+
error!("The buffer given to sign is too big. Its length is {} and maximum authorised in the TPM provider is 64.", len);
369+
return Err(ResponseStatus::PsaErrorNotSupported);
370370
}
371371

372372
let password_context = get_password_context(&*store_handle, key_triple)?;
@@ -405,8 +405,8 @@ impl Provide for TpmProvider {
405405

406406
let len = hash.len();
407407
if len > 64 {
408-
error!("The buffer given to sign is too big. Its length is {} and maximum authorised is 64.", len);
409-
return Err(ResponseStatus::PsaErrorInvalidArgument);
408+
error!("The buffer given to sign is too big. Its length is {} and maximum authorised is 64 in the TPM provider.", len);
409+
return Err(ResponseStatus::PsaErrorNotSupported);
410410
}
411411

412412
let signature = Signature {

0 commit comments

Comments
 (0)