/* This file is part of jpcsp. Jpcsp is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Jpcsp is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Jpcsp. If not, see <http://www.gnu.org/licenses/>. */ package jpcsp.HLE.modules; import static jpcsp.HLE.kernel.types.SceKernelErrors.ERROR_HTTP_ALREADY_INIT; import static jpcsp.HLE.kernel.types.SceKernelErrors.ERROR_HTTP_NOT_INIT; import jpcsp.HLE.CanBeNull; import jpcsp.HLE.HLEFunction; import jpcsp.HLE.HLEModule; import jpcsp.HLE.HLEUnimplemented; import jpcsp.HLE.PspString; import jpcsp.HLE.TPointer; import jpcsp.HLE.TPointer32; import java.util.HashMap; import jpcsp.HLE.kernel.types.SceKernelThreadInfo; import jpcsp.HLE.Modules; import org.apache.log4j.Logger; public class sceHttps extends HLEModule { public static Logger log = Modules.getLogger("sceHttps"); // Certificate related statics (guessed from a PSP's certificates' list). // The PSP currently handles certificates for the following issuers: // - RSA: 2 certificates (resolved); // - VERISIGN: 14 certificates (resolved); // - SCE: 5 (resolved); // - GEOTRUST: 4 (resolved); // - ENTRUST: 1 (resolved); // - VALICERT: 1 (resolved); // - CYBERTRUST: 4 (resolved); // - THAWTE: 2 (resolved); // - COMODO: 3 (resolved). public static final int PSP_HTTPS_ISSUER_ALL = 0x00000000; // Loads all certificates from flash. public static final int PSP_HTTPS_ISSUER_RSA = 0x00000001; public static final int PSP_HTTPS_ISSUER_VERISIGN = 0x00000002; public static final int PSP_HTTPS_ISSUER_SCE = 0x00000003; public static final int PSP_HTTPS_ISSUER_GEOTRUST = 0x00000004; public static final int PSP_HTTPS_ISSUER_ENTRUST = 0x00000005; public static final int PSP_HTTPS_ISSUER_VALICERT = 0x00000006; public static final int PSP_HTTPS_ISSUER_CYBERTRUST = 0x00000007; public static final int PSP_HTTPS_ISSUER_THAWTE = 0x00000008; public static final int PSP_HTTPS_ISSUER_COMODO = 0x00000009; public static final int PSP_HTTPS_CERT_ALL = 0xFFFFFFFF; // Loads all certificates for a particular issuer. public static final int PSP_HTTPS_CERT_RSA_1024_V1_C3 = 0x00000001; public static final int PSP_HTTPS_CERT_RSA_2048_V3 = 0x00000002; public static final int PSP_HTTPS_CERT_RSA_ALL = (PSP_HTTPS_CERT_RSA_1024_V1_C3 | PSP_HTTPS_CERT_RSA_2048_V3); public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C1 = 0x00000001; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C2 = 0x00000002; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C3 = 0x00000004; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C1_G2 = 0x00000008; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C2_G2 = 0x00000010; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C3_G2 = 0x00000020; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C4_G2 = 0x00000040; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C1_G3 = 0x00000080; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C2_G3 = 0x00000100; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C3_G3 = 0x00000200; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C4_G3 = 0x00000400; public static final int PSP_HTTPS_CERT_VERISIGN_TSA = 0x00000800; public static final int PSP_HTTPS_CERT_VERISIGN_RSA_SS = 0x00001000; public static final int PSP_HTTPS_CERT_VERISIGN_PCA_C3_G5 = 0x00002000; public static final int PSP_HTTPS_CERT_VERISIGN_ALL = (PSP_HTTPS_CERT_VERISIGN_PCA_C1 | PSP_HTTPS_CERT_VERISIGN_PCA_C2 | PSP_HTTPS_CERT_VERISIGN_PCA_C3 | PSP_HTTPS_CERT_VERISIGN_PCA_C1_G2 | PSP_HTTPS_CERT_VERISIGN_PCA_C2_G2 | PSP_HTTPS_CERT_VERISIGN_PCA_C3_G2 | PSP_HTTPS_CERT_VERISIGN_PCA_C4_G2 | PSP_HTTPS_CERT_VERISIGN_PCA_C1_G3 | PSP_HTTPS_CERT_VERISIGN_PCA_C2_G3 | PSP_HTTPS_CERT_VERISIGN_PCA_C2_G3 | PSP_HTTPS_CERT_VERISIGN_PCA_C3_G3 | PSP_HTTPS_CERT_VERISIGN_PCA_C4_G3 | PSP_HTTPS_CERT_VERISIGN_TSA | PSP_HTTPS_CERT_VERISIGN_RSA_SS | PSP_HTTPS_CERT_VERISIGN_PCA_C3_G5); public static final int PSP_HTTPS_CERT_SCEI_ROOT_CA_01 = 0x00000001; public static final int PSP_HTTPS_CERT_SCEI_ROOT_CA_02 = 0x00000002; public static final int PSP_HTTPS_CERT_SCEI_ROOT_CA_03 = 0x00000004; public static final int PSP_HTTPS_CERT_SCEI_ROOT_CA_04 = 0x00000008; public static final int PSP_HTTPS_CERT_SCEI_ROOT_CA_05 = 0x00000010; public static final int PSP_HTTPS_CERT_SCEI_ALL = (PSP_HTTPS_CERT_SCEI_ROOT_CA_01 | PSP_HTTPS_CERT_SCEI_ROOT_CA_02 | PSP_HTTPS_CERT_SCEI_ROOT_CA_03 | PSP_HTTPS_CERT_SCEI_ROOT_CA_04 | PSP_HTTPS_CERT_SCEI_ROOT_CA_05); public static final int PSP_HTTPS_CERT_GEOTRUST_GLOBAL_CA = 0x00000001; public static final int PSP_HTTPS_CERT_GEOTRUST_EQUIFAX_SECURE_CA = 0x00000002; public static final int PSP_HTTPS_CERT_GEOTRUST_EQUIFAX_SECURE_EBUSINESS_CA1 = 0x00000004; public static final int PSP_HTTPS_CERT_GEOTRUST_EQUIFAX_SECURE_GLOBAL_EBUSINESS_CA1 = 0x00000008; public static final int PSP_HTTPS_CERT_GEOTRUST_ALL = (PSP_HTTPS_CERT_GEOTRUST_GLOBAL_CA | PSP_HTTPS_CERT_GEOTRUST_EQUIFAX_SECURE_CA | PSP_HTTPS_CERT_GEOTRUST_EQUIFAX_SECURE_EBUSINESS_CA1 | PSP_HTTPS_CERT_GEOTRUST_EQUIFAX_SECURE_GLOBAL_EBUSINESS_CA1); public static final int PSP_HTTPS_CERT_ENTRUST_SECURE_SERVER_CA = 0x00000001; public static final int PSP_HTTPS_CERT_ENTRUST_ALL = PSP_HTTPS_CERT_ENTRUST_SECURE_SERVER_CA; public static final int PSP_HTTPS_CERT_VALICERT_C2_CA = 0x00000001; public static final int PSP_HTTPS_CERT_VALICERT_ALL = PSP_HTTPS_CERT_VALICERT_C2_CA; public static final int PSP_HTTPS_CERT_CYBERTRUST_BALTIMORE_ROOT_CA = 0x00000001; public static final int PSP_HTTPS_CERT_CYBERTRUST_GTE_GLOBAL_ROOT_CA = 0x00000002; public static final int PSP_HTTPS_CERT_CYBERTRUST_GTE_ROOT_CA = 0x00000004; public static final int PSP_HTTPS_CERT_CYBERTRUST_GLOBALSIGN_ROOT_CA_R1 = 0x00000008; public static final int PSP_HTTPS_CERT_CYBERTRUST_ALL = (PSP_HTTPS_CERT_CYBERTRUST_BALTIMORE_ROOT_CA | PSP_HTTPS_CERT_CYBERTRUST_GTE_GLOBAL_ROOT_CA | PSP_HTTPS_CERT_CYBERTRUST_GTE_ROOT_CA | PSP_HTTPS_CERT_CYBERTRUST_GLOBALSIGN_ROOT_CA_R1); public static final int PSP_HTTPS_CERT_THAWTE_PREMIUMSERVER_CA = 0x00000001; public static final int PSP_HTTPS_CERT_THAWTE_SERVER_CA = 0x00000002; public static final int PSP_HTTPS_CERT_THAWTE_ALL = (PSP_HTTPS_CERT_THAWTE_PREMIUMSERVER_CA | PSP_HTTPS_CERT_THAWTE_SERVER_CA); public static final int PSP_HTTPS_CERT_COMODO_ATE_CA_ROOT = 0x00000001; public static final int PSP_HTTPS_CERT_COMODO_AAA_CS = 0x00000002; public static final int PSP_HTTPS_CERT_COMODO_UTN_UFH = 0x00000004; public static final int PSP_HTTPS_CERT_COMODO_ALL = (PSP_HTTPS_CERT_COMODO_ATE_CA_ROOT | PSP_HTTPS_CERT_COMODO_AAA_CS | PSP_HTTPS_CERT_COMODO_UTN_UFH); // Error detail statics. public static final int PSP_HTTPS_ERROR_DETAIL_INTERNAL = 0x1; public static final int PSP_HTTPS_ERROR_DETAIL_INVALID_CERT = 0x2; public static final int PSP_HTTPS_ERROR_DETAIL_COMMON_NAME_CHECK = 0x4; public static final int PSP_HTTPS_ERROR_DETAIL_NOT_AFTER_CHECK = 0x8; public static final int PSP_HTTPS_ERROR_DETAIL_NOT_BEFORE_CHECK= 0x10; public static final int PSP_HTTPS_ERROR_DETAIL_INVALID_ROOT_CA = 0x20; // SSL flag statics (same values as error detail). public static final int PSP_HTTPS_SSL_FLAG_CHECK_SERVER = 0x1; public static final int PSP_HTTPS_SSL_FLAG_CHECK_CLIENT = 0x2; public static final int PSP_HTTPS_SSL_FLAG_CHECK_COMMON_NAME = 0x4; public static final int PSP_HTTPS_SSL_FLAG_CHECK_NOT_AFTER = 0x8; public static final int PSP_HTTPS_SSL_FLAG_CHECK_NOT_BEFORE = 0x10; public static final int PSP_HTTPS_SSL_FLAG_CHECK_VALID_ROOT_CA = 0x20; private boolean isHttpsInit; private HashMap<Integer, SslHandler> sslHandlers = new HashMap<Integer, SslHandler>(); protected class SslHandler { private int id; private int addr; private int pArg; private SslHandler(int id, int addr, int pArg) { this.id = id; this.addr = addr; this.pArg = pArg; } protected void triggerHandler(int oldState, int newState, int event, int error) { SceKernelThreadInfo thread = Modules.ThreadManForUserModule.getCurrentThread(); if (thread != null) { Modules.ThreadManForUserModule.executeCallback(thread, addr, null, true, oldState, newState, event, error, pArg); } } @Override public String toString() { return String.format("SslHandler[id=%d, addr=0x%08X, pArg=0x%08X]", id, addr, pArg); } } protected void notifyHandler(int oldState, int newState, int event, int error) { for (SslHandler handler : sslHandlers.values()) { handler.triggerHandler(oldState, newState, event, error); } } /** * Init the https library. * * @param rootCertNum - Pass 0 * @param rootCertListAddr - Pass 0 * @param clientCertAddr - Pass 0 * @param keyAddr - Pass 0 * * @return 0 on success, < 0 on error. */ @HLEUnimplemented @HLEFunction(nid = 0xE4D21302, version = 150) public int sceHttpsInit(int rootCertNum, @CanBeNull TPointer rootCertListAddr, @CanBeNull TPointer clientCertAddr, @CanBeNull TPointer keyAddr) { if (isHttpsInit) { return ERROR_HTTP_ALREADY_INIT; } isHttpsInit = true; return 0; } @HLEUnimplemented @HLEFunction(nid = 0x68AB0F86, version = 150) public int sceHttpsInitWithPath(@CanBeNull PspString rootCertFileList, @CanBeNull PspString clientCertFile, @CanBeNull PspString keyFile) { if (isHttpsInit) { return ERROR_HTTP_ALREADY_INIT; } isHttpsInit = true; return 0; } /** * Terminate the https library * * @return 0 on success, < 0 on error. */ @HLEUnimplemented @HLEFunction(nid = 0xF9D8EB63, version = 150) public int sceHttpsEnd() { if (!isHttpsInit) { return ERROR_HTTP_NOT_INIT; } isHttpsInit = false; return 0; } /** * Load default certificate * * @param certIssuer - Pass 0 * @param certType - Pass 0 * @return 0 on success, < 0 on error. */ @HLEUnimplemented @HLEFunction(nid = 0x87797BDD, version = 150) public int sceHttpsLoadDefaultCert(int certIssuer, int certType) { return 0; } @HLEUnimplemented @HLEFunction(nid = 0xAB1540D5, version = 150) public int sceHttpsGetSslError(TPointer sslIdAddr, TPointer32 errorAddr, TPointer32 errorDetailAddr) { if (!isHttpsInit) { return ERROR_HTTP_NOT_INIT; } errorAddr.setValue(0); errorDetailAddr.setValue(0); return 0; } @HLEUnimplemented @HLEFunction(nid = 0xBAC31BF1, version = 150) public int sceHttpsEnableOption(int flag) { if (!isHttpsInit) { return ERROR_HTTP_NOT_INIT; } return 0; } @HLEUnimplemented @HLEFunction(nid = 0xB3FAF831, version = 150) public int sceHttpsDisableOption(int flag) { if (!isHttpsInit) { return ERROR_HTTP_NOT_INIT; } return 0; } @HLEUnimplemented @HLEFunction(nid = 0xD11DAB01, version = 150) public int sceHttpsGetCaList(TPointer rootCAAddr, TPointer32 rootCANumAddr) { if (!isHttpsInit) { return ERROR_HTTP_NOT_INIT; } return 0; } @HLEUnimplemented @HLEFunction(nid = 0x569A1481, version = 150) public int sceHttpsSetSslCallback(int sslID, TPointer sslCallback, int sslArg) { if (!isHttpsInit) { return ERROR_HTTP_NOT_INIT; } SslHandler sslHandler = new SslHandler(sslID, sslCallback.getAddress(), sslArg); sslHandlers.put(sslID, sslHandler); return 0; } }