summaryrefslogtreecommitdiff
path: root/ckcapi.c
diff options
context:
space:
mode:
Diffstat (limited to 'ckcapi.c')
-rw-r--r--ckcapi.c79
1 files changed, 61 insertions, 18 deletions
diff --git a/ckcapi.c b/ckcapi.c
index 9ea7815..75c133a 100644
--- a/ckcapi.c
+++ b/ckcapi.c
@@ -113,6 +113,7 @@ ckcapi_winerr_to_ckr(DWORD werr)
switch(werr)
{
case ERROR_NOT_ENOUGH_MEMORY:
+ case ERROR_OUTOFMEMORY:
return CKR_HOST_MEMORY;
break;
case NTE_NO_MEMORY:
@@ -124,45 +125,42 @@ ckcapi_winerr_to_ckr(DWORD werr)
case ERROR_INVALID_HANDLE: /* inputs, so if they are bad, the input */
case NTE_BAD_ALGID: /* data is bad */
case NTE_BAD_HASH:
+ case NTE_BAD_TYPE:
+ case NTE_BAD_PUBLIC_KEY:
return CKR_DATA_INVALID;
- break;
case ERROR_BUSY:
case NTE_FAIL:
case NTE_BAD_UID:
return CKR_DEVICE_ERROR;
- break;
default:
return CKR_GENERAL_ERROR;
};
}
-
CK_RV
-ckcapi_return_data(CK_VOID_PTR dst, CK_ULONG_PTR dlen,
- CK_VOID_PTR src, DWORD slen)
+ckcapi_return_data(CK_ATTRIBUTE_PTR attr, CK_VOID_PTR src, DWORD slen)
{
/* Just asking for the length */
- if(!dst)
+ if(!attr->pValue)
{
- *dlen = slen;
+ attr->ulValueLen = slen;
return CKR_OK;
}
/* Buffer is too short */
- if(slen > *dlen)
+ if(slen > attr->ulValueLen)
{
- *dlen = slen;
+ attr->ulValueLen = slen;
return CKR_BUFFER_TOO_SMALL;
}
- *dlen = slen;
- memcpy(dst, src, slen);
+ attr->ulValueLen = slen;
+ memcpy(attr->pValue, src, slen);
return CKR_OK;
}
CK_RV
-ckcapi_return_string(CK_VOID_PTR dst, CK_ULONG_PTR dlen,
- WCHAR* string)
+ckcapi_return_string(CK_ATTRIBUTE_PTR attr, WCHAR* string)
{
DWORD error;
int result;
@@ -175,11 +173,11 @@ ckcapi_return_string(CK_VOID_PTR dst, CK_ULONG_PTR dlen,
* case this part.
*/
if(!string[0])
- return ckcapi_return_data(dst, dlen, "\0", 1);
+ return ckcapi_return_data(attr, "\0", 1);
result = WideCharToMultiByte(CP_UTF8, 0, string, -1,
- dst, dst ? *dlen : 0, NULL, NULL);
-
+ attr->pValue, attr->pValue ? attr->ulValueLen : 0,
+ NULL, NULL);
/* An error result somehow */
if(!result)
@@ -193,7 +191,7 @@ ckcapi_return_string(CK_VOID_PTR dst, CK_ULONG_PTR dlen,
NULL, 0, NULL, NULL);
if(!result)
return CKR_GENERAL_ERROR;
- *dlen = result;
+ attr->ulValueLen = result;
return CKR_BUFFER_TOO_SMALL;
/* A strange zero length success */
@@ -206,7 +204,52 @@ ckcapi_return_string(CK_VOID_PTR dst, CK_ULONG_PTR dlen,
}
}
- *dlen = result;
+ attr->ulValueLen = result;
+ return CKR_OK;
+}
+
+CK_RV
+ckcapi_return_dword_as_bytes(CK_ATTRIBUTE_PTR attr, DWORD value)
+{
+ int i;
+ CK_ULONG count = 0;
+ BOOL first = TRUE;
+ BYTE* at = attr->pValue;
+ CK_RV ret = CKR_OK;
+
+ for(i = 0; i < sizeof(DWORD); i++)
+ {
+ BYTE digit = (BYTE)((value >> (((sizeof(DWORD)-1)*8))) & 0xFF);
+ value = value << 8;
+
+ /* No leading zero */
+ if (first && digit == 0)
+ continue;
+
+ first = FALSE;
+ if(at)
+ {
+ if(count > attr->ulValueLen)
+ ret = CKR_BUFFER_TOO_SMALL;
+ else
+ *(at++) = digit;
+ }
+
+ count++;
+ }
+
+ attr->ulValueLen = count;
+ return ret;
+}
+
+CK_RV
+ckcapi_return_reversed_data(CK_ATTRIBUTE_PTR attr, CK_VOID_PTR data, CK_ULONG length)
+{
+ CK_RV ret = ckcapi_return_data(attr, data, length);
+ if(ret != CKR_OK || !attr->pValue)
+ return ret;
+
+ ckcapi_reverse_memory(attr->pValue, attr->ulValueLen);
return CKR_OK;
}