static FLMRequiredExtensionsType BuildFlmRequiredExtention(X509Certificate2 x509Certificate2)
        {
            FLMRequiredExtensionsType flmRequiredExtention = new FLMRequiredExtensionsType();

            flmRequiredExtention.FacilityInfo = new FLMRequiredExtensionsTypeFacilityInfo();
            flmRequiredExtention.FacilityInfo.AnnotationText          = new UserTextType();
            flmRequiredExtention.FacilityInfo.AnnotationText.language = "en-us";
            flmRequiredExtention.FacilityInfo.AnnotationText.Value    = "Example Facility List Message";
            flmRequiredExtention.FacilityInfo.FacilityName            = new UserTextType();
            flmRequiredExtention.FacilityInfo.FacilityName.Value      = "urn:x-facilityID:dcipllc.com:000000";
            flmRequiredExtention.FacilityInfo.UTCOffset        = new UTCOffsetType();
            flmRequiredExtention.FacilityInfo.UTCOffset.Offset = "-05:00";

            flmRequiredExtention.SecurityDeviceList = new SecurityDeviceListType();

            CombinedType securityDevice = new CombinedType();

            securityDevice.KeyInfo = new KeyInfoType();
            securityDevice.KeyInfo.ItemsElementName    = new ItemsChoiceType3[2];
            securityDevice.KeyInfo.ItemsElementName[0] = ItemsChoiceType3.KeyName;
            securityDevice.KeyInfo.ItemsElementName[1] = ItemsChoiceType3.X509Data;
            securityDevice.KeyInfo.Items    = new object[2];
            securityDevice.KeyInfo.Items[0] = x509Certificate2.IssuerName.Name;

            X509DataType x509Data = new X509DataType();

            x509Data.ItemsElementName    = new ItemsChoiceType1[1];
            x509Data.ItemsElementName[0] = ItemsChoiceType1.X509Certificate;
            x509Data.Items    = new object[1];
            x509Data.Items[0] = x509Certificate2.RawData;

            securityDevice.KeyInfo.Items[1] = x509Data;

            securityDevice.DeviceDescription = new deviceDescriptionType();
            securityDevice.DeviceDescription.DeviceIdentifier        = new deviceIdentifierPolyType();
            securityDevice.DeviceDescription.DeviceIdentifier.idtype = new deviceIdentifierPolyTypeIdtype();
            securityDevice.DeviceDescription.DeviceIdentifier.idtype = deviceIdentifierPolyTypeIdtype.DeviceUID;
            securityDevice.DeviceDescription.DeviceIdentifier.Value  = "urn:uid:" + Guid.Empty;
            securityDevice.DeviceDescription.DeviceTypeID            = new deviceTypeType();
            securityDevice.DeviceDescription.DeviceTypeID.scope      = "http://www.dcipllc.com/schemas/430-7/2009/FLM#deviceTypes";
            securityDevice.DeviceDescription.DeviceTypeID.Value      = "SMS";
            securityDevice.DeviceDescription.DeviceSerial            = "000000";
            securityDevice.DeviceDescription.ManufacturerName        = "Doremi";
            securityDevice.DeviceDescription.ModelNumber             = "DCP0000";
            securityDevice.DeviceDescription.DeviceComment           = new UserTextType();
            securityDevice.DeviceDescription.DeviceComment.Value     = "Not a Real Device";

            flmRequiredExtention.SecurityDeviceList.Items    = new CertOnlyType[1];
            flmRequiredExtention.SecurityDeviceList.Items[0] = securityDevice;

            return(flmRequiredExtention);
        }
        static void Main(string[] args)
        {
            //X509Certificate2 x509Certificate2 = GetCertificate("990B25F50DC7E2B548BE75AFED579448", StoreLocation.CurrentUser);
            //X509Certificate2 x509Certificate2 = GetCertificate("23B0B092F414B89745B443F2B3700039", StoreLocation.LocalMachine);
            //X509Certificate2 x509Certificate2 = GetCertificate("0efb7eebdcda4f64a718db3ff908b085", StoreLocation.LocalMachine);
            X509Certificate2 x509Certificate2 = GetCertificate("0EFB7EEBDCDA4F64A718DB3FF908B085", StoreLocation.CurrentUser); // *.dcipllc.com

            DCinemaSecurityMessageType extraTheatreMessage = BuildDCinemaSecurityMessage(x509Certificate2);
            TextWriter    WriteFileStream = new StreamWriter(@"\Source_SMPTE\Output\ExtraTheatreMessage.xml");
            XmlSerializer xmlSerializer   = new XmlSerializer(typeof(DCinemaSecurityMessageType));

            xmlSerializer.Serialize(WriteFileStream, extraTheatreMessage);
            WriteFileStream.Close();

            FLMRequiredExtensionsType flmRequiredExtention = BuildFlmRequiredExtention(x509Certificate2);

            WriteFileStream = new StreamWriter(@"\Source_SMPTE\Output\FacilityListMessageRequiredExtention.xml");
            xmlSerializer   = new XmlSerializer(typeof(FLMRequiredExtensionsType));
            xmlSerializer.Serialize(WriteFileStream, flmRequiredExtention);
            WriteFileStream.Close();

            AppendFLMRequiredExtension(extraTheatreMessage, flmRequiredExtention);
            WriteFileStream = new StreamWriter(@"\Source_SMPTE\Output\FaciltyListMessage.xml");
            xmlSerializer   = new XmlSerializer(typeof(DCinemaSecurityMessageType));
            xmlSerializer.Serialize(WriteFileStream, extraTheatreMessage);
            WriteFileStream.Close();

            SignETM(extraTheatreMessage, x509Certificate2);
            WriteFileStream = new StreamWriter(@"\Source_SMPTE\Output\FaciltyListMessage_Signed.xml");
            xmlSerializer   = new XmlSerializer(typeof(DCinemaSecurityMessageType));
            xmlSerializer.Serialize(WriteFileStream, extraTheatreMessage);
            WriteFileStream.Close();

            ServiceFacilityListMessageClient client = new ServiceFacilityListMessageClient();

            System.Console.WriteLine("Sending FLM: " + extraTheatreMessage.AuthenticatedPublic.MessageId);
            string result = client.FLM(extraTheatreMessage);

            System.Console.WriteLine(result);
        }
        static DCinemaSecurityMessageType AppendFLMRequiredExtension(DCinemaSecurityMessageType extraTheatreMessage, FLMRequiredExtensionsType flmRequiredExtention)
        {
            DCinemaSecurityMessageType facilityListMessage = extraTheatreMessage;

            StringWriter  stringWriter  = new StringWriter();
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(FLMRequiredExtensionsType));

            xmlSerializer.Serialize(stringWriter, flmRequiredExtention);
            string      serializedXML           = stringWriter.ToString();
            XmlDocument docFlmRequiredExtention = new XmlDocument();

            docFlmRequiredExtention.LoadXml(serializedXML);

            facilityListMessage.AuthenticatedPublic.RequiredExtensions = docFlmRequiredExtention.DocumentElement;

            extraTheatreMessage.AuthenticatedPublic.MessageType          = "http://www.smpte-ra.org/schemas/430-7/2008/FLM";
            extraTheatreMessage.AuthenticatedPublic.AnnotationText.Value = "Test Facility List Message";

            return(facilityListMessage);
        }