File "JKS2PEM+PK8.bas"

Path: /AndroCertif/JKS2PEM+PK8.bas
File size: 11.39 KB
MIME-type: text/plain
Charset: utf-8


#COMPILE EXE "JKS2PEM+PK8.exe"
#DIM ALL

$VER = "(1.0)"

'------------------------------------------------------------------------------
'   ** Constants **
'------------------------------------------------------------------------------
%IDC_LABEL1   = 1001
%IDC_LABEL2   = 1002
%IDC_LABEL3   = 1003
%IDC_TEXTBOX1 = 1004
%IDC_BUTTON1  = 1005
%IDC_BUTTON2  = 1006
%IDC_BUTTON3  = 1007
%IDC_BUTTON4  = 1008
'------------------------------------------------------------------------------
GLOBAL KS, PW, ER AS STRING
GLOBAL AUTORUN AS LONG
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Includes & Resources **
'------------------------------------------------------------------------------
#INCLUDE ONCE "WIN32API.INC"
#INCLUDE ONCE "AndroCertif.inc"
#RESOURCE ICON,   101, "icon.ico"
#RESOURCE MANIFEST, 1, "XPTheme.xml"
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Main Application Entry Point **
'------------------------------------------------------------------------------
FUNCTION PBMAIN()
    IF MissingTools() THEN EXIT FUNCTION
    ShowMainDialog %HWND_DESKTOP
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** CallBacks **
'------------------------------------------------------------------------------
CALLBACK FUNCTION ProcMainDialog()

    SELECT CASE AS LONG CB.MSG
        CASE %WM_INITDIALOG
            ' Initialization handler
            IF COMMAND$(1) <> "" AND EXIST(COMMAND$(2)) THEN
                PW = COMMAND$(1)
                KS = COMMAND$(2)
                AUTORUN = 1
                CONTROL SET TEXT CB.HNDL, %IDC_LABEL2, KS
                CONTROL SET TEXT CB.HNDL, %IDC_TEXTBOX1, PW
                CONTROL ENABLE   CB.HNDL, %IDC_TEXTBOX1
                CONTROL ENABLE   CB.HNDL, %IDC_BUTTON2 ' Validate PW
                PostMessage CB.HNDL, %WM_COMMAND, MAKDWD(%IDC_BUTTON2,%BN_CLICKED), GetDlgItem(CB.HNDL,%IDC_BUTTON2)
            END IF

        CASE %WM_COMMAND
            ' Process control notifications
            SELECT CASE AS LONG CB.CTL

                CASE %IDOK                ' Return key
                    IF KS = "" THEN
                      EXIT FUNCTION
                    ELSEIF PW = "" THEN
                      SendMessage CB.HNDL, %WM_COMMAND, MAKDWD(%IDC_BUTTON2,%BN_CLICKED), GetDlgItem(CB.HNDL,%IDC_BUTTON2) ' Validate PW
                    ELSE
                      SendMessage CB.HNDL, %WM_COMMAND, MAKDWD(%IDC_BUTTON3,%BN_CLICKED), GetDlgItem(CB.HNDL,%IDC_BUTTON3) ' Make PEM+PK8
                    END IF

                CASE %IDC_BUTTON1         ' Load JKS
                    IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN LoadKeystore CB.HNDL

                CASE %IDC_BUTTON2         ' Validate PW
                    IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
                        CONTROL DISABLE CB.HNDL, %IDC_BUTTON2
                        IF IsValidPw(CB.HNDL) THEN
                            CONTROL ENABLE    CB.HNDL, %IDC_BUTTON2
                            CONTROL ENABLE    CB.HNDL, %IDC_BUTTON3 ' Convert to PEM+PK8
                            SLEEP 10
                            IF AUTORUN THEN
                                SendMessage CB.HNDL, %WM_COMMAND, MAKDWD(%IDC_BUTTON3,%BN_CLICKED), GetDlgItem(CB.HNDL,%IDC_BUTTON3) ' Make PEM+PK8
                            ELSE
                                CONTROL SET FOCUS CB.HNDL, %IDC_BUTTON3
                            END IF
                        ELSE
                            CONTROL ENABLE CB.HNDL, %IDC_BUTTON2
                            MessageBox CB.HNDL, _
                                "ERROR!"+$CR+$CR+"Detail:"+$CR+ER, _
                                EXE.NAME$+$SPC+$VER, _
                                %MB_ICONWARNING
                        END IF
                    END IF

                CASE %IDC_BUTTON3         ' Convert to PEM+PK8
                    IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
                        IF MakePemPk8() THEN
                            MessageBox CB.HNDL, _
                             "Successfully created:"+$CR _
                            +"- cert.x509.pem"+$CR _
                            +"- key.pk8"+$CR _
                            +"based on "+$DQ+FileName(KS)+$DQ+$CR _
                            +"in "+FilePath(KS), _
                            EXE.NAME$+$SPC+$VER, _
                            %MB_ICONINFORMATION
                        ELSE
                            MessageBox CB.HNDL, _
                            "Error converting JKS to PEM+PKCS8!", _
                            EXE.NAME$+$SPC+$VER,%MB_ICONERROR
                        END IF
                        PW = ""
                        CONTROL DISABLE CB.HNDL, %IDC_BUTTON3
                    END IF

                CASE %IDC_BUTTON4         ' About
                    IF CB.CTLMSG = %BN_CLICKED OR CB.CTLMSG = 1 THEN
                        ShellExecute BYVAL 0, "open", "http://mougino.free.fr/freeware" + $NUL, BYVAL 0, BYVAL 0, %SW_SHOWNORMAL
                    END IF

            END SELECT

    END SELECT
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
'   ** Dialogs **
'------------------------------------------------------------------------------
FUNCTION ShowMainDialog(BYVAL hParent AS DWORD) AS LONG
    LOCAL lRslt AS LONG
    LOCAL hDlg  AS DWORD

    DIALOG NEW PIXELS, hParent, EXE.NAME$+$SPC+$VER,,, 302, 144, %WS_POPUP _
        OR %WS_BORDER OR %WS_DLGFRAME OR %WS_SYSMENU OR %WS_MINIMIZEBOX OR _
        %WS_CLIPSIBLINGS OR %WS_VISIBLE OR %DS_MODALFRAME OR %DS_3DLOOK OR _
        %DS_NOFAILCREATE OR %DS_SETFONT, %WS_EX_CONTROLPARENT OR %WS_EX_LEFT _
        OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR, TO hDlg
    DIALOG  SET ICON     hDlg, "#101"

    CONTROL ADD LABEL,   hDlg, %IDC_LABEL1, "1. Load the java keystore (jks) :", 8, 6, 288, 16
    CONTROL ADD LABEL,   hDlg, %IDC_LABEL2, "<no file loaded>", 8, 24, 264, _
        18, %WS_CHILD OR %WS_VISIBLE OR %SS_LEFT OR %SS_SUNKEN OR %SS_PATHELLIPSIS, _
        %WS_EX_LEFT OR %WS_EX_LTRREADING
    CONTROL SET COLOR    hDlg, %IDC_LABEL2, -1, %WHITE
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON1, "...", 272, 23, 24, 21

    CONTROL ADD LABEL,   hDlg, %IDC_LABEL3, "2. Type its password :", 8, 54, 288, 16
    CONTROL ADD TEXTBOX, hDlg, %IDC_TEXTBOX1, "", 8, 72, 240, 18, %WS_CHILD _
        OR %WS_VISIBLE OR %WS_TABSTOP OR %ES_LEFT OR %ES_PASSWORD OR _
        %ES_AUTOHSCROLL OR %WS_DISABLED, %WS_EX_CLIENTEDGE OR _
        %WS_EX_LEFT OR %WS_EX_LTRREADING OR %WS_EX_RIGHTSCROLLBAR
    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON2, "Validate", 248, 71, 48, 20, _
        %WS_CHILD OR %WS_VISIBLE OR %WS_DISABLED OR %WS_TABSTOP OR %BS_TEXT _
        OR %BS_PUSHBUTTON OR %BS_CENTER OR %BS_VCENTER, %WS_EX_LEFT OR _
        %WS_EX_LTRREADING

    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON3, "3. CONVERT TO PEM + PKCS8", 8, _
        104, 232, 32, %WS_CHILD OR %WS_VISIBLE OR %WS_DISABLED OR _
        %WS_TABSTOP OR %BS_TEXT OR %BS_PUSHBUTTON OR %BS_CENTER OR _
        %BS_VCENTER, %WS_EX_LEFT OR %WS_EX_LTRREADING

    CONTROL ADD BUTTON,  hDlg, %IDC_BUTTON4, "ABOUT", 240, 104, 56, 32

    DIALOG SHOW MODAL hDlg, CALL ProcMainDialog TO lRslt

    FUNCTION = lRslt
