public static void SharedRegister( ICharacter character, IWorldObject worldObject, DelegateFinishAction finishAction) { CancelCurrentInteraction(character); RegisteredActions[new Pair(character, worldObject)] = new PairAction(finishAction); }
// Send either ValidatePair or Pair (depending on Action) // request to iPhone and return true upon success or false otherwise. private bool Pair(PairAction Action) { #region Preparation of certificates X509V3CertificateGenerator DeviceCG = new X509V3CertificateGenerator(); DeviceCG.SetPublicKey(DevicePublicKey); DeviceCG.SetSerialNumber(Org.BouncyCastle.Math.BigInteger.Zero); DeviceCG.SetNotBefore(iPhone.RootCertificate.NotBefore); DeviceCG.SetNotAfter(iPhone.RootCertificate.NotAfter); DeviceCG.SetSignatureAlgorithm("SHA1WithRSAEncryption"); DeviceCG.AddExtension(Org.BouncyCastle.Asn1.X509.X509Extensions.BasicConstraints, true, new Org.BouncyCastle.Asn1.X509.BasicConstraints(false)); DeviceCertificate = DeviceCG.Generate(iPhone.RootKey.Private); // The \n at the end of these certificates is crucial; hung me up for a while. string sDeviceCertificate = "-----BEGIN CERTIFICATE-----\n" + Convert.ToBase64String(DeviceCertificate.GetEncoded()) + "\n-----END CERTIFICATE-----\n"; byte[] bDeviceCertificate = System.Text.Encoding.UTF8.GetBytes(sDeviceCertificate); string sHostCertificate = "-----BEGIN CERTIFICATE-----\n" + Convert.ToBase64String(iPhone.HostCertificate.GetEncoded()) + "\n-----END CERTIFICATE-----\n"; byte[] bHostCertificate = System.Text.Encoding.UTF8.GetBytes(sHostCertificate); string sRootCertificate = "-----BEGIN CERTIFICATE-----\n" + Convert.ToBase64String(iPhone.RootCertificate.GetEncoded()) + "\n-----END CERTIFICATE-----\n"; byte[] bRootCertificate = System.Text.Encoding.UTF8.GetBytes(sRootCertificate); #endregion MemoryStream MS = new MemoryStream(); XmlWriter XTW = XmlWriter.Create(MS, XWS); XTW.WriteStartDocument(); XTW.WriteDocType("plist", sApplePubID, sAppleSysID, null); XTW.WriteStartElement("plist"); XTW.WriteAttributeString("version", "1.0"); XTW.WriteStartElement("dict"); XTW.WriteElementString("key", "PairRecord"); XTW.WriteStartElement("dict"); XTW.WriteElementString("key", "DeviceCertificate"); XTW.WriteStartElement("data"); XTW.WriteBase64(bDeviceCertificate, 0, bDeviceCertificate.Length); XTW.WriteEndElement(); // DeviceCertificate data XTW.WriteElementString("key", "HostCertificate"); XTW.WriteStartElement("data"); XTW.WriteBase64(bHostCertificate, 0, bHostCertificate.Length); XTW.WriteEndElement(); // HostCertificate data XTW.WriteElementString("key", "HostID"); XTW.WriteElementString("string", iPhone.sHostID); XTW.WriteElementString("key", "RootCertificate"); XTW.WriteStartElement("data"); XTW.WriteBase64(bRootCertificate, 0, bRootCertificate.Length); XTW.WriteEndElement(); // RootCertificate data XTW.WriteEndElement(); // inner dict XTW.WriteElementString("key", "Request"); switch (Action) { case PairAction.Pair: XTW.WriteElementString("string", "Pair"); break; case PairAction.ValidatePair: XTW.WriteElementString("string", "ValidatePair"); break; case PairAction.Unpair: XTW.WriteElementString("string", "Unpair"); break; } XTW.WriteEndElement(); // outer dict XTW.WriteEndElement(); // plist XTW.WriteEndDocument(); XTW.Flush(); byte[] bXMLData = MS.GetBuffer(); XTW.Close(); // Closes MS, too. PListSend(bXMLData); bXMLData = PListReceive(); if (!CheckXMLForSuccess(bXMLData)) return false; // Have to validate after pairing for "trusted host status", apparently. if (Action == PairAction.Pair) return Pair(PairAction.ValidatePair); return true; }