OSDN Git Service

Add support for SSL/TLS CRLs.
authors_kawamoto <s_kawamoto@users.sourceforge.jp>
Sat, 12 Apr 2014 08:11:16 +0000 (17:11 +0900)
committers_kawamoto <s_kawamoto@users.sourceforge.jp>
Sat, 12 Apr 2014 08:11:16 +0000 (17:11 +0900)
FFFTP_Eng_Release/FFFTP.exe
Release/FFFTP.exe
socketwrapper.c

index 61045a4..da7cf1a 100644 (file)
Binary files a/FFFTP_Eng_Release/FFFTP.exe and b/FFFTP_Eng_Release/FFFTP.exe differ
index 196616e..afafc1b 100644 (file)
Binary files a/Release/FFFTP.exe and b/Release/FFFTP.exe differ
index a63c354..d8db7aa 100644 (file)
@@ -49,8 +49,11 @@ typedef void (__cdecl* _X509_free)(X509*);
 typedef int (__cdecl* _X509_print_ex)(BIO*, X509*, unsigned long, unsigned long);\r
 typedef X509_NAME* (__cdecl* _X509_get_subject_name)(X509*);\r
 typedef int (__cdecl* _X509_NAME_print_ex)(BIO*, X509_NAME*, int, unsigned long);\r
+typedef void (__cdecl* _X509_CRL_free)(X509_CRL*);\r
 typedef X509* (__cdecl* _PEM_read_bio_X509)(BIO*, X509**, pem_password_cb*, void*);\r
+typedef X509_CRL* (__cdecl* _PEM_read_bio_X509_CRL)(BIO*, X509_CRL**, pem_password_cb*, void*);\r
 typedef int (__cdecl* _X509_STORE_add_cert)(X509_STORE*, X509*);\r
+typedef int (__cdecl* _X509_STORE_add_crl)(X509_STORE*, X509_CRL*);\r
 \r
 _SSL_load_error_strings p_SSL_load_error_strings;\r
 _SSL_library_init p_SSL_library_init;\r
@@ -83,8 +86,11 @@ _X509_free p_X509_free;
 _X509_print_ex p_X509_print_ex;\r
 _X509_get_subject_name p_X509_get_subject_name;\r
 _X509_NAME_print_ex p_X509_NAME_print_ex;\r
+_X509_CRL_free p_X509_CRL_free;\r
 _PEM_read_bio_X509 p_PEM_read_bio_X509;\r
+_PEM_read_bio_X509_CRL p_PEM_read_bio_X509_CRL;\r
 _X509_STORE_add_cert p_X509_STORE_add_cert;\r
+_X509_STORE_add_crl p_X509_STORE_add_crl;\r
 \r
 #define MAX_SSL_SOCKET 16\r
 \r
@@ -165,8 +171,11 @@ BOOL LoadOpenSSL()
                || !(p_X509_print_ex = (_X509_print_ex)GetProcAddress(g_hOpenSSLCommon, "X509_print_ex"))\r
                || !(p_X509_get_subject_name = (_X509_get_subject_name)GetProcAddress(g_hOpenSSLCommon, "X509_get_subject_name"))\r
                || !(p_X509_NAME_print_ex = (_X509_NAME_print_ex)GetProcAddress(g_hOpenSSLCommon, "X509_NAME_print_ex"))\r
+               || !(p_X509_CRL_free = (_X509_CRL_free)GetProcAddress(g_hOpenSSLCommon, "X509_CRL_free"))\r
                || !(p_PEM_read_bio_X509 = (_PEM_read_bio_X509)GetProcAddress(g_hOpenSSLCommon, "PEM_read_bio_X509"))\r
