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
'------------------------------------------------------------------------------