Overview
Comment: | Began TEA-ifying TclPKCS11 |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA3-256: |
16597afcf31efaefcb4f53e94df01309 |
User & Date: | rkeene on 2010-10-10 15:27:53.000 |
Other Links: | manifest | tags |
Context
2010-10-10
| ||
17:26 | Ditched TEA Added simple Tcl Extension building arch check-in: 1a3fad8a69 user: rkeene tags: trunk | |
15:27 | Began TEA-ifying TclPKCS11 check-in: 16597afcf3 user: rkeene tags: trunk | |
13:39 | Added additional OS support for loading libraries (mostly untested) check-in: f7f7813de0 user: rkeene tags: trunk | |
Changes
Added .fossil-settings/ignore-glob version [7b6d514242].
Renamed and modified
Makefile
[454cbc79b9]
to Makefile.in
[31d0c8ba93].
|
| | > | | | | | | | | > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | CC = @CC@ SHLIB_LD = @SHLIB_LD@ CFLAGS = @CFLAGS@ @SHLIB_CFLAGS@ @CFLAGS_OPTIMIZE@ CPPFLAGS = @CPPFLAGS@ @DEFS@ -DTCL_USE_STUBS=1 LDFLAGS = @CC_SEARCH_FLAGS@ @SHLIB_LD_LIBS@ @TCL_STUB_LIB_SPEC@ LIBS = @LIBS@ @TCL_STUB_LIB_FLAG@ all: tclpkcs11@SHLIB_SUFFIX@ pkcs11.h: pkcs11f.h pkcs11t.h tclpkcs11.o: tclpkcs11.c pkcs11.h tclpkcs11@SHLIB_SUFFIX@: tclpkcs11.o $(SHLIB_LD) $(LDFLAGS) -o tclpkcs11@SHLIB_SUFFIX@ tclpkcs11.o $(LIBS) clean: rm -f tclpkcs11@SHLIB_SUFFIX@ tclpkcs11.o distclean: clean rm -rf autom4te.cache rm -f config.log config.status rm -f Makefile .PHONY: all clean distclean |
Added aclocal/tcl.m4 version [3c582bfe3b].
Added build/autogen.sh version [82860b7668].
Added configure.ac version [05ca78adc7].
Added install-sh version [d37d0bcb7b].
Modified tclpkcs11.c
from [e61975e985]
to [1f96f707c2].
|
| > | > > | > > | > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #ifdef HAVE_UNISTD_H # include <unistd.h> #endif #ifdef HAVE_STDLIB_H # include <stdlib.h> #endif #ifdef HAVE_STRING_H # include <string.h> #endif #ifdef HAVE_STRINGS_H # include <strings.h> #endif #ifdef HAVE_DLFCN_H # include <dlfcn.h> #endif #ifdef HAVE_DL_H # include <dl.h> #endif #ifdef _WIN32 |
︙ | ︙ | |||
43 44 45 46 47 48 49 | CK_SLOT_ID session_slot; CK_SESSION_HANDLE session; }; /* * Tcl <--> PKCS11 Bridge Functions */ | | | 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | CK_SLOT_ID session_slot; CK_SESSION_HANDLE session; }; /* * Tcl <--> PKCS11 Bridge Functions */ MODULE_SCOPE Tcl_Obj *tclpkcs11_pkcs11_error(CK_RV errorCode) { switch (errorCode) { case CKR_OK: return(Tcl_NewStringObj("PKCS11_OK OK", -1)); case CKR_CANCEL: return(Tcl_NewStringObj("PKCS11_ERROR CANCEL", -1)); case CKR_HOST_MEMORY: return(Tcl_NewStringObj("PKCS11_ERROR HOST_MEMORY", -1)); |
︙ | ︙ | |||
226 227 228 229 230 231 232 | case CKR_VENDOR_DEFINED: return(Tcl_NewStringObj("PKCS11_ERROR VENDOR_DEFINED", -1)); } return(Tcl_NewStringObj("PKCS11_ERROR UNKNOWN", -1)); } | | | | | 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 | case CKR_VENDOR_DEFINED: return(Tcl_NewStringObj("PKCS11_ERROR VENDOR_DEFINED", -1)); } return(Tcl_NewStringObj("PKCS11_ERROR UNKNOWN", -1)); } MODULE_SCOPE Tcl_Obj *tclpkcs11_bytearray_to_string(const unsigned char *data, unsigned long datalen) { unsigned long idx; Tcl_Obj *retval; retval = Tcl_NewObj(); if (data == NULL) { return(retval); } for (idx = 0; idx < datalen; idx++) { Tcl_AppendObjToObj(retval, Tcl_ObjPrintf("%02x", data[idx])); } return(retval); } MODULE_SCOPE unsigned long tclpkcs11_string_to_bytearray(Tcl_Obj *data, unsigned char *outbuf, unsigned long outbuflen) { unsigned long outbufidx = 0; char tmpbuf[5]; char *str; int tmpint; int tcl_rv; if (outbuf == NULL) { |
︙ | ︙ | |||
290 291 292 293 294 295 296 | } } return(outbufidx); } /* PKCS#11 Mutex functions implementation that use Tcl Mutexes */ | | | | | | | | 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 | } } return(outbufidx); } /* PKCS#11 Mutex functions implementation that use Tcl Mutexes */ MODULE_SCOPE CK_RV tclpkcs11_create_mutex(void **mutex) { Tcl_Mutex *retval; if (!mutex) { return(CKR_GENERAL_ERROR); } retval = (Tcl_Mutex *) ckalloc(sizeof(*retval)); memset(retval, 0, sizeof(*retval)); *mutex = retval; return(CKR_OK); } MODULE_SCOPE CK_RV tclpkcs11_lock_mutex(void *mutex) { if (!mutex) { return(CKR_GENERAL_ERROR); } Tcl_MutexLock(*mutex); return(CKR_OK); } MODULE_SCOPE CK_RV tclpkcs11_unlock_mutex(void *mutex) { if (!mutex) { return(CKR_GENERAL_ERROR); } Tcl_MutexUnlock(*mutex); return(CKR_OK); } MODULE_SCOPE CK_RV tclpkcs11_destroy_mutex(void *mutex) { if (!mutex) { return(CKR_GENERAL_ERROR); } Tcl_MutexFinalize(*mutex); ckfree(mutex); return(CKR_OK); } /* Convience function to start a session if one is not already active */ MODULE_SCOPE int tclpkcs11_start_session(struct tclpkcs11_handle *handle, CK_SLOT_ID slot) { CK_SESSION_HANDLE tmp_session; CK_RV chk_rv; if (handle->session != -1) { if (handle->session_slot == slot) { return(CKR_OK); } |
︙ | ︙ | |||
370 371 372 373 374 375 376 | handle->session = tmp_session; handle->session_slot = slot; return(CKR_OK); } | | | | 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 | handle->session = tmp_session; handle->session_slot = slot; return(CKR_OK); } MODULE_SCOPE int tclpkcs11_close_session(struct tclpkcs11_handle *handle) { CK_RV chk_rv; if (handle->session != -1) { chk_rv = handle->pkcs11->C_CloseSession(handle->session); handle->session = -1; handle->session_slot = -1; if (chk_rv != CKR_OK) { return(chk_rv); } } return(CKR_OK); } /* * Platform Specific Functions */ MODULE_SCOPE void *tclpkcs11_int_load_module(const char *pathname) { #if defined(TCL_INCLUDES_LOADFILE) int tcl_rv; Tcl_LoadHandle *new_handle; new_handle = (Tcl_LoadHandle *) ckalloc(sizeof(*new_handle)); tcl_rv = Tcl_LoadFile(NULL, Tcl_NewStringObj(pathname, -1), NULL, 0, NULL, new_handle); |
︙ | ︙ | |||
411 412 413 414 415 416 417 | #elif defined(HAVE_SHL_LOAD) return(shl_load(pathname, BIND_DEFERRED, 0L)); #elif defined(_WIN32) return(LoadLibrary(pathname)); #endif return(NULL); } | | | | 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 | #elif defined(HAVE_SHL_LOAD) return(shl_load(pathname, BIND_DEFERRED, 0L)); #elif defined(_WIN32) return(LoadLibrary(pathname)); #endif return(NULL); } MODULE_SCOPE void tclpkcs11_int_unload_module(void *handle) { #if defined(TCL_INCLUDES_LOADFILE) Tcl_LoadHandle *tcl_handle; tcl_handle = handle; Tcl_FSUnloadFile(NULL, *tcl_handle); ckfree(handle); #elif defined(HAVE_DLOPEN) dlclose(handle); #elif defined(HAVE_SHL_LOAD) shl_unload(handle); #elif defined(_WIN32) FreeLibrary(handle); #endif return; } MODULE_SCOPE void *tclpkcs11_int_lookup_sym(void *handle, const char *sym) { #if defined(TCL_INCLUDES_LOADFILE) Tcl_LoadHandle *tcl_handle; void *retval; tcl_handle = handle; retval = Tcl_FindSymbol(NULL, *tcl_handle, sym); |
︙ | ︙ | |||
460 461 462 463 464 465 466 | #endif return(NULL); } /* * Tcl Commands */ | | < < | 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 | #endif return(NULL); } /* * Tcl Commands */ MODULE_SCOPE int tclpkcs11_load_module(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { struct tclpkcs11_interpdata *interpdata; struct tclpkcs11_handle *new_handle; const char *pathname; Tcl_HashEntry *tcl_handle_entry; Tcl_Obj *tcl_handle; void *handle; int is_new_entry; CK_C_INITIALIZE_ARGS initargs; CK_RV (*getFuncList)(CK_FUNCTION_LIST_PTR_PTR ppFunctionList); CK_FUNCTION_LIST_PTR pkcs11_function_list; CK_RV chk_rv; |
︙ | ︙ | |||
545 546 547 548 549 550 551 | Tcl_SetObjResult(interp, tclpkcs11_pkcs11_error(chk_rv)); return(TCL_ERROR); } interpdata = (struct tclpkcs11_interpdata *) cd; | | < < < < < < | 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 | Tcl_SetObjResult(interp, tclpkcs11_pkcs11_error(chk_rv)); return(TCL_ERROR); } interpdata = (struct tclpkcs11_interpdata *) cd; tcl_handle = Tcl_ObjPrintf("pkcsmod%lu", interpdata->handles_idx); (interpdata->handles_idx)++; tcl_handle_entry = Tcl_CreateHashEntry(&interpdata->handles, (const char *) tcl_handle, &is_new_entry); if (!tcl_handle_entry) { Tcl_SetObjResult(interp, Tcl_NewStringObj("unable to create new hash entry", -1)); return(TCL_ERROR); } |
︙ | ︙ | |||
577 578 579 580 581 582 583 | Tcl_SetHashValue(tcl_handle_entry, (ClientData) new_handle); Tcl_SetObjResult(interp, tcl_handle); return(TCL_OK); } | | | 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 | Tcl_SetHashValue(tcl_handle_entry, (ClientData) new_handle); Tcl_SetObjResult(interp, tcl_handle); return(TCL_OK); } MODULE_SCOPE int tclpkcs11_unload_module(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { struct tclpkcs11_interpdata *interpdata; struct tclpkcs11_handle *handle; Tcl_HashEntry *tcl_handle_entry; Tcl_Obj *tcl_handle; CK_RV chk_rv; |
︙ | ︙ | |||
653 654 655 656 657 658 659 | ckfree((char *) handle); Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1)); return(TCL_OK); } | | | 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 | ckfree((char *) handle); Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1)); return(TCL_OK); } MODULE_SCOPE int tclpkcs11_list_slots(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { struct tclpkcs11_interpdata *interpdata; struct tclpkcs11_handle *handle; Tcl_HashEntry *tcl_handle_entry; Tcl_Obj *tcl_handle; Tcl_Obj *ret_list, *curr_item_list, *flags_list, *slot_desc; CK_SLOT_ID_PTR slots; |
︙ | ︙ | |||
831 832 833 834 835 836 837 | } Tcl_SetObjResult(interp, ret_list); return(TCL_OK); } | | | 832 833 834 835 836 837 838 839 840 841 842 843 844 845 846 | } Tcl_SetObjResult(interp, ret_list); return(TCL_OK); } MODULE_SCOPE int tclpkcs11_list_certs(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { struct tclpkcs11_interpdata *interpdata; struct tclpkcs11_handle *handle; Tcl_HashEntry *tcl_handle_entry; Tcl_Obj *tcl_handle, *tcl_slotid; long slotid_long; Tcl_Obj *obj_label, *obj_cert, *obj_id; Tcl_Obj *ret_list, *curr_item_list; |
︙ | ︙ | |||
1073 1074 1075 1076 1077 1078 1079 | /* Return */ Tcl_SetObjResult(interp, ret_list); return(TCL_OK); } | | | 1074 1075 1076 1077 1078 1079 1080 1081 1082 1083 1084 1085 1086 1087 1088 | /* Return */ Tcl_SetObjResult(interp, ret_list); return(TCL_OK); } MODULE_SCOPE int tclpkcs11_login(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { struct tclpkcs11_interpdata *interpdata; struct tclpkcs11_handle *handle; Tcl_HashEntry *tcl_handle_entry; Tcl_Obj *tcl_handle, *tcl_slotid, *tcl_password; long slotid_long; char *password; int password_len; |
︙ | ︙ | |||
1154 1155 1156 1157 1158 1159 1160 | return(TCL_ERROR); } return(TCL_OK); } | | | 1155 1156 1157 1158 1159 1160 1161 1162 1163 1164 1165 1166 1167 1168 1169 | return(TCL_ERROR); } return(TCL_OK); } MODULE_SCOPE int tclpkcs11_logout(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { struct tclpkcs11_interpdata *interpdata; struct tclpkcs11_handle *handle; Tcl_HashEntry *tcl_handle_entry; Tcl_Obj *tcl_handle, *tcl_slotid; long slotid_long; int tcl_rv; |
︙ | ︙ | |||
1222 1223 1224 1225 1226 1227 1228 | } Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1)); return(TCL_OK); } | | | 1223 1224 1225 1226 1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237 | } Tcl_SetObjResult(interp, Tcl_NewBooleanObj(1)); return(TCL_OK); } MODULE_SCOPE int tclpkcs11_perform_pki(int encrypt, ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { struct tclpkcs11_interpdata *interpdata; struct tclpkcs11_handle *handle; unsigned char *input, resultbuf[1024]; unsigned long tcl_strtobytearray_rv; Tcl_HashEntry *tcl_handle_entry; Tcl_Obj *pki_real_cmd; Tcl_Obj *tcl_keylist, **tcl_keylist_values, *tcl_keylist_key, *tcl_keylist_val; |
︙ | ︙ | |||
1479 1480 1481 1482 1483 1484 1485 | tcl_result = Tcl_NewByteArrayObj(resultbuf, resultbuf_len); Tcl_SetObjResult(interp, tcl_result); return(TCL_OK); } | | | > > > > > > > > > > | 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 | tcl_result = Tcl_NewByteArrayObj(resultbuf, resultbuf_len); Tcl_SetObjResult(interp, tcl_result); return(TCL_OK); } MODULE_SCOPE int tclpkcs11_encrypt(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { return(tclpkcs11_perform_pki(1, cd, interp, objc, objv)); } MODULE_SCOPE int tclpkcs11_decrypt(ClientData cd, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) { return(tclpkcs11_perform_pki(0, cd, interp, objc, objv)); } /* * Tcl Loadable Module Initialization */ int Tclpkcs11_Init(Tcl_Interp *interp) { struct tclpkcs11_interpdata *interpdata; Tcl_Command tclCreatComm_ret; const char *tclPkgReq_ret; int tclPkgProv_ret; #ifdef TCL_USE_STUBS const char *tclInitStubs_ret; /* Initialize Stubs */ tclInitStubs_ret = Tcl_InitStubs(interp, "8.4", 0); if (!tclInitStubs_ret) { return(TCL_ERROR); } #endif tclPkgReq_ret = Tcl_PkgRequire(interp, "pki", "0.1", 0); if (!tclPkgReq_ret) { return(TCL_ERROR); } interpdata = (struct tclpkcs11_interpdata *) ckalloc(sizeof(*interpdata)); |
︙ | ︙ |