[Cryptech-Commits] [sw/libhal] 02/05: Clean up RPC code, track changes to XDR API.

git at cryptech.is git at cryptech.is
Tue Feb 27 17:06:40 UTC 2018


This is an automated email from the git hooks/post-receive script.

paul at psgd.org pushed a commit to branch hashsig
in repository sw/libhal.

commit 067e04123c15558e84d77f822e704f664292f740
Author: Paul Selkirk <paul at psgd.org>
AuthorDate: Tue Feb 27 17:54:06 2018 +0100

    Clean up RPC code, track changes to XDR API.
---
 rpc_client.c | 103 ++++++-------
 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;
 }
 



More information about the Commits mailing list