CK_DATE date_value;
unsigned char array[8];
- /* Check if value can be converted to CK_DATE. */
- if (value_length != sizeof (CK_DATE)) {
+ /* Check if value is empty or can be converted to CK_DATE. */
+ if (value_length != 0 && value_length != sizeof (CK_DATE)) {
p11_buffer_fail (buffer);
return;
}
- memcpy (&date_value, value, value_length);
- memcpy (array, date_value.year, 4);
- memcpy (array + 4, date_value.month, 2);
- memcpy (array + 6, date_value.day, 2);
+ if (value_length == sizeof (CK_DATE)) {
+ memcpy (&date_value, value, value_length);
+ memcpy (array, date_value.year, 4);
+ memcpy (array + 4, date_value.month, 2);
+ memcpy (array + 6, date_value.day, 2);
+ }
- p11_rpc_buffer_add_byte_array (buffer, array, 8);
+ p11_rpc_buffer_add_byte_array (buffer, array, value_length);
}
void
const unsigned char *array;
size_t array_length;
+ /* The encoded date may be empty. */
if (!p11_rpc_buffer_get_byte_array (buffer, offset,
&array, &array_length) ||
- array_length != 8)
+ (array_length != 0 && array_length != sizeof (CK_DATE)))
return false;
- if (value) {
+ if (value && array_length == sizeof (CK_DATE)) {
memcpy (date_value.year, array, 4);
memcpy (date_value.month, array + 4, 2);
memcpy (date_value.day, array + 6, 2);
}
if (value_length)
- *value_length = sizeof (CK_DATE);
+ *value_length = array_length;
return true;
}
p11_buffer_uninit (&buffer);
}
+static void
+test_date_value_empty (void)
+{
+ p11_buffer buffer;
+ CK_DATE val;
+ size_t offset = 0;
+ CK_ULONG val_size;
+ bool ret;
+
+ p11_buffer_init (&buffer, 0);
+
+ p11_rpc_buffer_add_date_value(&buffer, NULL, 0);
+ assert (!p11_buffer_failed (&buffer));
+
+ ret = p11_rpc_buffer_get_date_value(&buffer, &offset, &val, &val_size);
+ assert_num_eq (true, ret);
+
+ assert_num_eq (0, val_size);
+
+ p11_buffer_uninit (&buffer);
+}
+
static void
test_byte_array_value (void)
{
p11_test (test_attribute_array_value, "/rpc/attribute-array-value");
p11_test (test_mechanism_type_array_value, "/rpc/mechanism-type-array-value");
p11_test (test_date_value, "/rpc/date-value");
+ p11_test (test_date_value_empty, "/rpc/date-value-empty");
p11_test (test_byte_array_value, "/rpc/byte-array-value");
p11_test (test_mechanism_value, "/rpc/mechanism-value");
p11_test (test_message_write, "/rpc/message-write");