END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
SUB LoadKeystore(BYVAL hDlg AS LONG)
    LOCAL e AS STRING

    DISPLAY OPENFILE hDlg, -50, -50, "Open Java KeyStore", "", _
      CHR$("Java KeyStore",0,"*.jks",0,"All files",0,"*.*",0), _
      "", "", %OFN_FILEMUSTEXIST TO e

    IF e = "" THEN EXIT SUB ' cancelled by user

    KS = e  : CONTROL SET TEXT hDlg, %IDC_LABEL2, KS
    PW = "" : CONTROL SET TEXT hDlg, %IDC_TEXTBOX1, PW
    CONTROL ENABLE    hDlg, %IDC_TEXTBOX1
    CONTROL ENABLE    hDlg, %IDC_BUTTON2 ' Validate pw
    CONTROL DISABLE   hDlg, %IDC_BUTTON3 ' Convert to PEM+PK8
    CONTROL SET FOCUS hDlg, %IDC_TEXTBOX1

END SUB
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION IsValidPw(BYVAL hDlg AS LONG) AS LONG
    LOCAL pass, tmpKS, tmpP12 AS STRING

    CONTROL GET TEXT hDlg, %IDC_TEXTBOX1 TO pass

    ' Clean any previous session
    tmpKS  = ENVIRON$("TEMP") + "\keystore.jks"     : KILL tmpKS
    tmpP12 = ENVIRON$("TEMP") + "\intermediate.p12" : KILL tmpP12

    ' Copy KeyStore to local
    FILECOPY KS, tmpKS

    ' Try to dump Java KeyStore from JKS into PKCS12, using PW
    ER = BATCH( _
                 toolsPath + "\keytool -importkeystore" _
               + " -srckeystore " + PDQ(tmpKS) _
               + " -srcstorepass " + PDQ(pass) _
               + " -deststorepass " + PDQ(pass) _
               + " -destkeystore " + PDQ(tmpP12) _
               + " -srcstoretype JKS" _
               + " -deststoretype PKCS12" _
             )
    KILL tmpKS
    IF NOT EXIST(tmpP12) THEN EXIT FUNCTION ' Error generating PKCS12

    ' PKCS12 generation complete (password is correct)
    ER = ""
    PW = pass
    FUNCTION = -1

