summaryrefslogtreecommitdiff
path: root/p11-kit/rpc-server.c
diff options
context:
space:
mode:
authorDaiki Ueno <dueno@redhat.com>2017-05-23 11:51:33 +0200
committerDaiki Ueno <ueno@gnu.org>2017-05-24 11:27:28 +0200
commitdfe606d40c33a6213b89b310df0964392fd6d64d (patch)
treef933da2ae2bea4ab894c9376ab2f1e99da434442 /p11-kit/rpc-server.c
parent3b484b87e13e52873ea48f920132ecd96cb79cbc (diff)
rpc: Convert mechanism parameters for portability
This is similar to commit ba49b85e, but for mechanism parameters.
Diffstat (limited to 'p11-kit/rpc-server.c')
-rw-r--r--p11-kit/rpc-server.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/p11-kit/rpc-server.c b/p11-kit/rpc-server.c
index 1eebf1b..47beed0 100644
--- a/p11-kit/rpc-server.c
+++ b/p11-kit/rpc-server.c
@@ -400,9 +400,8 @@ static CK_RV
proto_read_mechanism (p11_rpc_message *msg,
CK_MECHANISM_PTR mech)
{
- const unsigned char *data;
- uint32_t value;
- size_t n_data;
+ size_t offset;
+ CK_MECHANISM temp;
assert (msg != NULL);
assert (mech != NULL);
@@ -411,17 +410,31 @@ proto_read_mechanism (p11_rpc_message *msg,
/* Make sure this is in the right order */
assert (!msg->signature || p11_rpc_message_verify_part (msg, "M"));
- /* The mechanism type */
- if (!p11_rpc_buffer_get_uint32 (msg->input, &msg->parsed, &value))
+ /* Check the length needed to store the parameter */
+ memset (&temp, 0, sizeof (temp));
+ offset = msg->parsed;
+ if (!p11_rpc_buffer_get_mechanism (msg->input, &offset, &temp)) {
+ msg->parsed = offset;
return PARSE_ERROR;
+ }
- /* The mechanism data */
- if (!p11_rpc_buffer_get_byte_array (msg->input, &msg->parsed, &data, &n_data))
+ mech->mechanism = temp.mechanism;
+
+ /* The mechanism doesn't require parameter */
+ if (temp.ulParameterLen == 0) {
+ mech->pParameter = NULL;
+ mech->ulParameterLen = 0;
+ msg->parsed = offset;
+ return CKR_OK;
+ }
+
+ /* Actually retrieve the parameter */
+ mech->pParameter = p11_rpc_message_alloc_extra (msg, temp.ulParameterLen);
+ if (!p11_rpc_buffer_get_mechanism (msg->input, &msg->parsed, mech))
return PARSE_ERROR;
- mech->mechanism = value;
- mech->pParameter = (CK_VOID_PTR)data;
- mech->ulParameterLen = n_data;
+ assert (msg->parsed == offset);
+
return CKR_OK;
}