diff options
author | Rob Austein <sra@hactrn.net> | 2016-11-21 23:36:36 -0500 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2016-11-21 23:36:36 -0500 |
commit | 15efcdb3e2ebe20c35818447537728c9de2f089f (patch) | |
tree | 3dffa84f8e69254043ad088350e13c6010a16382 /rpc_server.c | |
parent | 834924b3e4d827f6db03d307a88e23bf95dc4624 (diff) |
Whack attribute code with a club until it works with PKCS #11.
PKCS #11 supports zero-length attributes (eg, CKA_LABEL) so hack of
using zero length attribute as NIL value won't work, instead we use a
slightly more portable version of the hack PKCS #11 uses (PKCS #11
stuffs -1 into a CK_ULONG, we stuff 0xFFFFFFFF into a uint32_t).
ks_attribute.c code was trying too hard and tripping over its own
socks. Instead of trying to maintain attributes[] in place during
modification, we now perform the minimum necessary change then re-scan
the block. This is (very slightly) slower but more robust, both
because the scan code has better error checking and because it's the
scan code that we want to be sure is happy before committing a change.
Rename hal_rpc_pkey_attribute_t to hal_pkey_attribute_t.
Diffstat (limited to 'rpc_server.c')
-rw-r--r-- | rpc_server.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/rpc_server.c b/rpc_server.c index f4f2a06..a21679a 100644 --- a/rpc_server.c +++ b/rpc_server.c @@ -657,10 +657,10 @@ static hal_error_t pkey_match(const uint8_t **iptr, const uint8_t * const ilimit check(hal_xdr_decode_int(iptr, ilimit, &flags)); check(hal_xdr_decode_int(iptr, ilimit, &attributes_len)); - hal_rpc_pkey_attribute_t attributes[attributes_len > 0 ? attributes_len : 1]; + hal_pkey_attribute_t attributes[attributes_len > 0 ? attributes_len : 1]; for (int i = 0; i < attributes_len; i++) { - hal_rpc_pkey_attribute_t *a = &attributes[i]; + hal_pkey_attribute_t *a = &attributes[i]; const uint8_t *value; uint32_t value_len; check(hal_xdr_decode_int(iptr, ilimit, &a->type)); @@ -710,16 +710,22 @@ static hal_error_t pkey_set_attributes(const uint8_t **iptr, const uint8_t * con check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle)); check(hal_xdr_decode_int(iptr, ilimit, &attributes_len)); - hal_rpc_pkey_attribute_t attributes[attributes_len > 0 ? attributes_len : 1]; + hal_pkey_attribute_t attributes[attributes_len > 0 ? attributes_len : 1]; for (int i = 0; i < attributes_len; i++) { - hal_rpc_pkey_attribute_t *a = &attributes[i]; - const uint8_t *value; - uint32_t value_len; + hal_pkey_attribute_t *a = &attributes[i]; check(hal_xdr_decode_int(iptr, ilimit, &a->type)); - check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &value, &value_len)); - a->value = value; - a->length = value_len; + const uint8_t *iptr_prior_to_decoding_length = *iptr; + check(hal_xdr_decode_int(iptr, ilimit, &a->length)); + if (a->length == HAL_PKEY_ATTRIBUTE_NIL) { + a->value = NULL; + } + else { + *iptr = iptr_prior_to_decoding_length; + const uint8_t *value; + check(hal_xdr_decode_buffer_in_place(iptr, ilimit, &value, &a->length)); + a->value = value; + } } ret = hal_rpc_pkey_set_attributes(pkey, attributes, attributes_len); @@ -740,7 +746,7 @@ static hal_error_t pkey_get_attributes(const uint8_t **iptr, const uint8_t * con check(hal_xdr_decode_int(iptr, ilimit, &pkey.handle)); check(hal_xdr_decode_int(iptr, ilimit, &attributes_len)); - hal_rpc_pkey_attribute_t attributes[attributes_len > 0 ? attributes_len : 1]; + hal_pkey_attribute_t attributes[attributes_len > 0 ? attributes_len : 1]; for (int i = 0; i < attributes_len; i++) check(hal_xdr_decode_int(iptr, ilimit, &attributes[i].type)); |