diff --git a/Limelight.xcodeproj/project.pbxproj b/Limelight.xcodeproj/project.pbxproj index 60dfd93..7d4f9c7 100644 --- a/Limelight.xcodeproj/project.pbxproj +++ b/Limelight.xcodeproj/project.pbxproj @@ -40,6 +40,10 @@ FB7E794419C8B71B00A15F68 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = FB7E794319C8B71B00A15F68 /* libiconv.dylib */; }; FBAB29F219EDB08B00929691 /* MDNSManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBAB29F119EDB08B00929691 /* MDNSManager.m */; }; FBAB29F619EDE0F800929691 /* Computer.m in Sources */ = {isa = PBXBuildFile; fileRef = FBAB29F519EDE0F800929691 /* Computer.m */; }; + FBAB29FC19EE13AA00929691 /* CryptoManager.m in Sources */ = {isa = PBXBuildFile; fileRef = FBAB29FB19EE13AA00929691 /* CryptoManager.m */; }; + FBCC0E9A19EF9703009729EB /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FBCC0E9819EF9703009729EB /* libcrypto.a */; }; + FBCC0E9B19EF9703009729EB /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FBCC0E9919EF9703009729EB /* libssl.a */; }; + FBCC0E9D19F00659009729EB /* mkcert.c in Sources */ = {isa = PBXBuildFile; fileRef = FBCC0E9C19F00659009729EB /* mkcert.c */; }; FBD8B40519C906230032E027 /* libavcodec.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FBD8B3FD19C906230032E027 /* libavcodec.a */; }; FBD8B40619C906230032E027 /* libavdevice.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FBD8B3FE19C906230032E027 /* libavdevice.a */; }; FBD8B40719C906230032E027 /* libavfilter.a in Frameworks */ = {isa = PBXBuildFile; fileRef = FBD8B3FF19C906230032E027 /* libavfilter.a */; }; @@ -112,6 +116,87 @@ FBAB29F319EDB0C400929691 /* MDNSManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MDNSManager.h; sourceTree = ""; }; FBAB29F419EDE0F800929691 /* Computer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Computer.h; sourceTree = ""; }; FBAB29F519EDE0F800929691 /* Computer.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = Computer.m; sourceTree = ""; }; + FBAB29FA19EE13AA00929691 /* CryptoManager.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CryptoManager.h; sourceTree = ""; }; + FBAB29FB19EE13AA00929691 /* CryptoManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CryptoManager.m; sourceTree = ""; }; + FBCC0E4C19EF9703009729EB /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = ""; }; + FBCC0E4D19EF9703009729EB /* asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = ""; }; + FBCC0E4E19EF9703009729EB /* asn1_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1_mac.h; sourceTree = ""; }; + FBCC0E4F19EF9703009729EB /* asn1t.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1t.h; sourceTree = ""; }; + FBCC0E5019EF9703009729EB /* bio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bio.h; sourceTree = ""; }; + FBCC0E5119EF9703009729EB /* blowfish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = ""; }; + FBCC0E5219EF9703009729EB /* bn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bn.h; sourceTree = ""; }; + FBCC0E5319EF9703009729EB /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = ""; }; + FBCC0E5419EF9703009729EB /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = ""; }; + FBCC0E5519EF9703009729EB /* cast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = ""; }; + FBCC0E5619EF9703009729EB /* cmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cmac.h; sourceTree = ""; }; + FBCC0E5719EF9703009729EB /* cms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cms.h; sourceTree = ""; }; + FBCC0E5819EF9703009729EB /* comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comp.h; sourceTree = ""; }; + FBCC0E5919EF9703009729EB /* conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = ""; }; + FBCC0E5A19EF9703009729EB /* conf_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf_api.h; sourceTree = ""; }; + FBCC0E5B19EF9703009729EB /* crypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto.h; sourceTree = ""; }; + FBCC0E5C19EF9703009729EB /* des.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = ""; }; + FBCC0E5D19EF9703009729EB /* des_old.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des_old.h; sourceTree = ""; }; + FBCC0E5E19EF9703009729EB /* dh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dh.h; sourceTree = ""; }; + FBCC0E5F19EF9703009729EB /* dsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsa.h; sourceTree = ""; }; + FBCC0E6019EF9703009729EB /* dso.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dso.h; sourceTree = ""; }; + FBCC0E6119EF9703009729EB /* dtls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dtls1.h; sourceTree = ""; }; + FBCC0E6219EF9703009729EB /* e_os2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = e_os2.h; sourceTree = ""; }; + FBCC0E6319EF9703009729EB /* ebcdic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ebcdic.h; sourceTree = ""; }; + FBCC0E6419EF9703009729EB /* ec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ec.h; sourceTree = ""; }; + FBCC0E6519EF9703009729EB /* ecdh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = ""; }; + FBCC0E6619EF9703009729EB /* ecdsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = ""; }; + FBCC0E6719EF9703009729EB /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = ""; }; + FBCC0E6819EF9703009729EB /* err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = ""; }; + FBCC0E6919EF9703009729EB /* evp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = evp.h; sourceTree = ""; }; + FBCC0E6A19EF9703009729EB /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = ""; }; + FBCC0E6B19EF9703009729EB /* idea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = idea.h; sourceTree = ""; }; + FBCC0E6C19EF9703009729EB /* krb5_asn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = krb5_asn.h; sourceTree = ""; }; + FBCC0E6D19EF9703009729EB /* kssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kssl.h; sourceTree = ""; }; + FBCC0E6E19EF9703009729EB /* lhash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lhash.h; sourceTree = ""; }; + FBCC0E6F19EF9703009729EB /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = ""; }; + FBCC0E7019EF9703009729EB /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = ""; }; + FBCC0E7119EF9703009729EB /* mdc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mdc2.h; sourceTree = ""; }; + FBCC0E7219EF9703009729EB /* modes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modes.h; sourceTree = ""; }; + FBCC0E7319EF9703009729EB /* obj_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = obj_mac.h; sourceTree = ""; }; + FBCC0E7419EF9703009729EB /* objects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = ""; }; + FBCC0E7519EF9703009729EB /* ocsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ocsp.h; sourceTree = ""; }; + FBCC0E7619EF9703009729EB /* opensslconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf.h; sourceTree = ""; }; + FBCC0E7719EF9703009729EB /* opensslv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslv.h; sourceTree = ""; }; + FBCC0E7819EF9703009729EB /* ossl_typ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ossl_typ.h; sourceTree = ""; }; + FBCC0E7919EF9703009729EB /* pem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem.h; sourceTree = ""; }; + FBCC0E7A19EF9703009729EB /* pem2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem2.h; sourceTree = ""; }; + FBCC0E7B19EF9703009729EB /* pkcs12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs12.h; sourceTree = ""; }; + FBCC0E7C19EF9703009729EB /* pkcs7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs7.h; sourceTree = ""; }; + FBCC0E7D19EF9703009729EB /* pqueue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pqueue.h; sourceTree = ""; }; + FBCC0E7E19EF9703009729EB /* rand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rand.h; sourceTree = ""; }; + FBCC0E7F19EF9703009729EB /* rc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc2.h; sourceTree = ""; }; + FBCC0E8019EF9703009729EB /* rc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc4.h; sourceTree = ""; }; + FBCC0E8119EF9703009729EB /* ripemd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ripemd.h; sourceTree = ""; }; + FBCC0E8219EF9703009729EB /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = ""; }; + FBCC0E8319EF9703009729EB /* safestack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safestack.h; sourceTree = ""; }; + FBCC0E8419EF9703009729EB /* seed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = seed.h; sourceTree = ""; }; + FBCC0E8519EF9703009729EB /* sha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha.h; sourceTree = ""; }; + FBCC0E8619EF9703009729EB /* srp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = srp.h; sourceTree = ""; }; + FBCC0E8719EF9703009729EB /* srtp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = srtp.h; sourceTree = ""; }; + FBCC0E8819EF9703009729EB /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = ""; }; + FBCC0E8919EF9703009729EB /* ssl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl2.h; sourceTree = ""; }; + FBCC0E8A19EF9703009729EB /* ssl23.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl23.h; sourceTree = ""; }; + FBCC0E8B19EF9703009729EB /* ssl3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl3.h; sourceTree = ""; }; + FBCC0E8C19EF9703009729EB /* stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stack.h; sourceTree = ""; }; + FBCC0E8D19EF9703009729EB /* symhacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symhacks.h; sourceTree = ""; }; + FBCC0E8E19EF9703009729EB /* tls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tls1.h; sourceTree = ""; }; + FBCC0E8F19EF9703009729EB /* ts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ts.h; sourceTree = ""; }; + FBCC0E9019EF9703009729EB /* txt_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = txt_db.h; sourceTree = ""; }; + FBCC0E9119EF9703009729EB /* ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui.h; sourceTree = ""; }; + FBCC0E9219EF9703009729EB /* ui_compat.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui_compat.h; sourceTree = ""; }; + FBCC0E9319EF9703009729EB /* whrlpool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = whrlpool.h; sourceTree = ""; }; + FBCC0E9419EF9703009729EB /* x509.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = ""; }; + FBCC0E9519EF9703009729EB /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = ""; }; + FBCC0E9619EF9703009729EB /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = ""; }; + FBCC0E9819EF9703009729EB /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libcrypto.a; sourceTree = ""; }; + FBCC0E9919EF9703009729EB /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libssl.a; sourceTree = ""; }; + FBCC0E9C19F00659009729EB /* mkcert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = mkcert.c; sourceTree = ""; }; + FBCC0E9E19F00697009729EB /* mkcert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mkcert.h; sourceTree = ""; }; FBD8B3FD19C906230032E027 /* libavcodec.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libavcodec.a; sourceTree = ""; }; FBD8B3FE19C906230032E027 /* libavdevice.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libavdevice.a; sourceTree = ""; }; FBD8B3FF19C906230032E027 /* libavfilter.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libavfilter.a; sourceTree = ""; }; @@ -214,6 +299,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + FBCC0E9B19EF9703009729EB /* libssl.a in Frameworks */, FB7E794419C8B71B00A15F68 /* libiconv.dylib in Frameworks */, FB290DC419B2E98F004C83CF /* libxml2.dylib in Frameworks */, FBD8B40719C906230032E027 /* libavfilter.a in Frameworks */, @@ -225,6 +311,7 @@ FB290CF419B2C406004C83CF /* CoreGraphics.framework in Frameworks */, FB290DC219B2E966004C83CF /* libopus.a in Frameworks */, FB290CF819B2C406004C83CF /* CoreData.framework in Frameworks */, + FBCC0E9A19EF9703009729EB /* libcrypto.a in Frameworks */, FB290DB519B2C814004C83CF /* liblimelight-common.a in Frameworks */, FBD8B40B19C906230032E027 /* libswresample.a in Frameworks */, FBD8B40819C906230032E027 /* libavformat.a in Frameworks */, @@ -310,6 +397,10 @@ FBAB29F319EDB0C400929691 /* MDNSManager.h */, FBAB29F419EDE0F800929691 /* Computer.h */, FBAB29F519EDE0F800929691 /* Computer.m */, + FBAB29FA19EE13AA00929691 /* CryptoManager.h */, + FBAB29FB19EE13AA00929691 /* CryptoManager.m */, + FBCC0E9E19F00697009729EB /* mkcert.h */, + FBCC0E9C19F00659009729EB /* mkcert.c */, ); path = Limelight; sourceTree = ""; @@ -359,6 +450,7 @@ FB290D3F19B2C814004C83CF /* libs */ = { isa = PBXGroup; children = ( + FBCC0E4919EF9703009729EB /* openssl */, FB2C87FA19B8F0B300F7655B /* FFmpeg */, FB290DA719B2C814004C83CF /* limelight-common */, FB290DAC19B2C814004C83CF /* opus */, @@ -436,6 +528,114 @@ path = FFmpeg; sourceTree = ""; }; + FBCC0E4919EF9703009729EB /* openssl */ = { + isa = PBXGroup; + children = ( + FBCC0E4A19EF9703009729EB /* include */, + FBCC0E9719EF9703009729EB /* lib */, + ); + path = openssl; + sourceTree = ""; + }; + FBCC0E4A19EF9703009729EB /* include */ = { + isa = PBXGroup; + children = ( + FBCC0E4B19EF9703009729EB /* openssl */, + ); + path = include; + sourceTree = ""; + }; + FBCC0E4B19EF9703009729EB /* openssl */ = { + isa = PBXGroup; + children = ( + FBCC0E4C19EF9703009729EB /* aes.h */, + FBCC0E4D19EF9703009729EB /* asn1.h */, + FBCC0E4E19EF9703009729EB /* asn1_mac.h */, + FBCC0E4F19EF9703009729EB /* asn1t.h */, + FBCC0E5019EF9703009729EB /* bio.h */, + FBCC0E5119EF9703009729EB /* blowfish.h */, + FBCC0E5219EF9703009729EB /* bn.h */, + FBCC0E5319EF9703009729EB /* buffer.h */, + FBCC0E5419EF9703009729EB /* camellia.h */, + FBCC0E5519EF9703009729EB /* cast.h */, + FBCC0E5619EF9703009729EB /* cmac.h */, + FBCC0E5719EF9703009729EB /* cms.h */, + FBCC0E5819EF9703009729EB /* comp.h */, + FBCC0E5919EF9703009729EB /* conf.h */, + FBCC0E5A19EF9703009729EB /* conf_api.h */, + FBCC0E5B19EF9703009729EB /* crypto.h */, + FBCC0E5C19EF9703009729EB /* des.h */, + FBCC0E5D19EF9703009729EB /* des_old.h */, + FBCC0E5E19EF9703009729EB /* dh.h */, + FBCC0E5F19EF9703009729EB /* dsa.h */, + FBCC0E6019EF9703009729EB /* dso.h */, + FBCC0E6119EF9703009729EB /* dtls1.h */, + FBCC0E6219EF9703009729EB /* e_os2.h */, + FBCC0E6319EF9703009729EB /* ebcdic.h */, + FBCC0E6419EF9703009729EB /* ec.h */, + FBCC0E6519EF9703009729EB /* ecdh.h */, + FBCC0E6619EF9703009729EB /* ecdsa.h */, + FBCC0E6719EF9703009729EB /* engine.h */, + FBCC0E6819EF9703009729EB /* err.h */, + FBCC0E6919EF9703009729EB /* evp.h */, + FBCC0E6A19EF9703009729EB /* hmac.h */, + FBCC0E6B19EF9703009729EB /* idea.h */, + FBCC0E6C19EF9703009729EB /* krb5_asn.h */, + FBCC0E6D19EF9703009729EB /* kssl.h */, + FBCC0E6E19EF9703009729EB /* lhash.h */, + FBCC0E6F19EF9703009729EB /* md4.h */, + FBCC0E7019EF9703009729EB /* md5.h */, + FBCC0E7119EF9703009729EB /* mdc2.h */, + FBCC0E7219EF9703009729EB /* modes.h */, + FBCC0E7319EF9703009729EB /* obj_mac.h */, + FBCC0E7419EF9703009729EB /* objects.h */, + FBCC0E7519EF9703009729EB /* ocsp.h */, + FBCC0E7619EF9703009729EB /* opensslconf.h */, + FBCC0E7719EF9703009729EB /* opensslv.h */, + FBCC0E7819EF9703009729EB /* ossl_typ.h */, + FBCC0E7919EF9703009729EB /* pem.h */, + FBCC0E7A19EF9703009729EB /* pem2.h */, + FBCC0E7B19EF9703009729EB /* pkcs12.h */, + FBCC0E7C19EF9703009729EB /* pkcs7.h */, + FBCC0E7D19EF9703009729EB /* pqueue.h */, + FBCC0E7E19EF9703009729EB /* rand.h */, + FBCC0E7F19EF9703009729EB /* rc2.h */, + FBCC0E8019EF9703009729EB /* rc4.h */, + FBCC0E8119EF9703009729EB /* ripemd.h */, + FBCC0E8219EF9703009729EB /* rsa.h */, + FBCC0E8319EF9703009729EB /* safestack.h */, + FBCC0E8419EF9703009729EB /* seed.h */, + FBCC0E8519EF9703009729EB /* sha.h */, + FBCC0E8619EF9703009729EB /* srp.h */, + FBCC0E8719EF9703009729EB /* srtp.h */, + FBCC0E8819EF9703009729EB /* ssl.h */, + FBCC0E8919EF9703009729EB /* ssl2.h */, + FBCC0E8A19EF9703009729EB /* ssl23.h */, + FBCC0E8B19EF9703009729EB /* ssl3.h */, + FBCC0E8C19EF9703009729EB /* stack.h */, + FBCC0E8D19EF9703009729EB /* symhacks.h */, + FBCC0E8E19EF9703009729EB /* tls1.h */, + FBCC0E8F19EF9703009729EB /* ts.h */, + FBCC0E9019EF9703009729EB /* txt_db.h */, + FBCC0E9119EF9703009729EB /* ui.h */, + FBCC0E9219EF9703009729EB /* ui_compat.h */, + FBCC0E9319EF9703009729EB /* whrlpool.h */, + FBCC0E9419EF9703009729EB /* x509.h */, + FBCC0E9519EF9703009729EB /* x509_vfy.h */, + FBCC0E9619EF9703009729EB /* x509v3.h */, + ); + path = openssl; + sourceTree = ""; + }; + FBCC0E9719EF9703009729EB /* lib */ = { + isa = PBXGroup; + children = ( + FBCC0E9819EF9703009729EB /* libcrypto.a */, + FBCC0E9919EF9703009729EB /* libssl.a */, + ); + path = lib; + sourceTree = ""; + }; FBD8B3FC19C906230032E027 /* lib */ = { isa = PBXGroup; children = ( @@ -706,6 +906,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + FBAB29FC19EE13AA00929691 /* CryptoManager.m in Sources */, FB290D3D19B2C6E3004C83CF /* VideoDepacketizer.m in Sources */, FBAB29F219EDB08B00929691 /* MDNSManager.m in Sources */, FB290D0719B2C406004C83CF /* Limelight.xcdatamodeld in Sources */, @@ -717,6 +918,7 @@ FB290D3919B2C6E3004C83CF /* MainFrameViewController.m in Sources */, FB290D3719B2C6E3004C83CF /* Connection.m in Sources */, FB290D3B19B2C6E3004C83CF /* StreamView.m in Sources */, + FBCC0E9D19F00659009729EB /* mkcert.c in Sources */, FB290D3819B2C6E3004C83CF /* ConnectionHandler.m in Sources */, FB290D3C19B2C6E3004C83CF /* VideoDecoder.m in Sources */, ); @@ -851,6 +1053,7 @@ "$(PROJECT_DIR)/libs/FFmpeg/lib", "$(PROJECT_DIR)/libs/limelight-common/lib", "$(PROJECT_DIR)/libs/opus/lib", + "$(PROJECT_DIR)/libs/openssl/lib", ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; @@ -876,6 +1079,7 @@ "$(PROJECT_DIR)/libs/FFmpeg/lib", "$(PROJECT_DIR)/libs/limelight-common/lib", "$(PROJECT_DIR)/libs/opus/lib", + "$(PROJECT_DIR)/libs/openssl/lib", ); PRODUCT_NAME = "$(TARGET_NAME)"; WRAPPER_EXTENSION = app; diff --git a/Limelight/CryptoManager.h b/Limelight/CryptoManager.h new file mode 100644 index 0000000..87ec646 --- /dev/null +++ b/Limelight/CryptoManager.h @@ -0,0 +1,15 @@ +// +// CryptoManager.h +// Limelight +// +// Created by Diego Waxemberg on 10/14/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import + +@interface CryptoManager : NSObject + +- (void) generateKeyPairUsingSSl; + +@end diff --git a/Limelight/CryptoManager.m b/Limelight/CryptoManager.m new file mode 100644 index 0000000..174d026 --- /dev/null +++ b/Limelight/CryptoManager.m @@ -0,0 +1,34 @@ +// +// CryptoManager.m +// Limelight +// +// Created by Diego Waxemberg on 10/14/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#import "CryptoManager.h" +#import "mkcert.h" + + +@implementation CryptoManager + +- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { + + +} + +- (void) generateKeyPairUsingSSl { + NSLog(@"Generating Certificate: "); + CertKeyPair certKeyPair = generateCertKeyPair(); + + NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); + NSString *documentsDirectory = [paths objectAtIndex:0]; + NSString *certFile = [documentsDirectory stringByAppendingPathComponent:@"client.crt"]; + NSString *keyPairFile = [documentsDirectory stringByAppendingPathComponent:@"client.key"]; + + NSLog(@"Writing cert and key to: \n%@\n%@", certFile, keyPairFile); + saveCertKeyPair([certFile UTF8String], [keyPairFile UTF8String], certKeyPair); + freeCertKeyPair(certKeyPair); +} + +@end diff --git a/Limelight/MainFrameViewController.m b/Limelight/MainFrameViewController.m index 18ac1dc..1a8a0cc 100644 --- a/Limelight/MainFrameViewController.m +++ b/Limelight/MainFrameViewController.m @@ -10,6 +10,7 @@ #import "VideoDepacketizer.h" #import "ConnectionHandler.h" #import "Computer.h" +#import "CryptoManager.h" @implementation MainFrameViewController NSString* hostAddr; @@ -86,6 +87,7 @@ MDNSManager* mDNSManager; mDNSManager = [[MDNSManager alloc] initWithCallback:self]; [mDNSManager searchForHosts]; + [[[CryptoManager alloc] init] generateKeyPairUsingSSl]; } - (void)updateHosts:(NSArray *)hosts { diff --git a/Limelight/mkcert.c b/Limelight/mkcert.c new file mode 100644 index 0000000..c9241b4 --- /dev/null +++ b/Limelight/mkcert.c @@ -0,0 +1,153 @@ + +#include "mkcert.h" + +#include +#include + +#include +#include + +#ifndef OPENSSL_NO_ENGINE +#include +#endif + +static const int NUM_BITS = 2048; +static const int SERIAL = 0; +static const int NUM_YEARS = 20; + +int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int years); +int add_ext(X509 *cert, int nid, char *value); + +struct CertKeyPair generateCertKeyPair() { + BIO *bio_err; + X509 *x509 = NULL; + EVP_PKEY *pkey = NULL; + CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON); + + bio_err = BIO_new_fp(stderr, BIO_NOCLOSE); + + mkcert(&x509, &pkey, NUM_BITS, SERIAL, NUM_YEARS); + + // Debug Print statements + //RSA_print_fp(stdout, pkey->pkey.rsa, 0); + //X509_print_fp(stdout, x509); + //PEM_write_PUBKEY(stdout, pkey); + //PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL); + //PEM_write_X509(stdout, x509); + +#ifndef OPENSSL_NO_ENGINE + ENGINE_cleanup(); +#endif + CRYPTO_cleanup_all_ex_data(); + + CRYPTO_mem_leaks(bio_err); + BIO_free(bio_err); + + return (CertKeyPair){x509, pkey}; +} + +void freeCertKeyPair(struct CertKeyPair certKeyPair) { + X509_free(certKeyPair.x509); + EVP_PKEY_free(certKeyPair.pkey); +} + +void saveCertKeyPair(const char* certFile, const char* keyPairFile, CertKeyPair certKeyPair) { + FILE* certFilePtr = fopen(certFile, "w"); + FILE* keyPairFilePtr = fopen(keyPairFile, "w"); + + PEM_write_PrivateKey(keyPairFilePtr, certKeyPair.pkey, NULL, NULL, 0, NULL, NULL); + PEM_write_X509(certFilePtr, certKeyPair.x509); + + fclose(certFilePtr); + fclose(keyPairFilePtr); +} + +int mkcert(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int years) { + X509 *x; + EVP_PKEY *pk; + RSA *rsa; + X509_NAME *name = NULL; + + if ((pkeyp == NULL) || (*pkeyp == NULL)) { + if ((pk=EVP_PKEY_new()) == NULL) { + abort(); + return(0); + } + } else { + pk = *pkeyp; + } + + if ((x509p == NULL) || (*x509p == NULL)) { + if ((x = X509_new()) == NULL) { + goto err; + } + } else { + x = *x509p; + } + + rsa = RSA_generate_key(bits, RSA_F4, NULL, NULL); + if (!EVP_PKEY_assign_RSA(pk, rsa)) { + abort(); + goto err; + } + + X509_set_version(x, 3); + ASN1_INTEGER_set(X509_get_serialNumber(x), serial); + X509_gmtime_adj(X509_get_notBefore(x), 0); + X509_gmtime_adj(X509_get_notAfter(x), (long)60*60*24*365*years); + X509_set_pubkey(x, pk); + + name = X509_get_subject_name(x); + + /* This function creates and adds the entry, working out the + * correct string type and performing checks on its length. + */ + X509_NAME_add_entry_by_txt(name,"CN", MBSTRING_ASC, (unsigned char*)"NVIDIA GameStream Client", -1, -1, 0); + + /* Its self signed so set the issuer name to be the same as the + * subject. + */ + X509_set_issuer_name(x, name); + + /* Add various extensions: standard extensions */ + add_ext(x, NID_basic_constraints, "critical,CA:TRUE"); + add_ext(x, NID_key_usage, "critical,keyCertSign,cRLSign"); + + add_ext(x, NID_subject_key_identifier, "hash"); + + if (!X509_sign(x, pk, EVP_sha1())) { + goto err; + } + + *x509p = x; + *pkeyp = pk; + return(1); +err: + return(0); +} + +/* Add extension using V3 code: we can set the config file as NULL + * because we wont reference any other sections. + */ + +int add_ext(X509 *cert, int nid, char *value) +{ + X509_EXTENSION *ex; + X509V3_CTX ctx; + /* This sets the 'context' of the extensions. */ + /* No configuration database */ + X509V3_set_ctx_nodb(&ctx); + /* Issuer and subject certs: both the target since it is self signed, + * no request and no CRL + */ + X509V3_set_ctx(&ctx, cert, cert, NULL, NULL, 0); + ex = X509V3_EXT_conf_nid(NULL, &ctx, nid, value); + if (!ex) { + return 0; + } + + X509_add_ext(cert, ex, -1); + X509_EXTENSION_free(ex); + return 1; +} + diff --git a/Limelight/mkcert.h b/Limelight/mkcert.h new file mode 100644 index 0000000..f6d3627 --- /dev/null +++ b/Limelight/mkcert.h @@ -0,0 +1,22 @@ +// +// mkcert.h +// Limelight +// +// Created by Diego Waxemberg on 10/16/14. +// Copyright (c) 2014 Limelight Stream. All rights reserved. +// + +#ifndef Limelight_mkcert_h +#define Limelight_mkcert_h + +#include + +typedef struct CertKeyPair { + X509 *x509; + EVP_PKEY *pkey; +} CertKeyPair; + +struct CertKeyPair generateCertKeyPair(); +void freeCertKeyPair(CertKeyPair); +void saveCertKeyPair(const char* certFile, const char* keyPairFile, CertKeyPair certKeyPair); +#endif