Overview
Comment: | Updated to dynamically allocate mutexes and support being de-initialized |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
abf861e4d59780172aa3142793bb5e4d |
User & Date: | rkeene on 2016-12-12 22:10:21 |
Other Links: | manifest | tags |
Context
2016-12-12
| ||
22:28 | Added hardening and debugging flags check-in: 8d5b3e826a user: rkeene tags: trunk | |
22:10 | Updated to dynamically allocate mutexes and support being de-initialized check-in: abf861e4d5 user: rkeene tags: trunk | |
18:50 | Added a note about generating primes taking a while check-in: c3a7dbada8 user: rkeene tags: trunk | |
Changes
Modified tls.c from [788b6c9daa] to [5a902a9319].
︙ | ︙ | |||
61 62 63 64 65 66 67 | static int UnimportObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); static SSL_CTX *CTX_Init(State *statePtr, int proto, char *key, char *cert, char *CAdir, char *CAfile, char *ciphers, char *DHparams); | | | 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | static int UnimportObjCmd(ClientData clientData, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]); static SSL_CTX *CTX_Init(State *statePtr, int proto, char *key, char *cert, char *CAdir, char *CAfile, char *ciphers, char *DHparams); static int TlsLibInit(int uninitialize); #define TLS_PROTO_SSL2 0x01 #define TLS_PROTO_SSL3 0x02 #define TLS_PROTO_TLS1 0x04 #define TLS_PROTO_TLS1_1 0x08 #define TLS_PROTO_TLS1_2 0x10 #define ENABLED(flag, mask) (((flag) & (mask)) == (mask)) |
︙ | ︙ | |||
113 114 115 116 117 118 119 | #include <openssl/crypto.h> /* * Threaded operation requires locking callbacks * Based from /crypto/cryptlib.c of OpenSSL and NSOpenSSL. */ | < < < | | | < | < | | | | | | < < | | 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | #include <openssl/crypto.h> /* * Threaded operation requires locking callbacks * Based from /crypto/cryptlib.c of OpenSSL and NSOpenSSL. */ static Tcl_Mutex *locks = NULL; static Tcl_Mutex init_mx; static void CryptoThreadLockCallback(int mode, int n, const char *file, int line); static unsigned long CryptoThreadIdCallback(void); static void CryptoThreadLockCallback(int mode, int n, const char *file, int line) { if (mode & CRYPTO_LOCK) { Tcl_MutexLock(&locks[n]); } else { Tcl_MutexUnlock(&locks[n]); } } static unsigned long CryptoThreadIdCallback(void) { return (unsigned long) Tcl_GetCurrentThread(); } #endif /* OPENSSL_THREADS */ #endif /* TCL_THREADS */ /* *------------------------------------------------------------------- |
︙ | ︙ | |||
1622 1623 1624 1625 1626 1627 1628 | #else Tcl_PkgRequire(interp, "Tcl", "8.4", 0) #endif == NULL) { return TCL_ERROR; } | | | 1615 1616 1617 1618 1619 1620 1621 1622 1623 1624 1625 1626 1627 1628 1629 | #else Tcl_PkgRequire(interp, "Tcl", "8.4", 0) #endif == NULL) { return TCL_ERROR; } if (TlsLibInit(0) != TCL_OK) { Tcl_AppendResult(interp, "could not initialize SSL library", NULL); return TCL_ERROR; } Tcl_CreateObjCommand(interp, "tls::ciphers", CiphersObjCmd, (ClientData) 0, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "tls::handshake", HandshakeObjCmd, (ClientData) 0, (Tcl_CmdDeleteProc *) NULL); Tcl_CreateObjCommand(interp, "tls::import", ImportObjCmd, (ClientData) 0, (Tcl_CmdDeleteProc *) NULL); |
︙ | ︙ | |||
1682 1683 1684 1685 1686 1687 1688 | * initilizes SSL library * * Result: * none * *------------------------------------------------------* */ | | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > < < < < < | < < < | 1675 1676 1677 1678 1679 1680 1681 1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 | * initilizes SSL library * * Result: * none * *------------------------------------------------------* */ static int TlsLibInit(int uninitialize) { static int initialized = 0; int status = TCL_OK; #if defined(OPENSSL_THREADS) && defined(TCL_THREADS) size_t num_locks; #endif if (uninitialize) { if (!initialized) { dprintf("Asked to uninitialize, but we are not initialized"); return(TCL_OK); } dprintf("Asked to uninitialize"); #if defined(OPENSSL_THREADS) && defined(TCL_THREADS) Tcl_MutexLock(&init_mx); CRYPTO_set_locking_callback(NULL); CRYPTO_set_id_callback(NULL); if (locks) { free(locks); locks = NULL; } #endif initialized = 0; #if defined(OPENSSL_THREADS) && defined(TCL_THREADS) Tcl_MutexUnlock(&init_mx); #endif return(TCL_OK); } if (initialized) { return(status); } initialized = 1; #if defined(OPENSSL_THREADS) && defined(TCL_THREADS) Tcl_MutexLock(&init_mx); num_locks = CRYPTO_num_locks(); locks = malloc(sizeof(*locks) * num_locks); CRYPTO_set_locking_callback(CryptoThreadLockCallback); CRYPTO_set_id_callback(CryptoThreadIdCallback); #endif if (SSL_library_init() != 1) { status = TCL_ERROR; |
︙ | ︙ |