summaryrefslogtreecommitdiff
path: root/ckcapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi.c')
-rw-r--r--ckcapi.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/ckcapi.c b/ckcapi.c
index 50df4d7..c0e6036 100644
--- a/ckcapi.c
+++ b/ckcapi.c
@@ -290,6 +290,54 @@ ckcapi_return_reversed_data(CK_ATTRIBUTE_PTR attr, CK_VOID_PTR data, CK_ULONG le
return CKR_OK;
}
+static void
+print_zero_decimal(CK_BYTE_PTR buffer, CK_ULONG length, WORD value)
+{
+ int i;
+ for(i = (int)length - 1; i >= 0; --i)
+ {
+ BYTE digit = value % 10;
+ buffer[i] = '0' + digit;
+ value /= 10;
+ }
+}
+
+CK_RV
+ckcapi_return_filetime(CK_ATTRIBUTE_PTR attr, FILETIME *ftime)
+{
+ SYSTEMTIME stime;
+ CK_DATE* date;
+
+ ASSERT(attr);
+ ASSERT(ftime);
+
+ if(!attr->pValue)
+ {
+ attr->ulValueLen = sizeof(CK_DATE);
+ return CKR_OK;
+ }
+
+ if(attr->ulValueLen < sizeof(CK_DATE))
+ {
+ attr->ulValueLen = sizeof(CK_DATE);
+ return CKR_BUFFER_TOO_SMALL;
+ }
+
+ if(!FileTimeToSystemTime(ftime, &stime))
+ {
+ DBG(("An invalid FILETIME was encountered"));
+ return CKR_GENERAL_ERROR;
+ }
+
+ date = (CK_DATE*)attr->pValue;
+ attr->ulValueLen = sizeof(CK_DATE);
+ print_zero_decimal(date->year, sizeof(date->year), stime.wYear);
+ print_zero_decimal(date->month, sizeof(date->month), stime.wMonth);
+ print_zero_decimal(date->day, sizeof(date->day), stime.wDay);
+
+ return CKR_OK;
+}
+
/* ---------------------------------------------------------------- */
static CK_RV