diff options
author | Stef Walter <stef@memberwebs.com> | 2008-12-03 00:20:13 +0000 |
---|---|---|
committer | Stef Walter <stef@memberwebs.com> | 2008-12-03 00:20:13 +0000 |
commit | b00eb56b7ffe5019bb33ad399d351b90f4715132 (patch) | |
tree | 0dbf8ab4425a6eb4f8cbc028556403515e516d68 /ckcapi.c | |
parent | 4b5eb21486d188f57f2bf7a91cd5da225dd3e0d1 (diff) |
Add basic key object support. No support yet for actual crypto ops. Not tested. Wanted to check it in so it doesn't get lost as it represents a lot of work.
Diffstat (limited to 'ckcapi.c')
-rw-r--r-- | ckcapi.c | 79 |
1 files changed, 61 insertions, 18 deletions
@@ -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; } |