Skip to content

Commit 3e055b7

Browse files
committed
use cached cmapfile
1 parent a8a8823 commit 3e055b7

File tree

2 files changed

+25
-2
lines changed

2 files changed

+25
-2
lines changed

external/canokey-pkcs11

src/data.c

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@
1414

1515
static DWORD GenerateContainerMapFile(CK_SESSION_HANDLE_PTR pSession, PBYTE *ppbData, PDWORD pcbData);
1616

17+
static BOOL cmapCached = FALSE;
18+
static BYTE cmap[1024];
19+
static DWORD cmapSize = 0;
20+
1721
// The CardReadFile function reads the entire file at the specified location into the user-supplied buffer.
1822
DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, __in LPSTR pszDirectoryName, __in LPSTR pszFileName,
1923
__in DWORD dwFlags, __deref_out_bcount_opt(*pcbData) PBYTE *ppbData, __out PDWORD pcbData) {
@@ -89,6 +93,19 @@ DWORD WINAPI CardReadFile(__in PCARD_DATA pCardData, __in LPSTR pszDirectoryName
8993
// Generate the container map file content by enumerating all private keys,
9094
// hashing public key data to produce a GUID, and marking CKA_ID==2 as default.
9195
static DWORD GenerateContainerMapFile(CK_SESSION_HANDLE_PTR pSession, PBYTE *ppbData, PDWORD pcbData) {
96+
CMD_LOG_FUNC(" pSession %p, ppbData %p, pcbData %p", pSession, ppbData, pcbData);
97+
98+
if (cmapCached) {
99+
CMD_DEBUG("cmap is cached");
100+
*ppbData = (PBYTE)g_pfnCspAlloc(cmapSize);
101+
if (!*ppbData)
102+
return SCARD_E_NO_MEMORY;
103+
memcpy(*ppbData, cmap, cmapSize);
104+
*pcbData = cmapSize;
105+
CMD_DEBUG("return cached container map, size: %d", cmapSize);
106+
CMD_RET_OK;
107+
}
108+
92109
const CK_SESSION_HANDLE hSession = *pSession;
93110
const CK_ULONG maxObjects = 64;
94111

@@ -165,7 +182,13 @@ static DWORD GenerateContainerMapFile(CK_SESSION_HANDLE_PTR pSession, PBYTE *ppb
165182
CMD_DEBUG("Container %d: %ls", i, rec->wszGuid);
166183
}
167184
*pcbData = (DWORD)total;
168-
return SCARD_S_SUCCESS;
185+
186+
cmapCached = TRUE;
187+
cmapSize = (DWORD)total;
188+
memcpy(cmap, recs, total);
189+
CMD_DEBUG("Container map generated, size: %d", total);
190+
191+
CMD_RET_OK;
169192
}
170193

171194
/*

0 commit comments

Comments
 (0)