-               || !(p_X509_STORE_add_cert = (_X509_STORE_add_cert)GetProcAddress(g_hOpenSSLCommon, "X509_STORE_add_cert")))\r
+               || !(p_PEM_read_bio_X509_CRL = (_PEM_read_bio_X509_CRL)GetProcAddress(g_hOpenSSLCommon, "PEM_read_bio_X509_CRL"))\r
+               || !(p_X509_STORE_add_cert = (_X509_STORE_add_cert)GetProcAddress(g_hOpenSSLCommon, "X509_STORE_add_cert"))\r
+               || !(p_X509_STORE_add_crl = (_X509_STORE_add_crl)GetProcAddress(g_hOpenSSLCommon, "X509_STORE_add_crl")))\r
        {\r
                if(g_hOpenSSL)\r
                        FreeLibrary(g_hOpenSSL);\r
@@ -341,8 +350,10 @@ BOOL SetSSLRootCertificate(const void* pData, DWORD Length)
        BYTE* p;\r
        BYTE* pBegin;\r
        BYTE* pEnd;\r
+       DWORD Left;\r
        BIO* pBIO;\r
        X509* pX509;\r
+       X509_CRL* pX509_CRL;\r
        if(!g_bOpenSSLLoaded)\r
                return FALSE;\r
        r = FALSE;\r
@@ -359,18 +370,19 @@ BOOL SetSSLRootCertificate(const void* pData, DWORD Length)
                        p = (BYTE*)pData;\r
                        pBegin = NULL;\r
                        pEnd = NULL;\r
-                       while(Length > 0)\r
+                       Left = Length;\r
+                       while(Left > 0)\r
                        {\r
                                if(!pBegin)\r
                                {\r
-                                       if(Length < 27)\r
+                                       if(Left < 27)\r
                                                break;\r
                                        if(memcmp(p, "-----BEGIN CERTIFICATE-----", 27) == 0)\r
                                                pBegin = p;\r
                                }\r
                                else if(!pEnd)\r
                                {\r
-                                       if(Length < 25)\r
+                                       if(Left < 25)\r
                                                break;\r
                                        if(memcmp(p, "-----END CERTIFICATE-----", 25) == 0)\r
                                                pEnd = p + 25;\r
@@ -391,7 +403,45 @@ BOOL SetSSLRootCertificate(const void* pData, DWORD Length)
                                        pEnd = NULL;\r
                                }\r
                                p++;\r
-                               Length--;\r
+                               Left--;\r
+                       }\r
+                       p = (BYTE*)pData;\r
+                       pBegin = NULL;\r
+                       pEnd = NULL;\r
+                       Left = Length;\r
+                       while(Left > 0)\r
+                       {\r
+                               if(!pBegin)\r
+                               {\r
+                                       if(Left < 24)\r
+                                               break;\r
+                                       if(memcmp(p, "-----BEGIN X509 CRL-----", 24) == 0)\r
+                                               pBegin = p;\r
+                               }\r
+                               else if(!pEnd)\r
+                               {\r
+                                       if(Left < 22)\r
+                                               break;\r
+                                       if(memcmp(p, "-----END X509 CRL-----", 22) == 0)\r
+                                               pEnd = p + 22;\r
+                               }\r
+                               if(pBegin && pEnd)\r
+                               {\r
+                                       if(pBIO = p_BIO_new_mem_buf(pBegin, (int)((size_t)pEnd - (size_t)pBegin)))\r
+                                       {\r
+                                               if(pX509_CRL = p_PEM_read_bio_X509_CRL(pBIO, NULL, NULL, NULL))\r
+                                               {\r
+                                                       if(p_X509_STORE_add_crl(pStore, pX509_CRL) == 1)\r
+                                                               r = TRUE;\r
+                                                       p_X509_CRL_free(pX509_CRL);\r
+                                               }\r
+                                               p_BIO_free(pBIO);\r
+                                       }\r
+                                       pBegin = NULL;\r
+                                       pEnd = NULL;\r
+                               }\r
+                               p++;\r
+                               Left--;\r
                        }\r
                }\r
        }\r