END FUNCTION
'------------------------------------------------------------------------------

'------------------------------------------------------------------------------
FUNCTION MakePemPk8 AS LONG
    LOCAL tmpP12, tmpRSA, tmpPEM, tmpX509, tmpPK8 AS STRING

    ' Clean any previous session
    tmpP12  = ENVIRON$("TEMP") + "\intermediate.p12"
    tmpRSA  = ENVIRON$("TEMP") + "\intermediate.rsa.pem" : KILL tmpRSA
    tmpPEM  = ENVIRON$("TEMP") + "\private.rsa.pem"      : KILL tmpPEM
    tmpX509 = ENVIRON$("TEMP") + "\cert.x509.pem"        : KILL tmpX509
    tmpPK8  = ENVIRON$("TEMP") + "\key.pk8"              : KILL tmpPK8

    ' Dump the new PKCS12 file into PEM
    BATCH toolsPath + "\openssl pkcs12" _
        + " -in " + PDQ(tmpP12) _
        + " -passin pass:" + PDQ(PW) _
        + " -nodes" _
        + " -out " + PDQ(tmpRSA)
    KILL tmpP12
    IF NOT EXIST(tmpRSA) THEN EXIT FUNCTION ' error

    ' Split the cert and private key from PEM
    BATCH toolsPath + "\splitpem " + PDQ(tmpRSA)
    KILL tmpRSA
    IF NOT EXIST(tmpX509) THEN EXIT FUNCTION ' error
    IF NOT EXIST(tmpPEM)  THEN EXIT FUNCTION ' error

    ' Convert the private key into PKCS8 format as expected by signapk
    BATCH toolsPath + "\openssl pkcs8" _
        + " -topk8" _
        + " -outform DER" _
        + " -in " + PDQ(tmpPEM) _
        + " -inform PEM" _
        + " -out " + PDQ(tmpPK8) _
        + " -nocrypt"
    KILL tmpPEM
    IF NOT EXIST(tmpPK8) THEN EXIT FUNCTION ' error

    ' All done! Move PEM & PK8 to target folder
    KILL FilePath(KS) + "cert.x509.pem"
    NAME tmpX509 AS FilePath(KS) + "cert.x509.pem"
    KILL FilePath(KS) + "key.pk8"
    NAME tmpPK8  AS FilePath(KS) + "key.pk8"
    FUNCTION = -1

END FUNCTION
'------------------------------------------------------------------------------