From a975cf2e6ad246ab499ba73259d97b889044731a Mon Sep 17 00:00:00 2001 From: Paul Selkirk Date: Tue, 27 Feb 2018 17:54:06 +0100 Subject: Clean up RPC code, track changes to XDR API. --- rpc_server.c | 495 ++++++++++++++++++++++------------------------------------- 1 file changed, 184 insertions(+), 311 deletions(-) (limited to 'rpc_server.c') diff --git a/rpc_server.c b/rpc_server.c index 4a5fa4c..3a23f4d 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 @@ -49,45 +49,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 +85,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 +100,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 +130,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 +203,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 +264,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 +290,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 +313,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 +342,63 @@ 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_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 +407,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); - - if (ret == HAL_OK) - check(hal_xdr_encode_int(optr, olimit, curve)); + check(hal_rpc_pkey_get_key_curve(pkey, &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 +481,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 +512,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)); - - /* call the local function */ - ret = hal_rpc_pkey_verify(pkey, hash, input, input_len, 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)); - 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 +530,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 +550,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 +569,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 +592,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 +610,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 +627,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 +647,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 +676,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 +686,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 +704,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); + 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_int(optr, olimit, pkey.handle); - - 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 +731,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: @@ -966,16 +839,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; } -- cgit v1.2.3 From a478fe1230efae768c72b8cdb29e2887e4226312 Mon Sep 17 00:00:00 2001 From: Paul Selkirk Date: Tue, 27 Feb 2018 18:04:39 +0100 Subject: Implement hash-based signatures, per draft-mcgrew-hash-sigs-08.txt --- rpc_server.c | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'rpc_server.c') diff --git a/rpc_server.c b/rpc_server.c index 3a23f4d..5a06e37 100644 --- a/rpc_server.c +++ b/rpc_server.c @@ -35,6 +35,7 @@ #include "hal.h" #include "hal_internal.h" #include "xdr_internal.h" +#include "hashsig.h" /* * RPC calls. @@ -359,6 +360,36 @@ static hal_error_t pkey_generate_ec(const uint8_t **iptr, const uint8_t * const 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) { @@ -794,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; -- cgit v1.2.3