aboutsummaryrefslogtreecommitdiff
path: root/rpc_server.c
diff options
context:
space:
mode:
Diffstat (limited to 'rpc_server.c')
-rw-r--r--rpc_server.c529
1 files changed, 218 insertions, 311 deletions
diff --git a/rpc_server.c b/rpc_server.c
index 4a5fa4c..5a06e37 100644
--- a/rpc_server.c
+++ b/rpc_server.c
@@ -3,7 +3,7 @@
* ------------
* Remote procedure call server-side private API implementation.
*
- * Copyright (c) 2016-2017, NORDUnet A/S All rights reserved.
+ * Copyright (c) 2016-2018, NORDUnet A/S All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
@@ -35,6 +35,7 @@
#include "hal.h"
#include "hal_internal.h"
#include "xdr_internal.h"
+#include "hashsig.h"
/*
* RPC calls.
@@ -49,45 +50,34 @@
static hal_error_t get_version(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
uint32_t version;
- hal_error_t ret;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
-
- /* call the local function */
- ret = hal_rpc_get_version(&version);
+ check(hal_rpc_get_version(&version));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, version));
-
- return ret;
+ return hal_xdr_encode_int(optr, olimit, version);
}
static hal_error_t get_random(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
uint32_t length;
- hal_error_t ret;
+ hal_error_t err;
+
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &length));
/* sanity check length */
- if (length == 0 || length > (uint32_t)(olimit - *optr - 4))
+ if (length == 0 || length > (uint32_t)(olimit - *optr - nargs(1)))
return HAL_ERROR_RPC_PACKET_OVERFLOW;
- /* call the local function */
/* get the data directly into the output buffer */
- check(hal_xdr_encode_int(optr, olimit, length));
- ret = hal_rpc_get_random(*optr, (size_t)length);
- if (ret == HAL_OK)
+ if ((err = hal_rpc_get_random(*optr + nargs(1), (size_t)length)) == HAL_OK) {
+ check(hal_xdr_encode_int(optr, olimit, length));
*optr += pad(length);
- else
- /* don't return data if error */
- *optr -= 4;
+ }
- return ret;
+ return err;
}
static hal_error_t set_pin(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -96,17 +86,13 @@ static hal_error_t set_pin(const uint8_t **iptr, const uint8_t * const ilimit,
hal_client_handle_t client;
uint32_t user;
const uint8_t *pin;
- uint32_t pin_len;
- hal_error_t ret;
+ size_t pin_len;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &user));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &pin, &pin_len));
-
- /* call the local function */
- ret = hal_rpc_set_pin(client, user, (const char * const)pin, pin_len);
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &pin, &pin_len));
- return ret;
+ return hal_rpc_set_pin(client, user, (const char * const)pin, pin_len);
}
static hal_error_t login(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -115,45 +101,29 @@ static hal_error_t login(const uint8_t **iptr, const uint8_t * const ilimit,
hal_client_handle_t client;
uint32_t user;
const uint8_t *pin;
- uint32_t pin_len;
- hal_error_t ret;
+ size_t pin_len;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &user));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &pin, &pin_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &pin, &pin_len));
- /* call the local function */
- ret = hal_rpc_login(client, user, (const char * const)pin, pin_len);
-
- return ret;
+ return hal_rpc_login(client, user, (const char * const)pin, pin_len);
}
static hal_error_t logout(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
hal_client_handle_t client;
- hal_error_t ret;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- /* call the local function */
- ret = hal_rpc_logout(client);
-
- return ret;
+ return hal_rpc_logout(client);
}
static hal_error_t logout_all(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
- hal_error_t ret;
-
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
-
- /* call the local function */
- ret = hal_rpc_logout_all();
-
- return ret;
+ return hal_rpc_logout_all();
}
static hal_error_t is_logged_in(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -161,88 +131,69 @@ static hal_error_t is_logged_in(const uint8_t **iptr, const uint8_t * const ilim
{
hal_client_handle_t client;
uint32_t user;
- hal_error_t ret;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &user));
- /* call the local function */
- ret = hal_rpc_is_logged_in(client, user);
-
- return ret;
+ return hal_rpc_is_logged_in(client, user);
}
static hal_error_t hash_get_digest_len(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
uint32_t alg;
size_t length;
- hal_error_t ret;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- check(hal_xdr_decode_int(iptr, ilimit, &alg));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- /* call the local function */
- ret = hal_rpc_hash_get_digest_length(alg, &length);
+ check(hal_xdr_decode_int(iptr, ilimit, &alg));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, length));
+ check(hal_rpc_hash_get_digest_length(alg, &length));
- return ret;
+ return hal_xdr_encode_int(optr, olimit, length);
}
static hal_error_t hash_get_digest_algorithm_id(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
uint32_t alg;
size_t len;
uint32_t len_max;
- uint8_t *optr_orig = *optr;
- hal_error_t ret;
+ hal_error_t err;
+
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &alg));
check(hal_xdr_decode_int(iptr, ilimit, &len_max));
/* sanity check len_max */
- if (len_max > (uint32_t)(olimit - *optr - 4))
+ if (len_max > (uint32_t)(olimit - *optr - nargs(1)))
return HAL_ERROR_RPC_PACKET_OVERFLOW;
- /* call the local function */
/* get the data directly into the output buffer */
- *optr += 4; /* reserve 4 bytes for length */
- ret = hal_rpc_hash_get_digest_algorithm_id(alg, *optr, &len, (size_t)len_max);
- if (ret == HAL_OK) {
- *optr = optr_orig;
+ if ((err = hal_rpc_hash_get_digest_algorithm_id(alg, *optr + nargs(1), &len, (size_t)len_max)) == HAL_OK) {
check(hal_xdr_encode_int(optr, olimit, len));
*optr += pad(len);
}
- else {
- /* don't return data if error */
- *optr = optr_orig;
- }
- return ret;
+
+ return err;
}
static hal_error_t hash_get_algorithm(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_hash_handle_t hash;
hal_digest_algorithm_t alg;
- hal_error_t ret;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- check(hal_xdr_decode_int(iptr, ilimit, &hash.handle));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- /* call the local function */
- ret = hal_rpc_hash_get_algorithm(hash, &alg);
+ check(hal_xdr_decode_int(iptr, ilimit, &hash.handle));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, alg));
+ check(hal_rpc_hash_get_algorithm(hash, &alg));
- return ret;
+ return hal_xdr_encode_int(optr, olimit, alg);
}
static hal_error_t hash_initialize(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -253,67 +204,57 @@ static hal_error_t hash_initialize(const uint8_t **iptr, const uint8_t * const i
hal_hash_handle_t hash;
uint32_t alg;
const uint8_t *key;
- uint32_t key_len;
- hal_error_t ret;
+ size_t key_len;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
check(hal_xdr_decode_int(iptr, ilimit, &alg));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &key, &key_len));
-
- /* call the local function */
- ret = hal_rpc_hash_initialize(client, session, &hash, (hal_digest_algorithm_t)alg, key, (size_t)key_len);
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &key, &key_len));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, hash.handle));
+ check(hal_rpc_hash_initialize(client, session, &hash, (hal_digest_algorithm_t)alg, key, (size_t)key_len));
- return ret;
+ return hal_xdr_encode_int(optr, olimit, hash.handle);
}
static hal_error_t hash_update(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_hash_handle_t hash;
const uint8_t *data;
- uint32_t length;
- hal_error_t ret;
+ size_t length;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- check(hal_xdr_decode_int(iptr, ilimit, &hash.handle));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &data, &length));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- /* call the local function */
- ret = hal_rpc_hash_update(hash, data, (size_t)length);
+ check(hal_xdr_decode_int(iptr, ilimit, &hash.handle));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &data, &length));
- return ret;
+ return hal_rpc_hash_update(hash, data, (size_t)length);
}
static hal_error_t hash_finalize(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_hash_handle_t hash;
uint32_t length;
- hal_error_t ret;
+ hal_error_t err;
+
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &hash.handle));
check(hal_xdr_decode_int(iptr, ilimit, &length));
/* sanity check length */
- if (length == 0 || length > (uint32_t)(olimit - *optr - 4))
+ if (length > (uint32_t)(olimit - *optr - nargs(1)))
return HAL_ERROR_RPC_PACKET_OVERFLOW;
- /* call the local function */
/* get the data directly into the output buffer */
- check(hal_xdr_encode_int(optr, olimit, length));
- ret = hal_rpc_hash_finalize(hash, *optr, (size_t)length);
- if (ret == HAL_OK)
+ if ((err = hal_rpc_hash_finalize(hash, *optr + nargs(1), (size_t)length)) == HAL_OK) {
+ check(hal_xdr_encode_int(optr, olimit, length));
*optr += pad(length);
- else
- /* don't return data if error */
- *optr -= 4;
- return ret;
+ }
+
+ return err;
}
static hal_error_t pkey_load(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -324,28 +265,23 @@ static hal_error_t pkey_load(const uint8_t **iptr, const uint8_t * const ilimit,
hal_pkey_handle_t pkey;
hal_uuid_t name;
const uint8_t *der;
- uint32_t der_len;
+ size_t der_len;
hal_key_flags_t flags;
- hal_error_t ret;
uint8_t *optr_orig = *optr;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &der, &der_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &der, &der_len));
check(hal_xdr_decode_int(iptr, ilimit, &flags));
- ret = hal_rpc_pkey_load(client, session, &pkey, &name, der, der_len, flags);
-
- if (ret == HAL_OK)
- ret = hal_xdr_encode_int(optr, olimit, pkey.handle);
-
- if (ret == HAL_OK)
- ret = hal_xdr_encode_buffer(optr, olimit, name.uuid, sizeof(name.uuid));
+ check(hal_rpc_pkey_load(client, session, &pkey, &name, der, der_len, flags));
- if (ret != HAL_OK)
+ if ((err = hal_xdr_encode_int(optr, olimit, pkey.handle)) != HAL_OK ||
+ (err = hal_xdr_encode_variable_opaque(optr, olimit, name.uuid, sizeof(name.uuid))) != HAL_OK)
*optr = optr_orig;
- return ret;
+ return err;
}
static hal_error_t pkey_open(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -355,23 +291,18 @@ static hal_error_t pkey_open(const uint8_t **iptr, const uint8_t * const ilimit,
hal_session_handle_t session;
hal_pkey_handle_t pkey;
const uint8_t *name_ptr;
- uint32_t name_len;
- hal_error_t ret;
+ size_t name_len;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &name_ptr, &name_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &name_ptr, &name_len));
if (name_len != sizeof(hal_uuid_t))
return HAL_ERROR_KEY_NAME_TOO_LONG;
- /* call the local function */
- ret = hal_rpc_pkey_open(client, session, &pkey, (const hal_uuid_t *) name_ptr);
+ check(hal_rpc_pkey_open(client, session, &pkey, (const hal_uuid_t *) name_ptr));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, pkey.handle));
-
- return ret;
+ return hal_xdr_encode_int(optr, olimit, pkey.handle);
}
static hal_error_t pkey_generate_rsa(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -383,27 +314,24 @@ static hal_error_t pkey_generate_rsa(const uint8_t **iptr, const uint8_t * const
hal_uuid_t name;
uint32_t key_len;
const uint8_t *exp;
- uint32_t exp_len;
+ size_t exp_len;
hal_key_flags_t flags;
- hal_error_t ret;
+ uint8_t *optr_orig = *optr;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
check(hal_xdr_decode_int(iptr, ilimit, &key_len));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &exp, &exp_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &exp, &exp_len));
check(hal_xdr_decode_int(iptr, ilimit, &flags));
- /* call the local function */
- ret = hal_rpc_pkey_generate_rsa(client, session, &pkey, &name, key_len, exp, exp_len, flags);
+ check(hal_rpc_pkey_generate_rsa(client, session, &pkey, &name, key_len, exp, exp_len, flags));
- if (ret == HAL_OK) {
- uint8_t *optr_orig = *optr;
- if ((ret = hal_xdr_encode_int(optr, olimit, pkey.handle)) != HAL_OK ||
- (ret = hal_xdr_encode_buffer(optr, olimit, name.uuid, sizeof(name.uuid))) != HAL_OK)
- *optr = optr_orig;
- }
+ if ((err = hal_xdr_encode_int(optr, olimit, pkey.handle)) != HAL_OK ||
+ (err = hal_xdr_encode_variable_opaque(optr, olimit, name.uuid, sizeof(name.uuid))) != HAL_OK)
+ *optr = optr_orig;
- return ret;
+ return err;
}
static hal_error_t pkey_generate_ec(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -415,76 +343,93 @@ static hal_error_t pkey_generate_ec(const uint8_t **iptr, const uint8_t * const
hal_uuid_t name;
uint32_t curve;
hal_key_flags_t flags;
- hal_error_t ret;
+ uint8_t *optr_orig = *optr;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
check(hal_xdr_decode_int(iptr, ilimit, &curve));
check(hal_xdr_decode_int(iptr, ilimit, &flags));
- /* call the local function */
- ret = hal_rpc_pkey_generate_ec(client, session, &pkey, &name, curve, flags);
+ check(hal_rpc_pkey_generate_ec(client, session, &pkey, &name, curve, flags));
- if (ret == HAL_OK) {
- uint8_t *optr_orig = *optr;
- if ((ret = hal_xdr_encode_int(optr, olimit, pkey.handle)) != HAL_OK ||
- (ret = hal_xdr_encode_buffer(optr, olimit, name.uuid, sizeof(name.uuid))) != HAL_OK)
- *optr = optr_orig;
- }
+ if ((err = hal_xdr_encode_int(optr, olimit, pkey.handle)) != HAL_OK ||
+ (err = hal_xdr_encode_variable_opaque(optr, olimit, name.uuid, sizeof(name.uuid))) != HAL_OK)
+ *optr = optr_orig;
- return ret;
+ return err;
+}
+
+static hal_error_t pkey_generate_hashsig(const uint8_t **iptr, const uint8_t * const ilimit,
+ uint8_t **optr, const uint8_t * const olimit)
+{
+ hal_client_handle_t client;
+ hal_session_handle_t session;
+ hal_pkey_handle_t pkey;
+ hal_uuid_t name;
+ uint32_t hss_levels;
+ uint32_t lms_type;
+ uint32_t lmots_type;
+ hal_key_flags_t flags;
+ uint8_t *optr_orig = *optr;
+ hal_error_t err;
+
+ check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
+ check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
+ check(hal_xdr_decode_int(iptr, ilimit, &hss_levels));
+ check(hal_xdr_decode_int(iptr, ilimit, &lms_type));
+ check(hal_xdr_decode_int(iptr, ilimit, &lmots_type));
+ check(hal_xdr_decode_int(iptr, ilimit, &flags));
+
+ check(hal_rpc_pkey_generate_hashsig(client, session, &pkey, &name, hss_levels, lms_type, lmots_type, flags));
+
+ if ((err = hal_xdr_encode_int(optr, olimit, pkey.handle)) != HAL_OK ||
+ (err = hal_xdr_encode_variable_opaque(optr, olimit, name.uuid, sizeof(name.uuid))) != HAL_OK)
+ *optr = optr_orig;
+
+ return err;
}
static hal_error_t pkey_close(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_pkey_handle_t pkey;
- hal_error_t ret;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- /* call the local function */
- ret = hal_rpc_pkey_close(pkey);
+ check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
- return ret;
+ return hal_rpc_pkey_close(pkey);
}
static hal_error_t pkey_delete(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_pkey_handle_t pkey;
- hal_error_t ret;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- /* call the local function */
- ret = hal_rpc_pkey_delete(pkey);
+ check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
- return ret;
+ return hal_rpc_pkey_delete(pkey);
}
static hal_error_t pkey_get_key_type(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_pkey_handle_t pkey;
hal_key_type_t type;
- hal_error_t ret;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- /* call the local function */
- ret = hal_rpc_pkey_get_key_type(pkey, &type);
+ check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, type));
+ check(hal_rpc_pkey_get_key_type(pkey, &type));
- return ret;
+ return hal_xdr_encode_int(optr, olimit, type);
}
static hal_error_t pkey_get_key_curve(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -493,89 +438,71 @@ static hal_error_t pkey_get_key_curve(const uint8_t **iptr, const uint8_t * cons
hal_client_handle_t client;
hal_pkey_handle_t pkey;
hal_curve_name_t curve;
- hal_error_t ret;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
- /* call the local function */
- ret = hal_rpc_pkey_get_key_curve(pkey, &curve);
+ check(hal_rpc_pkey_get_key_curve(pkey, &curve));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, curve));
-
- return ret;
+ return hal_xdr_encode_int(optr, olimit, curve);
}
static hal_error_t pkey_get_key_flags(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_pkey_handle_t pkey;
hal_key_flags_t flags;
- hal_error_t ret;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
- check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- /* call the local function */
- ret = hal_rpc_pkey_get_key_flags(pkey, &flags);
+ check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
- if (ret == HAL_OK)
- check(hal_xdr_encode_int(optr, olimit, flags));
+ check(hal_rpc_pkey_get_key_flags(pkey, &flags));
- return ret;
+ return hal_xdr_encode_int(optr, olimit, flags);
}
static hal_error_t pkey_get_public_key_len(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_pkey_handle_t pkey;
size_t len;
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
+ /* skip over unused client argument */
+ *iptr += nargs(1);
+
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
- /* call the local function */
len = hal_rpc_pkey_get_public_key_len(pkey);
- check(hal_xdr_encode_int(optr, olimit, len));
-
- return HAL_OK;
+ return hal_xdr_encode_int(optr, olimit, len);
}
static hal_error_t pkey_get_public_key(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit)
{
- hal_client_handle_t client __attribute__((unused));
hal_pkey_handle_t pkey;
size_t len;
uint32_t len_max;
- uint8_t *optr_orig = *optr;
- hal_error_t ret;
+ hal_error_t err;
+
+ /* skip over unused client argument */
+ *iptr += nargs(1);
- check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
check(hal_xdr_decode_int(iptr, ilimit, &len_max));
/* sanity check len_max */
- if (len_max > (uint32_t)(olimit - *optr - 4))
+ if (len_max > (uint32_t)(olimit - *optr - nargs(1)))
return HAL_ERROR_RPC_PACKET_OVERFLOW;
- /* call the local function */
/* get the data directly into the output buffer */
- *optr += 4; /* reserve 4 bytes for length */
- ret = hal_rpc_pkey_get_public_key(pkey, *optr, &len, len_max);
- if (ret == HAL_OK) {
- *optr = optr_orig;
+ if ((err = hal_rpc_pkey_get_public_key(pkey, *optr + nargs(1), &len, len_max)) == HAL_OK) {
check(hal_xdr_encode_int(optr, olimit, len));
*optr += pad(len);
}
- else {
- /* don't return data if error */
- *optr = optr_orig;
- }
- return ret;
+
+ return err;
}
static hal_error_t pkey_sign(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -585,31 +512,28 @@ static hal_error_t pkey_sign(const uint8_t **iptr, const uint8_t * const ilimit,
hal_pkey_handle_t pkey;
hal_hash_handle_t hash;
const uint8_t *input;
- uint32_t input_len;
+ size_t input_len;
uint32_t sig_max;
size_t sig_len;
- uint8_t *optr_orig = *optr;
- hal_error_t ret;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
check(hal_xdr_decode_int(iptr, ilimit, &hash.handle));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &input, &input_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &input, &input_len));
check(hal_xdr_decode_int(iptr, ilimit, &sig_max));
/* sanity check sig_max */
- if (sig_max > (uint32_t)(olimit - *optr - 4))
+ if (sig_max > (uint32_t)(olimit - *optr - nargs(1)))
return HAL_ERROR_RPC_PACKET_OVERFLOW;
- /* call the local function */
/* get the data directly into the output buffer */
- *optr += 4; /* reserve 4 bytes for length */
- ret = hal_rpc_pkey_sign(pkey, hash, input, input_len, *optr, &sig_len, sig_max);
- *optr = optr_orig;
- if (ret == HAL_OK) {
+ err = hal_rpc_pkey_sign(pkey, hash, input, input_len, *optr + nargs(1), &sig_len, sig_max);
+ if (err == HAL_OK) {
check(hal_xdr_encode_int(optr, olimit, sig_len));
*optr += pad(sig_len);
}
- return ret;
+
+ return err;
}
static hal_error_t pkey_verify(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -619,21 +543,17 @@ static hal_error_t pkey_verify(const uint8_t **iptr, const uint8_t * const ilimi
hal_pkey_handle_t pkey;
hal_hash_handle_t hash;
const uint8_t *input;
- uint32_t input_len;
+ size_t input_len;
const uint8_t *sig;
- uint32_t sig_len;
- hal_error_t ret;
+ size_t sig_len;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
check(hal_xdr_decode_int(iptr, ilimit, &hash.handle));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &input, &input_len));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &sig, &sig_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &input, &input_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &sig, &sig_len));
- /* call the local function */
- ret = hal_rpc_pkey_verify(pkey, hash, input, input_len, sig, sig_len);
-
- return ret;
+ return hal_rpc_pkey_verify(pkey, hash, input, input_len, sig, sig_len);
}
static hal_error_t pkey_match(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -641,11 +561,12 @@ static hal_error_t pkey_match(const uint8_t **iptr, const uint8_t * const ilimit
{
hal_client_handle_t client;
hal_session_handle_t session;
- uint32_t type, curve, attributes_len, state, result_max, previous_uuid_len;
+ uint32_t type, curve, attributes_len, state, result_max;
+ size_t previous_uuid_len;
const uint8_t *previous_uuid_ptr;
hal_key_flags_t mask, flags;
uint8_t *optr_orig = *optr;
- hal_error_t ret;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
@@ -660,16 +581,16 @@ static hal_error_t pkey_match(const uint8_t **iptr, const uint8_t * const ilimit
for (size_t i = 0; i < attributes_len; i++) {
hal_pkey_attribute_t *a = &attributes[i];
const uint8_t *value;
- uint32_t value_len;
+ size_t value_len;
check(hal_xdr_decode_int(iptr, ilimit, &a->type));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &value, &value_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &value, &value_len));
a->value = value;
a->length = value_len;
}
check(hal_xdr_decode_int(iptr, ilimit, &state));
check(hal_xdr_decode_int(iptr, ilimit, &result_max));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &previous_uuid_ptr, &previous_uuid_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &previous_uuid_ptr, &previous_uuid_len));
if (previous_uuid_len != sizeof(hal_uuid_t))
return HAL_ERROR_KEY_NAME_TOO_LONG;
@@ -679,24 +600,21 @@ static hal_error_t pkey_match(const uint8_t **iptr, const uint8_t * const ilimit
hal_uuid_t result[result_max];
unsigned result_len, ustate = state;
- ret = hal_rpc_pkey_match(client, session, type, curve, mask, flags,
- attributes, attributes_len,
- &ustate, result, &result_len, result_max,
- previous_uuid);
+ check(hal_rpc_pkey_match(client, session, type, curve, mask, flags,
+ attributes, attributes_len, &ustate, result,
+ &result_len, result_max, previous_uuid));
- if (ret == HAL_OK)
- ret = hal_xdr_encode_int(optr, olimit, ustate);
+ if ((err = hal_xdr_encode_int(optr, olimit, ustate)) == HAL_OK)
+ err = hal_xdr_encode_int(optr, olimit, result_len);
- if (ret == HAL_OK)
- ret = hal_xdr_encode_int(optr, olimit, result_len);
+ for (size_t i = 0; err == HAL_OK && i < result_len; ++i)
+ err = hal_xdr_encode_variable_opaque(optr, olimit, result[i].uuid,
+ sizeof(result[i].uuid));
- for (size_t i = 0; ret == HAL_OK && i < result_len; ++i)
- ret = hal_xdr_encode_buffer(optr, olimit, result[i].uuid,
- sizeof(result[i].uuid));
- if (ret != HAL_OK)
+ if (err != HAL_OK)
*optr = optr_orig;
- return ret;
+ return err;
}
static hal_error_t pkey_set_attributes(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -705,7 +623,6 @@ static hal_error_t pkey_set_attributes(const uint8_t **iptr, const uint8_t * con
hal_client_handle_t client;
hal_pkey_handle_t pkey;
uint32_t attributes_len;
- hal_error_t ret;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
@@ -724,14 +641,14 @@ static hal_error_t pkey_set_attributes(const uint8_t **iptr, const uint8_t * con
else {
*iptr = iptr_prior_to_decoding_length;
const uint8_t *value;
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &value, &a->length));
+ size_t len;
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &value, &len));
a->value = value;
+ a->length = len;
}
}
- ret = hal_rpc_pkey_set_attributes(pkey, attributes, attributes_len);
-
- return ret;
+ return hal_rpc_pkey_set_attributes(pkey, attributes, attributes_len);
}
static hal_error_t pkey_get_attributes(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -741,7 +658,7 @@ static hal_error_t pkey_get_attributes(const uint8_t **iptr, const uint8_t * con
hal_pkey_handle_t pkey;
uint32_t attributes_len, u32;
uint8_t *optr_orig = *optr;
- hal_error_t ret;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
@@ -761,26 +678,24 @@ static hal_error_t pkey_get_attributes(const uint8_t **iptr, const uint8_t * con
uint8_t attributes_buffer[attributes_buffer_len > 0 ? attributes_buffer_len : 1];
- ret = hal_rpc_pkey_get_attributes(pkey, attributes, attributes_len,
- attributes_buffer, attributes_buffer_len);
-
- if (ret == HAL_OK) {
- ret = hal_xdr_encode_int(optr, olimit, attributes_len);
- for (size_t i = 0; ret == HAL_OK && i < attributes_len; i++) {
- ret = hal_xdr_encode_int(optr, olimit, attributes[i].type);
- if (ret != HAL_OK)
- break;
- if (attributes_buffer_len == 0)
- ret = hal_xdr_encode_int(optr, olimit, attributes[i].length);
- else
- ret = hal_xdr_encode_buffer(optr, olimit, attributes[i].value, attributes[i].length);
+ check(hal_rpc_pkey_get_attributes(pkey, attributes, attributes_len,
+ attributes_buffer, attributes_buffer_len));
+
+ if ((err = hal_xdr_encode_int(optr, olimit, attributes_len)) == HAL_OK) {
+ for (size_t i = 0; err == HAL_OK && i < attributes_len; i++) {
+ if ((err = hal_xdr_encode_int(optr, olimit, attributes[i].type)) == HAL_OK) {
+ if (attributes_buffer_len == 0)
+ err = hal_xdr_encode_int(optr, olimit, attributes[i].length);
+ else
+ err = hal_xdr_encode_variable_opaque(optr, olimit, attributes[i].value, attributes[i].length);
+ }
}
}
- if (ret != HAL_OK)
+ if (err != HAL_OK)
*optr = optr_orig;
- return ret;
+ return err;
}
static hal_error_t pkey_export(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -792,7 +707,7 @@ static hal_error_t pkey_export(const uint8_t **iptr, const uint8_t * const ilimi
size_t pkcs8_len, kek_len;
uint32_t pkcs8_max, kek_max;
uint8_t *optr_orig = *optr;
- hal_error_t ret;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle));
@@ -802,18 +717,13 @@ static hal_error_t pkey_export(const uint8_t **iptr, const uint8_t * const ilimi
uint8_t pkcs8[pkcs8_max], kek[kek_max];
- ret = hal_rpc_pkey_export(pkey, kekek, pkcs8, &pkcs8_len, sizeof(pkcs8), kek, &kek_len, sizeof(kek));
+ check(hal_rpc_pkey_export(pkey, kekek, pkcs8, &pkcs8_len, sizeof(pkcs8), kek, &kek_len, sizeof(kek)));
- if (ret == HAL_OK)
- ret = hal_xdr_encode_buffer(optr, olimit, pkcs8, pkcs8_len);
-
- if (ret == HAL_OK)
- ret = hal_xdr_encode_buffer(optr, olimit, kek, kek_len);
-
- if (ret != HAL_OK)
+ if ((err = hal_xdr_encode_variable_opaque(optr, olimit, pkcs8, pkcs8_len)) != HAL_OK ||
+ (err = hal_xdr_encode_variable_opaque(optr, olimit, kek, kek_len)) != HAL_OK)
*optr = optr_orig;
- return ret;
+ return err;
}
static hal_error_t pkey_import(const uint8_t **iptr, const uint8_t * const ilimit,
@@ -825,30 +735,25 @@ static hal_error_t pkey_import(const uint8_t **iptr, const uint8_t * const ilimi
hal_pkey_handle_t kekek;
hal_uuid_t name;
const uint8_t *pkcs8, *kek;
- uint32_t pkcs8_len, kek_len;
+ size_t pkcs8_len, kek_len;
uint8_t *optr_orig = *optr;
hal_key_flags_t flags;
- hal_error_t ret;
+ hal_error_t err;
check(hal_xdr_decode_int(iptr, ilimit, &client.handle));
check(hal_xdr_decode_int(iptr, ilimit, &session.handle));
check(hal_xdr_decode_int(iptr, ilimit, &kekek.handle));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &pkcs8, &pkcs8_len));
- check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &kek, &kek_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &pkcs8, &pkcs8_len));
+ check(hal_xdr_decode_variable_opaque_ptr(iptr, ilimit, &kek, &kek_len));
check(hal_xdr_decode_int(iptr, ilimit, &flags));
- ret = hal_rpc_pkey_import(client, session, &pkey, &name, kekek, pkcs8, pkcs8_len, kek, kek_len, flags);
-
- if (ret == HAL_OK)
- ret = hal_xdr_encode_int(optr, olimit, pkey.handle);
+ check(hal_rpc_pkey_import(client, session, &pkey, &name, kekek, pkcs8, pkcs8_len, kek, kek_len, flags));
- if (ret == HAL_OK)
- ret = hal_xdr_encode_buffer(optr, olimit, name.uuid, sizeof(name.uuid));
-
- if (ret != HAL_OK)
+ if ((err = hal_xdr_encode_int(optr, olimit, pkey.handle)) != HAL_OK ||
+ (err = hal_xdr_encode_variable_opaque(optr, olimit, name.uuid, sizeof(name.uuid))) != HAL_OK)
*optr = optr_orig;
- return ret;
+ return err;
}
@@ -857,17 +762,16 @@ hal_error_t hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ile
{
const uint8_t * iptr = ibuf;
const uint8_t * const ilimit = ibuf + ilen;
- uint8_t * optr = obuf + 12; /* reserve space for opcode, client, and response code */
+ uint8_t * optr = obuf + nargs(3); /* reserve space for opcode, client, and response code */
const uint8_t * const olimit = obuf + *olen;
uint32_t rpc_func_num;
uint32_t client_handle;
- hal_error_t ret;
+ hal_error_t err;
hal_error_t (*handler)(const uint8_t **iptr, const uint8_t * const ilimit,
uint8_t **optr, const uint8_t * const olimit) = NULL;
check(hal_xdr_decode_int(&iptr, ilimit, &rpc_func_num));
- check(hal_xdr_decode_int(&iptr, ilimit, &client_handle));
- check(hal_xdr_undecode_int(&iptr));
+ check(hal_xdr_decode_int_peek(&iptr, ilimit, &client_handle));
switch (rpc_func_num) {
case RPC_FUNC_GET_VERSION:
@@ -921,6 +825,9 @@ hal_error_t hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ile
case RPC_FUNC_PKEY_GENERATE_EC:
handler = pkey_generate_ec;
break;
+ case RPC_FUNC_PKEY_GENERATE_HASHSIG:
+ handler = pkey_generate_hashsig;
+ break;
case RPC_FUNC_PKEY_CLOSE:
handler = pkey_close;
break;
@@ -966,16 +873,16 @@ hal_error_t hal_rpc_server_dispatch(const uint8_t * const ibuf, const size_t ile
}
if (handler)
- ret = handler(&iptr, ilimit, &optr, olimit);
+ err = handler(&iptr, ilimit, &optr, olimit);
else
- ret = HAL_ERROR_RPC_BAD_FUNCTION;
+ err = HAL_ERROR_RPC_BAD_FUNCTION;
/* Encode opcode, client ID, and response code at the beginning of the payload */
*olen = optr - obuf;
optr = obuf;
check(hal_xdr_encode_int(&optr, olimit, rpc_func_num));
check(hal_xdr_encode_int(&optr, olimit, client_handle));
- check(hal_xdr_encode_int(&optr, olimit, ret));
+ check(hal_xdr_encode_int(&optr, olimit, err));
return HAL_OK;
}