• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright 2014-2022 The GmSSL Project. All Rights Reserved.
3  *
4  *  Licensed under the Apache License, Version 2.0 (the License); you may
5  *  not use this file except in compliance with the License.
6  *
7  *  http://www.apache.org/licenses/LICENSE-2.0
8  */
9 
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <string.h>
14 #include "skf_int.h"
15 
16 
17 
18 SKF_METHOD *skf_method = NULL;
19 SKF_VENDOR *skf_vendor = NULL;
20 extern SKF_VENDOR skf_wisec;
21 
22 
23 #define SKFerr(f,e)
24 
25 
SKF_LoadLibrary(LPSTR so_path,LPSTR vendor)26 ULONG SKF_LoadLibrary(LPSTR so_path, LPSTR vendor)
27 {
28 	if (skf_method) {
29 		SKF_METHOD_free(skf_method);
30 		skf_method = NULL;
31 	}
32 
33 	if (!(skf_method = SKF_METHOD_load_library((char *)so_path))) {
34 		SKFerr(SKF_F_SKF_LOADLIBRARY, SKF_R_LOAD_LIBRARY_FAILURE);
35 		return SAR_FAIL;
36 	}
37 
38 	if (vendor) {
39 		if (strcmp((char *)vendor, skf_wisec.name) == 0) {
40 			skf_vendor = &skf_wisec;
41 		} else {
42 			SKFerr(SKF_F_SKF_LOADLIBRARY, SKF_R_UNKNOWN_VENDOR);
43 			return SAR_FAIL;
44 		}
45 	}
46 
47 	return SAR_OK;
48 }
49 
SKF_UnloadLibrary(void)50 ULONG SKF_UnloadLibrary(void)
51 {
52 	SKF_METHOD_free(skf_method);
53 	skf_method = NULL;
54 	skf_vendor = NULL;
55 	return SAR_OK;
56 }
57 
58 /*
59 static SKF_ERR_REASON skf_errors[] = {
60 	{ SAR_OK,			SKF_R_SUCCESS },
61 	{ SAR_FAIL,			SKF_R_FAILURE },
62 	{ SAR_UNKNOWNERR,		SKF_R_UNKNOWN_ERROR },
63 	{ SAR_NOTSUPPORTYETERR,		SKF_R_OPERATION_NOT_SUPPORTED },
64 	{ SAR_FILEERR,			SKF_R_FILE_ERROR },
65 	{ SAR_INVALIDHANDLEERR,		SKF_R_INVALID_HANDLE },
66 	{ SAR_INVALIDPARAMERR,		SKF_R_INVALID_PARAMETER },
67 	{ SAR_READFILEERR,		SKF_R_READ_FILE_FAILURE },
68 	{ SAR_WRITEFILEERR,		SKF_R_WRITE_FILE_FAILURE },
69 	{ SAR_NAMELENERR,		SKF_R_INVALID_NAME_LENGTH },
70 	{ SAR_KEYUSAGEERR,		SKF_R_INVALID_KEY_USAGE },
71 	{ SAR_MODULUSLENERR,		SKF_R_INVALID_MODULUS_LENGTH },
72 	{ SAR_NOTINITIALIZEERR,		SKF_R_NOT_INITIALIZED },
73 	{ SAR_OBJERR,			SKF_R_INVALID_OBJECT },
74 	{ SAR_MEMORYERR,		SKF_R_MEMORY_ERROR },
75 	{ SAR_TIMEOUTERR,		SKF_R_TIMEOUT },
76 	{ SAR_INDATALENERR,		SKF_R_INVALID_INPUT_LENGTH },
77 	{ SAR_INDATAERR,		SKF_R_INVALID_INPUT_VALUE },
78 	{ SAR_GENRANDERR,		SKF_R_RANDOM_GENERATION_FAILED },
79 	{ SAR_HASHOBJERR,		SKF_R_INVALID_DIGEST_HANDLE },
80 	{ SAR_HASHERR,			SKF_R_DIGEST_ERROR },
81 	{ SAR_GENRSAKEYERR,		SKF_R_RSA_KEY_GENERATION_FAILURE },
82 	{ SAR_RSAMODULUSLENERR,		SKF_R_INVALID_RSA_MODULUS_LENGTH },
83 	{ SAR_CSPIMPRTPUBKEYERR,	SKF_R_CSP_IMPORT_PUBLIC_KEY_ERROR },
84 	{ SAR_RSAENCERR,		SKF_R_RSA_ENCRYPTION_FAILURE },
85 	{ SAR_RSADECERR,		SKF_R_RSA_DECRYPTION_FAILURE },
86 	{ SAR_HASHNOTEQUALERR,		SKF_R_HASH_NOT_EQUAL },
87 	{ SAR_KEYNOTFOUNTERR,		SKF_R_KEY_NOT_FOUND },
88 	{ SAR_CERTNOTFOUNTERR,		SKF_R_CERTIFICATE_NOT_FOUND },
89 	{ SAR_NOTEXPORTERR,		SKF_R_EXPORT_FAILED },
90 	{ SAR_DECRYPTPADERR,		SKF_R_DECRYPT_INVALID_PADDING },
91 	{ SAR_MACLENERR,		SKF_R_INVALID_MAC_LENGTH },
92 	{ SAR_BUFFER_TOO_SMALL,		SKF_R_BUFFER_TOO_SMALL },
93 	{ SAR_KEYINFOTYPEERR,		SKF_R_INVALID_KEY_INFO_TYPE },
94 	{ SAR_NOT_EVENTERR,		SKF_R_NO_EVENT },
95 	{ SAR_DEVICE_REMOVED,		SKF_R_DEVICE_REMOVED },
96 	{ SAR_PIN_INCORRECT,		SKF_R_PIN_INCORRECT },
97 	{ SAR_PIN_LOCKED,		SKF_R_PIN_LOCKED },
98 	{ SAR_PIN_INVALID,		SKF_R_INVALID_PIN },
99 	{ SAR_PIN_LEN_RANGE,		SKF_R_INVALID_PIN_LENGTH },
100 	{ SAR_USER_ALREADY_LOGGED_IN,	SKF_R_USER_ALREADY_LOGGED_IN },
101 	{ SAR_USER_PIN_NOT_INITIALIZED,	SKF_R_USER_PIN_NOT_INITIALIZED },
102 	{ SAR_USER_TYPE_INVALID,	SKF_R_INVALID_USER_TYPE },
103 	{ SAR_APPLICATION_NAME_INVALID, SKF_R_INVALID_APPLICATION_NAME },
104 	{ SAR_APPLICATION_EXISTS,	SKF_R_APPLICATION_ALREADY_EXIST },
105 	{ SAR_USER_NOT_LOGGED_IN,	SKF_R_USER_NOT_LOGGED_IN },
106 	{ SAR_APPLICATION_NOT_EXISTS,	SKF_R_APPLICATION_NOT_EXIST },
107 	{ SAR_FILE_ALREADY_EXIST,	SKF_R_FILE_ALREADY_EXIST },
108 	{ SAR_NO_ROOM,			SKF_R_NO_SPACE },
109 	{ SAR_FILE_NOT_EXIST,		SKF_R_FILE_NOT_EXIST },
110 };
111 */
112 
skf_get_error_reason(ULONG ulError)113 static unsigned long skf_get_error_reason(ULONG ulError)
114 {
115 /*
116 	int i;
117 	for (i = 0; i < OSSL_NELEM(skf_errors); i++) {
118 		if (ulError == skf_errors[i].err) {
119 			return skf_errors[i].reason;
120 		}
121 	}
122 	if (skf_vendor) {
123 		return skf_vendor->get_error_reason(ulError);
124 	}
125 */
126 	return 0;
127 }
128 
SKF_GetErrorString(ULONG ulError,LPSTR * szErrorStr)129 ULONG SKF_GetErrorString(ULONG ulError, LPSTR *szErrorStr)
130 {
131 	unsigned long reason;
132 
133 	if ((reason = skf_get_error_reason(ulError)) != 0) {
134 		//*szErrorStr = (LPSTR)ERR_reason_error_string(reason);
135 	} else {
136 		*szErrorStr = (LPSTR)"(unknown)";
137 	}
138 
139 	return SAR_OK;
140 }
141 
SKF_WaitForDevEvent(LPSTR szDevName,ULONG * pulDevNameLen,ULONG * pulEvent)142 ULONG DEVAPI SKF_WaitForDevEvent(
143 	LPSTR szDevName,
144 	ULONG *pulDevNameLen,
145 	ULONG *pulEvent)
146 {
147 	ULONG rv;
148 
149 	if (!skf_method) {
150 		SKFerr(SKF_F_SKF_WAITFORDEVEVENT,
151 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
152 		return SAR_NOTINITIALIZEERR;
153 	}
154 
155 	if (!skf_method->WaitForDevEvent) {
156 		SKFerr(SKF_F_SKF_WAITFORDEVEVENT,
157 			SKF_R_FUNCTION_NOT_SUPPORTED);
158 		return SAR_NOTSUPPORTYETERR;
159 	}
160 
161 	if ((rv = skf_method->WaitForDevEvent(
162 		szDevName,
163 		pulDevNameLen,
164 		pulEvent)) != SAR_OK) {
165 		SKFerr(SKF_F_SKF_WAITFORDEVEVENT, skf_get_error_reason(rv));
166 		return rv;
167 	}
168 
169 	return SAR_OK;
170 }
171 
SKF_CancelWaitForDevEvent(void)172 ULONG DEVAPI SKF_CancelWaitForDevEvent(
173 	void)
174 {
175 	ULONG rv;
176 
177 	if (!skf_method) {
178 		SKFerr(SKF_F_SKF_CANCELWAITFORDEVEVENT,
179 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
180 		return SAR_NOTINITIALIZEERR;
181 	}
182 
183 	if (!skf_method->CancelWaitForDevEvent) {
184 		SKFerr(SKF_F_SKF_CANCELWAITFORDEVEVENT,
185 			SKF_R_FUNCTION_NOT_SUPPORTED);
186 		return SAR_NOTSUPPORTYETERR;
187 	}
188 
189 	if (skf_method->CancelWaitForDevEvent) {
190 		return skf_method->CancelWaitForDevEvent();
191 	}
192 
193 	if ((rv = skf_method->CancelWaitForDevEvent()) != SAR_OK) {
194 		SKFerr(SKF_F_SKF_CANCELWAITFORDEVEVENT, skf_get_error_reason(rv));
195 		return rv;
196 	}
197 
198 	return SAR_OK;
199 }
200 
SKF_EnumDev(BOOL bPresent,LPSTR szNameList,ULONG * pulSize)201 ULONG DEVAPI SKF_EnumDev(
202 	BOOL bPresent,
203 	LPSTR szNameList,
204 	ULONG *pulSize)
205 {
206 	ULONG rv;
207 
208 
209 	// check output of all enum functions !!!!
210 
211 	if (!skf_method) {
212 		SKFerr(SKF_F_SKF_ENUMDEV,
213 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
214 		return SAR_NOTINITIALIZEERR;
215 	}
216 
217 	if (!skf_method->EnumDev) {
218 		SKFerr(SKF_F_SKF_ENUMDEV,
219 			SKF_R_FUNCTION_NOT_SUPPORTED);
220 		return SAR_NOTSUPPORTYETERR;
221 	}
222 
223 	if (szNameList) {
224 		memset(szNameList, 0, *pulSize);
225 	}
226 
227 	if ((rv = skf_method->EnumDev(
228 		bPresent,
229 		szNameList,
230 		pulSize)) != SAR_OK) {
231 		SKFerr(SKF_F_SKF_ENUMDEV, skf_get_error_reason(rv));
232 		return rv;
233 	}
234 
235 	return SAR_OK;
236 }
237 
SKF_ConnectDev(LPSTR szName,DEVHANDLE * phDev)238 ULONG DEVAPI SKF_ConnectDev(
239 	LPSTR szName,
240 	DEVHANDLE *phDev)
241 {
242 	ULONG rv;
243 
244 	if (!skf_method) {
245 		SKFerr(SKF_F_SKF_CONNECTDEV,
246 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
247 		return SAR_NOTINITIALIZEERR;
248 	}
249 
250 	if (!skf_method->ConnectDev) {
251 		SKFerr(SKF_F_SKF_CONNECTDEV,
252 			SKF_R_FUNCTION_NOT_SUPPORTED);
253 		return SAR_NOTSUPPORTYETERR;
254 	}
255 
256 	if ((rv = skf_method->ConnectDev(
257 		szName,
258 		phDev)) != SAR_OK) {
259 		SKFerr(SKF_F_SKF_CONNECTDEV, skf_get_error_reason(rv));
260 		return rv;
261 	}
262 
263 	return SAR_OK;
264 }
265 
SKF_DisConnectDev(DEVHANDLE hDev)266 ULONG DEVAPI SKF_DisConnectDev(
267 	DEVHANDLE hDev)
268 {
269 	ULONG rv;
270 
271 	if (!skf_method) {
272 		SKFerr(SKF_F_SKF_DISCONNECTDEV,
273 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
274 		return SAR_NOTINITIALIZEERR;
275 	}
276 
277 	if (!skf_method->DisConnectDev) {
278 		SKFerr(SKF_F_SKF_DISCONNECTDEV,
279 			SKF_R_FUNCTION_NOT_SUPPORTED);
280 		return SAR_NOTSUPPORTYETERR;
281 	}
282 
283 	if ((rv = skf_method->DisConnectDev(
284 		hDev)) != SAR_OK) {
285 		SKFerr(SKF_F_SKF_DISCONNECTDEV, skf_get_error_reason(rv));
286 		return rv;
287 	}
288 
289 	return SAR_OK;
290 }
291 
SKF_GetDevState(LPSTR szDevName,ULONG * pulDevState)292 ULONG DEVAPI SKF_GetDevState(
293 	LPSTR szDevName,
294 	ULONG *pulDevState)
295 {
296 	ULONG rv;
297 
298 	if (!skf_method) {
299 		SKFerr(SKF_F_SKF_GETDEVSTATE,
300 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
301 		return SAR_NOTINITIALIZEERR;
302 	}
303 
304 	if (!skf_method->GetDevState) {
305 		SKFerr(SKF_F_SKF_GETDEVSTATE,
306 			SKF_R_FUNCTION_NOT_SUPPORTED);
307 		return SAR_NOTSUPPORTYETERR;
308 	}
309 
310 	if ((rv = skf_method->GetDevState(
311 		szDevName,
312 		pulDevState)) != SAR_OK) {
313 		SKFerr(SKF_F_SKF_GETDEVSTATE, skf_get_error_reason(rv));
314 		return rv;
315 	}
316 
317 	return SAR_OK;
318 }
319 
SKF_SetLabel(DEVHANDLE hDev,LPSTR szLabel)320 ULONG DEVAPI SKF_SetLabel(
321 	DEVHANDLE hDev,
322 	LPSTR szLabel)
323 {
324 	ULONG rv;
325 
326 	if (!skf_method) {
327 		SKFerr(SKF_F_SKF_SETLABEL,
328 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
329 		return SAR_NOTINITIALIZEERR;
330 	}
331 
332 	if (!skf_method->SetLabel) {
333 		SKFerr(SKF_F_SKF_SETLABEL,
334 			SKF_R_FUNCTION_NOT_SUPPORTED);
335 		return SAR_NOTSUPPORTYETERR;
336 	}
337 
338 	if ((rv = skf_method->SetLabel(
339 		hDev,
340 		szLabel)) != SAR_OK) {
341 		SKFerr(SKF_F_SKF_SETLABEL, skf_get_error_reason(rv));
342 		return rv;
343 	}
344 
345 	return SAR_OK;
346 }
347 
SKF_GetDevInfo(DEVHANDLE hDev,DEVINFO * pDevInfo)348 ULONG DEVAPI SKF_GetDevInfo(
349 	DEVHANDLE hDev,
350 	DEVINFO *pDevInfo)
351 {
352 	ULONG rv;
353 
354 	if (!skf_method) {
355 		SKFerr(SKF_F_SKF_GETDEVINFO,
356 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
357 		return SAR_NOTINITIALIZEERR;
358 	}
359 
360 	if (!skf_method->GetDevInfo) {
361 		SKFerr(SKF_F_SKF_GETDEVINFO,
362 			SKF_R_FUNCTION_NOT_SUPPORTED);
363 		return SAR_NOTSUPPORTYETERR;
364 	}
365 
366 	memset(pDevInfo, 0, sizeof(DEVINFO));
367 
368 	if ((rv = skf_method->GetDevInfo(
369 		hDev,
370 		pDevInfo)) != SAR_OK) {
371 		SKFerr(SKF_F_SKF_GETDEVINFO, skf_get_error_reason(rv));
372 		printf("rv = %8x\n", rv);
373 		return rv;
374 	}
375 
376 	if (skf_vendor) {
377 		pDevInfo->AlgSymCap = skf_vendor->get_cipher_cap(pDevInfo->AlgSymCap);
378 		pDevInfo->AlgAsymCap = skf_vendor->get_pkey_cap(pDevInfo->AlgAsymCap);
379 		pDevInfo->AlgHashCap = skf_vendor->get_digest_cap(pDevInfo->AlgHashCap);
380 		pDevInfo->DevAuthAlgId = skf_vendor->get_cipher_cap(pDevInfo->DevAuthAlgId);
381 	}
382 
383 	return SAR_OK;
384 }
385 
SKF_LockDev(DEVHANDLE hDev,ULONG ulTimeOut)386 ULONG DEVAPI SKF_LockDev(
387 	DEVHANDLE hDev,
388 	ULONG ulTimeOut)
389 {
390 	ULONG rv;
391 
392 	if (!skf_method) {
393 		SKFerr(SKF_F_SKF_LOCKDEV,
394 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
395 		return SAR_NOTINITIALIZEERR;
396 	}
397 
398 	if (!skf_method->LockDev) {
399 		SKFerr(SKF_F_SKF_LOCKDEV,
400 			SKF_R_FUNCTION_NOT_SUPPORTED);
401 		return SAR_NOTSUPPORTYETERR;
402 	}
403 
404 	if ((rv = skf_method->LockDev(
405 		hDev,
406 		ulTimeOut)) != SAR_OK) {
407 		SKFerr(SKF_F_SKF_LOCKDEV, skf_get_error_reason(rv));
408 		return rv;
409 	}
410 
411 	return SAR_OK;
412 }
413 
SKF_UnlockDev(DEVHANDLE hDev)414 ULONG DEVAPI SKF_UnlockDev(
415 	DEVHANDLE hDev)
416 {
417 	ULONG rv;
418 
419 	if (!skf_method) {
420 		SKFerr(SKF_F_SKF_UNLOCKDEV,
421 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
422 		return SAR_NOTINITIALIZEERR;
423 	}
424 
425 	if (!skf_method->UnlockDev) {
426 		SKFerr(SKF_F_SKF_UNLOCKDEV,
427 			SKF_R_FUNCTION_NOT_SUPPORTED);
428 		return SAR_NOTSUPPORTYETERR;
429 	}
430 
431 	if ((rv = skf_method->UnlockDev(
432 		hDev)) != SAR_OK) {
433 		SKFerr(SKF_F_SKF_UNLOCKDEV, skf_get_error_reason(rv));
434 		return rv;
435 	}
436 
437 	return SAR_OK;
438 }
439 
SKF_Transmit(DEVHANDLE hDev,BYTE * pbCommand,ULONG ulCommandLen,BYTE * pbData,ULONG * pulDataLen)440 ULONG DEVAPI SKF_Transmit(
441 	DEVHANDLE hDev,
442 	BYTE *pbCommand,
443 	ULONG ulCommandLen,
444 	BYTE *pbData,
445 	ULONG *pulDataLen)
446 {
447 	ULONG rv;
448 
449 	if (!skf_method) {
450 		SKFerr(SKF_F_SKF_TRANSMIT,
451 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
452 		return SAR_NOTINITIALIZEERR;
453 	}
454 
455 	if (!skf_method->Transmit) {
456 		SKFerr(SKF_F_SKF_TRANSMIT,
457 			SKF_R_FUNCTION_NOT_SUPPORTED);
458 		return SAR_NOTSUPPORTYETERR;
459 	}
460 
461 	if ((rv = skf_method->Transmit(
462 		hDev,
463 		pbCommand,
464 		ulCommandLen,
465 		pbData,
466 		pulDataLen)) != SAR_OK) {
467 		SKFerr(SKF_F_SKF_TRANSMIT, skf_get_error_reason(rv));
468 		return rv;
469 	}
470 
471 	return SAR_OK;
472 }
473 
SKF_ChangeDevAuthKey(DEVHANDLE hDev,BYTE * pbKeyValue,ULONG ulKeyLen)474 ULONG DEVAPI SKF_ChangeDevAuthKey(
475 	DEVHANDLE hDev,
476 	BYTE *pbKeyValue,
477 	ULONG ulKeyLen)
478 {
479 	ULONG rv;
480 
481 	if (!skf_method) {
482 		SKFerr(SKF_F_SKF_CHANGEDEVAUTHKEY,
483 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
484 		return SAR_NOTINITIALIZEERR;
485 	}
486 
487 	if (!skf_method->ChangeDevAuthKey) {
488 		SKFerr(SKF_F_SKF_CHANGEDEVAUTHKEY,
489 			SKF_R_FUNCTION_NOT_SUPPORTED);
490 		return SAR_NOTSUPPORTYETERR;
491 	}
492 
493 	if ((rv = skf_method->ChangeDevAuthKey(
494 		hDev,
495 		pbKeyValue,
496 		ulKeyLen)) != SAR_OK) {
497 		SKFerr(SKF_F_SKF_CHANGEDEVAUTHKEY, skf_get_error_reason(rv));
498 		return rv;
499 	}
500 
501 	return SAR_OK;
502 }
503 
SKF_DevAuth(DEVHANDLE hDev,BYTE * pbAuthData,ULONG ulLen)504 ULONG DEVAPI SKF_DevAuth(
505 	DEVHANDLE hDev,
506 	BYTE *pbAuthData,
507 	ULONG ulLen)
508 {
509 	ULONG rv;
510 
511 	if (!skf_method) {
512 		SKFerr(SKF_F_SKF_DEVAUTH,
513 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
514 		return SAR_NOTINITIALIZEERR;
515 	}
516 
517 	if (!skf_method->DevAuth) {
518 		SKFerr(SKF_F_SKF_DEVAUTH,
519 			SKF_R_FUNCTION_NOT_SUPPORTED);
520 		return SAR_NOTSUPPORTYETERR;
521 	}
522 
523 	if ((rv = skf_method->DevAuth(
524 		hDev,
525 		pbAuthData,
526 		ulLen)) != SAR_OK) {
527 		SKFerr(SKF_F_SKF_DEVAUTH, skf_get_error_reason(rv));
528 		return rv;
529 	}
530 
531 	return SAR_OK;
532 }
533 
SKF_ChangePIN(HAPPLICATION hApplication,ULONG ulPINType,LPSTR szOldPin,LPSTR szNewPin,ULONG * pulRetryCount)534 ULONG DEVAPI SKF_ChangePIN(
535 	HAPPLICATION hApplication,
536 	ULONG ulPINType,
537 	LPSTR szOldPin,
538 	LPSTR szNewPin,
539 	ULONG *pulRetryCount)
540 {
541 	ULONG rv;
542 
543 	if (!skf_method) {
544 		SKFerr(SKF_F_SKF_CHANGEPIN,
545 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
546 		return SAR_NOTINITIALIZEERR;
547 	}
548 
549 	if (!skf_method->ChangePIN) {
550 		SKFerr(SKF_F_SKF_CHANGEPIN,
551 			SKF_R_FUNCTION_NOT_SUPPORTED);
552 		return SAR_NOTSUPPORTYETERR;
553 	}
554 
555 	if ((rv = skf_method->ChangePIN(
556 		hApplication,
557 		ulPINType,
558 		szOldPin,
559 		szNewPin,
560 		pulRetryCount)) != SAR_OK) {
561 		SKFerr(SKF_F_SKF_CHANGEPIN, skf_get_error_reason(rv));
562 		return rv;
563 	}
564 
565 	return SAR_OK;
566 }
567 
SKF_GetPINInfo(HAPPLICATION hApplication,ULONG ulPINType,ULONG * pulMaxRetryCount,ULONG * pulRemainRetryCount,BOOL * pbDefaultPin)568 LONG DEVAPI SKF_GetPINInfo(
569 	HAPPLICATION hApplication,
570 	ULONG ulPINType,
571 	ULONG *pulMaxRetryCount,
572 	ULONG *pulRemainRetryCount,
573 	BOOL *pbDefaultPin)
574 {
575 	ULONG rv;
576 
577 	if (!skf_method) {
578 		SKFerr(SKF_F_SKF_GETPININFO,
579 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
580 		return SAR_NOTINITIALIZEERR;
581 	}
582 
583 	if (!skf_method->GetPINInfo) {
584 		SKFerr(SKF_F_SKF_GETPININFO,
585 			SKF_R_FUNCTION_NOT_SUPPORTED);
586 		return SAR_NOTSUPPORTYETERR;
587 	}
588 
589 	if ((rv = skf_method->GetPINInfo(
590 		hApplication,
591 		ulPINType,
592 		pulMaxRetryCount,
593 		pulRemainRetryCount,
594 		pbDefaultPin)) != SAR_OK) {
595 		SKFerr(SKF_F_SKF_GETPININFO, skf_get_error_reason(rv));
596 		return rv;
597 	}
598 
599 	return SAR_OK;
600 }
601 
SKF_VerifyPIN(HAPPLICATION hApplication,ULONG ulPINType,LPSTR szPIN,ULONG * pulRetryCount)602 ULONG DEVAPI SKF_VerifyPIN(
603 	HAPPLICATION hApplication,
604 	ULONG ulPINType,
605 	LPSTR szPIN,
606 	ULONG *pulRetryCount)
607 {
608 	ULONG rv;
609 
610 	if (!skf_method) {
611 		SKFerr(SKF_F_SKF_VERIFYPIN,
612 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
613 		return SAR_NOTINITIALIZEERR;
614 	}
615 
616 	if (!skf_method->VerifyPIN) {
617 		SKFerr(SKF_F_SKF_VERIFYPIN,
618 			SKF_R_FUNCTION_NOT_SUPPORTED);
619 		return SAR_NOTSUPPORTYETERR;
620 	}
621 
622 	if ((rv = skf_method->VerifyPIN(
623 		hApplication,
624 		ulPINType,
625 		szPIN,
626 		pulRetryCount)) != SAR_OK) {
627 		SKFerr(SKF_F_SKF_VERIFYPIN, skf_get_error_reason(rv));
628 		return rv;
629 	}
630 
631 	return SAR_OK;
632 }
633 
SKF_UnblockPIN(HAPPLICATION hApplication,LPSTR szAdminPIN,LPSTR szNewUserPIN,ULONG * pulRetryCount)634 ULONG DEVAPI SKF_UnblockPIN(
635 	HAPPLICATION hApplication,
636 	LPSTR szAdminPIN,
637 	LPSTR szNewUserPIN,
638 	ULONG *pulRetryCount)
639 {
640 	ULONG rv;
641 
642 	if (!skf_method) {
643 		SKFerr(SKF_F_SKF_UNBLOCKPIN,
644 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
645 		return SAR_NOTINITIALIZEERR;
646 	}
647 
648 	if (!skf_method->UnblockPIN) {
649 		SKFerr(SKF_F_SKF_UNBLOCKPIN,
650 			SKF_R_FUNCTION_NOT_SUPPORTED);
651 		return SAR_NOTSUPPORTYETERR;
652 	}
653 
654 	if ((rv = skf_method->UnblockPIN(
655 		hApplication,
656 		szAdminPIN,
657 		szNewUserPIN,
658 		pulRetryCount)) != SAR_OK) {
659 		SKFerr(SKF_F_SKF_UNBLOCKPIN, skf_get_error_reason(rv));
660 		return rv;
661 	}
662 
663 	return SAR_OK;
664 }
665 
SKF_ClearSecureState(HAPPLICATION hApplication)666 ULONG DEVAPI SKF_ClearSecureState(
667 	HAPPLICATION hApplication)
668 {
669 	ULONG rv;
670 
671 	if (!skf_method) {
672 		SKFerr(SKF_F_SKF_CLEARSECURESTATE,
673 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
674 		return SAR_NOTINITIALIZEERR;
675 	}
676 
677 	if (!skf_method->ClearSecureState) {
678 		SKFerr(SKF_F_SKF_CLEARSECURESTATE,
679 			SKF_R_FUNCTION_NOT_SUPPORTED);
680 		return SAR_NOTSUPPORTYETERR;
681 	}
682 
683 	if ((rv = skf_method->ClearSecureState(
684 		hApplication)) != SAR_OK) {
685 		SKFerr(SKF_F_SKF_CLEARSECURESTATE, skf_get_error_reason(rv));
686 		return rv;
687 	}
688 
689 	return SAR_OK;
690 }
691 
SKF_CreateApplication(DEVHANDLE hDev,LPSTR szAppName,LPSTR szAdminPin,DWORD dwAdminPinRetryCount,LPSTR szUserPin,DWORD dwUserPinRetryCount,DWORD dwCreateFileRights,HAPPLICATION * phApplication)692 ULONG DEVAPI SKF_CreateApplication(
693 	DEVHANDLE hDev,
694 	LPSTR szAppName,
695 	LPSTR szAdminPin,
696 	DWORD dwAdminPinRetryCount,
697 	LPSTR szUserPin,
698 	DWORD dwUserPinRetryCount,
699 	DWORD dwCreateFileRights,
700 	HAPPLICATION *phApplication)
701 {
702 	ULONG rv;
703 
704 	if (!skf_method) {
705 		SKFerr(SKF_F_SKF_CREATEAPPLICATION,
706 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
707 		return SAR_NOTINITIALIZEERR;
708 	}
709 
710 	if (!skf_method->CreateApplication) {
711 		SKFerr(SKF_F_SKF_CREATEAPPLICATION,
712 			SKF_R_FUNCTION_NOT_SUPPORTED);
713 		return SAR_NOTSUPPORTYETERR;
714 	}
715 
716 	if ((rv = skf_method->CreateApplication(
717 		hDev,
718 		szAppName,
719 		szAdminPin,
720 		dwAdminPinRetryCount,
721 		szUserPin,
722 		dwUserPinRetryCount,
723 		dwCreateFileRights,
724 		phApplication)) != SAR_OK) {
725 		SKFerr(SKF_F_SKF_CREATEAPPLICATION, skf_get_error_reason(rv));
726 		return rv;
727 	}
728 
729 	return SAR_OK;
730 }
731 
SKF_EnumApplication(DEVHANDLE hDev,LPSTR szAppName,ULONG * pulSize)732 ULONG DEVAPI SKF_EnumApplication(
733 	DEVHANDLE hDev,
734 	LPSTR szAppName,
735 	ULONG *pulSize)
736 {
737 	ULONG rv;
738 
739 	if (!skf_method) {
740 		SKFerr(SKF_F_SKF_ENUMAPPLICATION,
741 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
742 		return SAR_NOTINITIALIZEERR;
743 	}
744 
745 	if (!skf_method->EnumApplication) {
746 		SKFerr(SKF_F_SKF_ENUMAPPLICATION,
747 			SKF_R_FUNCTION_NOT_SUPPORTED);
748 		return SAR_NOTSUPPORTYETERR;
749 	}
750 
751 	if ((rv = skf_method->EnumApplication(
752 		hDev,
753 		szAppName,
754 		pulSize)) != SAR_OK) {
755 		SKFerr(SKF_F_SKF_ENUMAPPLICATION, skf_get_error_reason(rv));
756 		return rv;
757 	}
758 
759 	return SAR_OK;
760 }
761 
SKF_DeleteApplication(DEVHANDLE hDev,LPSTR szAppName)762 ULONG DEVAPI SKF_DeleteApplication(
763 	DEVHANDLE hDev,
764 	LPSTR szAppName)
765 {
766 	ULONG rv;
767 
768 	if (!skf_method) {
769 		SKFerr(SKF_F_SKF_DELETEAPPLICATION,
770 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
771 		return SAR_NOTINITIALIZEERR;
772 	}
773 
774 	if (!skf_method->DeleteApplication) {
775 		SKFerr(SKF_F_SKF_DELETEAPPLICATION,
776 			SKF_R_FUNCTION_NOT_SUPPORTED);
777 		return SAR_NOTSUPPORTYETERR;
778 	}
779 
780 	if ((rv = skf_method->DeleteApplication(
781 		hDev,
782 		szAppName)) != SAR_OK) {
783 		SKFerr(SKF_F_SKF_DELETEAPPLICATION, skf_get_error_reason(rv));
784 		return rv;
785 	}
786 
787 	return SAR_OK;
788 }
789 
SKF_OpenApplication(DEVHANDLE hDev,LPSTR szAppName,HAPPLICATION * phApplication)790 ULONG DEVAPI SKF_OpenApplication(
791 	DEVHANDLE hDev,
792 	LPSTR szAppName,
793 	HAPPLICATION *phApplication)
794 {
795 	ULONG rv;
796 
797 	if (!skf_method) {
798 		SKFerr(SKF_F_SKF_OPENAPPLICATION,
799 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
800 		return SAR_NOTINITIALIZEERR;
801 	}
802 
803 	if (!skf_method->OpenApplication) {
804 		SKFerr(SKF_F_SKF_OPENAPPLICATION,
805 			SKF_R_FUNCTION_NOT_SUPPORTED);
806 		return SAR_NOTSUPPORTYETERR;
807 	}
808 
809 	if ((rv = skf_method->OpenApplication(
810 		hDev,
811 		szAppName,
812 		phApplication)) != SAR_OK) {
813 		SKFerr(SKF_F_SKF_OPENAPPLICATION, skf_get_error_reason(rv));
814 		return rv;
815 	}
816 
817 	return SAR_OK;
818 }
819 
SKF_CloseApplication(HAPPLICATION hApplication)820 ULONG DEVAPI SKF_CloseApplication(
821 	HAPPLICATION hApplication)
822 {
823 	ULONG rv;
824 
825 	if (!skf_method) {
826 		SKFerr(SKF_F_SKF_CLOSEAPPLICATION,
827 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
828 		return SAR_NOTINITIALIZEERR;
829 	}
830 
831 	if (!skf_method->CloseApplication) {
832 		SKFerr(SKF_F_SKF_CLOSEAPPLICATION,
833 			SKF_R_FUNCTION_NOT_SUPPORTED);
834 		return SAR_NOTSUPPORTYETERR;
835 	}
836 
837 	if ((rv = skf_method->CloseApplication(
838 		hApplication)) != SAR_OK) {
839 		SKFerr(SKF_F_SKF_CLOSEAPPLICATION, skf_get_error_reason(rv));
840 		return rv;
841 	}
842 
843 	return SAR_OK;
844 }
845 
SKF_CreateFile(HAPPLICATION hApplication,LPSTR szFileName,ULONG ulFileSize,ULONG ulReadRights,ULONG ulWriteRights)846 ULONG DEVAPI SKF_CreateFile(
847 	HAPPLICATION hApplication,
848 	LPSTR szFileName,
849 	ULONG ulFileSize,
850 	ULONG ulReadRights,
851 	ULONG ulWriteRights)
852 {
853 	ULONG rv;
854 
855 	if (!skf_method) {
856 		SKFerr(SKF_F_SKF_CREATEFILE,
857 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
858 		return SAR_NOTINITIALIZEERR;
859 	}
860 
861 	if (!skf_method->CreateObject) {
862 		SKFerr(SKF_F_SKF_CREATEFILE,
863 			SKF_R_FUNCTION_NOT_SUPPORTED);
864 		return SAR_NOTSUPPORTYETERR;
865 	}
866 
867 	if ((rv = skf_method->CreateObject(
868 		hApplication,
869 		szFileName,
870 		ulFileSize,
871 		ulReadRights,
872 		ulWriteRights)) != SAR_OK) {
873 		SKFerr(SKF_F_SKF_CREATEFILE, skf_get_error_reason(rv));
874 
875 		//LPSTR str = NULL;
876 		//printf("error = %08X\n", rv);
877 		//SKF_GetErrorString(rv, &str);
878 		//printf("error = %s\n", (char *)str);
879 
880 		return rv;
881 	}
882 
883 	return SAR_OK;
884 }
885 
SKF_DeleteFile(HAPPLICATION hApplication,LPSTR szFileName)886 ULONG DEVAPI SKF_DeleteFile(
887 	HAPPLICATION hApplication,
888 	LPSTR szFileName)
889 {
890 	ULONG rv;
891 
892 	if (!skf_method) {
893 		SKFerr(SKF_F_SKF_DELETEFILE,
894 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
895 		return SAR_NOTINITIALIZEERR;
896 	}
897 
898 	if (!skf_method->DeleteObject) {
899 		SKFerr(SKF_F_SKF_DELETEFILE,
900 			SKF_R_FUNCTION_NOT_SUPPORTED);
901 		return SAR_NOTSUPPORTYETERR;
902 	}
903 
904 	if ((rv = skf_method->DeleteObject(
905 		hApplication,
906 		szFileName)) != SAR_OK) {
907 		SKFerr(SKF_F_SKF_DELETEFILE, skf_get_error_reason(rv));
908 		return rv;
909 	}
910 
911 	return SAR_OK;
912 }
913 
SKF_EnumFiles(HAPPLICATION hApplication,LPSTR szFileList,ULONG * pulSize)914 ULONG DEVAPI SKF_EnumFiles(
915 	HAPPLICATION hApplication,
916 	LPSTR szFileList,
917 	ULONG *pulSize)
918 {
919 	ULONG rv;
920 
921 	if (!skf_method) {
922 		SKFerr(SKF_F_SKF_ENUMFILES,
923 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
924 		return SAR_NOTINITIALIZEERR;
925 	}
926 
927 	if (!skf_method->EnumObjects) {
928 		SKFerr(SKF_F_SKF_ENUMFILES,
929 			SKF_R_FUNCTION_NOT_SUPPORTED);
930 		return SAR_NOTSUPPORTYETERR;
931 	}
932 
933 	if ((rv = skf_method->EnumObjects(
934 		hApplication,
935 		szFileList,
936 		pulSize)) != SAR_OK) {
937 		SKFerr(SKF_F_SKF_ENUMFILES, skf_get_error_reason(rv));
938 		return rv;
939 	}
940 
941 	return SAR_OK;
942 }
943 
SKF_GetFileInfo(HAPPLICATION hApplication,LPSTR szFileName,FILEATTRIBUTE * pFileInfo)944 ULONG DEVAPI SKF_GetFileInfo(
945 	HAPPLICATION hApplication,
946 	LPSTR szFileName,
947 	FILEATTRIBUTE *pFileInfo)
948 {
949 	ULONG rv;
950 
951 	if (!skf_method) {
952 		SKFerr(SKF_F_SKF_GETFILEINFO,
953 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
954 		return SAR_NOTINITIALIZEERR;
955 	}
956 
957 	if (!skf_method->GetObjectInfo) {
958 		SKFerr(SKF_F_SKF_GETFILEINFO,
959 			SKF_R_FUNCTION_NOT_SUPPORTED);
960 		return SAR_NOTSUPPORTYETERR;
961 	}
962 
963 	memset(pFileInfo, 0, sizeof(FILEATTRIBUTE));
964 
965 	if ((rv = skf_method->GetObjectInfo(
966 		hApplication,
967 		szFileName,
968 		pFileInfo)) != SAR_OK) {
969 		SKFerr(SKF_F_SKF_GETFILEINFO, skf_get_error_reason(rv));
970 		return rv;
971 	}
972 
973 	return SAR_OK;
974 }
975 
SKF_ReadFile(HAPPLICATION hApplication,LPSTR szFileName,ULONG ulOffset,ULONG ulSize,BYTE * pbOutData,ULONG * pulOutLen)976 ULONG DEVAPI SKF_ReadFile(
977 	HAPPLICATION hApplication,
978 	LPSTR szFileName,
979 	ULONG ulOffset,
980 	ULONG ulSize,
981 	BYTE *pbOutData,
982 	ULONG *pulOutLen)
983 {
984 	ULONG rv;
985 
986 	if (!skf_method) {
987 		SKFerr(SKF_F_SKF_READFILE,
988 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
989 		return SAR_NOTINITIALIZEERR;
990 	}
991 
992 	if (!skf_method->ReadObject) {
993 		SKFerr(SKF_F_SKF_READFILE,
994 			SKF_R_FUNCTION_NOT_SUPPORTED);
995 		return SAR_NOTSUPPORTYETERR;
996 	}
997 
998 	if ((rv = skf_method->ReadObject(
999 		hApplication,
1000 		szFileName,
1001 		ulOffset,
1002 		ulSize,
1003 		pbOutData,
1004 		pulOutLen)) != SAR_OK) {
1005 		SKFerr(SKF_F_SKF_READFILE, skf_get_error_reason(rv));
1006 		return rv;
1007 	}
1008 
1009 	return SAR_OK;
1010 }
1011 
SKF_WriteFile(HAPPLICATION hApplication,LPSTR szFileName,ULONG ulOffset,BYTE * pbData,ULONG ulSize)1012 ULONG DEVAPI SKF_WriteFile(
1013 	HAPPLICATION hApplication,
1014 	LPSTR szFileName,
1015 	ULONG ulOffset,
1016 	BYTE *pbData,
1017 	ULONG ulSize)
1018 {
1019 	ULONG rv;
1020 
1021 	if (!skf_method) {
1022 		SKFerr(SKF_F_SKF_WRITEFILE,
1023 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1024 		return SAR_NOTINITIALIZEERR;
1025 	}
1026 
1027 	if (!skf_method->WriteObject) {
1028 		SKFerr(SKF_F_SKF_WRITEFILE,
1029 			SKF_R_FUNCTION_NOT_SUPPORTED);
1030 		return SAR_NOTSUPPORTYETERR;
1031 	}
1032 
1033 	if ((rv = skf_method->WriteObject(
1034 		hApplication,
1035 		szFileName,
1036 		ulOffset,
1037 		pbData,
1038 		ulSize)) != SAR_OK) {
1039 		SKFerr(SKF_F_SKF_WRITEFILE, skf_get_error_reason(rv));
1040 
1041 		printf("error = %08X\n", rv);
1042 
1043 		return rv;
1044 	}
1045 
1046 	return SAR_OK;
1047 }
1048 
SKF_CreateContainer(HAPPLICATION hApplication,LPSTR szContainerName,HCONTAINER * phContainer)1049 ULONG DEVAPI SKF_CreateContainer(
1050 	HAPPLICATION hApplication,
1051 	LPSTR szContainerName,
1052 	HCONTAINER *phContainer)
1053 {
1054 	ULONG rv;
1055 
1056 	if (!skf_method) {
1057 		SKFerr(SKF_F_SKF_CREATECONTAINER,
1058 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1059 		return SAR_NOTINITIALIZEERR;
1060 	}
1061 
1062 	if (!skf_method->CreateContainer) {
1063 		SKFerr(SKF_F_SKF_CREATECONTAINER,
1064 			SKF_R_FUNCTION_NOT_SUPPORTED);
1065 		return SAR_NOTSUPPORTYETERR;
1066 	}
1067 
1068 	if ((rv = skf_method->CreateContainer(
1069 		hApplication,
1070 		szContainerName,
1071 		phContainer)) != SAR_OK) {
1072 		SKFerr(SKF_F_SKF_CREATECONTAINER, skf_get_error_reason(rv));
1073 		return rv;
1074 	}
1075 
1076 	return SAR_OK;
1077 }
1078 
SKF_DeleteContainer(HAPPLICATION hApplication,LPSTR szContainerName)1079 ULONG DEVAPI SKF_DeleteContainer(
1080 	HAPPLICATION hApplication,
1081 	LPSTR szContainerName)
1082 {
1083 	ULONG rv;
1084 
1085 	if (!skf_method) {
1086 		SKFerr(SKF_F_SKF_DELETECONTAINER,
1087 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1088 		return SAR_NOTINITIALIZEERR;
1089 	}
1090 
1091 	if (!skf_method->DeleteContainer) {
1092 		SKFerr(SKF_F_SKF_DELETECONTAINER,
1093 			SKF_R_FUNCTION_NOT_SUPPORTED);
1094 		return SAR_NOTSUPPORTYETERR;
1095 	}
1096 
1097 	if ((rv = skf_method->DeleteContainer(
1098 		hApplication,
1099 		szContainerName)) != SAR_OK) {
1100 		SKFerr(SKF_F_SKF_DELETECONTAINER, skf_get_error_reason(rv));
1101 		return rv;
1102 	}
1103 
1104 	return SAR_OK;
1105 }
1106 
SKF_EnumContainer(HAPPLICATION hApplication,LPSTR szContainerName,ULONG * pulSize)1107 ULONG DEVAPI SKF_EnumContainer(
1108 	HAPPLICATION hApplication,
1109 	LPSTR szContainerName,
1110 	ULONG *pulSize)
1111 {
1112 	ULONG rv;
1113 
1114 	if (!skf_method) {
1115 		SKFerr(SKF_F_SKF_ENUMCONTAINER,
1116 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1117 		return SAR_NOTINITIALIZEERR;
1118 	}
1119 
1120 	if (!skf_method->EnumContainer) {
1121 		SKFerr(SKF_F_SKF_ENUMCONTAINER,
1122 			SKF_R_FUNCTION_NOT_SUPPORTED);
1123 		return SAR_NOTSUPPORTYETERR;
1124 	}
1125 
1126 	if ((rv = skf_method->EnumContainer(
1127 		hApplication,
1128 		szContainerName,
1129 		pulSize)) != SAR_OK) {
1130 		SKFerr(SKF_F_SKF_ENUMCONTAINER, skf_get_error_reason(rv));
1131 		return rv;
1132 	}
1133 
1134 	return SAR_OK;
1135 }
1136 
SKF_OpenContainer(HAPPLICATION hApplication,LPSTR szContainerName,HCONTAINER * phContainer)1137 ULONG DEVAPI SKF_OpenContainer(
1138 	HAPPLICATION hApplication,
1139 	LPSTR szContainerName,
1140 	HCONTAINER *phContainer)
1141 {
1142 	ULONG rv;
1143 
1144 	if (!skf_method) {
1145 		SKFerr(SKF_F_SKF_OPENCONTAINER,
1146 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1147 		return SAR_NOTINITIALIZEERR;
1148 	}
1149 
1150 	if (!skf_method->OpenContainer) {
1151 		SKFerr(SKF_F_SKF_OPENCONTAINER,
1152 			SKF_R_FUNCTION_NOT_SUPPORTED);
1153 		return SAR_NOTSUPPORTYETERR;
1154 	}
1155 
1156 	if ((rv = skf_method->OpenContainer(
1157 		hApplication,
1158 		szContainerName,
1159 		phContainer)) != SAR_OK) {
1160 		SKFerr(SKF_F_SKF_OPENCONTAINER, skf_get_error_reason(rv));
1161 		return rv;
1162 	}
1163 
1164 	return SAR_OK;
1165 }
1166 
SKF_CloseContainer(HCONTAINER hContainer)1167 ULONG DEVAPI SKF_CloseContainer(
1168 	HCONTAINER hContainer)
1169 {
1170 	ULONG rv;
1171 
1172 	if (!skf_method) {
1173 		SKFerr(SKF_F_SKF_CLOSECONTAINER,
1174 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1175 		return SAR_NOTINITIALIZEERR;
1176 	}
1177 
1178 	if (!skf_method->CloseContainer) {
1179 		SKFerr(SKF_F_SKF_CLOSECONTAINER,
1180 			SKF_R_FUNCTION_NOT_SUPPORTED);
1181 		return SAR_NOTSUPPORTYETERR;
1182 	}
1183 
1184 	if ((rv = skf_method->CloseContainer(
1185 		hContainer)) != SAR_OK) {
1186 		SKFerr(SKF_F_SKF_CLOSECONTAINER, skf_get_error_reason(rv));
1187 		return rv;
1188 	}
1189 
1190 	return SAR_OK;
1191 }
1192 
SKF_GetContainerType(HCONTAINER hContainer,ULONG * pulContainerType)1193 ULONG DEVAPI SKF_GetContainerType(
1194 	HCONTAINER hContainer,
1195 	ULONG *pulContainerType)
1196 {
1197 	ULONG rv;
1198 
1199 	if (!skf_method) {
1200 		SKFerr(SKF_F_SKF_GETCONTAINERTYPE,
1201 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1202 		return SAR_NOTINITIALIZEERR;
1203 	}
1204 
1205 	if (!skf_method->GetContainerType) {
1206 		SKFerr(SKF_F_SKF_GETCONTAINERTYPE,
1207 			SKF_R_FUNCTION_NOT_SUPPORTED);
1208 		return SAR_NOTSUPPORTYETERR;
1209 	}
1210 
1211 	if ((rv = skf_method->GetContainerType(
1212 		hContainer,
1213 		pulContainerType)) != SAR_OK) {
1214 		SKFerr(SKF_F_SKF_GETCONTAINERTYPE, skf_get_error_reason(rv));
1215 		return rv;
1216 	}
1217 
1218 	return SAR_OK;
1219 }
1220 
SKF_ImportCertificate(HCONTAINER hContainer,BOOL bExportSignKey,BYTE * pbCert,ULONG ulCertLen)1221 ULONG DEVAPI SKF_ImportCertificate(
1222 	HCONTAINER hContainer,
1223 	BOOL bExportSignKey,
1224 	BYTE *pbCert,
1225 	ULONG ulCertLen)
1226 {
1227 	ULONG rv;
1228 
1229 	if (!skf_method) {
1230 		SKFerr(SKF_F_SKF_IMPORTCERTIFICATE,
1231 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1232 		return SAR_NOTINITIALIZEERR;
1233 	}
1234 
1235 	if (!skf_method->ImportCertificate) {
1236 		SKFerr(SKF_F_SKF_IMPORTCERTIFICATE,
1237 			SKF_R_FUNCTION_NOT_SUPPORTED);
1238 		return SAR_NOTSUPPORTYETERR;
1239 	}
1240 
1241 	if ((rv = skf_method->ImportCertificate(
1242 		hContainer,
1243 		bExportSignKey,
1244 		pbCert,
1245 		ulCertLen)) != SAR_OK) {
1246 		SKFerr(SKF_F_SKF_IMPORTCERTIFICATE, skf_get_error_reason(rv));
1247 		return rv;
1248 	}
1249 
1250 	return SAR_OK;
1251 }
1252 
SKF_ExportCertificate(HCONTAINER hContainer,BOOL bSignFlag,BYTE * pbCert,ULONG * pulCertLen)1253 ULONG DEVAPI SKF_ExportCertificate(
1254 	HCONTAINER hContainer,
1255 	BOOL bSignFlag,
1256 	BYTE *pbCert,
1257 	ULONG *pulCertLen)
1258 {
1259 	ULONG rv;
1260 
1261 	if (!skf_method) {
1262 		SKFerr(SKF_F_SKF_EXPORTCERTIFICATE,
1263 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1264 		return SAR_NOTINITIALIZEERR;
1265 	}
1266 
1267 	if (!skf_method->ExportCertificate) {
1268 		SKFerr(SKF_F_SKF_EXPORTCERTIFICATE,
1269 			SKF_R_FUNCTION_NOT_SUPPORTED);
1270 		return SAR_NOTSUPPORTYETERR;
1271 	}
1272 
1273 	if ((rv = skf_method->ExportCertificate(
1274 		hContainer,
1275 		bSignFlag,
1276 		pbCert,
1277 		pulCertLen)) != SAR_OK) {
1278 		SKFerr(SKF_F_SKF_EXPORTCERTIFICATE, skf_get_error_reason(rv));
1279 		return rv;
1280 	}
1281 
1282 	return SAR_OK;
1283 }
1284 
SKF_ExportPublicKey(HCONTAINER hContainer,BOOL bSignFlag,BYTE * pbBlob,ULONG * pulBlobLen)1285 ULONG DEVAPI SKF_ExportPublicKey(
1286 	HCONTAINER hContainer,
1287 	BOOL bSignFlag,
1288 	BYTE *pbBlob,
1289 	ULONG *pulBlobLen)
1290 {
1291 	ULONG rv;
1292 
1293 	// TODO: check the output length, clear the memmory.
1294 	// if pbBlob is NULL, return the length
1295 
1296 	if (!skf_method) {
1297 		SKFerr(SKF_F_SKF_EXPORTPUBLICKEY,
1298 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1299 		return SAR_NOTINITIALIZEERR;
1300 	}
1301 
1302 	if (!skf_method->ExportPublicKey) {
1303 		SKFerr(SKF_F_SKF_EXPORTPUBLICKEY,
1304 			SKF_R_FUNCTION_NOT_SUPPORTED);
1305 		return SAR_NOTSUPPORTYETERR;
1306 	}
1307 
1308 	if ((rv = skf_method->ExportPublicKey(
1309 		hContainer,
1310 		bSignFlag,
1311 		pbBlob,
1312 		pulBlobLen)) != SAR_OK) {
1313 		SKFerr(SKF_F_SKF_EXPORTPUBLICKEY, skf_get_error_reason(rv));
1314 		return rv;
1315 	}
1316 
1317 	return SAR_OK;
1318 }
1319 
SKF_GenRandom(DEVHANDLE hDev,BYTE * pbRandom,ULONG ulRandomLen)1320 ULONG DEVAPI SKF_GenRandom(
1321 	DEVHANDLE hDev,
1322 	BYTE *pbRandom,
1323 	ULONG ulRandomLen)
1324 {
1325 	ULONG rv;
1326 
1327 	if (!skf_method) {
1328 		SKFerr(SKF_F_SKF_GENRANDOM,
1329 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1330 		return SAR_NOTINITIALIZEERR;
1331 	}
1332 
1333 	if (!skf_method->GenRandom) {
1334 		SKFerr(SKF_F_SKF_GENRANDOM,
1335 			SKF_R_FUNCTION_NOT_SUPPORTED);
1336 		return SAR_NOTSUPPORTYETERR;
1337 	}
1338 
1339 	if ((rv = skf_method->GenRandom(
1340 		hDev,
1341 		pbRandom,
1342 		ulRandomLen)) != SAR_OK) {
1343 		SKFerr(SKF_F_SKF_GENRANDOM, skf_get_error_reason(rv));
1344 		return rv;
1345 	}
1346 
1347 	return SAR_OK;
1348 }
1349 
SKF_GenExtRSAKey(DEVHANDLE hDev,ULONG ulBitsLen,RSAPRIVATEKEYBLOB * pBlob)1350 ULONG DEVAPI SKF_GenExtRSAKey(
1351 	DEVHANDLE hDev,
1352 	ULONG ulBitsLen,
1353 	RSAPRIVATEKEYBLOB *pBlob)
1354 {
1355 	ULONG rv;
1356 
1357 	if (!skf_method) {
1358 		SKFerr(SKF_F_SKF_GENEXTRSAKEY,
1359 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1360 		return SAR_NOTINITIALIZEERR;
1361 	}
1362 
1363 	if (!skf_method->GenExtRSAKey) {
1364 		SKFerr(SKF_F_SKF_GENEXTRSAKEY,
1365 			SKF_R_FUNCTION_NOT_SUPPORTED);
1366 		return SAR_NOTSUPPORTYETERR;
1367 	}
1368 
1369 	if ((rv = skf_method->GenExtRSAKey(
1370 		hDev,
1371 		ulBitsLen,
1372 		pBlob)) != SAR_OK) {
1373 		SKFerr(SKF_F_SKF_GENEXTRSAKEY, skf_get_error_reason(rv));
1374 		return rv;
1375 	}
1376 
1377 	return SAR_OK;
1378 }
1379 
SKF_GenRSAKeyPair(HCONTAINER hContainer,ULONG ulBitsLen,RSAPUBLICKEYBLOB * pBlob)1380 ULONG DEVAPI SKF_GenRSAKeyPair(
1381 	HCONTAINER hContainer,
1382 	ULONG ulBitsLen,
1383 	RSAPUBLICKEYBLOB *pBlob)
1384 {
1385 	ULONG rv;
1386 
1387 	if (!skf_method) {
1388 		SKFerr(SKF_F_SKF_GENRSAKEYPAIR,
1389 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1390 		return SAR_NOTINITIALIZEERR;
1391 	}
1392 
1393 	if (!skf_method->GenRSAKeyPair) {
1394 		SKFerr(SKF_F_SKF_GENRSAKEYPAIR,
1395 			SKF_R_FUNCTION_NOT_SUPPORTED);
1396 		return SAR_NOTSUPPORTYETERR;
1397 	}
1398 
1399 	memset(pBlob, 0, sizeof(RSAPUBLICKEYBLOB));
1400 	if ((rv = skf_method->GenRSAKeyPair(
1401 		hContainer,
1402 		ulBitsLen,
1403 		pBlob)) != SAR_OK) {
1404 		SKFerr(SKF_F_SKF_GENRSAKEYPAIR, skf_get_error_reason(rv));
1405 		return rv;
1406 	}
1407 
1408 	return SAR_OK;
1409 }
1410 
SKF_ImportRSAKeyPair(HCONTAINER hContainer,ULONG ulSymAlgId,BYTE * pbWrappedKey,ULONG ulWrappedKeyLen,BYTE * pbEncryptedData,ULONG ulEncryptedDataLen)1411 ULONG DEVAPI SKF_ImportRSAKeyPair(
1412 	HCONTAINER hContainer,
1413 	ULONG ulSymAlgId,
1414 	BYTE *pbWrappedKey,
1415 	ULONG ulWrappedKeyLen,
1416 	BYTE *pbEncryptedData,
1417 	ULONG ulEncryptedDataLen)
1418 {
1419 	ULONG rv;
1420 
1421 	if (!skf_method) {
1422 		SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR,
1423 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1424 		return SAR_NOTINITIALIZEERR;
1425 	}
1426 
1427 	if (!skf_method->ImportRSAKeyPair) {
1428 		SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR,
1429 			SKF_R_FUNCTION_NOT_SUPPORTED);
1430 		return SAR_NOTSUPPORTYETERR;
1431 	}
1432 
1433 	if (skf_vendor) {
1434 		if (!(ulSymAlgId = skf_vendor->get_cipher_algor(ulSymAlgId))) {
1435 			SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR,
1436 				SKF_R_NOT_SUPPORTED_CIPHER_ALGOR);
1437 			return SAR_NOTSUPPORTYETERR;
1438 		}
1439 	}
1440 
1441 	if ((rv = skf_method->ImportRSAKeyPair(
1442 		hContainer,
1443 		ulSymAlgId,
1444 		pbWrappedKey,
1445 		ulWrappedKeyLen,
1446 		pbEncryptedData,
1447 		ulEncryptedDataLen)) != SAR_OK) {
1448 		SKFerr(SKF_F_SKF_IMPORTRSAKEYPAIR, skf_get_error_reason(rv));
1449 		return rv;
1450 	}
1451 
1452 	return SAR_OK;
1453 }
1454 
SKF_RSASignData(HCONTAINER hContainer,BYTE * pbData,ULONG ulDataLen,BYTE * pbSignature,ULONG * pulSignLen)1455 ULONG DEVAPI SKF_RSASignData(
1456 	HCONTAINER hContainer,
1457 	BYTE *pbData,
1458 	ULONG ulDataLen,
1459 	BYTE *pbSignature,
1460 	ULONG *pulSignLen)
1461 {
1462 	ULONG rv;
1463 
1464 	if (!skf_method) {
1465 		SKFerr(SKF_F_SKF_RSASIGNDATA,
1466 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1467 		return SAR_NOTINITIALIZEERR;
1468 	}
1469 
1470 	if (!skf_method->RSASignData) {
1471 		SKFerr(SKF_F_SKF_RSASIGNDATA,
1472 			SKF_R_FUNCTION_NOT_SUPPORTED);
1473 		return SAR_NOTSUPPORTYETERR;
1474 	}
1475 
1476 	if ((rv = skf_method->RSASignData(
1477 		hContainer,
1478 		pbData,
1479 		ulDataLen,
1480 		pbSignature,
1481 		pulSignLen)) != SAR_OK) {
1482 		SKFerr(SKF_F_SKF_RSASIGNDATA, skf_get_error_reason(rv));
1483 		return rv;
1484 	}
1485 
1486 	return SAR_OK;
1487 }
1488 
SKF_RSAVerify(DEVHANDLE hDev,RSAPUBLICKEYBLOB * pRSAPubKeyBlob,BYTE * pbData,ULONG ulDataLen,BYTE * pbSignature,ULONG ulSignLen)1489 ULONG DEVAPI SKF_RSAVerify(
1490 	DEVHANDLE hDev,
1491 	RSAPUBLICKEYBLOB *pRSAPubKeyBlob,
1492 	BYTE *pbData,
1493 	ULONG ulDataLen,
1494 	BYTE *pbSignature,
1495 	ULONG ulSignLen)
1496 {
1497 	ULONG rv;
1498 
1499 	if (!skf_method) {
1500 		SKFerr(SKF_F_SKF_RSAVERIFY,
1501 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1502 		return SAR_NOTINITIALIZEERR;
1503 	}
1504 
1505 	if (!skf_method->RSAVerify) {
1506 		SKFerr(SKF_F_SKF_RSAVERIFY,
1507 			SKF_R_FUNCTION_NOT_SUPPORTED);
1508 		return SAR_NOTSUPPORTYETERR;
1509 	}
1510 
1511 	if ((rv = skf_method->RSAVerify(
1512 		hDev,
1513 		pRSAPubKeyBlob,
1514 		pbData,
1515 		ulDataLen,
1516 		pbSignature,
1517 		ulSignLen)) != SAR_OK) {
1518 		SKFerr(SKF_F_SKF_RSAVERIFY, skf_get_error_reason(rv));
1519 		return rv;
1520 	}
1521 
1522 	return SAR_OK;
1523 }
1524 
SKF_RSAExportSessionKey(HCONTAINER hContainer,ULONG ulAlgId,RSAPUBLICKEYBLOB * pPubKey,BYTE * pbData,ULONG * pulDataLen,HANDLE * phSessionKey)1525 ULONG DEVAPI SKF_RSAExportSessionKey(
1526 	HCONTAINER hContainer,
1527 	ULONG ulAlgId,
1528 	RSAPUBLICKEYBLOB *pPubKey,
1529 	BYTE *pbData,
1530 	ULONG *pulDataLen,
1531 	HANDLE *phSessionKey)
1532 {
1533 	ULONG rv;
1534 
1535 	if (!skf_method) {
1536 		SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY,
1537 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1538 		return SAR_NOTINITIALIZEERR;
1539 	}
1540 
1541 	if (!skf_method->RSAExportSessionKey) {
1542 		SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY,
1543 			SKF_R_FUNCTION_NOT_SUPPORTED);
1544 		return SAR_NOTSUPPORTYETERR;
1545 	}
1546 
1547 	if (skf_vendor) {
1548 		if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) {
1549 			SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY,
1550 				SKF_R_NOT_SUPPORTED_CIPHER_ALGOR);
1551 			return SAR_NOTSUPPORTYETERR;
1552 		}
1553 	}
1554 
1555 	if ((rv = skf_method->RSAExportSessionKey(
1556 		hContainer,
1557 		ulAlgId,
1558 		pPubKey,
1559 		pbData,
1560 		pulDataLen,
1561 		phSessionKey)) != SAR_OK) {
1562 		SKFerr(SKF_F_SKF_RSAEXPORTSESSIONKEY, skf_get_error_reason(rv));
1563 		return rv;
1564 	}
1565 
1566 	return SAR_OK;
1567 }
1568 
SKF_ExtRSAPubKeyOperation(DEVHANDLE hDev,RSAPUBLICKEYBLOB * pRSAPubKeyBlob,BYTE * pbInput,ULONG ulInputLen,BYTE * pbOutput,ULONG * pulOutputLen)1569 ULONG DEVAPI SKF_ExtRSAPubKeyOperation(
1570 	DEVHANDLE hDev,
1571 	RSAPUBLICKEYBLOB *pRSAPubKeyBlob,
1572 	BYTE *pbInput,
1573 	ULONG ulInputLen,
1574 	BYTE *pbOutput,
1575 	ULONG *pulOutputLen)
1576 {
1577 	ULONG rv;
1578 
1579 	if (!skf_method) {
1580 		SKFerr(SKF_F_SKF_EXTRSAPUBKEYOPERATION,
1581 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1582 		return SAR_NOTINITIALIZEERR;
1583 	}
1584 
1585 	if (!skf_method->ExtRSAPubKeyOperation) {
1586 		SKFerr(SKF_F_SKF_EXTRSAPUBKEYOPERATION,
1587 			SKF_R_FUNCTION_NOT_SUPPORTED);
1588 		return SAR_NOTSUPPORTYETERR;
1589 	}
1590 
1591 	if ((rv = skf_method->ExtRSAPubKeyOperation(
1592 		hDev,
1593 		pRSAPubKeyBlob,
1594 		pbInput,
1595 		ulInputLen,
1596 		pbOutput,
1597 		pulOutputLen)) != SAR_OK) {
1598 		SKFerr(SKF_F_SKF_EXTRSAPUBKEYOPERATION, skf_get_error_reason(rv));
1599 		return rv;
1600 	}
1601 
1602 	return SAR_OK;
1603 }
1604 
SKF_ExtRSAPriKeyOperation(DEVHANDLE hDev,RSAPRIVATEKEYBLOB * pRSAPriKeyBlob,BYTE * pbInput,ULONG ulInputLen,BYTE * pbOutput,ULONG * pulOutputLen)1605 ULONG DEVAPI SKF_ExtRSAPriKeyOperation(
1606 	DEVHANDLE hDev,
1607 	RSAPRIVATEKEYBLOB *pRSAPriKeyBlob,
1608 	BYTE *pbInput,
1609 	ULONG ulInputLen,
1610 	BYTE *pbOutput,
1611 	ULONG *pulOutputLen)
1612 {
1613 	ULONG rv;
1614 
1615 	if (!skf_method) {
1616 		SKFerr(SKF_F_SKF_EXTRSAPRIKEYOPERATION,
1617 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1618 		return SAR_NOTINITIALIZEERR;
1619 	}
1620 
1621 	if (!skf_method->ExtRSAPriKeyOperation) {
1622 		SKFerr(SKF_F_SKF_EXTRSAPRIKEYOPERATION,
1623 			SKF_R_FUNCTION_NOT_SUPPORTED);
1624 		return SAR_NOTSUPPORTYETERR;
1625 	}
1626 
1627 	if ((rv = skf_method->ExtRSAPriKeyOperation(
1628 		hDev,
1629 		pRSAPriKeyBlob,
1630 		pbInput,
1631 		ulInputLen,
1632 		pbOutput,
1633 		pulOutputLen)) != SAR_OK) {
1634 		SKFerr(SKF_F_SKF_EXTRSAPRIKEYOPERATION, skf_get_error_reason(rv));
1635 		return rv;
1636 	}
1637 
1638 	return SAR_OK;
1639 }
1640 
SKF_GenECCKeyPair(HCONTAINER hContainer,ULONG ulAlgId,ECCPUBLICKEYBLOB * pBlob)1641 ULONG DEVAPI SKF_GenECCKeyPair(
1642 	HCONTAINER hContainer,
1643 	ULONG ulAlgId,
1644 	ECCPUBLICKEYBLOB *pBlob)
1645 {
1646 	ULONG rv;
1647 
1648 	if (!skf_method) {
1649 		SKFerr(SKF_F_SKF_GENECCKEYPAIR,
1650 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1651 		return SAR_NOTINITIALIZEERR;
1652 	}
1653 
1654 	if (!skf_method->GenECCKeyPair) {
1655 		SKFerr(SKF_F_SKF_GENECCKEYPAIR,
1656 			SKF_R_FUNCTION_NOT_SUPPORTED);
1657 		return SAR_NOTSUPPORTYETERR;
1658 	}
1659 
1660 	if (skf_vendor) {
1661 		if (!(ulAlgId = skf_vendor->get_pkey_algor(ulAlgId))) {
1662 			SKFerr(SKF_F_SKF_GENECCKEYPAIR,
1663 				SKF_R_NOT_SUPPORTED_PKEY_ALGOR);
1664 			return SAR_NOTSUPPORTYETERR;
1665 		}
1666 	}
1667 
1668 	memset(pBlob, 0, sizeof(ECCPUBLICKEYBLOB));
1669 	if ((rv = skf_method->GenECCKeyPair(
1670 		hContainer,
1671 		ulAlgId,
1672 		pBlob)) != SAR_OK) {
1673 		SKFerr(SKF_F_SKF_GENECCKEYPAIR, skf_get_error_reason(rv));
1674 		return rv;
1675 	}
1676 
1677 	return SAR_OK;
1678 }
1679 
SKF_ImportECCKeyPair(HCONTAINER hContainer,ENVELOPEDKEYBLOB * pEnvelopedKeyBlob)1680 ULONG DEVAPI SKF_ImportECCKeyPair(
1681 	HCONTAINER hContainer,
1682 	ENVELOPEDKEYBLOB *pEnvelopedKeyBlob)
1683 {
1684 	ULONG rv;
1685 
1686 	if (!skf_method) {
1687 		SKFerr(SKF_F_SKF_IMPORTECCKEYPAIR,
1688 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1689 		return SAR_NOTINITIALIZEERR;
1690 	}
1691 
1692 	if (!skf_method->ImportECCKeyPair) {
1693 		SKFerr(SKF_F_SKF_IMPORTECCKEYPAIR,
1694 			SKF_R_FUNCTION_NOT_SUPPORTED);
1695 		return SAR_NOTSUPPORTYETERR;
1696 	}
1697 
1698 	if ((rv = skf_method->ImportECCKeyPair(
1699 		hContainer,
1700 		pEnvelopedKeyBlob)) != SAR_OK) {
1701 		SKFerr(SKF_F_SKF_IMPORTECCKEYPAIR, skf_get_error_reason(rv));
1702 		printf("%s %d: error = %08X\n", __FILE__, __LINE__, rv);
1703 		return rv;
1704 	}
1705 
1706 	return SAR_OK;
1707 }
1708 
SKF_ECCSignData(HCONTAINER hContainer,BYTE * pbDigest,ULONG ulDigestLen,ECCSIGNATUREBLOB * pSignature)1709 ULONG DEVAPI SKF_ECCSignData(
1710 	HCONTAINER hContainer,
1711 	BYTE *pbDigest,
1712 	ULONG ulDigestLen,
1713 	ECCSIGNATUREBLOB *pSignature)
1714 {
1715 	ULONG rv;
1716 
1717 	if (!skf_method) {
1718 		SKFerr(SKF_F_SKF_ECCSIGNDATA,
1719 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1720 		return SAR_NOTINITIALIZEERR;
1721 	}
1722 
1723 	if (!skf_method->ECCSignData) {
1724 		SKFerr(SKF_F_SKF_ECCSIGNDATA,
1725 			SKF_R_FUNCTION_NOT_SUPPORTED);
1726 		return SAR_NOTSUPPORTYETERR;
1727 	}
1728 
1729 	if ((rv = skf_method->ECCSignData(
1730 		hContainer,
1731 		pbDigest,
1732 		ulDigestLen,
1733 		pSignature)) != SAR_OK) {
1734 		SKFerr(SKF_F_SKF_ECCSIGNDATA, skf_get_error_reason(rv));
1735 		return rv;
1736 	}
1737 
1738 	return SAR_OK;
1739 }
1740 
SKF_ECCVerify(DEVHANDLE hDev,ECCPUBLICKEYBLOB * pECCPubKeyBlob,BYTE * pbData,ULONG ulDataLen,ECCSIGNATUREBLOB * pSignature)1741 ULONG DEVAPI SKF_ECCVerify(
1742 	DEVHANDLE hDev,
1743 	ECCPUBLICKEYBLOB *pECCPubKeyBlob,
1744 	BYTE *pbData,
1745 	ULONG ulDataLen,
1746 	ECCSIGNATUREBLOB *pSignature)
1747 {
1748 	ULONG rv;
1749 
1750 	if (!skf_method) {
1751 		SKFerr(SKF_F_SKF_ECCVERIFY,
1752 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1753 		return SAR_NOTINITIALIZEERR;
1754 	}
1755 
1756 	if (!skf_method->ECCVerify) {
1757 		SKFerr(SKF_F_SKF_ECCVERIFY,
1758 			SKF_R_FUNCTION_NOT_SUPPORTED);
1759 		return SAR_NOTSUPPORTYETERR;
1760 	}
1761 
1762 	if ((rv = skf_method->ECCVerify(
1763 		hDev,
1764 		pECCPubKeyBlob,
1765 		pbData,
1766 		ulDataLen,
1767 		pSignature)) != SAR_OK) {
1768 		SKFerr(SKF_F_SKF_ECCVERIFY, skf_get_error_reason(rv));
1769 		return rv;
1770 	}
1771 
1772 	return SAR_OK;
1773 }
1774 
SKF_ECCExportSessionKey(HCONTAINER hContainer,ULONG ulAlgId,ECCPUBLICKEYBLOB * pPubKey,ECCCIPHERBLOB * pData,HANDLE * phSessionKey)1775 ULONG DEVAPI SKF_ECCExportSessionKey(
1776 	HCONTAINER hContainer,
1777 	ULONG ulAlgId,
1778 	ECCPUBLICKEYBLOB *pPubKey,
1779 	ECCCIPHERBLOB *pData,
1780 	HANDLE *phSessionKey)
1781 {
1782 	ULONG rv;
1783 
1784 	if (!skf_method) {
1785 		SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY,
1786 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1787 		return SAR_NOTINITIALIZEERR;
1788 	}
1789 
1790 	if (!skf_method->ECCExportSessionKey) {
1791 		SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY,
1792 			SKF_R_FUNCTION_NOT_SUPPORTED);
1793 		return SAR_NOTSUPPORTYETERR;
1794 	}
1795 
1796 	if (skf_vendor) {
1797 		if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) {
1798 			SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY,
1799 				SKF_R_NOT_SUPPORTED_CIPHER_ALGOR);
1800 			return SAR_NOTSUPPORTYETERR;
1801 		}
1802 	}
1803 
1804 	if ((rv = skf_method->ECCExportSessionKey(
1805 		hContainer,
1806 		ulAlgId,
1807 		pPubKey,
1808 		pData,
1809 		phSessionKey)) != SAR_OK) {
1810 		SKFerr(SKF_F_SKF_ECCEXPORTSESSIONKEY, skf_get_error_reason(rv));
1811 		return rv;
1812 	}
1813 
1814 	return SAR_OK;
1815 }
1816 
SKF_ECCDecrypt(HCONTAINER hContainer,ECCCIPHERBLOB * pCipherText,BYTE * pbPlainText,ULONG * pulPlainTextLen)1817 ULONG DEVAPI SKF_ECCDecrypt(
1818 	HCONTAINER hContainer,
1819 	ECCCIPHERBLOB *pCipherText,
1820 	BYTE *pbPlainText,
1821 	ULONG *pulPlainTextLen)
1822 {
1823 	ULONG rv;
1824 
1825 	if (!skf_method) {
1826 		SKFerr(SKF_F_SKF_ECCDECRYPT,
1827 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1828 		return SAR_NOTINITIALIZEERR;
1829 	}
1830 
1831 	if (!skf_method->ECCDecrypt) {
1832 		SKFerr(SKF_F_SKF_ECCDECRYPT,
1833 			SKF_R_FUNCTION_NOT_SUPPORTED);
1834 		return SAR_NOTSUPPORTYETERR;
1835 	}
1836 
1837 	if ((rv = skf_method->ECCDecrypt(
1838 		hContainer,
1839 		pCipherText,
1840 		pbPlainText,
1841 		pulPlainTextLen)) != SAR_OK) {
1842 		SKFerr(SKF_F_SKF_ECCDECRYPT, skf_get_error_reason(rv));
1843 		return rv;
1844 	}
1845 
1846 	return SAR_OK;
1847 }
1848 
SKF_ExtECCEncrypt(DEVHANDLE hDev,ECCPUBLICKEYBLOB * pECCPubKeyBlob,BYTE * pbPlainText,ULONG ulPlainTextLen,ECCCIPHERBLOB * pCipherText)1849 ULONG DEVAPI SKF_ExtECCEncrypt(
1850 	DEVHANDLE hDev,
1851 	ECCPUBLICKEYBLOB *pECCPubKeyBlob,
1852 	BYTE *pbPlainText,
1853 	ULONG ulPlainTextLen,
1854 	ECCCIPHERBLOB *pCipherText)
1855 {
1856 	ULONG rv;
1857 
1858 	if (!skf_method) {
1859 		SKFerr(SKF_F_SKF_EXTECCENCRYPT,
1860 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1861 		return SAR_NOTINITIALIZEERR;
1862 	}
1863 
1864 	if (!skf_method->ExtECCEncrypt) {
1865 		SKFerr(SKF_F_SKF_EXTECCENCRYPT,
1866 			SKF_R_FUNCTION_NOT_SUPPORTED);
1867 		return SAR_NOTSUPPORTYETERR;
1868 	}
1869 
1870 	if ((rv = skf_method->ExtECCEncrypt(
1871 		hDev,
1872 		pECCPubKeyBlob,
1873 		pbPlainText,
1874 		ulPlainTextLen,
1875 		pCipherText)) != SAR_OK) {
1876 		SKFerr(SKF_F_SKF_EXTECCENCRYPT, skf_get_error_reason(rv));
1877 		return rv;
1878 	}
1879 
1880 	return SAR_OK;
1881 }
1882 
SKF_ExtECCDecrypt(DEVHANDLE hDev,ECCPRIVATEKEYBLOB * pECCPriKeyBlob,ECCCIPHERBLOB * pCipherText,BYTE * pbPlainText,ULONG * pulPlainTextLen)1883 ULONG DEVAPI SKF_ExtECCDecrypt(
1884 	DEVHANDLE hDev,
1885 	ECCPRIVATEKEYBLOB *pECCPriKeyBlob,
1886 	ECCCIPHERBLOB *pCipherText,
1887 	BYTE *pbPlainText,
1888 	ULONG *pulPlainTextLen)
1889 {
1890 	ULONG rv;
1891 
1892 	if (!skf_method) {
1893 		SKFerr(SKF_F_SKF_EXTECCDECRYPT,
1894 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1895 		return SAR_NOTINITIALIZEERR;
1896 	}
1897 
1898 	if (!skf_method->ExtECCDecrypt) {
1899 		SKFerr(SKF_F_SKF_EXTECCDECRYPT,
1900 			SKF_R_FUNCTION_NOT_SUPPORTED);
1901 		return SAR_NOTSUPPORTYETERR;
1902 	}
1903 
1904 	if ((rv = skf_method->ExtECCDecrypt(
1905 		hDev,
1906 		pECCPriKeyBlob,
1907 		pCipherText,
1908 		pbPlainText,
1909 		pulPlainTextLen)) != SAR_OK) {
1910 		SKFerr(SKF_F_SKF_EXTECCDECRYPT, skf_get_error_reason(rv));
1911 		return rv;
1912 	}
1913 
1914 	return SAR_OK;
1915 }
1916 
SKF_ExtECCSign(DEVHANDLE hDev,ECCPRIVATEKEYBLOB * pECCPriKeyBlob,BYTE * pbData,ULONG ulDataLen,ECCSIGNATUREBLOB * pSignature)1917 ULONG DEVAPI SKF_ExtECCSign(
1918 	DEVHANDLE hDev,
1919 	ECCPRIVATEKEYBLOB *pECCPriKeyBlob,
1920 	BYTE *pbData,
1921 	ULONG ulDataLen,
1922 	ECCSIGNATUREBLOB *pSignature)
1923 {
1924 	ULONG rv;
1925 
1926 	if (!skf_method) {
1927 		SKFerr(SKF_F_SKF_EXTECCSIGN,
1928 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1929 		return SAR_NOTINITIALIZEERR;
1930 	}
1931 
1932 	if (!skf_method->ExtECCSign) {
1933 		SKFerr(SKF_F_SKF_EXTECCSIGN,
1934 			SKF_R_FUNCTION_NOT_SUPPORTED);
1935 		return SAR_NOTSUPPORTYETERR;
1936 	}
1937 
1938 	if ((rv = skf_method->ExtECCSign(
1939 		hDev,
1940 		pECCPriKeyBlob,
1941 		pbData,
1942 		ulDataLen,
1943 		pSignature)) != SAR_OK) {
1944 		SKFerr(SKF_F_SKF_EXTECCSIGN, skf_get_error_reason(rv));
1945 		return rv;
1946 	}
1947 
1948 	return SAR_OK;
1949 }
1950 
SKF_ExtECCVerify(DEVHANDLE hDev,ECCPUBLICKEYBLOB * pECCPubKeyBlob,BYTE * pbData,ULONG ulDataLen,ECCSIGNATUREBLOB * pSignature)1951 ULONG DEVAPI SKF_ExtECCVerify(
1952 	DEVHANDLE hDev,
1953 	ECCPUBLICKEYBLOB *pECCPubKeyBlob,
1954 	BYTE *pbData,
1955 	ULONG ulDataLen,
1956 	ECCSIGNATUREBLOB *pSignature)
1957 {
1958 	ULONG rv;
1959 
1960 	if (!skf_method) {
1961 		SKFerr(SKF_F_SKF_EXTECCVERIFY,
1962 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1963 		return SAR_NOTINITIALIZEERR;
1964 	}
1965 
1966 	if (!skf_method->ExtECCVerify) {
1967 		SKFerr(SKF_F_SKF_EXTECCVERIFY,
1968 			SKF_R_FUNCTION_NOT_SUPPORTED);
1969 		return SAR_NOTSUPPORTYETERR;
1970 	}
1971 
1972 	if ((rv = skf_method->ExtECCVerify(
1973 		hDev,
1974 		pECCPubKeyBlob,
1975 		pbData,
1976 		ulDataLen,
1977 		pSignature)) != SAR_OK) {
1978 		SKFerr(SKF_F_SKF_EXTECCVERIFY, skf_get_error_reason(rv));
1979 		return rv;
1980 	}
1981 
1982 	return SAR_OK;
1983 }
1984 
SKF_GenerateAgreementDataWithECC(HCONTAINER hContainer,ULONG ulAlgId,ECCPUBLICKEYBLOB * pTempECCPubKeyBlob,BYTE * pbID,ULONG ulIDLen,HANDLE * phAgreementHandle)1985 ULONG DEVAPI SKF_GenerateAgreementDataWithECC(
1986 	HCONTAINER hContainer,
1987 	ULONG ulAlgId,
1988 	ECCPUBLICKEYBLOB *pTempECCPubKeyBlob,
1989 	BYTE *pbID,
1990 	ULONG ulIDLen,
1991 	HANDLE *phAgreementHandle)
1992 {
1993 	ULONG rv;
1994 
1995 	if (!skf_method) {
1996 		SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC,
1997 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
1998 		return SAR_NOTINITIALIZEERR;
1999 	}
2000 
2001 	if (!skf_method->GenerateAgreementDataWithECC) {
2002 		SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC,
2003 			SKF_R_FUNCTION_NOT_SUPPORTED);
2004 		return SAR_NOTSUPPORTYETERR;
2005 	}
2006 
2007 	if (skf_vendor) {
2008 		if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) {
2009 			SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC,
2010 				SKF_R_NOT_SUPPORTED_CIPHER_ALGOR);
2011 			return SAR_NOTSUPPORTYETERR;
2012 		}
2013 	}
2014 
2015 	if ((rv = skf_method->GenerateAgreementDataWithECC(
2016 		hContainer,
2017 		ulAlgId,
2018 		pTempECCPubKeyBlob,
2019 		pbID,
2020 		ulIDLen,
2021 		phAgreementHandle)) != SAR_OK) {
2022 		SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAWITHECC, skf_get_error_reason(rv));
2023 		return rv;
2024 	}
2025 
2026 	return SAR_OK;
2027 }
2028 
SKF_GenerateAgreementDataAndKeyWithECC(HANDLE hContainer,ULONG ulAlgId,ECCPUBLICKEYBLOB * pSponsorECCPubKeyBlob,ECCPUBLICKEYBLOB * pSponsorTempECCPubKeyBlob,ECCPUBLICKEYBLOB * pTempECCPubKeyBlob,BYTE * pbID,ULONG ulIDLen,BYTE * pbSponsorID,ULONG ulSponsorIDLen,HANDLE * phKeyHandle)2029 ULONG DEVAPI SKF_GenerateAgreementDataAndKeyWithECC(
2030 	HANDLE hContainer,
2031 	ULONG ulAlgId,
2032 	ECCPUBLICKEYBLOB *pSponsorECCPubKeyBlob,
2033 	ECCPUBLICKEYBLOB *pSponsorTempECCPubKeyBlob,
2034 	ECCPUBLICKEYBLOB *pTempECCPubKeyBlob,
2035 	BYTE *pbID,
2036 	ULONG ulIDLen,
2037 	BYTE *pbSponsorID,
2038 	ULONG ulSponsorIDLen,
2039 	HANDLE *phKeyHandle)
2040 {
2041 	ULONG rv;
2042 
2043 	if (!skf_method) {
2044 		SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC,
2045 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2046 		return SAR_NOTINITIALIZEERR;
2047 	}
2048 
2049 	if (!skf_method->GenerateAgreementDataAndKeyWithECC) {
2050 		SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC,
2051 			SKF_R_FUNCTION_NOT_SUPPORTED);
2052 		return SAR_NOTSUPPORTYETERR;
2053 	}
2054 
2055 	if (skf_vendor) {
2056 		if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) {
2057 			SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC,
2058 				SKF_R_NOT_SUPPORTED_CIPHER_ALGOR);
2059 			return SAR_NOTSUPPORTYETERR;
2060 		}
2061 	}
2062 
2063 	if ((rv = skf_method->GenerateAgreementDataAndKeyWithECC(
2064 		hContainer,
2065 		ulAlgId,
2066 		pSponsorECCPubKeyBlob,
2067 		pSponsorTempECCPubKeyBlob,
2068 		pTempECCPubKeyBlob,
2069 		pbID,
2070 		ulIDLen,
2071 		pbSponsorID,
2072 		ulSponsorIDLen,
2073 		phKeyHandle)) != SAR_OK) {
2074 		SKFerr(SKF_F_SKF_GENERATEAGREEMENTDATAANDKEYWITHECC, skf_get_error_reason(rv));
2075 		return rv;
2076 	}
2077 
2078 	return SAR_OK;
2079 }
2080 
SKF_GenerateKeyWithECC(HANDLE hAgreementHandle,ECCPUBLICKEYBLOB * pECCPubKeyBlob,ECCPUBLICKEYBLOB * pTempECCPubKeyBlob,BYTE * pbID,ULONG ulIDLen,HANDLE * phKeyHandle)2081 ULONG DEVAPI SKF_GenerateKeyWithECC(
2082 	HANDLE hAgreementHandle,
2083 	ECCPUBLICKEYBLOB *pECCPubKeyBlob,
2084 	ECCPUBLICKEYBLOB *pTempECCPubKeyBlob,
2085 	BYTE *pbID,
2086 	ULONG ulIDLen,
2087 	HANDLE *phKeyHandle)
2088 {
2089 	ULONG rv;
2090 
2091 	if (!skf_method) {
2092 		SKFerr(SKF_F_SKF_GENERATEKEYWITHECC,
2093 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2094 		return SAR_NOTINITIALIZEERR;
2095 	}
2096 
2097 	if (!skf_method->GenerateKeyWithECC) {
2098 		SKFerr(SKF_F_SKF_GENERATEKEYWITHECC,
2099 			SKF_R_FUNCTION_NOT_SUPPORTED);
2100 		return SAR_NOTSUPPORTYETERR;
2101 	}
2102 
2103 	if ((rv = skf_method->GenerateKeyWithECC(
2104 		hAgreementHandle,
2105 		pECCPubKeyBlob,
2106 		pTempECCPubKeyBlob,
2107 		pbID,
2108 		ulIDLen,
2109 		phKeyHandle)) != SAR_OK) {
2110 		SKFerr(SKF_F_SKF_GENERATEKEYWITHECC, skf_get_error_reason(rv));
2111 		return rv;
2112 	}
2113 
2114 	return SAR_OK;
2115 }
2116 
SKF_ImportSessionKey(HCONTAINER hContainer,ULONG ulAlgId,BYTE * pbWrapedData,ULONG ulWrapedLen,HANDLE * phKey)2117 ULONG DEVAPI SKF_ImportSessionKey(
2118 	HCONTAINER hContainer,
2119 	ULONG ulAlgId,
2120 	BYTE *pbWrapedData,
2121 	ULONG ulWrapedLen,
2122 	HANDLE *phKey)
2123 {
2124 	ULONG rv;
2125 
2126 	if (!skf_method) {
2127 		SKFerr(SKF_F_SKF_IMPORTSESSIONKEY,
2128 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2129 		return SAR_NOTINITIALIZEERR;
2130 	}
2131 
2132 	if (!skf_method->ImportSessionKey) {
2133 		SKFerr(SKF_F_SKF_IMPORTSESSIONKEY,
2134 			SKF_R_FUNCTION_NOT_SUPPORTED);
2135 		return SAR_NOTSUPPORTYETERR;
2136 	}
2137 
2138 	if (skf_vendor) {
2139 		if (!(ulAlgId = skf_vendor->get_cipher_algor(ulAlgId))) {
2140 			SKFerr(SKF_F_SKF_IMPORTSESSIONKEY,
2141 				SKF_R_NOT_SUPPORTED_CIPHER_ALGOR);
2142 			return SAR_NOTSUPPORTYETERR;
2143 		}
2144 	}
2145 
2146 	if ((rv = skf_method->ImportSessionKey(
2147 		hContainer,
2148 		ulAlgId,
2149 		pbWrapedData,
2150 		ulWrapedLen,
2151 		phKey)) != SAR_OK) {
2152 		SKFerr(SKF_F_SKF_IMPORTSESSIONKEY, skf_get_error_reason(rv));
2153 		return rv;
2154 	}
2155 
2156 	return SAR_OK;
2157 }
2158 
SKF_SetSymmKey(DEVHANDLE hDev,BYTE * pbKey,ULONG ulAlgID,HANDLE * phKey)2159 ULONG DEVAPI SKF_SetSymmKey(
2160 	DEVHANDLE hDev,
2161 	BYTE *pbKey,
2162 	ULONG ulAlgID,
2163 	HANDLE *phKey)
2164 {
2165 	ULONG rv;
2166 
2167 	if (!skf_method) {
2168 		SKFerr(SKF_F_SKF_SETSYMMKEY,
2169 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2170 		return SAR_NOTINITIALIZEERR;
2171 	}
2172 
2173 	if (!skf_method->SetSymmKey) {
2174 		SKFerr(SKF_F_SKF_SETSYMMKEY,
2175 			SKF_R_FUNCTION_NOT_SUPPORTED);
2176 		return SAR_NOTSUPPORTYETERR;
2177 	}
2178 
2179 	if (skf_vendor) {
2180 		if (!(ulAlgID = skf_vendor->get_cipher_algor(ulAlgID))) {
2181 			SKFerr(SKF_F_SKF_SETSYMMKEY,
2182 				SKF_R_NOT_SUPPORTED_CIPHER_ALGOR);
2183 			return SAR_NOTSUPPORTYETERR;
2184 		}
2185 	}
2186 
2187 	if ((rv = skf_method->SetSymmKey(
2188 		hDev,
2189 		pbKey,
2190 		ulAlgID,
2191 		phKey)) != SAR_OK) {
2192 		SKFerr(SKF_F_SKF_SETSYMMKEY, skf_get_error_reason(rv));
2193 		return rv;
2194 	}
2195 
2196 	return SAR_OK;
2197 }
2198 
SKF_EncryptInit(HANDLE hKey,BLOCKCIPHERPARAM EncryptParam)2199 ULONG DEVAPI SKF_EncryptInit(
2200 	HANDLE hKey,
2201 	BLOCKCIPHERPARAM EncryptParam)
2202 {
2203 	ULONG rv;
2204 
2205 	if (!skf_method) {
2206 		SKFerr(SKF_F_SKF_ENCRYPTINIT,
2207 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2208 		return SAR_NOTINITIALIZEERR;
2209 	}
2210 
2211 	if (!skf_method->EncryptInit) {
2212 		SKFerr(SKF_F_SKF_ENCRYPTINIT,
2213 			SKF_R_FUNCTION_NOT_SUPPORTED);
2214 		return SAR_NOTSUPPORTYETERR;
2215 	}
2216 
2217 	if ((rv = skf_method->EncryptInit(
2218 		hKey,
2219 		EncryptParam)) != SAR_OK) {
2220 		SKFerr(SKF_F_SKF_ENCRYPTINIT, skf_get_error_reason(rv));
2221 		return rv;
2222 	}
2223 
2224 	return SAR_OK;
2225 }
2226 
SKF_Encrypt(HANDLE hKey,BYTE * pbData,ULONG ulDataLen,BYTE * pbEncryptedData,ULONG * pulEncryptedLen)2227 ULONG DEVAPI SKF_Encrypt(
2228 	HANDLE hKey,
2229 	BYTE *pbData,
2230 	ULONG ulDataLen,
2231 	BYTE *pbEncryptedData,
2232 	ULONG *pulEncryptedLen)
2233 {
2234 	ULONG rv;
2235 
2236 	if (!skf_method) {
2237 		SKFerr(SKF_F_SKF_ENCRYPT,
2238 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2239 		return SAR_NOTINITIALIZEERR;
2240 	}
2241 
2242 	if (!skf_method->Encrypt) {
2243 		SKFerr(SKF_F_SKF_ENCRYPT,
2244 			SKF_R_FUNCTION_NOT_SUPPORTED);
2245 		return SAR_NOTSUPPORTYETERR;
2246 	}
2247 
2248 	if ((rv = skf_method->Encrypt(
2249 		hKey,
2250 		pbData,
2251 		ulDataLen,
2252 		pbEncryptedData,
2253 		pulEncryptedLen)) != SAR_OK) {
2254 		SKFerr(SKF_F_SKF_ENCRYPT, skf_get_error_reason(rv));
2255 		return rv;
2256 	}
2257 
2258 	return SAR_OK;
2259 }
2260 
SKF_EncryptUpdate(HANDLE hKey,BYTE * pbData,ULONG ulDataLen,BYTE * pbEncryptedData,ULONG * pulEncryptedLen)2261 ULONG DEVAPI SKF_EncryptUpdate(
2262 	HANDLE hKey,
2263 	BYTE *pbData,
2264 	ULONG ulDataLen,
2265 	BYTE *pbEncryptedData,
2266 	ULONG *pulEncryptedLen)
2267 {
2268 	ULONG rv;
2269 
2270 	if (!skf_method) {
2271 		SKFerr(SKF_F_SKF_ENCRYPTUPDATE,
2272 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2273 		return SAR_NOTINITIALIZEERR;
2274 	}
2275 
2276 	if (!skf_method->EncryptUpdate) {
2277 		SKFerr(SKF_F_SKF_ENCRYPTUPDATE,
2278 			SKF_R_FUNCTION_NOT_SUPPORTED);
2279 		return SAR_NOTSUPPORTYETERR;
2280 	}
2281 
2282 	if ((rv = skf_method->EncryptUpdate(
2283 		hKey,
2284 		pbData,
2285 		ulDataLen,
2286 		pbEncryptedData,
2287 		pulEncryptedLen)) != SAR_OK) {
2288 		SKFerr(SKF_F_SKF_ENCRYPTUPDATE, skf_get_error_reason(rv));
2289 		return rv;
2290 	}
2291 
2292 	return SAR_OK;
2293 }
2294 
SKF_EncryptFinal(HANDLE hKey,BYTE * pbEncryptedData,ULONG * pulEncryptedDataLen)2295 ULONG DEVAPI SKF_EncryptFinal(
2296 	HANDLE hKey,
2297 	BYTE *pbEncryptedData,
2298 	ULONG *pulEncryptedDataLen)
2299 {
2300 	ULONG rv;
2301 
2302 	if (!skf_method) {
2303 		SKFerr(SKF_F_SKF_ENCRYPTFINAL,
2304 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2305 		return SAR_NOTINITIALIZEERR;
2306 	}
2307 
2308 	if (!skf_method->EncryptFinal) {
2309 		SKFerr(SKF_F_SKF_ENCRYPTFINAL,
2310 			SKF_R_FUNCTION_NOT_SUPPORTED);
2311 		return SAR_NOTSUPPORTYETERR;
2312 	}
2313 
2314 	if ((rv = skf_method->EncryptFinal(
2315 		hKey,
2316 		pbEncryptedData,
2317 		pulEncryptedDataLen)) != SAR_OK) {
2318 		SKFerr(SKF_F_SKF_ENCRYPTFINAL, skf_get_error_reason(rv));
2319 		return rv;
2320 	}
2321 
2322 	return SAR_OK;
2323 }
2324 
SKF_DecryptInit(HANDLE hKey,BLOCKCIPHERPARAM DecryptParam)2325 ULONG DEVAPI SKF_DecryptInit(
2326 	HANDLE hKey,
2327 	BLOCKCIPHERPARAM DecryptParam)
2328 {
2329 	ULONG rv;
2330 
2331 	if (!skf_method) {
2332 		SKFerr(SKF_F_SKF_DECRYPTINIT,
2333 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2334 		return SAR_NOTINITIALIZEERR;
2335 	}
2336 
2337 	if (!skf_method->DecryptInit) {
2338 		SKFerr(SKF_F_SKF_DECRYPTINIT,
2339 			SKF_R_FUNCTION_NOT_SUPPORTED);
2340 		return SAR_NOTSUPPORTYETERR;
2341 	}
2342 
2343 	if ((rv = skf_method->DecryptInit(
2344 		hKey,
2345 		DecryptParam)) != SAR_OK) {
2346 		SKFerr(SKF_F_SKF_DECRYPTINIT, skf_get_error_reason(rv));
2347 		return rv;
2348 	}
2349 
2350 	return SAR_OK;
2351 }
2352 
SKF_Decrypt(HANDLE hKey,BYTE * pbEncryptedData,ULONG ulEncryptedLen,BYTE * pbData,ULONG * pulDataLen)2353 ULONG DEVAPI SKF_Decrypt(
2354 	HANDLE hKey,
2355 	BYTE *pbEncryptedData,
2356 	ULONG ulEncryptedLen,
2357 	BYTE *pbData,
2358 	ULONG *pulDataLen)
2359 {
2360 	ULONG rv;
2361 
2362 	if (!skf_method) {
2363 		SKFerr(SKF_F_SKF_DECRYPT,
2364 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2365 		return SAR_NOTINITIALIZEERR;
2366 	}
2367 
2368 	if (!skf_method->Decrypt) {
2369 		SKFerr(SKF_F_SKF_DECRYPT,
2370 			SKF_R_FUNCTION_NOT_SUPPORTED);
2371 		return SAR_NOTSUPPORTYETERR;
2372 	}
2373 
2374 	if ((rv = skf_method->Decrypt(
2375 		hKey,
2376 		pbEncryptedData,
2377 		ulEncryptedLen,
2378 		pbData,
2379 		pulDataLen)) != SAR_OK) {
2380 		SKFerr(SKF_F_SKF_DECRYPT, skf_get_error_reason(rv));
2381 		return rv;
2382 	}
2383 
2384 	return SAR_OK;
2385 }
2386 
SKF_DecryptUpdate(HANDLE hKey,BYTE * pbEncryptedData,ULONG ulEncryptedLen,BYTE * pbData,ULONG * pulDataLen)2387 ULONG DEVAPI SKF_DecryptUpdate(
2388 	HANDLE hKey,
2389 	BYTE *pbEncryptedData,
2390 	ULONG ulEncryptedLen,
2391 	BYTE *pbData,
2392 	ULONG *pulDataLen)
2393 {
2394 	ULONG rv;
2395 
2396 	if (!skf_method) {
2397 		SKFerr(SKF_F_SKF_DECRYPTUPDATE,
2398 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2399 		return SAR_NOTINITIALIZEERR;
2400 	}
2401 
2402 	if (!skf_method->DecryptUpdate) {
2403 		SKFerr(SKF_F_SKF_DECRYPTUPDATE,
2404 			SKF_R_FUNCTION_NOT_SUPPORTED);
2405 		return SAR_NOTSUPPORTYETERR;
2406 	}
2407 
2408 	if ((rv = skf_method->DecryptUpdate(
2409 		hKey,
2410 		pbEncryptedData,
2411 		ulEncryptedLen,
2412 		pbData,
2413 		pulDataLen)) != SAR_OK) {
2414 		SKFerr(SKF_F_SKF_DECRYPTUPDATE, skf_get_error_reason(rv));
2415 		return rv;
2416 	}
2417 
2418 	return SAR_OK;
2419 }
2420 
SKF_DecryptFinal(HANDLE hKey,BYTE * pbDecryptedData,ULONG * pulDecryptedDataLen)2421 ULONG DEVAPI SKF_DecryptFinal(
2422 	HANDLE hKey,
2423 	BYTE *pbDecryptedData,
2424 	ULONG *pulDecryptedDataLen)
2425 {
2426 	ULONG rv;
2427 
2428 	if (!skf_method) {
2429 		SKFerr(SKF_F_SKF_DECRYPTFINAL,
2430 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2431 		return SAR_NOTINITIALIZEERR;
2432 	}
2433 
2434 	if (!skf_method->DecryptFinal) {
2435 		SKFerr(SKF_F_SKF_DECRYPTFINAL,
2436 			SKF_R_FUNCTION_NOT_SUPPORTED);
2437 		return SAR_NOTSUPPORTYETERR;
2438 	}
2439 
2440 	if ((rv = skf_method->DecryptFinal(
2441 		hKey,
2442 		pbDecryptedData,
2443 		pulDecryptedDataLen)) != SAR_OK) {
2444 		SKFerr(SKF_F_SKF_DECRYPTFINAL, skf_get_error_reason(rv));
2445 		return rv;
2446 	}
2447 
2448 	return SAR_OK;
2449 }
2450 
SKF_DigestInit(DEVHANDLE hDev,ULONG ulAlgID,ECCPUBLICKEYBLOB * pPubKey,BYTE * pbID,ULONG ulIDLen,HANDLE * phHash)2451 ULONG DEVAPI SKF_DigestInit(
2452 	DEVHANDLE hDev,
2453 	ULONG ulAlgID,
2454 	ECCPUBLICKEYBLOB *pPubKey,
2455 	BYTE *pbID,
2456 	ULONG ulIDLen,
2457 	HANDLE *phHash)
2458 {
2459 	ULONG rv;
2460 
2461 	if (!skf_method) {
2462 		SKFerr(SKF_F_SKF_DIGESTINIT,
2463 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2464 		return SAR_NOTINITIALIZEERR;
2465 	}
2466 
2467 	if (!skf_method->DigestInit) {
2468 		SKFerr(SKF_F_SKF_DIGESTINIT,
2469 			SKF_R_FUNCTION_NOT_SUPPORTED);
2470 		return SAR_NOTSUPPORTYETERR;
2471 	}
2472 
2473 	if (skf_vendor) {
2474 		if (!(ulAlgID = skf_vendor->get_digest_algor(ulAlgID))) {
2475 			SKFerr(SKF_F_SKF_DIGESTINIT,
2476 				SKF_R_NOT_SUPPORTED_DIGEST_ALGOR);
2477 			return SAR_NOTSUPPORTYETERR;
2478 		}
2479 	}
2480 
2481 	if ((rv = skf_method->DigestInit(
2482 		hDev,
2483 		ulAlgID,
2484 		pPubKey,
2485 		pbID,
2486 		ulIDLen,
2487 		phHash)) != SAR_OK) {
2488 		SKFerr(SKF_F_SKF_DIGESTINIT, skf_get_error_reason(rv));
2489 		return rv;
2490 	}
2491 
2492 	return SAR_OK;
2493 }
2494 
SKF_Digest(HANDLE hHash,BYTE * pbData,ULONG ulDataLen,BYTE * pbHashData,ULONG * pulHashLen)2495 ULONG DEVAPI SKF_Digest(
2496 	HANDLE hHash,
2497 	BYTE *pbData,
2498 	ULONG ulDataLen,
2499 	BYTE *pbHashData,
2500 	ULONG *pulHashLen)
2501 {
2502 	ULONG rv;
2503 
2504 	if (!skf_method) {
2505 		SKFerr(SKF_F_SKF_DIGEST,
2506 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2507 		return SAR_NOTINITIALIZEERR;
2508 	}
2509 
2510 	if (!skf_method->Digest) {
2511 		SKFerr(SKF_F_SKF_DIGEST,
2512 			SKF_R_FUNCTION_NOT_SUPPORTED);
2513 		return SAR_NOTSUPPORTYETERR;
2514 	}
2515 
2516 	if ((rv = skf_method->Digest(
2517 		hHash,
2518 		pbData,
2519 		ulDataLen,
2520 		pbHashData,
2521 		pulHashLen)) != SAR_OK) {
2522 		SKFerr(SKF_F_SKF_DIGEST, skf_get_error_reason(rv));
2523 		return rv;
2524 	}
2525 
2526 	return SAR_OK;
2527 }
2528 
SKF_DigestUpdate(HANDLE hHash,BYTE * pbData,ULONG ulDataLen)2529 ULONG DEVAPI SKF_DigestUpdate(
2530 	HANDLE hHash,
2531 	BYTE *pbData,
2532 	ULONG ulDataLen)
2533 {
2534 	ULONG rv;
2535 
2536 	if (!skf_method) {
2537 		SKFerr(SKF_F_SKF_DIGESTUPDATE,
2538 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2539 		return SAR_NOTINITIALIZEERR;
2540 	}
2541 
2542 	if (!skf_method->DigestUpdate) {
2543 		SKFerr(SKF_F_SKF_DIGESTUPDATE,
2544 			SKF_R_FUNCTION_NOT_SUPPORTED);
2545 		return SAR_NOTSUPPORTYETERR;
2546 	}
2547 
2548 	if ((rv = skf_method->DigestUpdate(
2549 		hHash,
2550 		pbData,
2551 		ulDataLen)) != SAR_OK) {
2552 		SKFerr(SKF_F_SKF_DIGESTUPDATE, skf_get_error_reason(rv));
2553 		return rv;
2554 	}
2555 
2556 	return SAR_OK;
2557 }
2558 
SKF_DigestFinal(HANDLE hHash,BYTE * pHashData,ULONG * pulHashLen)2559 ULONG DEVAPI SKF_DigestFinal(
2560 	HANDLE hHash,
2561 	BYTE *pHashData,
2562 	ULONG *pulHashLen)
2563 {
2564 	ULONG rv;
2565 
2566 	if (!skf_method) {
2567 		SKFerr(SKF_F_SKF_DIGESTFINAL,
2568 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2569 		return SAR_NOTINITIALIZEERR;
2570 	}
2571 
2572 	if (!skf_method->DigestFinal) {
2573 		SKFerr(SKF_F_SKF_DIGESTFINAL,
2574 			SKF_R_FUNCTION_NOT_SUPPORTED);
2575 		return SAR_NOTSUPPORTYETERR;
2576 	}
2577 
2578 	if ((rv = skf_method->DigestFinal(
2579 		hHash,
2580 		pHashData,
2581 		pulHashLen)) != SAR_OK) {
2582 		SKFerr(SKF_F_SKF_DIGESTFINAL, skf_get_error_reason(rv));
2583 		return rv;
2584 	}
2585 
2586 	return SAR_OK;
2587 }
2588 
SKF_MacInit(HANDLE hKey,BLOCKCIPHERPARAM * pMacParam,HANDLE * phMac)2589 ULONG DEVAPI SKF_MacInit(
2590 	HANDLE hKey,
2591 	BLOCKCIPHERPARAM *pMacParam,
2592 	HANDLE *phMac)
2593 {
2594 	ULONG rv;
2595 
2596 	if (!skf_method) {
2597 		SKFerr(SKF_F_SKF_MACINIT,
2598 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2599 		return SAR_NOTINITIALIZEERR;
2600 	}
2601 
2602 	if (!skf_method->MacInit) {
2603 		SKFerr(SKF_F_SKF_MACINIT,
2604 			SKF_R_FUNCTION_NOT_SUPPORTED);
2605 		return SAR_NOTSUPPORTYETERR;
2606 	}
2607 
2608 	if ((rv = skf_method->MacInit(
2609 		hKey,
2610 		pMacParam,
2611 		phMac)) != SAR_OK) {
2612 		SKFerr(SKF_F_SKF_MACINIT, skf_get_error_reason(rv));
2613 		return rv;
2614 	}
2615 
2616 	return SAR_OK;
2617 }
2618 
SKF_Mac(HANDLE hMac,BYTE * pbData,ULONG ulDataLen,BYTE * pbMacData,ULONG * pulMacLen)2619 ULONG DEVAPI SKF_Mac(
2620 	HANDLE hMac,
2621 	BYTE *pbData,
2622 	ULONG ulDataLen,
2623 	BYTE *pbMacData,
2624 	ULONG *pulMacLen)
2625 {
2626 	ULONG rv;
2627 
2628 	if (!skf_method) {
2629 		SKFerr(SKF_F_SKF_MAC,
2630 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2631 		return SAR_NOTINITIALIZEERR;
2632 	}
2633 
2634 	if (!skf_method->Mac) {
2635 		SKFerr(SKF_F_SKF_MAC,
2636 			SKF_R_FUNCTION_NOT_SUPPORTED);
2637 		return SAR_NOTSUPPORTYETERR;
2638 	}
2639 
2640 	if ((rv = skf_method->Mac(
2641 		hMac,
2642 		pbData,
2643 		ulDataLen,
2644 		pbMacData,
2645 		pulMacLen)) != SAR_OK) {
2646 		SKFerr(SKF_F_SKF_MAC, skf_get_error_reason(rv));
2647 		return rv;
2648 	}
2649 
2650 	return SAR_OK;
2651 }
2652 
SKF_MacUpdate(HANDLE hMac,BYTE * pbData,ULONG ulDataLen)2653 ULONG DEVAPI SKF_MacUpdate(
2654 	HANDLE hMac,
2655 	BYTE *pbData,
2656 	ULONG ulDataLen)
2657 {
2658 	ULONG rv;
2659 
2660 	if (!skf_method) {
2661 		SKFerr(SKF_F_SKF_MACUPDATE,
2662 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2663 		return SAR_NOTINITIALIZEERR;
2664 	}
2665 
2666 	if (!skf_method->MacUpdate) {
2667 		SKFerr(SKF_F_SKF_MACUPDATE,
2668 			SKF_R_FUNCTION_NOT_SUPPORTED);
2669 		return SAR_NOTSUPPORTYETERR;
2670 	}
2671 
2672 	if ((rv = skf_method->MacUpdate(
2673 		hMac,
2674 		pbData,
2675 		ulDataLen)) != SAR_OK) {
2676 		SKFerr(SKF_F_SKF_MACUPDATE, skf_get_error_reason(rv));
2677 		return rv;
2678 	}
2679 
2680 	return SAR_OK;
2681 }
2682 
SKF_MacFinal(HANDLE hMac,BYTE * pbMacData,ULONG * pulMacDataLen)2683 ULONG DEVAPI SKF_MacFinal(
2684 	HANDLE hMac,
2685 	BYTE *pbMacData,
2686 	ULONG *pulMacDataLen)
2687 {
2688 	ULONG rv;
2689 
2690 	if (!skf_method) {
2691 		SKFerr(SKF_F_SKF_MACFINAL,
2692 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2693 		return SAR_NOTINITIALIZEERR;
2694 	}
2695 
2696 	if (!skf_method->MacFinal) {
2697 		SKFerr(SKF_F_SKF_MACFINAL,
2698 			SKF_R_FUNCTION_NOT_SUPPORTED);
2699 		return SAR_NOTSUPPORTYETERR;
2700 	}
2701 
2702 	if ((rv = skf_method->MacFinal(
2703 		hMac,
2704 		pbMacData,
2705 		pulMacDataLen)) != SAR_OK) {
2706 		SKFerr(SKF_F_SKF_MACFINAL, skf_get_error_reason(rv));
2707 		return rv;
2708 	}
2709 
2710 	return SAR_OK;
2711 }
2712 
SKF_CloseHandle(HANDLE hHandle)2713 ULONG DEVAPI SKF_CloseHandle(
2714 	HANDLE hHandle)
2715 {
2716 	ULONG rv;
2717 
2718 	if (!skf_method) {
2719 		SKFerr(SKF_F_SKF_CLOSEHANDLE,
2720 			SKF_R_SKF_METHOD_NOT_INITIALIZED);
2721 		return SAR_NOTINITIALIZEERR;
2722 	}
2723 
2724 	if (!skf_method->CloseHandle) {
2725 		SKFerr(SKF_F_SKF_CLOSEHANDLE,
2726 			SKF_R_FUNCTION_NOT_SUPPORTED);
2727 		return SAR_NOTSUPPORTYETERR;
2728 	}
2729 
2730 	if ((rv = skf_method->CloseHandle(
2731 		hHandle)) != SAR_OK) {
2732 		SKFerr(SKF_F_SKF_CLOSEHANDLE, skf_get_error_reason(rv));
2733 		return rv;
2734 	}
2735 
2736 	return SAR_OK;
2737 }
2738 
2739