diff --git a/appleauth/auth.cpp b/appleauth/auth.cpp index cf8f2ae..d15e7bc 100644 --- a/appleauth/auth.cpp +++ b/appleauth/auth.cpp @@ -2,6 +2,7 @@ #include "tier2/fileformats/plist.h" #include "http/http.h" #include "openssl/srp.h" +#include "openssl/evp.h" #include "openssl/sha.h" #include "tier0/rand.h" @@ -26,6 +27,12 @@ IHTTPClientManager *g_pHttpClientMgr = NULL; #define N2048 "AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73" #define G2048 "2" +enum EPasswordType +{ + PASSWORD_TYPE_S2K, + PASSWORD_TYPE_S2K_FO, +}; + class CAppleAuth: public IAppleAuth { public: @@ -35,6 +42,7 @@ public: virtual EAppleAuthDaemonStatus GetStatus() override; virtual EAppleAuthStatus SubmitLoginData( const char *szEmail, const char *szPassword ) override; virtual EAppleAuthStatus Submit2FA( const char *szCode ) override; + virtual CUtlString EncryptPassword( const char *szPassword, CUtlString szSalt, uint32_t uIters, EPasswordType eType ); CUtlString FetchADIPB(); void FetchHeaders( CUtlString szAdiPb ); @@ -292,7 +300,7 @@ EAppleAuthStatus CAppleAuth::SubmitLoginData( const char *szEmail, const char *s "\t\n" "\tA2k\n" - "\t%s\n" + "\t%s\n" "\tps\n" "\ts2ks2k_fo\n" @@ -310,7 +318,7 @@ EAppleAuthStatus CAppleAuth::SubmitLoginData( const char *szEmail, const char *s "\t2026-1-9T12:00:00Z\n" "\tX-Apple-I-MD\n" "\t%s\n" - "\tX-Apple-I-MD_LU\n" + "\tX-Apple-I-MD-LU\n" "\t" APPLE_LOCAL_USER "\n" "\tX-Apple-I-MD-M\n" "\t%s\n" @@ -323,19 +331,11 @@ EAppleAuthStatus CAppleAuth::SubmitLoginData( const char *szEmail, const char *s "\tbootstrap\n" - "\t\n" - - "\tcapp\n" - "\tXcode\n" - - "\tdc\n" - "\t#9d9da0\n" + "\t\n" "\ticscrec\n" "\t\n" - "\tloc\n" - "\ten_US\n" "\tpbe\n" "\t\n" @@ -346,6 +346,9 @@ EAppleAuthStatus CAppleAuth::SubmitLoginData( const char *szEmail, const char *s "\tsvct\n" "\tiCloud\n" + "\tloc\n" + "\ten_US\n" + "\t\n" "\t\n" @@ -368,7 +371,9 @@ EAppleAuthStatus CAppleAuth::SubmitLoginData( const char *szEmail, const char *s if (stResponse.m_uCode == 200) { V_printf("%s\n",stResponse.m_message.GetMemory()); - + IJSONObject *pObject = PropertyListManager()->ReadString(stResponse.m_message); + IJSONObject *pResponse = pObject->GetValue("Response")->GetObject(); + EncryptPassword(szPassword, pResponse->GetValue("s")->GetStringValue(), pResponse->GetValue("i")->GetNumberValue(), PASSWORD_TYPE_S2K); } g_pHttpClientMgr->Disconnect(m_pGrandSlamClient); @@ -381,6 +386,48 @@ EAppleAuthStatus CAppleAuth::Submit2FA( const char *szCode ) } +int base64_decode(const char *b64, unsigned char *out) { + int len = strlen(b64); + int out_len = EVP_DecodeBlock(out, + (const unsigned char *)b64, + len); + if (out_len < 0) + return -1; + + while (len > 0 && b64[len - 1] == '=') { + out_len--; + len--; + } + + return out_len; +} +CUtlString CAppleAuth::EncryptPassword( const char *szPassword, CUtlString szSalt, uint32_t uIters, EPasswordType eType ) +{ + + unsigned char hashedPassword[SHA256_DIGEST_LENGTH]; + CUtlString szHashedPasswordHex = ""; + unsigned char encryptedPassword[32]; + CUtlString szEncryptedPasswordHex = ""; + unsigned char salt[32]; + int iSaltLen = base64_decode(szSalt, salt); + + if ( eType == PASSWORD_TYPE_S2K ) + { + for ( int i = 0; i < SHA256_DIGEST_LENGTH; i++ ) + { + szHashedPasswordHex.AppendTail(CUtlString("%02x", hashedPassword[i])); + } + PKCS5_PBKDF2_HMAC(szHashedPasswordHex, szHashedPasswordHex.GetLenght(), salt, iSaltLen, uIters, EVP_sha256(), 32, encryptedPassword); + }; + for ( int i = 0; i < SHA256_DIGEST_LENGTH; i++ ) + { + szEncryptedPasswordHex.AppendTail(CUtlString("%02x", encryptedPassword[i])); + } + V_printf("%s\n",szEncryptedPasswordHex.GetString()); + return szEncryptedPasswordHex; + +} + static CAppleAuth s_appleAuth; EXPOSE_INTERFACE_GLOBALVAR(CAppleAuth, IAppleAuth, APPLE_AUTH_INTERFACE_VERSION, s_appleAuth); diff --git a/fpc/Makefile b/fpc/Makefile index 3070800..6b8a24b 100644 --- a/fpc/Makefile +++ b/fpc/Makefile @@ -6,7 +6,7 @@ FILESYSTEM_FILES := ../stdfilesystems/filesystem_libc.cpp TIER1_OBJS := $(TIER1_FILES:.cpp=.o) TIER2_OBJS := $(TIER2_FILES:.cpp=.o) FPC_FILES := library/helper.cpp library/target.cpp library/builder.cpp library/runner.cpp library/c.cpp library/ld.cpp library/clang/c.cpp library/clang/ld.cpp -CC = clang +CC = clang++ ifneq ($(FPC_ARCH),) ifneq ($(FPC_OS),) @@ -30,34 +30,34 @@ endif recompile: ../build/tools/fpc build/fpc build -install: ../build/tools/fpc libfpcbuild.a libfpc.so libtier0.so libtier1.a libtier2.a libfilesystem_std.so install_temp builddir +install: ../build/tools/fpc build/libfpcbuild.a build/libfpc.so build/libtier0.so build/libtier1.a build/libtier2.a build/libfilesystem_std.so install_temp builddir $(CC) -fPIC main.cpp library/helper.cpp library/target.cpp library/builder.cpp -lc -lstdc++ $(CCFLAGS) -o build/fpc -ltier0 -Lbuild build/libtier1.a build/libtier2.a -Wl,--disable-new-dtags -Wl,-rpath,'$$ORIGIN' - build/fpc build + build/fpc build -fpcdebug mv build/fpc_temp build/fpc mv build/libfpc_temp.so build/libfpc.so build/fpc build -fpcdebug mv build/fpc_temp build/fpc mv build/libfpc_temp.so build/libfpc.so -libtier0.so: $(TIER0_FILES) builddir +build/libtier0.so: $(TIER0_FILES) builddir $(CC) $(CCFLAGS) -fPIC -shared -o build/libtier0.so $(TIER0_FILES) %.o: %.cpp $(CC) $(CCFLAGS) -fPIC -c $< -o $@ -libtier1.a: $(TIER1_OBJS) builddir libtier0.so +build/libtier1.a: $(TIER1_OBJS) builddir build/libtier0.so ar rcs build/libtier1.a $(TIER1_OBJS) -libtier2.a: $(TIER2_OBJS) builddir libtier1.a +build/libtier2.a: $(TIER2_OBJS) builddir build/libtier1.a ar rcs build/libtier2.a $(TIER2_OBJS) -libfilesystem_std.so: $(FILESYSTEM_FILES) libtier1.a builddir - $(CC) $(CCFLAGS) -fPIC -shared -o build/libfilesystem_std.so $(FILESYSTEM_FILES) build/libtier1.a +build/libfilesystem_std.so: $(FILESYSTEM_FILES) build/libtier1.a build/libtier0.so builddir + $(CC) $(CCFLAGS) -fPIC -shared -o build/libfilesystem_std.so $(FILESYSTEM_FILES) build/libtier1.a -ltier0 -Lbuild -libfpcbuild.a: buildfile/interfaces.o builddir +build/libfpcbuild.a: buildfile/interfaces.o builddir ar rcs build/libfpcbuild.a buildfile/interfaces.o -libfpc.so: $(FPC_FILES) builddir libfpcbuild.a libtier1.a +build/libfpc.so: $(FPC_FILES) builddir build/libfpcbuild.a build/libtier1.a $(CC) $(CCFLAGS) $(FPC_FILES) library/libfpc.cpp -fPIC -shared -o build/libfpc.so build/libtier1.a builddir: diff --git a/fpc/build.cpp b/fpc/build.cpp index 3877124..32befd4 100644 --- a/fpc/build.cpp +++ b/fpc/build.cpp @@ -61,9 +61,6 @@ DECLARE_BUILD_STAGE(libfpcbuild) ldProject = ccompiler->Compile(&compileProject); ldProject.linkType = ELINK_STATIC_LIBRARY; - if (linker->IsLibraryExists("clang")) - ldProject.libraries.AppendTail("clang"); - CUtlString outputProject = linker->Link(&ldProject); @@ -76,7 +73,7 @@ DECLARE_BUILD_STAGE(libfpc) if (linker->IsLibraryExists("clang")) g_libFpcFiles.AppendTail("library/clang/c_libclang.cpp"); else - V_printf("Warning: to support included files libclang must be installed."); + V_printf("Warning: to support included files libclang must be installed.\n"); CProject_t compileProject = {}; LinkProject_t ldProject = {}; @@ -84,6 +81,11 @@ DECLARE_BUILD_STAGE(libfpc) compileProject.files = g_libFpcFiles; compileProject.includeDirectories = g_IncludeDirectories; compileProject.bFPIC = true; + compileProject.macros = { + {"FPC_ARCH", CUtlString("\"%s\"",Target_t::StringFromCPU(compileProject.m_target.cpu))}, + {"FPC_OS", CUtlString("\"%s\"",Target_t::StringFromKernel(compileProject.m_target.kernel))}, + {"FPC_ABI", CUtlString("\"%s\"",Target_t::StringFromABI(compileProject.m_target.abi))}, + }; ldProject = ccompiler->Compile(&compileProject); ldProject.linkType = ELINK_DYNAMIC_LIBRARY; ldProject.libraryObjects = { @@ -112,21 +114,22 @@ DECLARE_BUILD_STAGE(fpc) compileProject.files = g_fpcFiles; compileProject.bFPIC = true; compileProject.includeDirectories = g_IncludeDirectories; + compileProject.macros = { + {"FPC_ARCH", CUtlString("\"%s\"",Target_t::StringFromCPU(compileProject.m_target.cpu))}, + {"FPC_OS", CUtlString("\"%s\"",Target_t::StringFromKernel(compileProject.m_target.kernel))}, + {"FPC_ABI", CUtlString("\"%s\"",Target_t::StringFromABI(compileProject.m_target.abi))}, + }; ldProject = ccompiler->Compile(&compileProject); ldProject.libraryObjects = { GET_PROJECT_LIBRARY(tier0, "tier0"), GET_PROJECT_LIBRARY(tier1, "tier1"), GET_PROJECT_LIBRARY(tier2, "tier2"), }; - V_printf("WHAT %s\n",GET_PROJECT_LIBRARY(tier0, "tier0").GetString()); - - if (linker->IsLibraryExists("clang")) - ldProject.libraries.AppendTail("clang"); CUtlString outputProject = linker->Link(&ldProject); - ADD_OUTPUT_OBJECT("fpc", outputProject) + ADD_OUTPUT_OBJECT("fpc", outputProject); return 0; }; diff --git a/fpc/library/clang/ld.cpp b/fpc/library/clang/ld.cpp index ed44353..b2c1802 100644 --- a/fpc/library/clang/ld.cpp +++ b/fpc/library/clang/ld.cpp @@ -112,17 +112,10 @@ void CClangLinker::SetOutputFile( CUtlVector &cmd, const char *szNam void CClangLinker::SetDefaultLibraryPaths( CUtlVector &cmd, LinkProject_t *pProject ) { - switch (pProject->m_target.kernel) + if (pProject->m_target.kernel & TARGET_KERNEL_LINUX) { - case TARGET_KERNEL_LINUX: - case TARGET_KERNEL_ANDROID: cmd.AppendTail("-Wl,--disable-new-dtags"); cmd.AppendTail("-Wl,-rpath,$ORIGIN"); - break; - case TARGET_KERNEL_DARWIN: - break; - default: - break; } } diff --git a/fpc/library/target.cpp b/fpc/library/target.cpp index 7b2b7fe..e85885d 100644 --- a/fpc/library/target.cpp +++ b/fpc/library/target.cpp @@ -16,47 +16,15 @@ CUtlString Target_t::GetTriplet() { CUtlString triplet = ""; - if ( cpu == TARGET_CPU_AMD64 ) - triplet.AppendTail("x86_64"); - if ( cpu == TARGET_CPU_80386 ) - triplet.AppendTail("i386"); - if ( cpu == TARGET_CPU_80486 ) - triplet.AppendTail("i486"); - if ( cpu == TARGET_CPU_80586 ) - triplet.AppendTail("i586"); - if ( cpu == TARGET_CPU_80686 ) - triplet.AppendTail("i686"); - if ( cpu == TARGET_CPU_AARCH64 ) - triplet.AppendTail("aarch64"); - if ( cpu == TARGET_CPU_WASM32 ) - triplet.AppendTail("wasm32"); + triplet.AppendTail(StringFromCPU(cpu)); triplet.AppendTail("-"); - if ( kernel == TARGET_KERNEL_UNKNOWN ) - triplet.AppendTail("unknown-unknown"); - if ( kernel == TARGET_KERNEL_UNKNOWN_LINUX ) - triplet.AppendTail("unknown-linux"); - if ( kernel == TARGET_KERNEL_PC_LINUX ) - triplet.AppendTail("pc-linux"); - if ( kernel == TARGET_KERNEL_ALPINE_LINUX ) - triplet.AppendTail("alpine-linux"); - if ( kernel == TARGET_KERNEL_WINDOWS ) - triplet.AppendTail("pc-windows"); - if ( kernel == TARGET_KERNEL_DARWIN ) - triplet.AppendTail("apple-darwin"); - if ( kernel == TARGET_KERNEL_IOS ) - triplet.AppendTail("apple-ios"); - if ( kernel == TARGET_KERNEL_ANDROID ) - triplet.AppendTail("linux-android"); - if ( kernel == TARGET_KERNEL_WASI ) - triplet.AppendTail("unknown-wasi"); - if ( kernel == TARGET_KERNEL_EMSCRIPTEN ) - triplet.AppendTail("unknown-emscripten"); - if ( abi != TARGET_ABI_DEFAULT ) + triplet.AppendTail(StringFromKernel(kernel)); + + if ( abi != TARGET_ABI_UNDEFINED && abi != TARGET_ABI_DEFAULT ) + { triplet.AppendTail("-"); - if ( abi == TARGET_ABI_GNU ) - triplet.AppendTail("gnu"); - if ( abi == TARGET_ABI_MUSL ) - triplet.AppendTail("musl"); + triplet.AppendTail(StringFromABI(abi)); + } return triplet; @@ -65,7 +33,7 @@ CUtlString Target_t::GetTriplet() const char *Target_t::GetExecutableFileFormat() { if (kernel & TARGET_KERNEL_POSIX) - return ""; + return "%s"; if (kernel & TARGET_KERNEL_WINDOWS_DEVICES) { @@ -180,6 +148,59 @@ Target_t Target_t::DefaultTarget() .optimization = TARGET_DEBUG, }; } +const char *Target_t::StringFromCPU( ETargetCPU cpu ) +{ + if ( cpu == TARGET_CPU_AMD64 ) + return "x86_64"; + if ( cpu == TARGET_CPU_80386 ) + return "i386"; + if ( cpu == TARGET_CPU_80486 ) + return "i486"; + if ( cpu == TARGET_CPU_80586 ) + return "i586"; + if ( cpu == TARGET_CPU_80686 ) + return "i686"; + if ( cpu == TARGET_CPU_AARCH64 ) + return "aarch64"; + if ( cpu == TARGET_CPU_WASM32 ) + return "wasm32"; + return NULL; +} + +const char *Target_t::StringFromKernel( ETargetKernel kernel ) +{ + if ( kernel == TARGET_KERNEL_UNKNOWN ) + return "unknown-unknown"; + if ( kernel == TARGET_KERNEL_UNKNOWN_LINUX ) + return "unknown-linux"; + if ( kernel == TARGET_KERNEL_PC_LINUX ) + return "pc-linux"; + if ( kernel == TARGET_KERNEL_ALPINE_LINUX ) + return "alpine-linux"; + if ( kernel == TARGET_KERNEL_WINDOWS ) + return "pc-windows"; + if ( kernel == TARGET_KERNEL_DARWIN ) + return "apple-darwin"; + if ( kernel == TARGET_KERNEL_IOS ) + return "apple-ios"; + if ( kernel == TARGET_KERNEL_ANDROID ) + return "linux-android"; + if ( kernel == TARGET_KERNEL_WASI ) + return "unknown-wasi"; + if ( kernel == TARGET_KERNEL_EMSCRIPTEN ) + return "unknown-emscripten"; + return NULL; +} + +const char *Target_t::StringFromABI( ETargetABI abi ) +{ + if ( abi == TARGET_ABI_GNU ) + return "gnu"; + if ( abi == TARGET_ABI_MUSL ) + return "musl"; + return NULL; +} + ETargetCPU Target_t::CPUFromString( const char *szName ) { CUtlString szUtlName = szName; diff --git a/fpc/main.cpp b/fpc/main.cpp index 616ae14..ecb30d7 100644 --- a/fpc/main.cpp +++ b/fpc/main.cpp @@ -155,8 +155,17 @@ findbuild: CommandLine()->CreateCommandLine(c, v); Plat_InitRandom(); + + if (CommandLine()->CheckParam("-v") || CommandLine()->CheckParam("--version")) + { + V_printf("fpc version v1\n"); + V_printf("built " __DATE__ " " __TIME__ "\n"); + V_printf("built for %s\n", Target_t::HostTarget().GetTriplet().GetString()); + return 0; + } + if (CommandLine()->CheckParam("build")) - return build(); + build(); const char *szDeployDevice = CommandLine()->ParamValue("deploy"); Plat_ShutdownRandom(); return 0; diff --git a/fpc/public/target.h b/fpc/public/target.h index 3a55f56..0520c51 100644 --- a/fpc/public/target.h +++ b/fpc/public/target.h @@ -73,6 +73,9 @@ struct Target_t const char *GetDynamicLibraryFileFormat(); static Target_t HostTarget(); static Target_t DefaultTarget(); + static const char *StringFromCPU( ETargetCPU eCPU ); + static const char *StringFromKernel( ETargetKernel eKernel ); + static const char *StringFromABI( ETargetABI eABI ); static ETargetCPU CPUFromString( const char *szName ); static ETargetKernel KernelFromString( const char *szName ); static ETargetABI ABIFromString( const char *szName ); diff --git a/public/tier2/fileformats/json.h b/public/tier2/fileformats/json.h index c1e14f2..ec2f188 100644 --- a/public/tier2/fileformats/json.h +++ b/public/tier2/fileformats/json.h @@ -17,6 +17,12 @@ enum EJSONParameterType JSON_PARAMETER_OBJECT, }; +enum EJSONParameterNotes +{ + JSON_PARAMETER_NOTE_NONE = 0, + JSON_PARAMETER_NOTE_BINARY, +}; + abstract_class IJSONArray { public: @@ -33,6 +39,7 @@ abstract_class IJSONValue { public: virtual EJSONParameterType GetType( void ) = 0; + virtual virtual const char *GetStringValue() = 0; virtual float GetNumberValue() = 0; virtual bool GetBooleanValue() = 0; diff --git a/stdfilesystems/filesystem_libc.cpp b/stdfilesystems/filesystem_libc.cpp index 65e57be..eed1215 100644 --- a/stdfilesystems/filesystem_libc.cpp +++ b/stdfilesystems/filesystem_libc.cpp @@ -124,7 +124,7 @@ public: delete pHandle; } - virtual CUtlBuffer Read( IFileHandle *pFile ) override { return NULL; }; + virtual CUtlBuffer Read( IFileHandle *pFile ) override { return {}; }; virtual const char *ReadString( IFileHandle *pFile ) override { char *szData = NULL; size_t uSize = Size(pFile); diff --git a/tier2/fileformats/plist.cpp b/tier2/fileformats/plist.cpp index 06fe2fd..039a823 100644 --- a/tier2/fileformats/plist.cpp +++ b/tier2/fileformats/plist.cpp @@ -37,7 +37,7 @@ IJSONObject *CPropertyListManager::ReadDict( IXMLObject *pDict ) { szKeyToCreate = c->GetChildren()[0]->GetValue(); } - if ( !V_strcmp(c->GetValue(), "string")) + if ( !V_strcmp(c->GetValue(), "string") || !V_strcmp(c->GetValue(), "data") ) { if ( szKeyToCreate == NULL ) continue; @@ -49,6 +49,18 @@ IJSONObject *CPropertyListManager::ReadDict( IXMLObject *pDict ) pObject->SetValue(szKeyToCreate, pVal); szKeyToCreate = NULL; } + if ( !V_strcmp(c->GetValue(), "integer") ) + { + if ( szKeyToCreate == NULL ) + continue; + IJSONValue *pVal = JSONManager()->CreateValue(); + if (c->GetChildren().GetSize()>0) + pVal->SetNumberValue(atol(c->GetChildren()[0]->GetValue())); + else + pVal->SetNumberValue(0); + pObject->SetValue(szKeyToCreate, pVal); + szKeyToCreate = NULL; + } if ( !V_strcmp(c->GetValue(), "dict")) { if ( szKeyToCreate == NULL )