Discuss this help topic in SecureBlackbox Forum
Creating ASiC-E containers
The creation of ASiC-E containers is much similar to the creation of ASiC-S ones; however the former ones are complicated by the use of Manifests.
The result of running the sample code below is a ZIP archive containing:
// ASiC-E example (Pascal code)
Container := TElASiCContainer.Create(nil);
Container.CreateContainer;
Container.SignatureForm := asfExtended;
// Add the documents
Container.Add('C:\Documents\sample.txt');
Container.Add('C:\Documents\sample2.txt');
// Add a manifest that will point to the documents in the archive.
Manifest := Container.AddManifest;
Manifest.AddReference(Container.Directory.EntryWithName('sample.txt'));
Manifest.AddReference(Container.Directory.EntryWithName('sample2.txt'));
// Add a timestamp.
Timestamp := Container.AddTimestamp(Timestamper);
// The manifest will be timestamped.
Manifest.Signature := Timestamp;
// Add the second manifest, with the first document and its CAdES signature.
Manifest2 := Container.AddManifest;
Manifest2.AddReference(Container.Directory.EntryWithName('sample.txt'));
CadesSig := Container.AddCAdESSignature;
CadesSig.AddSignatureEntry(Certificate, nil);
Manifest2.Signature := CadesSig;
// Adding the XAdES signature does not require a manifest; data will be stored in the signatures.xml.
XadesSig := Container.AddXAdESSignature(Certificate);
// Create a XAdES signature entry over the first document only.
XadesSig.SignatureEntries[0].AddReference(Container.Directory.EntryWithName('sampel.txt'));
// Create another XAdES over both files:
index := XadesSig.AddSignatureEntry(Certificate2);
XSig.SignatureEntries[index].AddReference(Container.Directory.EntryWithName('sample.txt'));
XSig.SignatureEntries[index].AddReference(Container.Directory.EntryWithName('sample2.txt'));
// Save the files.
Container.Compress('C:\Documents\sample.asice');
// Add a CAdES signature. First load a certificate.
Certificate := TElX509Certificate.Create(nil);
Certificate.LoadFromFileAuto('C:\Documents\cert.pfx', 'password');
CadesSig := Container.AddCAdESSignature;
CadesSig.AddSignatureEntry(Certificate, nil);
// Adding a XAdES signature; use the same certificate.
XadesSig := Container.AddXAdESSignature(Certificate);
// We can add multiple signature entries to the XAdES signature document.
Certificate2 := TElX509Certificate.Create(nil);
Certificate2.LoadFromFileAuto('C:\Documents\cert2.pfx', 'password');
index := XadesSig.AddSignatureEntry(Certificate2);
// in this case we should also point to the signed entry
XadesSig.SignatureEntries[index].AddReference(Container.ASiCSSignedEntry);
// Save the archive calculating all timestamps and signatures.
Container.Compress('C:\Documents\sample.asics');