public InputParameterData(CommonInputType commonInput, RecordCommonInputType recordCommonInput, CareReceiverIdType careReceiverId, DateTime agreementStartDate) { this.CommonInput = commonInput; this.RecordCommonInput = recordCommonInput; this.CareReceiverId = careReceiverId; this.AgreementStartDate = agreementStartDate; }
public static ConsultResponse Consult(this GlobalMedicalFileConsultationPortTypeClient client, CommonInputType common, RoutingType routing, RetrieveTransactionRequestType detailValue, out ArchivingInfo archivingInfo) { var detail = new BlobType(); detail.Id = "_" + Guid.NewGuid().ToString(); detail.ContentType = "text/xml"; detail.ContentEncoding = "none"; var detailStream = new MemoryStream(); var serializer = new XmlSerializer(typeof(RetrieveTransactionRequestType)); serializer.Serialize(detailStream, detailValue); detail.Value = detailStream.ToArray(); ResponseReturnType super = client.Consult(common, routing, detail); archivingInfo = new ArchivingInfo(); archivingInfo.RequestDetail = detail; archivingInfo.RequestXadesT = null; archivingInfo.ResponseDetail = super.Detail; archivingInfo.ResponseXadesT = super.XadesT; var retVal = new ConsultResponse(); retVal.Common = super.CommonOutput; if (super.Detail.ContentType == "text/xml" && super.Detail.ContentEncoding == "none") { var reader = XmlReader.Create(new MemoryStream(super.Detail.Value)); var deserializer = new XmlSerializer(typeof(RetrieveTransactionResponseType)); if (deserializer.CanDeserialize(reader)) { retVal.DetailValue = deserializer.Deserialize(reader) as RetrieveTransactionResponseType; } } return retVal; }
public static ResponseReturnType Consult(this GlobalMedicalFileConsultationPortTypeClient client, CommonInputType common, RoutingType routing, BlobType detail) { SendRequestType request = new SendRequestType(); request.CommonInput = common; request.Routing = routing; request.Detail = detail; //No xades required SendResponseType response = client.consultGlobalMedicalFile(request); if (response.Status.Code != "200") throw new InvalidOperationException(String.Format("eHealth returned the following status: {0}, {1}", response.Status.Code, response.Status.Message[0].Value)); //No xades returned return response.Return; }
private void DoTest(GenericAsyncClient client, TimeStampAuthorityClient tsaClient) { //Create common input with info about the requestor, must match SAML CommonInputType commonInput = new CommonInputType(); commonInput.InputReference = "TADM1234567890"; commonInput.Request = new RequestType(); commonInput.Request.IsTest = true; commonInput.Origin = new OrigineType(); commonInput.Origin.Package = new PackageType(); commonInput.Origin.Package.Name = "eH-I Test"; commonInput.Origin.Package.License = new LicenseType(); commonInput.Origin.Package.License.Username = "******"; //provide you own license commonInput.Origin.Package.License.Password = "******"; //provide your own password commonInput.Origin.SiteID = "01"; //CareNet Gateway ID. commonInput.Origin.CareProvider = new CareProviderType(); commonInput.Origin.CareProvider.Nihii = new NihiiType(); commonInput.Origin.CareProvider.Nihii.Quality = "hospital"; commonInput.Origin.CareProvider.Nihii.Value = "71022212000"; commonInput.Origin.CareProvider.Organization = new IdType(); commonInput.Origin.CareProvider.Organization.Nihii = commonInput.Origin.CareProvider.Nihii; //create blob value Stream raw = new MemoryStream(Encoding.ASCII.GetBytes(RandomString(1024*1024))); //you might use a file instead MemoryStream deflated = new MemoryStream(); DeflateStream deflater = new DeflateStream(deflated, CompressionMode.Compress, true); raw.CopyTo(deflater); deflater.Flush(); deflater.Close(); //create blob Blob blob = new Blob(); blob.MessageName = "ADM"; blob.Id = "_" + Guid.NewGuid().ToString(); blob.ContentType = "text/plain"; blob.Value = deflated.ToArray(); //Create Xml with the blob inside it to sign. XmlDocument signDoc; using(MemoryStream signDocStream = new MemoryStream()) { XmlWriter signDocWriter = XmlWriter.Create(signDocStream); signDocWriter.WriteStartElement("root"); XmlSerializer serializer = new XmlSerializer(typeof(Blob), new XmlRootAttribute("Detail")); serializer.Serialize(signDocWriter, blob); signDocWriter.WriteEndElement(); signDocWriter.Flush(); signDocStream.Seek(0, SeekOrigin.Begin); signDoc = new XmlDocument(); signDoc.PreserveWhitespace = true; signDoc.Load(signDocStream); } //create the xades-t var xigner = new XadesCreator(sign); xigner.TimestampProvider = new EHealthTimestampProvider(tsaClient); xigner.DataTransforms.Add(new XmlDsigBase64Transform()); xigner.DataTransforms.Add(new OptionalDeflateTransform()); XmlElement xades = xigner.CreateXadesT(signDoc, blob.Id); //conver the xades-t to byte array MemoryStream xadesSteam = new MemoryStream(); using (var writer = XmlWriter.Create(xadesSteam)) { xades.WriteTo(writer); } //Create the Base64 structure base64Binary xadesParam = new base64Binary(); xadesParam.contentType = "text/xml"; xadesParam.Value = xadesSteam.ToArray(); //Send the message Thread.Sleep(1000); //sleep to let the eID recover :( TAck nipAck = client.post(commonInput, blob, xadesParam); //check if the messages was correctly send Assert.AreEqual("urn:nip:tack:result:major:success", nipAck.ResultMajor); //Get any waiting responses MsgQuery msgQuery = new MsgQuery(); msgQuery.Max = 1; //best to specify to avoid quota exceeds or memory issues msgQuery.Include = true; Query tackQuery = new Query(); tackQuery.Max = 10; //best to specify, but since they are smaller we can handle more tackQuery.Include = true; //Get the messages & tACK Thread.Sleep(1000); //sleep to let the eID recover :( Responses rsp = client.get(commonInput.Origin, msgQuery, tackQuery); //Collect the hash values of the messages & the tack //Should be a list of bytes arrays, but WCF isn't that smart so you need to do the encoding (base64, sperated by spaces) StringBuilder msgHashValues = new StringBuilder(); if (rsp.MsgResponse != null) { foreach (MsgResponse msgRsp in rsp.MsgResponse) { //Parse the xades, and rework it to a doc that contains the detail & xades. XmlDocument verifyDoc; using (MemoryStream verifyDocStream = new MemoryStream()) { //Create new doc with element root XmlWriter verifyDocWriter = XmlWriter.Create(verifyDocStream); verifyDocWriter.WriteStartElement("root", "urn:dummy"); //Add blob (detail) XmlSerializer serializer = new XmlSerializer(typeof(Blob), "urn:be:cin:types:v1"); serializer.Serialize(verifyDocWriter, msgRsp.Detail); //Add xades-T XmlDocument xadesDoc = new XmlDocument(); xadesDoc.PreserveWhitespace = true; xadesDoc.Load(new MemoryStream(msgRsp.Xadest.Value)); xadesDoc.DocumentElement.WriteTo(verifyDocWriter); verifyDocWriter.WriteEndElement(); verifyDocWriter.Flush(); //Reload the result verifyDocStream.Seek(0, SeekOrigin.Begin); verifyDoc = new XmlDocument(); verifyDoc.PreserveWhitespace = true; verifyDoc.Load(verifyDocStream); //Validate the doc XmlElement prop = (XmlElement) XadesTools.FindXadesProperties(verifyDoc.DocumentElement)[0]; XadesVerifier verifier = new XadesVerifier(); verifier.RevocationMode = X509RevocationMode.NoCheck; //only for testing verifier.TrustedTsaCerts.Add(tsaTrust); SignatureInfo info = verifier.Verify(verifyDoc, prop); //check info (time & certificate) to your own rules. } if (msgHashValues.Length != 0) msgHashValues.Append(" "); msgHashValues.Append(Convert.ToBase64String(msgRsp.Detail.HashValue)); } } List<String> resend = new List<string>(); StringBuilder tackContents = new StringBuilder(); if (rsp.TAckResponse != null) { foreach (TAckResponse tackRsp in rsp.TAckResponse) { //Parse the xades, and rework it to a doc that contains the detail & xades. XmlDocument verifyDoc; using (MemoryStream verifyDocStream = new MemoryStream()) { //Create new doc with element root XmlWriter verifyDocWriter = XmlWriter.Create(verifyDocStream); verifyDocWriter.WriteStartElement("root", "urn:dummy"); //Add blob (detail) XmlSerializer serializer = new XmlSerializer(typeof(TAck), "urn:be:cin:nip:async:generic"); serializer.Serialize(verifyDocWriter, tackRsp.TAck); //Add xades-T XmlDocument xadesDoc = new XmlDocument(); xadesDoc.PreserveWhitespace = true; xadesDoc.Load(new MemoryStream(tackRsp.Xadest.Value)); xadesDoc.DocumentElement.WriteTo(verifyDocWriter); verifyDocWriter.WriteEndElement(); verifyDocWriter.Flush(); //Reload the result verifyDocStream.Seek(0, SeekOrigin.Begin); verifyDoc = new XmlDocument(); verifyDoc.PreserveWhitespace = true; verifyDoc.Load(verifyDocStream); //Validate the doc XmlElement prop = (XmlElement)XadesTools.FindXadesProperties(verifyDoc.DocumentElement)[0]; XadesVerifier verifier = new XadesVerifier(); verifier.RevocationMode = X509RevocationMode.NoCheck; //only for testing verifier.TrustedTsaCerts.Add(tsaTrust); SignatureInfo info = verifier.Verify(verifyDoc, prop); //check info (time & certificate) to your own rules. } //send failed, resend later. if ("urn:nip:tack:result:major:success" != tackRsp.TAck.ResultMajor) { resend.Add(tackRsp.TAck.AppliesTo); } if (tackContents.Length != 0) tackContents.Append(" "); tackContents.Append(Convert.ToBase64String(tackRsp.TAck.Value)); //the content of the tAck is already a hash... } } //Confirm the received messages & tack Thread.Sleep(1000); //sleep to let the eID recover :( client.confirm(commonInput.Origin, msgHashValues.ToString(), tackContents.ToString()); //We should not have anything to resend Assert.AreEqual(0, resend.Count); }
public static ResponseReturnType Consult(this GlobalMedicalFileConsultationPortTypeClient client, CommonInputType common, RoutingType routing, BlobType detail) { SendRequestType request = new SendRequestType(); request.CommonInput = common; request.Routing = routing; request.Detail = detail; //No xades required SendResponseType response = client.consultGlobalMedicalFile(request); if (response.Status.Code != "200") { throw new InvalidOperationException(String.Format("eHealth returned the following status: {0}, {1}", response.Status.Code, response.Status.Message[0].Value)); } //No xades returned return(response.Return); }
public static ConsultResponse Consult(this GlobalMedicalFileConsultationPortTypeClient client, CommonInputType common, RoutingType routing, RetrieveTransactionRequestType detailValue, out ArchivingInfo archivingInfo) { var detail = new BlobType(); detail.Id = "_" + Guid.NewGuid().ToString(); detail.ContentType = "text/xml"; detail.ContentEncoding = "none"; var detailStream = new MemoryStream(); var serializer = new XmlSerializer(typeof(RetrieveTransactionRequestType)); serializer.Serialize(detailStream, detailValue); detail.Value = detailStream.ToArray(); ResponseReturnType super = client.Consult(common, routing, detail); archivingInfo = new ArchivingInfo(); archivingInfo.RequestDetail = detail; archivingInfo.RequestXadesT = null; archivingInfo.ResponseDetail = super.Detail; archivingInfo.ResponseXadesT = super.XadesT; var retVal = new ConsultResponse(); retVal.Common = super.CommonOutput; if (super.Detail.ContentType == "text/xml" && super.Detail.ContentEncoding == "none") { var reader = XmlReader.Create(new MemoryStream(super.Detail.Value)); var deserializer = new XmlSerializer(typeof(RetrieveTransactionResponseType)); if (deserializer.CanDeserialize(reader)) { retVal.DetailValue = deserializer.Deserialize(reader) as RetrieveTransactionResponseType; } } return(retVal); }
private void DoTest(GenericAsyncClient client, TimeStampAuthorityClient tsaClient) { //Create common input with info about the requestor, must match SAML CommonInputType commonInput = new CommonInputType(); commonInput.InputReference = "TADM1234567890"; commonInput.Request = new RequestType(); commonInput.Request.IsTest = true; commonInput.Origin = new OrigineType(); commonInput.Origin.Package = new PackageType(); commonInput.Origin.Package.Name = "eH-I Test"; commonInput.Origin.Package.License = new LicenseType(); commonInput.Origin.Package.License.Username = "******"; //provide you own license commonInput.Origin.Package.License.Password = "******"; //provide your own password commonInput.Origin.SiteID = "01"; //CareNet Gateway ID. commonInput.Origin.CareProvider = new CareProviderType(); commonInput.Origin.CareProvider.Nihii = new NihiiType(); commonInput.Origin.CareProvider.Nihii.Quality = "hospital"; commonInput.Origin.CareProvider.Nihii.Value = "71022212000"; commonInput.Origin.CareProvider.Organization = new IdType(); commonInput.Origin.CareProvider.Organization.Nihii = commonInput.Origin.CareProvider.Nihii; //create blob value Stream raw = new MemoryStream(Encoding.ASCII.GetBytes(RandomString(1024 * 1024))); //you might use a file instead MemoryStream deflated = new MemoryStream(); DeflateStream deflater = new DeflateStream(deflated, CompressionMode.Compress, true); raw.CopyTo(deflater); deflater.Flush(); deflater.Close(); //create blob Blob blob = new Blob(); blob.MessageName = "ADM"; blob.Id = "_" + Guid.NewGuid().ToString(); blob.ContentType = "text/plain"; blob.Value = deflated.ToArray(); //Create Xml with the blob inside it to sign. XmlDocument signDoc; using (MemoryStream signDocStream = new MemoryStream()) { XmlWriter signDocWriter = XmlWriter.Create(signDocStream); signDocWriter.WriteStartElement("root"); XmlSerializer serializer = new XmlSerializer(typeof(Blob), new XmlRootAttribute("Detail")); serializer.Serialize(signDocWriter, blob); signDocWriter.WriteEndElement(); signDocWriter.Flush(); signDocStream.Seek(0, SeekOrigin.Begin); signDoc = new XmlDocument(); signDoc.PreserveWhitespace = true; signDoc.Load(signDocStream); } //create the xades-t var xigner = new XadesCreator(sign); xigner.TimestampProvider = new EHealthTimestampProvider(tsaClient); xigner.DataTransforms.Add(new XmlDsigBase64Transform()); xigner.DataTransforms.Add(new OptionalDeflateTransform()); XmlElement xades = xigner.CreateXadesT(signDoc, blob.Id); //conver the xades-t to byte array MemoryStream xadesSteam = new MemoryStream(); using (var writer = XmlWriter.Create(xadesSteam)) { xades.WriteTo(writer); } //Create the Base64 structure base64Binary xadesParam = new base64Binary(); xadesParam.contentType = "text/xml"; xadesParam.Value = xadesSteam.ToArray(); //Send the message Thread.Sleep(1000); //sleep to let the eID recover :( TAck nipAck = client.post(commonInput, blob, xadesParam); //check if the messages was correctly send Assert.AreEqual("urn:nip:tack:result:major:success", nipAck.ResultMajor); //Get any waiting responses MsgQuery msgQuery = new MsgQuery(); msgQuery.Max = 1; //best to specify to avoid quota exceeds or memory issues msgQuery.Include = true; Query tackQuery = new Query(); tackQuery.Max = 10; //best to specify, but since they are smaller we can handle more tackQuery.Include = true; //Get the messages & tACK Thread.Sleep(1000); //sleep to let the eID recover :( Responses rsp = client.get(commonInput.Origin, msgQuery, tackQuery); //Collect the hash values of the messages & the tack //Should be a list of bytes arrays, but WCF isn't that smart so you need to do the encoding (base64, sperated by spaces) StringBuilder msgHashValues = new StringBuilder(); if (rsp.MsgResponse != null) { foreach (MsgResponse msgRsp in rsp.MsgResponse) { //Parse the xades, and rework it to a doc that contains the detail & xades. XmlDocument verifyDoc; using (MemoryStream verifyDocStream = new MemoryStream()) { //Create new doc with element root XmlWriter verifyDocWriter = XmlWriter.Create(verifyDocStream); verifyDocWriter.WriteStartElement("root", "urn:dummy"); //Add blob (detail) XmlSerializer serializer = new XmlSerializer(typeof(Blob), "urn:be:cin:types:v1"); serializer.Serialize(verifyDocWriter, msgRsp.Detail); //Add xades-T XmlDocument xadesDoc = new XmlDocument(); xadesDoc.PreserveWhitespace = true; xadesDoc.Load(new MemoryStream(msgRsp.Xadest.Value)); xadesDoc.DocumentElement.WriteTo(verifyDocWriter); verifyDocWriter.WriteEndElement(); verifyDocWriter.Flush(); //Reload the result verifyDocStream.Seek(0, SeekOrigin.Begin); verifyDoc = new XmlDocument(); verifyDoc.PreserveWhitespace = true; verifyDoc.Load(verifyDocStream); //Validate the doc XmlElement prop = (XmlElement)XadesTools.FindXadesProperties(verifyDoc.DocumentElement)[0]; XadesVerifier verifier = new XadesVerifier(); verifier.RevocationMode = X509RevocationMode.NoCheck; //only for testing verifier.TrustedTsaCerts.Add(tsaTrust); SignatureInfo info = verifier.Verify(verifyDoc, prop); //check info (time & certificate) to your own rules. } if (msgHashValues.Length != 0) { msgHashValues.Append(" "); } msgHashValues.Append(Convert.ToBase64String(msgRsp.Detail.HashValue)); } } List <String> resend = new List <string>(); StringBuilder tackContents = new StringBuilder(); if (rsp.TAckResponse != null) { foreach (TAckResponse tackRsp in rsp.TAckResponse) { //Parse the xades, and rework it to a doc that contains the detail & xades. XmlDocument verifyDoc; using (MemoryStream verifyDocStream = new MemoryStream()) { //Create new doc with element root XmlWriter verifyDocWriter = XmlWriter.Create(verifyDocStream); verifyDocWriter.WriteStartElement("root", "urn:dummy"); //Add blob (detail) XmlSerializer serializer = new XmlSerializer(typeof(TAck), "urn:be:cin:nip:async:generic"); serializer.Serialize(verifyDocWriter, tackRsp.TAck); //Add xades-T XmlDocument xadesDoc = new XmlDocument(); xadesDoc.PreserveWhitespace = true; xadesDoc.Load(new MemoryStream(tackRsp.Xadest.Value)); xadesDoc.DocumentElement.WriteTo(verifyDocWriter); verifyDocWriter.WriteEndElement(); verifyDocWriter.Flush(); //Reload the result verifyDocStream.Seek(0, SeekOrigin.Begin); verifyDoc = new XmlDocument(); verifyDoc.PreserveWhitespace = true; verifyDoc.Load(verifyDocStream); //Validate the doc XmlElement prop = (XmlElement)XadesTools.FindXadesProperties(verifyDoc.DocumentElement)[0]; XadesVerifier verifier = new XadesVerifier(); verifier.RevocationMode = X509RevocationMode.NoCheck; //only for testing verifier.TrustedTsaCerts.Add(tsaTrust); SignatureInfo info = verifier.Verify(verifyDoc, prop); //check info (time & certificate) to your own rules. } //send failed, resend later. if ("urn:nip:tack:result:major:success" != tackRsp.TAck.ResultMajor) { resend.Add(tackRsp.TAck.AppliesTo); } if (tackContents.Length != 0) { tackContents.Append(" "); } tackContents.Append(Convert.ToBase64String(tackRsp.TAck.Value)); //the content of the tAck is already a hash... } } //Confirm the received messages & tack Thread.Sleep(1000); //sleep to let the eID recover :( client.confirm(commonInput.Origin, msgHashValues.ToString(), tackContents.ToString()); //We should not have anything to resend Assert.AreEqual(0, resend.Count); }