diff options
-rw-r--r-- | rpc_client.c | 103 | ||||
-rw-r--r-- | rpc_server.c | 495 |
2 files changed, 231 insertions, 367 deletions
diff --git a/rpc_client.c b/rpc_client.c index e968369..bb63448 100644 --- a/rpc_client.c +++ b/rpc_client.c @@ -4,7 +4,7 @@ * Remote procedure call client-side private API implementation. * * Authors: Rob Austein, Paul Selkirk - * Copyright (c) 2015-2016, NORDUnet A/S All rights reserved. + * Copyright (c) 2015-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 @@ -139,7 +139,7 @@ static hal_error_t get_random(void *buffer, const size_t length) uint8_t outbuf[nargs(3)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(4) + pad(length)]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t rcvlen = length; + size_t rcvlen = length; hal_client_handle_t dummy_client = {0}; hal_error_t rpc_ret; @@ -152,7 +152,7 @@ static hal_error_t get_random(void *buffer, const size_t length) check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); if (rpc_ret == HAL_OK) { - check(hal_xdr_decode_buffer(&iptr, ilimit, buffer, &rcvlen)); + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, buffer, &rcvlen)); // XXX check rcvlen vs length } return rpc_ret; @@ -170,7 +170,7 @@ static hal_error_t set_pin(const hal_client_handle_t client, check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_SET_PIN)); check(hal_xdr_encode_int(&optr, olimit, client.handle)); check(hal_xdr_encode_int(&optr, olimit, user)); - check(hal_xdr_encode_buffer(&optr, olimit, (const uint8_t *)pin, pin_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, (const uint8_t *)pin, pin_len)); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_SET_PIN, inbuf, sizeof(inbuf), &iptr, &ilimit)); @@ -205,7 +205,7 @@ static hal_error_t login(const hal_client_handle_t client, check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_LOGIN)); check(hal_xdr_encode_int(&optr, olimit, client.handle)); check(hal_xdr_encode_int(&optr, olimit, user)); - check(hal_xdr_encode_buffer(&optr, olimit, (const uint8_t *)pin, pin_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, (const uint8_t *)pin, pin_len)); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_LOGIN, inbuf, sizeof(inbuf), &iptr, &ilimit)); @@ -298,7 +298,6 @@ static hal_error_t hash_get_digest_algorithm_id(const hal_digest_algorithm_t alg uint8_t outbuf[nargs(4)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(4) + pad(len_max)]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t len32 = len_max; hal_client_handle_t dummy_client = {0}; hal_error_t rpc_ret; @@ -313,8 +312,8 @@ static hal_error_t hash_get_digest_algorithm_id(const hal_digest_algorithm_t alg check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); if (rpc_ret == HAL_OK) { - check(hal_xdr_decode_buffer(&iptr, ilimit, id, &len32)); - *len = len32; + *len = len_max; + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, id, len)); } return rpc_ret; } @@ -358,7 +357,7 @@ static hal_error_t hash_initialize(const hal_client_handle_t client, check(hal_xdr_encode_int(&optr, olimit, client.handle)); check(hal_xdr_encode_int(&optr, olimit, session.handle)); check(hal_xdr_encode_int(&optr, olimit, alg)); - check(hal_xdr_encode_buffer(&optr, olimit, key, key_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, key, key_len)); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_HASH_INITIALIZE, inbuf, sizeof(inbuf), &iptr, &ilimit)); @@ -382,7 +381,7 @@ static hal_error_t hash_update(const hal_hash_handle_t hash, check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_HASH_UPDATE)); check(hal_xdr_encode_int(&optr, olimit, dummy_client.handle)); check(hal_xdr_encode_int(&optr, olimit, hash.handle)); - check(hal_xdr_encode_buffer(&optr, olimit, data, length)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, data, length)); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_HASH_UPDATE, inbuf, sizeof(inbuf), &iptr, &ilimit)); @@ -397,7 +396,7 @@ static hal_error_t hash_finalize(const hal_hash_handle_t hash, uint8_t outbuf[nargs(4)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(4) + pad(length)]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t digest_len = length; + size_t digest_len = length; hal_client_handle_t dummy_client = {0}; hal_error_t rpc_ret; @@ -411,7 +410,7 @@ static hal_error_t hash_finalize(const hal_hash_handle_t hash, check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); if (rpc_ret == HAL_OK) { - check(hal_xdr_decode_buffer(&iptr, ilimit, digest, &digest_len)); + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, digest, &digest_len)); /* XXX check digest_len vs length */ } return rpc_ret; @@ -427,27 +426,25 @@ static hal_error_t pkey_remote_load(const hal_client_handle_t client, uint8_t outbuf[nargs(5) + pad(der_len)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(5) + pad(sizeof(name->uuid))]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t name_len = sizeof(name->uuid); + size_t name_len = sizeof(name->uuid); hal_error_t rpc_ret; check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_PKEY_LOAD)); check(hal_xdr_encode_int(&optr, olimit, client.handle)); check(hal_xdr_encode_int(&optr, olimit, session.handle)); - check(hal_xdr_encode_buffer(&optr, olimit, der, der_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, der, der_len)); check(hal_xdr_encode_int(&optr, olimit, flags)); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_PKEY_LOAD, inbuf, sizeof(inbuf), &iptr, &ilimit)); check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); - if (rpc_ret == HAL_OK) { check(hal_xdr_decode_int(&iptr, ilimit, &pkey->handle)); - check(hal_xdr_decode_buffer(&iptr, ilimit, name->uuid, &name_len)); + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, name->uuid, &name_len)); if (name_len != sizeof(name->uuid)) return HAL_ERROR_KEY_NAME_TOO_LONG; } - return rpc_ret; } @@ -464,7 +461,7 @@ static hal_error_t pkey_remote_open(const hal_client_handle_t client, check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_PKEY_OPEN)); check(hal_xdr_encode_int(&optr, olimit, client.handle)); check(hal_xdr_encode_int(&optr, olimit, session.handle)); - check(hal_xdr_encode_buffer(&optr, olimit, name->uuid, sizeof(name->uuid))); + check(hal_xdr_encode_variable_opaque(&optr, olimit, name->uuid, sizeof(name->uuid))); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_PKEY_OPEN, inbuf, sizeof(inbuf), &iptr, &ilimit)); @@ -488,14 +485,14 @@ static hal_error_t pkey_remote_generate_rsa(const hal_client_handle_t client, uint8_t outbuf[nargs(6) + pad(exp_len)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(5) + pad(sizeof(name->uuid))]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t name_len = sizeof(name->uuid); + size_t name_len = sizeof(name->uuid); hal_error_t rpc_ret; check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_PKEY_GENERATE_RSA)); check(hal_xdr_encode_int(&optr, olimit, client.handle)); check(hal_xdr_encode_int(&optr, olimit, session.handle)); check(hal_xdr_encode_int(&optr, olimit, key_len)); - check(hal_xdr_encode_buffer(&optr, olimit, exp, exp_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, exp, exp_len)); check(hal_xdr_encode_int(&optr, olimit, flags)); check(hal_rpc_send(outbuf, optr - outbuf)); @@ -505,7 +502,7 @@ static hal_error_t pkey_remote_generate_rsa(const hal_client_handle_t client, if (rpc_ret == HAL_OK) { check(hal_xdr_decode_int(&iptr, ilimit, &pkey->handle)); - check(hal_xdr_decode_buffer(&iptr, ilimit, name->uuid, &name_len)); + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, name->uuid, &name_len)); if (name_len != sizeof(name->uuid)) return HAL_ERROR_KEY_NAME_TOO_LONG; } @@ -523,7 +520,7 @@ static hal_error_t pkey_remote_generate_ec(const hal_client_handle_t client, uint8_t outbuf[nargs(5)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(5) + pad(sizeof(name->uuid))]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t name_len = sizeof(name->uuid); + size_t name_len = sizeof(name->uuid); hal_error_t rpc_ret; check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_PKEY_GENERATE_EC)); @@ -539,7 +536,7 @@ static hal_error_t pkey_remote_generate_ec(const hal_client_handle_t client, if (rpc_ret == HAL_OK) { check(hal_xdr_decode_int(&iptr, ilimit, &pkey->handle)); - check(hal_xdr_decode_buffer(&iptr, ilimit, name->uuid, &name_len)); + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, name->uuid, &name_len)); if (name_len != sizeof(name->uuid)) return HAL_ERROR_KEY_NAME_TOO_LONG; } @@ -677,12 +674,11 @@ static size_t pkey_remote_get_public_key_len(const hal_pkey_handle_t pkey) check(read_matching_packet(RPC_FUNC_PKEY_GET_PUBLIC_KEY_LEN, inbuf, sizeof(inbuf), &iptr, &ilimit)); check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); - if (rpc_ret == HAL_OK) { - check(hal_xdr_decode_int(&iptr, ilimit, &len32)); + if (rpc_ret == HAL_OK && + hal_xdr_decode_int(&iptr, ilimit, &len32) == HAL_OK) return (size_t)len32; - } - else - return 0; + + return 0; } static hal_error_t pkey_remote_get_public_key(const hal_pkey_handle_t pkey, @@ -691,7 +687,6 @@ static hal_error_t pkey_remote_get_public_key(const hal_pkey_handle_t pkey, uint8_t outbuf[nargs(4)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(4) + pad(der_max)]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t dlen32 = der_max; hal_client_handle_t dummy_client = {0}; hal_error_t rpc_ret; @@ -705,8 +700,8 @@ static hal_error_t pkey_remote_get_public_key(const hal_pkey_handle_t pkey, check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); if (rpc_ret == HAL_OK) { - check(hal_xdr_decode_buffer(&iptr, ilimit, der, &dlen32)); - *der_len = (size_t)dlen32; + *der_len = der_max; + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, der, der_len)); } return rpc_ret; } @@ -719,7 +714,6 @@ static hal_error_t pkey_remote_sign(const hal_pkey_handle_t pkey, uint8_t outbuf[nargs(6) + pad(input_len)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(4) + pad(signature_max)]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t slen32 = signature_max; hal_client_handle_t dummy_client = {0}; hal_error_t rpc_ret; @@ -727,7 +721,7 @@ static hal_error_t pkey_remote_sign(const hal_pkey_handle_t pkey, check(hal_xdr_encode_int(&optr, olimit, dummy_client.handle)); check(hal_xdr_encode_int(&optr, olimit, pkey.handle)); check(hal_xdr_encode_int(&optr, olimit, hash.handle)); - check(hal_xdr_encode_buffer(&optr, olimit, input, input_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, input, input_len)); check(hal_xdr_encode_int(&optr, olimit, signature_max)); check(hal_rpc_send(outbuf, optr - outbuf)); @@ -735,8 +729,8 @@ static hal_error_t pkey_remote_sign(const hal_pkey_handle_t pkey, check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); if (rpc_ret == HAL_OK) { - check(hal_xdr_decode_buffer(&iptr, ilimit, signature, &slen32)); - *signature_len = (size_t)slen32; + *signature_len = signature_max; + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, signature, signature_len)); } return rpc_ret; } @@ -756,8 +750,8 @@ static hal_error_t pkey_remote_verify(const hal_pkey_handle_t pkey, check(hal_xdr_encode_int(&optr, olimit, dummy_client.handle)); check(hal_xdr_encode_int(&optr, olimit, pkey.handle)); check(hal_xdr_encode_int(&optr, olimit, hash.handle)); - check(hal_xdr_encode_buffer(&optr, olimit, input, input_len)); - check(hal_xdr_encode_buffer(&optr, olimit, signature, signature_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, input, input_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, signature, signature_len)); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_PKEY_VERIFY, inbuf, sizeof(inbuf), &iptr, &ilimit)); @@ -802,12 +796,12 @@ static hal_error_t pkey_remote_match(const hal_client_handle_t client, if (attributes != NULL) { for (int i = 0; i < attributes_len; i++) { check(hal_xdr_encode_int(&optr, olimit, attributes[i].type)); - check(hal_xdr_encode_buffer(&optr, olimit, attributes[i].value, attributes[i].length)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, attributes[i].value, attributes[i].length)); } } check(hal_xdr_encode_int(&optr, olimit, *state)); check(hal_xdr_encode_int(&optr, olimit, result_max)); - check(hal_xdr_encode_buffer(&optr, olimit, previous_uuid->uuid, sizeof(previous_uuid->uuid))); + check(hal_xdr_encode_variable_opaque(&optr, olimit, previous_uuid->uuid, sizeof(previous_uuid->uuid))); check(hal_rpc_send(outbuf, optr - outbuf)); check(read_matching_packet(RPC_FUNC_PKEY_MATCH, inbuf, sizeof(inbuf), &iptr, &ilimit)); @@ -820,8 +814,8 @@ static hal_error_t pkey_remote_match(const hal_client_handle_t client, *state = ustate; check(hal_xdr_decode_int(&iptr, ilimit, &array_len)); for (int i = 0; i < array_len; ++i) { - uint32_t uuid_len = sizeof(result[i].uuid); - check(hal_xdr_decode_buffer(&iptr, ilimit, result[i].uuid, &uuid_len)); + size_t uuid_len = sizeof(result[i].uuid); + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, result[i].uuid, &uuid_len)); if (uuid_len != sizeof(result[i].uuid)) return HAL_ERROR_KEY_NAME_TOO_LONG; } @@ -853,7 +847,7 @@ static hal_error_t pkey_remote_set_attributes(const hal_pkey_handle_t pkey, if (attributes[i].length == HAL_PKEY_ATTRIBUTE_NIL) check(hal_xdr_encode_int(&optr, olimit, HAL_PKEY_ATTRIBUTE_NIL)); else - check(hal_xdr_encode_buffer(&optr, olimit, attributes[i].value, attributes[i].length)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, attributes[i].value, attributes[i].length)); } check(hal_rpc_send(outbuf, optr - outbuf)); @@ -904,10 +898,10 @@ static hal_error_t pkey_remote_get_attributes(const hal_pkey_handle_t pkey, attributes[i].length = u32; } else { - u32 = attributes_buffer + attributes_buffer_len - abuf; - check(hal_xdr_decode_buffer(&iptr, ilimit, abuf, &u32)); + size_t len = attributes_buffer + attributes_buffer_len - abuf; + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, abuf, &len)); attributes[i].value = abuf; - attributes[i].length = u32; + attributes[i].length = len; abuf += u32; } } @@ -938,13 +932,10 @@ static hal_error_t pkey_remote_export(const hal_pkey_handle_t pkey, check(hal_xdr_decode_int(&iptr, ilimit, &rpc_ret)); if (rpc_ret == HAL_OK) { - uint32_t len; - len = pkcs8_max; - check(hal_xdr_decode_buffer(&iptr, ilimit, pkcs8, &len)); - *pkcs8_len = (size_t) len; - len = kek_max; - check(hal_xdr_decode_buffer(&iptr, ilimit, kek, &len)); - *kek_len = (size_t) len; + *pkcs8_len = pkcs8_max; + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, pkcs8, pkcs8_len)); + *kek_len = kek_max; + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, kek, kek_len)); } return rpc_ret; } @@ -961,15 +952,15 @@ static hal_error_t pkey_remote_import(const hal_client_handle_t client, uint8_t outbuf[nargs(7) + pad(pkcs8_len) + pad(kek_len)], *optr = outbuf, *olimit = outbuf + sizeof(outbuf); uint8_t inbuf[nargs(5) + pad(sizeof(name->uuid))]; const uint8_t *iptr = inbuf, *ilimit = inbuf + sizeof(inbuf); - uint32_t name_len = sizeof(name->uuid); + size_t name_len = sizeof(name->uuid); hal_error_t rpc_ret; check(hal_xdr_encode_int(&optr, olimit, RPC_FUNC_PKEY_IMPORT)); check(hal_xdr_encode_int(&optr, olimit, client.handle)); check(hal_xdr_encode_int(&optr, olimit, session.handle)); check(hal_xdr_encode_int(&optr, olimit, kekek.handle)); - check(hal_xdr_encode_buffer(&optr, olimit, pkcs8, pkcs8_len)); - check(hal_xdr_encode_buffer(&optr, olimit, kek, kek_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, pkcs8, pkcs8_len)); + check(hal_xdr_encode_variable_opaque(&optr, olimit, kek, kek_len)); check(hal_xdr_encode_int(&optr, olimit, flags)); check(hal_rpc_send(outbuf, optr - outbuf)); @@ -979,7 +970,7 @@ static hal_error_t pkey_remote_import(const hal_client_handle_t client, if (rpc_ret == HAL_OK) { check(hal_xdr_decode_int(&iptr, ilimit, &pkey->handle)); - check(hal_xdr_decode_buffer(&iptr, ilimit, name->uuid, &name_len)); + check(hal_xdr_decode_variable_opaque(&iptr, ilimit, name->uuid, &name_len)); if (name_len != sizeof(name->uuid)) return HAL_ERROR_KEY_NAME_TOO_LONG; } 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; } |