XAdES Specification based on the Apache
           XMLSec Project

       Zdravko Danailov             Krassen Deltchev
Email: nqkoi_ot_bg@yahoo.com Email: Krassen.Deltchev@rub.de




                        Project thesis

                              at

             Chair for Network and Data Security
                    Prof. Dr. Jörg Schwenk

             advised through Dipl.Ing. Lijun Liao


                         22.05.2007




       Horst-Görtz Institute Ruhr-University of Bochum
Abstract
XML Advanced Electronic Signature (XAdES) provides basic authentication and integrity protection, and
satisfies the legal requirements for advanced electronic signatures.There are several implementations of
XAdES, but most of them are not OpenSource, or are partialy proprietary software. Great project concerned
with Digital Electronic Signatures is the OpenSource Apache XML Security Project. For the developer and
common user there is an implementation for the XMLDSIG specification, but still no one for XAdES.
The free source code implemetations of XAdES threat this project as a separate one and there is no interface,
which can explicit assemble them into the Apache XML Sec. That’s why, the scope of our project is to create
a library, that implements XAdES into the OpenSource Apache XML Security- to extend its functionality
and level of security, so using the Apache XML Sec, gives the opportunity to handle Advanced Electronic
Signatures, which is a standard of security nowadays.
The library is developed in Java, because shouldn’t be any kind of OS platform - dependencies, using it as a
plug-in to the Security Project of Apache.
   More detailed, to validate the signing and verifying of signatures, and also test our code, we use the text-
based test suite of JUnit.




                                                       i
Acknowledgements
We want to express our gratitude to our families and friends, who gave their moral support all the time
and contributed for the better working atmosphere.
To Dipl.Ing. Lijun Liao, we want to thank for the technical input and support.




                                                  ii
Contents

1 Introduction                                                                                                                                              1
  1.1 Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                   1
  1.2 Related works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                     2

2 Background                                                                                                                                                4
  2.1 Definitions and Abbreviations . . . . . . . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   4
  2.2 XML . . . . . . . . . . . . . . . . . . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   5
  2.3 XML Advanced Electronic Signature Data Structures .                   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   6
      2.3.1 XML Signature . . . . . . . . . . . . . . . . .                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   6
      2.3.2 XAdES- XML Advanced Electronic Signature                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   8

3 XAdES Elements                                                                                                                                            10
  3.1 Overview . . . . . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   10
  3.2 QualifyingProperties . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
  3.3 SignedProperties . . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  3.4 UnsignedProperties . . . . . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
  3.5 SignedSignatureProperties . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   17
  3.6 SignedDataObjectProperties . . . . . . . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
  3.7 UnsignedSignatureProperties . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
  3.8 The SigningTime element . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
  3.9 The SigningCertificate element . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
  3.10 The SignaturePolicyIdentifier element . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
  3.11 The SignatureProductionPlace element . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  3.12 The SignerRole element . . . . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31
  3.13 The DataObjectFormat element . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34
  3.14 The CommitmentTypeIndication element . . .           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
  3.15 The AllDataObjectsTimeStamp element . . . .          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
  3.16 The IndividualDataObjectsTimeStamp element           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
  3.17 The CounterSignature element . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41

4 Datatypes                                                                                                                                                 42
  4.1 The ObjectIdentifierType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                       42
  4.2 The EncapsulatedPKIDataType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                         44
  4.3 The TimeStampType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                                         45

5 Conclusion                                                                                                                                                47

6 Author’s addresses                                                                                                                                        48

7 Bibliography                                                                                                                                              49

A Appendix - XAdES                                                                                                                                           i



                                                     iii
B Appendix - XAdES-BES                      iv

C Appendix - XAdES-More then one Element    vi

D Appendix - Screenshots                    xi




                                       iv
List of Figures

 2.1    XMLDSIG Specification . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   6
 2.2    XMLDSIG example . . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   7
 2.3    Advanced Electronic Signature(XAdES)       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   8
 2.4    XAdES Specification . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   9

 3.1    QualifyingProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   12
 3.2    Method setSignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   12
 3.3    Method setUnsignedProperties . . . . . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   13
 3.4    Method setTarget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   13
 3.5    SignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   14
 3.6    Methods setSignedSignatureProperties, setSignedDataObjectProperties . . .                                                  .   .   .   .   .   .   .   .   15
 3.7    UnsignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   16
 3.8    Method setUnsignedSignatureProperties . . . . . . . . . . . . . . . . . . . .                                              .   .   .   .   .   .   .   .   16
 3.9    Method setUnsignedDataObjectProperties . . . . . . . . . . . . . . . . . . .                                               .   .   .   .   .   .   .   .   17
 3.10   SignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   17
 3.11   Contructor SignedSignatureProperties . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   19
 3.12   SignedDataObjectProperties . . . . . . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   20
 3.13   Methods setCommitmentTypeIndication, setDataObjectFormat . . . . . . . .                                                   .   .   .   .   .   .   .   .   20
 3.14   Methods setAllDataObjectsTimeStamp, setIndividualDataObjectsTimeStamp                                                      .   .   .   .   .   .   .   .   21
 3.15   UnsignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   22
 3.16   Method setCounterSignature . . . . . . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   22
 3.17   SigningTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                          .   .   .   .   .   .   .   .   23
 3.18   Constructor SigningTime . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   23
 3.19   SigningCertificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                          .   .   .   .   .   .   .   .   24
 3.20   Method setSigningCertificate . . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   25
 3.21   SignaturePolicyIdentifier . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   26
 3.22   Method setSignaturePolicyId . . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   27
 3.23   Methods setSigPolicyId, setSigPolicyHash . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   27
 3.24   Methods setTransforms1, setSigPolicyQualifiers . . . . . . . . . . . . . . . .                                              .   .   .   .   .   .   .   .   28
 3.25   Method setSigPolicyQualifiers . . . . . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   29
 3.26   SignatureProductionPlace . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   30
 3.27   Methods: setStateOrProvince, setCity . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   30
 3.28   Methods: setPostalCode, setCountryName . . . . . . . . . . . . . . . . . . .                                               .   .   .   .   .   .   .   .   31
 3.29   SignerRole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   32
 3.30   Methods: setClaimedRoles, setCertifiedRoles . . . . . . . . . . . . . . . . .                                               .   .   .   .   .   .   .   .   32
 3.31   Constructor CertifiedRolesList . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   33
 3.32   Constructor ClaimedRolesList . . . . . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   33
 3.33   DataObjectFormat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                           .   .   .   .   .   .   .   .   34
 3.34   Method setDescription . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   34
 3.35   Method setObjectIdentifier . . . . . . . . . . . . . . . . . . . . . . . . . . .                                            .   .   .   .   .   .   .   .   35
 3.36   Method setMimeType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                             .   .   .   .   .   .   .   .   35



                                                       v
3.37   Method setEncoding . . . . . . . . . . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35
3.38   Method setObjectReference attribite . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
3.39   CommitmentTypeIndication . . . . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
3.40   Constructor CommitmentTypeIndication . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38
3.41   Method setCommitmentTypeQualifier . . . .         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   38
3.42   AllDataObjectsTimeStamp . . . . . . . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
3.43   Method setAllDataObjectsTimeStamp . . . .        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   39
3.44   IndividualDataObjectsTimeStamp . . . . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
3.45   Method setIndividualDataObjectsTimeStamp         .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   40
3.46   CounterSignature . . . . . . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   41

4.1    ObjectIdentifierType . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                    .   .   .   .   .   .   .   .   .   42
4.2    IdentifierType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                  .   .   .   .   .   .   .   .   .   42
4.3    DocumentationReferencesType . . . . . . . . . . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   .   .   .   43
4.4    Methods setIdentifier, setDescription, setDocumentationReferences . . . .                                         .   .   .   .   .   .   .   .   .   43
4.5    EncapsulatedPKIDataType . . . . . . . . . . . . . . . . . . . . . . . . . .                                      .   .   .   .   .   .   .   .   .   44
4.6    Method setID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                   .   .   .   .   .   .   .   .   .   45
4.7    TimeStampType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .                                    .   .   .   .   .   .   .   .   .   46
4.8    Method setHashDataInfo, setEncapsulatedTimeStamp, setXMLTimeStamp                                                .   .   .   .   .   .   .   .   .   46

D.1 Screenshot - Eclipse IDE JUnit plug-in console output . . . . . . . . . . . . . . . . . . . . xii
D.2 Screenshot - Eclipse IDE console output . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii




                                                   vi
List of Tables

 2.1   Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .    4
 2.2   Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .     5
 2.3   XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .       6

 A.1 XAdES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .        iii

 B.1 XAdES-BES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .           v

 C.1 XAdES-More then one Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .             x




                                                    vii
1 Introduction
The XML Signature is a method of associating a key with referenced data (octets); it does not normatively
specify how keys are associated with persons or institutions, nor the meaning of the data, being referenced
and signed.
   The main goal of our project is to build a library, which extends the Apache XML Security Project, to
meet the XAdES specification, so that the user shall be able to create advanced electronic signatures and be
able to validate them.
   The XAdES (XML Advanced Electronic Signature) specification is sophisticated and there are strong
hierarchies among the different XML elements. Every one of them is discussed in separated sections of this
thesis(in chapter 3 and chapter 4), where the reader gets an overview on the XML notation, regarding every
specific XAdES element, associated with Java code samples: important constructors, variables, constants;
and at last, but not at least a pointer to the JUnit test, which verifies the right execution of the code in the
library, regarding this particular XAdES element.
   The XAdES specification is extended by the: XAdES-T, XAdES-C, XAdES-X, XAdES-X-L, XAdES-A;
we describe in this thesis only the implemented specifications in our project library of XAdES and XAdES-
BES (Basic Electronic Signature).
   We concentrate only on the creation and verification of electronic signatures, which are valid, requiring
only one signer party; therefore, neither independent (parallel signers, without ordering requirement), nor
embedded (multiple party signers with signer ordering requirement) digital signatures (such as: contracts,
signed between two parties) are described in this work, or find implementation in this version of our project.


1.1 Tools
In this section we will specify the necessary tools and mention some requirements, which are obligatory for
the use, execution and further development of this project.


     1. Tools for development:
            - Java Development Kit (at least version 1.5)1
            - IBM Eclipse IDE2
            - JUnit 3.8.1(Plug-In for Eclipse)3
     2. Tools for the common user:
            - Java Runtime Environment (at least version 1.5)4
  NOTE: We cannot test the functionality of this project and especially of our library with a lower
version of JUnit, because there are no such ones available.
 1
   http://java.sun.com/
 2
   http://www.eclipse.org/
    NOTE: you can use also the Apache Ant toolkit, instead of Eclipse-
    http://ant.apache.org/
 3
   http://www.junit.org/index.htm
 4
   http://java.sun.com/




                                                               1
1.2 Related works
At this moment, there are two projects (JDigiDoc and DContract), which are concerned with XAdES. On
one side, JDigiDoc is a framework and implementation of digital signatures. It validates the private keys of
Estonian ID Cards and Mobile ID Cards for mobile PC devices. JDigiDoc is contrived as an OpenSource.
The java project can be obtained from the website and tested with the Apache XML toolkit, but it is not
designed explicit as a library for the Apache XML Project.

   • JDigiDoc
     Veiko Sinivee
     Veiko.Sinivee@seb.se
     openxades@openxades.org
     http://www.openxades.org/


  On another side, DContract provides a toolbox for the management of digital contracts within Java.It
supports all XML Advanced Electronic Signature types (XAdES v1.3.2 2006-03): XAdES-BES, XAdES-
EPES, XAdES-T, XAdES-C, XAdES-X, XAdES-X-L. It uses PKCS12 key repository management and can
generate RSA key pairs up to 2048 bit. The DContract project is not an OpenSource.

   • DContract
     Frank Cornelis
     http://www.frankcornelis.be
     info@frankcornelis.be


  Other contributions to XAdES shall be listed as follows:

   • Baltimore Technologies
     Vivekanand Sakaram
     (vsakaram@baltimore.com)
     Project information:
     Language: Java
     probably only commercial license
     (code source can be negotiated only on individual basis)


   • Institute for Applied Information Processing and Communications (IAIK),
     Graz University of Technology
     Martin Centner
     (mcentner@iaik.tugraz.at)
     Peter Lipp
     (plipp@iaik.tugraz.at)
     Project information:
     Language: Java
     free for educational use and research (code for commercial license only)




                                                     2
• Kopint-Datorg Rt. (Kopdat)
  Balazs Andras Dohanyos
  (balazs.dohanyos@kopdat.hu)
  Project information:
  Language: C++ (compiled in VC6.0)
  contact sales( no source availability)


• Microsoft
  Eddy Rubens
  (eddyrube@microsoft.com)
  Stefan Santesson
  (stefans@microsoft.com)
  Project information:
  Language: C#
  free library( code availability - yes)


• Universitat Politecnica de Catalunya (UPC)
  Joan Arnedo (joanar@ac.upc.es)
  Juan Carlos Cruellas (cruellas@ac.upc.es)
  Project information:
  Language: Java
  probably commercial licence( no source availability)


• Agencia Catalana de Certificacio [CATCert]
  Marta Cruellas
  (mcruellas@catcert.net)
  Project information:
  no furthur information




                                                3
2 Background
For the better understanding of this thesis and the goal of our library, we shall specify some basic terms and
expound the essence of the main ‘Building Blocks’.


2.1 Definitions and Abbreviations
For the purposes of the current work, the following terms and definitions apply:

  Term                                         Definition
  Arbitrator                                   entity that arbitrates in disputes between a signer and a
                                               verifier
  Attributes Authorities                       provide users with attributes linked to public key certifi-
                                               cates
  Certification Authorities                     provide users with public key certificates
  Registration Authorities                     allow the identification and registration of entities before
                                               a CA generates certificates

  Repository Authorities                       publish CRLs issued by CAs, signature policies issued by
                                               signature policy issuers and optionally public key certifi-
                                               cates
  Signature Policy Issuers                     define the technical and procedural requirements for elec-
                                               tronic signature creation and validation, in order to meet a
                                               particular business need

  Signer                                       entity that creates the electronic signature
  Time-Stamping Authorities                    attest that some data object was formed before a given
                                               trusted time
  Time-Marking Authorities                     record that some data was formed before a given trusted
                                               time
  Trusted Service Providers                    one or more entities that help to build trust relationships
                                               between the signer and verifier
  Verifier                                      entity that verifies the electronic signature

                                           Table 2.1: Definitions




                                                      4
Term                                    Abbreviation
                Attribute Certificate                    AC
                Certification Authority                  CA
                Cryptographic Message Syntax            CMS
                Certificate Revocation List              CRL
                Document Type Definition                 DTD
                Electronic Signature                    ES
                Hyper Text Transfer Protocol            HTTP
                Online Certificate Status Protocol       OCSP
                Object IDentifier                        OID
                Public Key Certificate                   PKC
                Time-Stamping Authorities               TSA
                Trusted Service Providers               TSP
                Time Stamping Unit                      TSU
                Uniform Resource Identifier              URI
                Uniform Resource Name                   URN
                XML Advanced Electronic Signature       XAdES
                XAdES Archiving validation data         XAdES-A
                XAdES Basic Electronic Signature        XAdES-BES
                XAdES Complete validation data          XAdES-C
                XAdES Explicit Policy based Elec-       XAdES-EPES
                tronic Signature
                XAdES with Time-stamp                   XAdES-T
                XAdES eXtended validation data          XAdES-X
                eXtensible Markup Language              XML
                eXtensible Markup Language Digital      XMLDSIG
                SIGnature
                eXtensible Stylesheet Language          XSL
                eXtensible Stylesheet Language          XSLT
                Transformations

                                        Table 2.2: Abbreviations



2.2 XML
As mentioned above XML [XML][XML-schema-part-1][XML-schema-part-2] is the abbreviation for eX-
tensible Markup Language. Its main purpose is to facilitate the sharing of data across different informa-
tion systems, particularly via the Internet. By adding semantic constraints, application languages such as
XHTML, RSS, MathML, GraphML, Scalable Vector Graphics, can be implemented in XML. Moreover,
XML is sometimes used as the specification language for such application languages.
   XML is recommended by the World Wide Web Consortium (W3C). It is a fee-free open standard. The
W3C recommendation specifies both the lexical grammar, and the requirements for parsing.




                                                    5
eXtensible Markup Language
            File extension                       .xml
            Uniform Type                         public.xml
            MIME type                            application/xml, text/xml (deprecated)
            Developed by                         World Wide Web Consortium

            Type of format                        Markup language

            Extended from                         SGML

            Extended to                           XHTML, RSS, Atom, ...

            Standard(s)                           1.0 (Fourth Edition) 1.1 (Second Edition)

                                              Table 2.3: XML




2.3 XML Advanced Electronic Signature Data Structures
2.3.1 XML Signature
This section provides an overview and examples of XML digital signature syntax. An informal representa-
tion and examples are used to describe the structure of the XML signature syntax. This representation and
examples may omit attributes, details and potential features that are explained later.
   XML Signatures are applied to arbitrary digital content (data objects) via an indirection. Data objects are
digested, the resulting value is placed in an element with other information and that element is then digested
and cryptographically signed. XML digital signatures are represented by the Signature element which has
the following structure:

                                              XMLDSIG
< d s : S i g n a t u r e ID ? >− − − − − − − − −+− − − − −+
   <ds:SignedInfo>                               |         |
        <ds:CanonicalizationMethod />            |         |
        <ds:SignatureMethod / >                  |         |
        ( < d s : R e f e r e n c e URI? >       |         |
            (<ds:Transforms>)?                   |         |
            <ds:DigestMethod>                    |         |
            <ds:DigestValue>                     |         |
        < / d s : R e f e r e n c e >)+          |         |
   </ ds:SignedInfo>                             |         |
   <ds:SignatureValue>                           |         |
   ( < d s : K e y I n f o >)?− − − − − − − − − +          |
   <ds:Object>                                             |
< d s : S i g n a t u r e >− − − − − − − − − − − − − − − −+


                                    Figure 2.1: XMLDSIG Specification




                                                      6
Signatures are related to data objects via URIs. Within an XML document, signatures are related to local
data objects via fragment identifiers. Such local data can be included within an enveloping signature or
can enclose an enveloped signature. Detached signatures are over external network resources or local data
objects that reside within the same XML document as sibling elements; in this case, the signature is neither
enveloping (signature is parent) nor enveloped attribute (signature is child). Since a Signature element (and
its Id value/name) may co-exist or be combined with other elements (and their IDs) within a single XML
document, care should be taken in choosing names such that there are no subsequent collisions that violate
the ID uniqueness validity constraint.
   The following example is a detached signature of the content of the HTML4.01 in XML specification.


< n d s : R o o t E l e m e n t x m l n s : n d s = " h t t p : / / www. n d s . r u b . de / x a d e s " >
    < n d s : A I −NDS−HGI I d = " AI−NDS−HGI−18378667 " >Some s i m p l e t e x t < / n d s : A I −NDS−HGI>
    < S i g n a t u r e xmlns = " h t t p : / / www. w3 . o r g / 2 0 0 0 / 0 9 / x m l d s i g # " I d = " S i g n a t u r e I d " >
        <SignedInfo>
        <CanonicalizationMethod
        A l g o r i t h m = " h t t p : / / www. w3 . o r g / TR / 2 0 0 1 / REC−xml−c14n −20010315 " / >
        < S i g n a t u r e M e t h o d A l g o r i t h m = " h t t p : / / www. w3 . o r g / 2 0 0 0 / 0 9 / x m l d s i g # dsa−s h a 1 " / >
            < R e f e r e n c e URI= " #AI−NDS−HGI−18378667 " >
                <Transforms>
                     < T r a n s f o r m A l g o r i t h m = " h t t p : / / www. w3 . o r g / 2 0 0 1 / 1 0 / xml−exc−c14n # " / >
                < / Transforms>
                < D i g e s t M e t h o d A l g o r i t h m = " h t t p : / / www. w3 . o r g / 2 0 0 0 / 0 9 / x m l d s i g # s h a 1 " / >
                < D i g e s t V a l u e >+e0UhqPaZkX7+5 x V r b g 5 0 I T c h 2 I =< / D i g e s t V a l u e >
            </ Reference>
            +< R e f e r e n c e URI= " # S i g n e d P r o p e r t i e s −11626165 " >< / R e f e r e n c e >
            +< R e f e r e n c e URI= " # U n s i g n e d P r o p e r t i e s −25392791 " >< / R e f e r e n c e >
    </ SignedInfo>
    < S i g n a t u r e V a l u e >SVlS9m97Q0t12pi . . . . . < / S i g n a t u r e V a l u e >
    <KeyInfo>
        <X509Data >
            < X 5 0 9 C e r t i f i c a t e >MIIC3DCCApoCBEY1 . . . . . < / X 5 0 9 C e r t i f i c a t e >
        < / X509Data >
        <KeyValue >
            <DSAKeyValue>
                <P> / X9TgR11EilS30qcLuz . . . . . < / P>
                <Q>l2BQjxUjC8yykrmCouuEC /BYHPU=< / Q>
                <G>9+ GghdabPd7LvKtc . . . . . < / G>
                <Y>OglcRuqvCSTioZQ . . . . . < / Y>
            < / DSAKeyValue>
        < / KeyValue >
    < / KeyInfo>
    +< O b j e c t >< / O b j e c t >
    </ Signature>
< / nds:RootElement>


                                                  Figure 2.2: XMLDSIG example



  The required SignedInfo element is the information that is actually signed. Core validation of SignedInfo
consists of two mandatory processes: validation of the signature over SignedInfo and validation of each



                                                                      7
Reference digest within SignedInfo. Note that the algorithms used in calculating the SignatureValue are
also included in the signed information while the SignatureValue element is outside SignedInfo.
    The CanonicalizationMethod is the algorithm that is used to canonicalize the SignedInfo element before
it is digested as part of the signature operation. Note that the example in Figure 2.2 , as well as all examples
in this specification, are not in canonical form.

2.3.2 XAdES- XML Advanced Electronic Signature
An XML Advanced Electronic Signature [XAdES][ESI-XAdES] is illustrated in Figure 2.3 .




                            Figure 2.3: Advanced Electronic Signature(XAdES)


   The XML Advanced Electronic Signature (XAdES)- its format is the one defined in [XMLDSIG] with
the addition of signed properties (SigningTime, SigningCertificate, SignaturePolicyIdentifier, SignaturePro-
ductionPlace, SignerRole, AllDataObjectsTimeStamp, IndividualDataObjectsTimeStamp, DataObjectFor-
mat and CommitmentTypeIndication) and unsigned properties (CounterSignature) (where "?" denotes zero
or one occurrence; "+" denotes one or more occurrences; and "*" denotes zero or more occurrences):




                                                       8
XMLDSIG
                                                 |
< d s : S i g n a t u r e ID ? >− − − − − − − − −+− − − − −+
    <ds:SignedInfo>                              |         |
        <ds:CanonicalizationMethod />            |         |
        <ds:SignatureMethod / >                  |         |
        ( < d s : R e f e r e n c e URI? >       |         |
            (<ds:Transforms>)?                   |         |
            <ds:DigestMethod>                    |         |
            <ds:DigestValue>                     |         |
        < / d s : R e f e r e n c e >)+          |         |
    </ ds:SignedInfo>                            |         |
    <ds:SignatureValue>                          |         |
    ( < d s : K e y I n f o >)?− − − − − − − − − +         |
                                                           |
    <ds:Object>                                            |
                                                           |
        <QualifyingProperties>                             |
                                                           |
            <SignedProperties>                             |
                                                           |
                <SignedSignatureProperties>                |
                    ( SigningTime )                        |
                    ( SigningCertificate )                 |
                    ( SignaturePolicyIdentifier )          |
                    ( SignatureProductionPlace )?          |
                    ( SignerRole )?                        |
                </ SignedSignatureProperties>              |
                                                           |
                <SignedDataObjectProperties>               |
                    ( DataObjectFormat )∗                  |
                    ( CommitmentTypeIndication )∗          |
                    ( AllDataObjectsTimeStamp )∗           |
                    ( IndividualDataObjectsTimeStamp )∗    |
                </ SignedDataObjectProperties>             |
                                                           |
            </ SignedProperties>                           |
                                                           |
            <UnsignedProperties>                           |
                                                           |
                <UnsignedSignatureProperties>              |
                    ( CounterSignature )∗                  |
                </ UnsignedSignatureProperties>            |
                                                           |
            </ UnsignedProperties>                         |
                                                           |
        </ QualifyingProperties>                           |
                                                           |
    </ ds:Object>                                          |
                                                           |
< / d s : S i g n a t u r e >− − − − − − − − − − − − − − − +
                                                           |
                                                        XAdES


                                   Figure 2.4: XAdES Specification


                                                  9
3 XAdES Elements
3.1 Overview
The reader shall understand that, there are several requirements for the sake of the proper run of the project
library. The original OpenSource Apache XML Security Project can be found at:
http://santuario.apache.org/Java/index.html , where the developer can find the source and binary packages (
http://xml.apache.org/security/dist/ ) and important installation notes(
http://santuario.apache.org/Java/installation.html) Our project library is tested on the former version of the
Apache XMLSec Project- v1.3.0. Furthermore, the Apache Project is created as an ’Eclipse Java Project’
and we use Sun JDK 1.5.0_11. For the reader concerned, regarding the implementation of the Project, using
JDK 1.4.x (only Windows NT 4.0 and old Unix-based distributions with kernel 2.4.x) please refer to the
installation site of the project. The developer must be aware of the following facts:
   • Copy all files from ’xml-security-bin-1_3_0/xml-security-1_3_0/libs’ to the ’xml-security-src-1_3_0/
     xml-security-1_3_0/libs’, so the Apache XMLSec Project( xml-security-src-1_3_0) can be loaded as
     a standard Eclipse Java Project and properly run,
   • In the new Eclipse Java Project load the JUnit 3.8.1 library, so the XAdES JUnit tests can be executed.
  We didn’t test our project library with the current version of JUnit namely version 4.1.
  We decided to separate the XAdES library package (.../xml-security-src-1_3_0/xml-security-src-1_3_0/
xml-security-1_3_0/src-xades/ ) in the following sub-packages:
   • ’.../input/ ’- where the Java Keystore data is specified;
   • ’.../doc/’- where the JavaDoc shall be found,
   • ’.../org/apache/xml/security/xades/ ’- where the user can find the source code of our XAdES library;
     the following Java classes are important for the discussion in this introduction to the thesis:
         – QualifyingProperties- the fundamental XAdES element, which embeds all qualifying
           properties of an Advanced XML Signature; The QualifyingProperties is a child element
           of Object (one of the four base XAdES elements-’SignedInfo’, ’SignatureValue’,
           ’KeyInfo’ and ’Object’); if we regret the use of the Object element, then an Advanced
           Electronic Signature cannot be built, because the other sub-elements: ’SignedInfo’,
           ’SignatureValue’, ’KeyInfo’ in their selves do not fulfill completely the XAdES specifi-
           cation ,
         – Constants- all used constants for the different types of elements/attributes, namespaces, al-
           gorithms’ descriptions are defined,
   • ’.../org/apache/xml/security/xades/sp’- the SignedProperties XAdES element and its sub-
     elements ( conform to the XMLDSIG notation) are specified,
   • ’.../org/apache/xml/security/xades/up’- the user shall find all the classes, which describe the basic
     child-element UnsignedProperties( of the QualifyingProperties) and its sub-elements,
     which are optional( see further)



                                                     10
• ’.../org/apache/xml/security/xades/tests’- where we have specified all Signature-creation tests and the
     JUnit tests:
        – The class CreateSignatureSDOPalland- every single element of the XAdES notation is
          created, so the XML notation of XAdES is fully described. The output is can be found in : /xml-
          security-src-1_3_0/xml-security-1_3_0/signature.xml (see Appendix A - XAdES specification)
        – The class CreateSignatureSignedSignatureProperties- where the
          XAdES-BES specification is implemented:
          the basic child-element of QualifyingProperties- SignedProperties, with its sub-
          element:
          SignedSignatureProperties, further its child-elements: SigningTime,
          SigningCertificate, SignaturePolicyIdentifier, which are all
          required elements in the XAdES notation. The output is illustrated in : /xml-security-src-
          1_3_0/xml-security-1_3_0/signature1.xml (see Appendix B- XAdES-BES)
        – The class CreateSignatureMoreThanOneElements- according to the XAdES specifi-
          cation, XML elements, which can occur min. ’0’ and max. ’unbounded’, e.g. more than one el-
          ements from the same type are allowed to exist, are demonstrated for their multiple use. The out-
          put for this case is represented due : /xml-security-src-1_3_0/xml-security-1_3_0/signature2.xml
          (see Appendix C- XAdES More than one element)
        – The class JUtests- where we specify the different JUnit tests on our library, separated in two
          general sections:

   • positive tests- which illustrate the verification of the first three classes(
     CreateSignatureSDOPalland,CreateSignatureSignedSignatureProper-
     ties, CreateSignatureMoreThanOneElements)

   • negative tests- which verify the right implementation of all required elements of the XAdES notation
     in the project library (refer to the separate explanation on every test in the further sections of the
     thesis); if the library is able to create the signature without using a required element, nor giving an
     IllegalArgumentException the particular negative test shall fail.

  Now let’s concentrate more detailed on every one XML element of the XAdES notation with its specific
use, structure and its implementation in the project library.




                                                    11
3.2 QualifyingProperties
     The basic element of Object is the QualifyingProperties element, which contains the whole qual-
     ifying information for the Advanced Electronic Signature. This element has the following structure:

     < x s d : e l e m e n t name= " Q u a l i f y i n g P r o p e r t i e s "
     type =" Q u a l i f y i n g P r o p e r t i e s T y p e " / >
     < x s d : c o m p l e x T y p e name= " Q u a l i f y i n g P r o p e r t i e s T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " S i g n e d P r o p e r t i e s " t y p e = " S i g n e d P r o p e r t i e s T y p e "
                  minOccurs=" 0 " / >
             < x s d : e l e m e n t name= " U n s i g n e d P r o p e r t i e s " t y p e = " U n s i g n e d P r o p e r t i e s T y p e "
                  minOccurs=" 0 " / >
         </ xsd:sequence>
         < x s d : a t t r i b u t e name= " T a r g e t " t y p e = " x s d : a n y U R I " u s e = " r e q u i r e d " / >
         < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / >
     < / xsd:complexType>


                                                                   Figure 3.1: QualifyingProperties



        The QualifyingProperties element is extended by its two general sub-elements - the
     SignedProperties and the UnsignedProperties. The main function of the
     SignedProperties is to contribute to the cryptographic justification of the XML signature, while the
     UnsignedProperties is required, generally for an embracement of all variations of the XAdES nota-
     tion (XAdES, XAdES-T, XAdES-C, XAdES-X, XAdES-A1 and to illustrate all kind of different cases by
     creating Advanced Electronic signature: single signer - one signature; parallel signer without requirement
     of ordering for signing the sensitive data, multiple signer with ordering by signing the electronic document .
        The SignedProperties must be protected by a Reference element in SignedInfo and must ap-
     pear only once within the QualifyingProperties.The Target attribute is required and it’s used
     as a reference to the XML signature, and the optional Id attribute references to the container of the
     QualifyingProperties element.


 1   /∗∗
 2   ∗ Method s e t S i g n e d P r o p e r t i e s
 3   ∗
 4   ∗ @param s p
 5   ∗/
 6   public void s e t S i g n e d P r o p e r t i e s ( S i g n e d P r o p e r t i e s sp ) {
 7      i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( s p ! = n u l l ) )
 8      {
 9         t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( sp . getElement ( ) ) ;
10         XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
11      }
12   }



                                                             Figure 3.2: Method setSignedProperties



       1
           http://www.w3.org/TR/XAdES/




                                                                                             12
1   /∗∗
 2     ∗
 3     ∗ Method s e t U n s i g n e d P r o p e r t i e s
 4     ∗
 5     ∗ @param u s p
 6     ∗/
 7   publ ic void s e t U n s i g n e d P r o p e r t i e s ( U n s i g n e d P r o p e r t i e s usp )
 8   {    if
 9        ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( u s p ! = n u l l ) )
10        {
11                t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( usp . getElement ( ) ) ;
12               XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
13        }
14   }



                                                         Figure 3.3: Method setUnsignedProperties




        The two child-elements - SignedProperties and UnsignedProperties, are created using a
     set-Method. Because of their occurrence, it is necessary to define the conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (SignedProperties,UnsignedProperties) is not an
            empty one((sp != null)or (usp != null));

       If any one of these both statements is not fulfilled, no child-element of QualifyingProperties
     would be created.

 1
 2   /∗∗
 3     ∗ S e t s t h e <code >T a r g e t </ code > a t t r i b u t e
 4     ∗
 5     ∗ @param T a r g e t ( anyURI )
 6     ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n ∗∗∗∗ b e c a u s e o f " u s e= r e q u i r e d " ∗∗∗∗
 7     ∗/
 8        public void s e t T a r g e t ( S t r i n g Target ) {
 9                i f ( T a r g e t == n u l l ) { throw new
10                IllegalArgumentException ( " Target Attibute is required ! " ) ;
11                }
12        e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( T a r g e t ! = n u l l ) ) {
13        this . _constructionElement . setAttributeNS
14        ( n u l l , C o n s t a n t s . _ATT_TARGET , T a r g e t ) ;
15                }
16        }



                                                                    Figure 3.4: Method setTarget




                                                                                          13
The Target Attribute, as we already mentioned above, is a required one. Within a set-Method two
    general cases are tested:

        1. First of all, whether this attribute is an empty one (which is forbidden), so an IllegalArgumentExcep-
           tion should be executed with the relevant message.


1      i f ( T a r g e t == n u l l } ) {
2         throw b f new I l l e g a l A r g u m e n t E x c e p t i o n ( " T a r g e t A t t i b u t e i s
3         required ! " );
4      }




        2. Second of all, whether the present state of the signature-creation is -"Signing Mode"((this._state ==
           MODE_SIGN)), and whether the attribute is not an empty one((Target != null));

      At the end, we shall mention this requirement of the Target attribute, as a test-case (JUnit test), which is
    implemented in our project library as a JUnit negative test ("testNeg_QP_Target_required"), refers to class
    JUtests in the package org.apache.xml.security.xades.tests.


    3.3 SignedProperties
    The SignedProperties has two elements - SignedSignatureProperties and
    SignedDataObjectProperties. The SignedSignatureProperties element is required and
    must occur only once within the SignedProperties.
       The other sub-element of the SignedProperties, SignedDataObjectProperties, is optional
    and contains elements that can appear one or more than once in the XML signature, which is good illustrated
    in our JUnit tests.
       The schema definition of SignedProperties element as it follows:


    < x s d : e l e m e n t name= " S i g n e d P r o p e r t i e s " t y p e = " S i g n e d P r o p e r t i e s T y p e " / >
    < x s d : c o m p l e x T y p e name= " S i g n e d P r o p e r t i e s T y p e " >
        <xsd:sequence>
            < x s d : e l e m e n t name= " S i g n e d S i g n a t u r e P r o p e r t i e s "
                 type =" S i g n e d S i g n a t u r e P r o p e r t i e s T y p e " / >
                < x s d : e l e m e n t name= " S i g n e d D a t a O b j e c t P r o p e r t i e s "
                    t y p e =" S i g n e d D a t a O b j e c t P r o p e r t i e s T y p e " minOccurs=" 0 " / >
        </ xsd:sequence>
        < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / >
    < / xsd:complexType>


                                                               Figure 3.5: SignedProperties




                                                                                   14
1   /∗∗
 2     ∗ Method s e t S i g n e d S i g n a t u r e P r o p e r t i e s
 3     ∗
 4     ∗ @param s s p
 5     ∗/
 6        public void s e t S i g n e d S i g n a t u r e P r o p e r t i e s ( S i g n e d S i g n a t u r e P r o p e r t i e s ssp ) {
 7            i f ( s s p == n u l l ) {
 8            throw new I l l e g a l A r g u m e n t E x c e p t i o n (
 9                    " S i g n e d S i g n a t u r e P r o p e r t i e s Element i s r e q u i r e d ! " ) ;
10            }
11            e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( s s p ! = n u l l ) ) {
12            t h i s . _constructionElement . appendChild ( ssp . getElement ( ) ) ;
13            XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
14            }
15        }
16
17   /∗∗
18     ∗ Method s e t S i g n e d D a t a O b j e c t P r o p e r t i e s
19     ∗
20     ∗ @param s d o p
21     ∗/
22        p u b l i c void s e t S i g n e d D a t a O b j e c t P r o p e r t i e s ( S i g n e d D a t a O b j e c t P r o p e r t i e s sdop ) {
23                i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( s d o p ! = n u l l ) ) {
24                t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( sdop . getElement ( ) ) ;
25               XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
26               }
27        }



                        Figure 3.6: Methods setSignedSignatureProperties, setSignedDataObjectProperties




     The two child-elements - SignedSignatureProperties and
     SignedDataObjectProperties, are created using a set-Method. Because of their different way of
     occurrence, it is necessary to define the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (SignedSignatureProperties,
            SignedDataObjectProperties) is not an empty one((ssp != null)or (sdop != null));

     If any one of these both statements is not fulfilled, no child-element of SignedProperties would be
     created. By the SignedSignatureProperties element we use the JUnit test to demonstrate the
     obligatorily occurrence, with other words: if this element is an empty one, an IllegalArgumentException
     should be executed with the relevant message.


 1      i f ( s s p == n u l l } {
 2         throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g n e d S i g n a t u r e P r o p e r t i e s E l e m e n t i s
 3         required ! " );
 4      }




     Refers to the negative JUnit test testNeg_SignedSignatureProperties in
     org.apache.xml.security.xades.tests.JUtests.



                                                                                         15
3.4 UnsignedProperties
     The UnsignedProperties element and its sub-elements are not signed by the [XMLDSIG] signature.
     They are divided on *SignatureProperties and *DataObjectProperties just like the
     SignedProperties.


     < x s d : e l e m e n t name= " U n s i g n e d P r o p e r t i e s " t y p e = " U n s i g n e d P r o p e r t i e s T y p e " / >
     < x s d : c o m p l e x T y p e name= " U n s i g n e d P r o p e r t i e s T y p e " >
             <xsd:sequence>
                 < x s d : e l e m e n t name= " U n s i g n e d S i g n a t u r e P r o p e r t i e s "
                     t y p e =" U n s i g n e d S i g n a t u r e P r o p e r t i e s T y p e " minOccurs=" 0 " / >
                     < x s d : e l e m e n t name= " U n s i g n e d D a t a O b j e c t P r o p e r t i e s "
                          t y p e =" U n s i g n e d D a t a O b j e c t P r o p e r t i e s T y p e " minOccurs=" 0 " / >
             </ xsd:sequence>
             < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / >
     < / xsd:complexType>


                                                               Figure 3.7: UnsignedProperties



        In this case we can make a reference to the UnsignedProperties element using the optional Id
     attribute.
     The two child-elements - UnsignedSignatureProperties and
     UnsignedDataObjectProperties, are created using a set-Method. Because of their occurrence, it
     is necessary to define the following conditions:

         1. It should not be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN)), because the UnsignedProperties element consists of "chil-
            dren", that are not signed by the XMLDSIG signature;

         2. So it appears only one condition to be proved, whether the XML-element
            (UnsignedSignatureProperties, UnsignedDataObjectProperties) is not an empty
            one((ussp != null)or (usdop != null));



 1   /∗∗
 2     ∗ Method s e t U n s i g n e d S i g n a t u r e P r o p e r t i e s
 3     ∗
 4     ∗ @param u s s p
 5     ∗/
 6        public void s e t U n s i g n e d S i g n a t u r e P r o p e r t i e s ( U n s i g n e d S i g n a t u r e P r o p e r t i e s ussp ) {
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( u s s p ! = n u l l ) ) {
 8              t h i s . _constructionElement . appendChild ( ussp . getElement ( ) ) ;
 9              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10            }
11        }



                                               Figure 3.8: Method setUnsignedSignatureProperties




                                                                                      16
1   /∗∗
 2     ∗ Method s e t U n s i g n e d D a t a O b j e c t P r o p e r t i e s
 3     ∗
 4     ∗ @param u s d o p
 5     ∗/
 6        p u b l i c void s e t U n s i g n e d D a t a O b j e c t P r o p e r t i e s ( U n s i g n e d D a t a O b j e c t P r o p e r t i e s usdop ) {
 7                i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( u s s p ! = n u l l ) ) {
 8                  t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( usdop . get El eme nt ( ) ) ;
 9                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10               }
11        }



                                               Figure 3.9: Method setUnsignedDataObjectProperties




       If the statement mentioned above, is not fulfilled, no child-element of UnsignedProperties would
     be created.


     3.5 SignedSignatureProperties
     The SignedSignatureProperties has three required Elements (SigningTime,
     SigningCertificate, SignaturePolicyIdentifier) and two optional ones
     (SignatureProductionPlace, SignerRole).The XAdES-BES specification is applied through the
     SigningTime, SigningCertificate, SignaturePolicyIdentifier elements.



     < x s d : e l e m e n t name= " S i g n e d S i g n a t u r e P r o p e r t i e s "
     type =" S i g n e d S i g n a t u r e P r o p e r t i e s T y p e " / >
     < x s d : c o m p l e x T y p e name= " S i g n e d S i g n a t u r e P r o p e r t i e s T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " S i g n i n g T i m e " t y p e = " x s d : d a t e T i m e " / >
             < x s d : e l e m e n t name= " S i g n i n g C e r t i f i c a t e " t y p e = " C e r t I D L i s t T y p e " / >
             < x s d : e l e m e n t name= " S i g n a t u r e P o l i c y I d e n t i f e r "
                type =" S i g n a t u r e P o l i c y I d e n t i f i e r T y p e " / >
             < x s d : e l e m e n t name= " S i g n a t u r e P r o d u c t i o n P l a c e "
             t y p e =" S i g n a t u r e P r o d u c t i o n P l a c e T y p e " minOccurs=" 0 " / >
             < x s d : e l e m e n t name= " S i g n e r R o l e " t y p e = " S i g n e r R o l e T y p e " m i n O c c u r s = " 0 " / >
         </ xsd:sequence>
     < / xsd:complexType>


                                                           Figure 3.10: SignedSignatureProperties



        The child-elements of the SignedSignatureProperties are added, using a constructor. As men-
     tioned above, the SigningTime, SigningCertificate and
     SignaturePolicyIdentifier elements are required. Thorough, their occurrence is tested: if one
     of these obligatory elements is missing, an IllegalArgumentException should be executed with the relevant
     message:




                                                                                        17
1     i f ( s i g n i n g t i m e == n u l l } | | ( s i g n i n g c e r t i f i c a t e == n u l l } | | (
2     s i g n a t u r e p o l i c y i d e n t i f i e r == n u l l )
3     {
4         throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " Wrong E l e m e n t V a l u e ! " ) ;
5     }




       Refers to the negative JUnit tests testNeg_SigningTime, testNeg_SigningCertificate and
    testNeg_SignaturePolicyIdentifier and to the positive JUnit test
    testPositive_SignedSignatureProperties_Elements_required in
    org.apache.xml.security.xades.tests.JUtests.
       The same statements are used to prove that the present phase of signature’ creation is -"Signing Mode"
    ((this._state == MODE_SIGN)), and the XML-element (SigningTime, SigningCertificate and
    SignaturePolicyIdentifier) is not an empty one((signingtime!= null)or (signingcertificate!= null))
    or ((signaturepolicyidentifier!= null)).Likewise, for the other two elements the tested conditions are, whether
    the present state of the signature’ creation is -"Signing Mode"
    ((this._state == MODE_SIGN)), and also whether the XML-element (
    SignatureProductionPlace, SignerRole) is not an empty one
    ((signatureproductionplace! = null) or (signerrole! = null));




                                                                                   18
1   /∗∗
 2     ∗ Constructor SignedSignatureProperties
 3     ∗
 4     ∗ @param doc
 5     ∗ @param s i g n i n g t i m e S i g n i n g T i m e
 6     ∗ @param s i g n i n g c e r t i f i c a t e S i g n i n g C e r t i f i c a t e
 7     ∗ @param s i g n a t u r e p o l i c y i d e n t i f i e r S i g n a t u r e P o l i c y I d e n t i f i e r
 8     ∗ @param s i g n a t u r e p r o d u c t i o n p l a c e S i g n a t u r e P r o d u c t i o n P l a c e
 9     ∗ @param s i g n e r r o l e S i g n e r R o l e
10     ∗/
11        p u b l i c S i g n e d S i g n a t u r e P r o p e r t i e s ( Document doc , S i g n i n g T i m e s i g n i n g t i m e ,
12   SigningCertificate signingcertificate , SignaturePolicyIdentifier
13   signaturepolicyidentifier , SignatureProductionPlace
14   signatureproductionplace , SignerRole s i g n e r r o l e ) {
15        s u p e r ( doc ) ;
16        i f ( s i g n i n g t i m e == n u l l | | s i g n i n g c e r t i f i c a t e == n u l l | |
17                s i g n a t u r e p o l i c y i d e n t i f i e r == n u l l )
18                throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " Wrong E l e m e n t V a l u e ! " ) ;
19
20           t h i s . _constructionElement . appendChild ( signingtime . getElement ( ) ) ;
21           XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
22
23           t h i s . _constructionElement . appendChild ( s i g n i n g c e r t i f i c a t e . getElement ( ) ) ;
24           XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
25
26           t h i s . _constructionElement . appendChild ( s i g n a t u r e p o l i c y i d e n t i f i e r . getElement ( ) ) ;
27           XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
28
29         i f ( ( s i g n a t u r e p r o d u c t i o n p l a c e != n u l l ) {
30             t h i s . _constructionElement . appendChild ( s i g n a t u r e p r o d u c t i o n p l a c e . getElement ( ) ) ;
31             XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
32         }
33         i f ( s i g n e r r o l e != n u l l ) {
34           t h i s . _constructionElement . appendChild ( s i g n e r r o l e . getElement ( ) ) ;
35           XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
36         }
37   }



                                                 Figure 3.11: Contructor SignedSignatureProperties




     3.6 SignedDataObjectProperties
     SignedDataObjectProperties contains sub- elements that qualify some of the signed data objects.
     DataObjectFormat, CommitmentTypeIndication,
     AllDataObjectsTimeStamp, IndividualDataObjectsTimeStamp can occur more than once
     within the SignedDataObjectProperties elements.



     All these properties qualify the signed data object after all the required transforms have been made.




                                                                                       19
< x s d : e l e m e n t name= " S i g n e d D a t a O b j e c t P r o p e r t i e s "
     type =" SignedDataObjectPropertiesType " / >
     < x s d : c o m p l e x T y p e name= " S i g n e d D a t a O b j e c t P r o p e r t i e s T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " D a t a O b j e c t F o r m a t " t y p e = " D a t a O b j e c t F o r m a t T y p e "
                  m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
             < x s d : e l e m e n t name= " C o m m i t m e n t T y p e I n d i c a t i o n "
                  t y p e =" CommitmentTypeIndicationType " minOccurs=" 0 "
                  maxOccurs = " unbounded " / >
             < x s d : e l e m e n t name= " A l l D a t a O b j e c t s T i m e S t a m p " t y p e = " TimeStampType "
                  m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
             < x s d : e l e m e n t name= " I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p " t y p e = " TimeStampType "
                  m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
         </ xsd:sequence>
     < / xsd:complexType>


                                               Figure 3.12: SignedDataObjectProperties




 1   /∗∗
 2     ∗ Method s e t D a t a O b j e c t F o r m a t
 3     ∗
 4     ∗ @param d a t a o b j e c t f o r m a t
 5     ∗/
 6        public void setDataObjectFormat ( DataObjectFormat d a t a o b j e c t f o r m a t ) {
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( d a t a o b j e c t f o r m a t ! = n u l l ) ) {
 8              t h i s . _constructionElement . appendChild ( d a t a o b j e c t f o r m a t . getElement ( ) ) ;
 9              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10            }
11        }
12   /∗∗
13     ∗ Method s e t C o m m i t m e n t T y p e I n d i c a t i o n
14     ∗
15     ∗ @param c o m m i t m e n t t y p e i n d i c a t i o n
16     ∗/
17        public void setCommitmentTypeIndication ( CommitmentTypeIndication
18   commitmenttypeindication ) {
19            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( c o m m i t m e n t t y p e i n d i c a t i o n ! = n u l l ) ) {
20              t h i s . _constructionElement . appendChild ( commitmenttypeindication . getElement ( ) ) ;
21              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
22            }
23        }



                         Figure 3.13: Methods setCommitmentTypeIndication, setDataObjectFormat




                                                                        20
1   /∗∗
 2     ∗ Method s e t A l l D a t a O b j e c t s T i m e S t a m p
 3     ∗
 4     ∗ @param a l l d a t a o b j e c t s t i m e s t a m p
 5     ∗/
 6        public void setAllDataObjectsTimeStamp ( AllDataObjectsTimeStamp
 7   alldataobjectstimestamp ) {
 8            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&&( a l l d a t a o b j e c t s t i m e s t a m p ! = n u l l ) )
 9              { t h i s . _constructionElement . appendChild ( a l l d a t a o b j e c t s t i m e s t a m p . getElement ( ) ) ;
10              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
11              }
12        }
13
14   /∗∗
15     ∗ Method s e t I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p
16     ∗
17     ∗ @param i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p
18     ∗/
19        public void setIn dividual DataObje ctsTimeS tamp ( IndividualDataObjectsTimeStamp
20         individualdataobjectstimestamp ) {
21            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p ! =
22            null )){
23              t h i s . _constructionElement . appendChild
24              ( ind ivid uald ata obje ctst imes tamp . getElement ( ) ) ;
25              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
26            }
27         }



                Figure 3.14: Methods setAllDataObjectsTimeStamp, setIndividualDataObjectsTimeStamp



     The child-elements - DataObjectFormat, CommitmentTypeIndicationType,
     AllDataObjectsTimeStamp and IndividualDataObjectsTimeStamp, are created using a set-
     Method. Because of their occurrence, it is necessary to define the following conditions:

        1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
           ((this._state == MODE_SIGN));

        2. And also, whether the XML-element (DataObjectFormat,
           CommitmentTypeIndicationType,
           AllDataObjectsTimeStamp and IndividualDataObjectsTimeStamp) is not an empty
           one((dataobjectformat!= null), (commitmenttypeindication!= null), (alldataobjectstimestamp != null),
           (individualdataobjectstimestamp != null));

       If any one of these both statements is not fulfilled, no child-element of
     SignedDataObjectProperties would be created.


     3.7 UnsignedSignatureProperties
     The UnsignedSignatureProperties element contains CounterSignature,
     SignatureTimeStamp, CompleteCertificateRefs, CompleteCertificateRefs,
     SigAndRefsTimeStamp, RefsOnlyTimeStamp, CertificateValues,
     RevocationValues, ArchiveTimeStamp. In our Project we will pay attention only to the
     CounterSignature element, because of the structure of XAdES. This will be discussed more detailed
     in section 3.17.



                                                                           21
< x s d : e l e m e n t name= " U n s i g n e d S i g n a t u r e P r o p e r t i e s "
     type =" U n s i g n e d S i g n a t u r e P r o p e r t i e s T y p e " / >
     < x s d : c o m p l e x T y p e name= " U n s i g n e d S i g n a t u r e P r o p e r t i e s T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " C o u n t e r S i g n a t u r e " t y p e = " C o u n t e r S i g n a t u r e T y p e "
                  m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
             < x s d : e l e m e n t name= " S i g n a t u r e T i m e S t a m p " t y p e = " TimeStampType "
                  m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
             < x s d : e l e m e n t name= " C o m p l e t e C e r t i f i c a t e R e f s "
                  t y p e =" C o m p l e t e C e r t i f i c a t e R e f s T y p e " minOccurs=" 0 " / >
             < x s d : e l e m e n t name= " C o m p l e t e R e v o c a t i o n R e f s "
                  t y p e =" CompleteRevocationRefsType " minOccurs=" 0 " / >
             <xsd:choice>
                 < x s d : e l e m e n t name= " SigAndRefsTimeStamp " t y p e = " TimeStampType "
                      m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
                 < x s d : e l e m e n t name= " RefsOnlyTimeStamp " t y p e = " TimeStampType "
                      m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
             </ xsd:choice>
             < x s d : e l e m e n t name= " C e r t i f i c a t e V a l u e s " t y p e = " C e r t i f i c a t e V a l u e s T y p e "
                  minOccurs=" 0 " / >
             < x s d : e l e m e n t name= " R e v o c a t i o n V a l u e s " t y p e = " R e v o c a t i o n V a l u e s T y p e "
                  minOccurs=" 0 " / >
             < x s d : e l e m e n t name= " A r c h i v e T i m e S t a m p " t y p e = " TimeStampType "
                  m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
         </ xsd:sequence>
     < / xsd:complexType>


                                                    Figure 3.15: UnsignedSignatureProperties




     Only the CounterSignature element, using a set-Method, is specified, because the other sub-elements
     of the UnsignedSignatureProperties are not included in the XAdES XML structure. Note, that
     only the value of the element is tested, because the "children" of
     UnsignedProperties element, are not signed by the XMLDSIG signature.


 1   /∗∗
 2     ∗ Method s e t C o u n t e r S i g n a t u r e
 3     ∗ @param s i g n a t u r e
 4     ∗/
 5        public void s e t C o u n t e r S i g n a t u r e ( C o u n t e r S i g n a t u r e         signature ) {
 6            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( s i g n a t u r e ! = n u l l ) ) {
 7              t h i s . _constructionElement . appendChild ( s i g n a t u r e . getElement ( ) ) ;
 8              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
 9            }
10        }



                                                    Figure 3.16: Method setCounterSignature




                                                                                 22
3.8 The SigningTime element
     The SigningTime element is meant for showing the date and time at which the signer has created the
     signed XML signature. It is a sub-element of SignedSignatureProperties and in view of that
     contributes for the cryptographic justification of the XML signature. This element must occur exactly once
     within the signature. However the SigningTime can take only the local time of the computer on which
     the signature is created.
        The definition of this element, as it follows:


     < x s d : e l e m e n t name= " S i g n i n g T i m e " t y p e = " x s d : d a t e T i m e " / >


                                                                      Figure 3.17: SigningTime




 1   /∗∗
 2     ∗ Constructor SigningTime
 3     ∗
 4     ∗ @param doc
 5     ∗ @param d a t e T i m e
 6     ∗/
 7        p u b l i c S i g n i n g T i m e ( Document doc , D a t e d a t e T i m e ) {
 8               s u p e r ( doc ) ;
 9                t h i s . a d d T e x t ( toXMLDate ( d a t e T i m e ) . t o S t r i n g ( ) ) ;
10        }



                                                            Figure 3.18: Constructor SigningTime




        The SigningTime is created using a specific constructor, with two variables doc and dateTime. For
     this function we use the javax.xml.datatype.XMLGregorianCalendar and
     java.util.GregorianCalendar libraries.




                                                                                         23
3.9 The SigningCertificate element
Using the SigningCertificate element could be avoided a simple substitution of the certificate.
As sub-elements, it has the CertDigest and IssuerSerial elements, which consist of references
to the DigestMethod URI and DigestValue, as well as a reference to the X509IssuerSerial
(X509IssuerName, X509SerialNumber).Just like the SigningTime element,
SigningCertificate is sub-element of the SignedSignatureProperties, its use is required
and must appear only once.
   Below follows the schema definition:


< x s d : e l e m e n t name= " S i g n i n g C e r t i f i c a t e " t y p e = " C e r t I D L i s t T y p e " / >
< x s d : c o m p l e x T y p e name= " C e r t I D L i s t T y p e " >
    <xsd:sequence>
        < x s d : e l e m e n t name= " C e r t " t y p e = " C e r t I D T y p e " maxOccurs = " unbounded " / >
    </ xsd:sequence>
< / xsd:complexType>
< x s d : c o m p l e x T y p e name= " C e r t I D T y p e " >
    <xsd:sequence>
        < x s d : e l e m e n t name= " C e r t D i g e s t " t y p e = " D i g e s t A l g A n d V a l u e T y p e " / >
        < x s d : e l e m e n t name= " I s s u e r S e r i a l " t y p e = " d s : X 5 0 9 I s s u e r S e r i a l T y p e " / >
    </ xsd:sequence>
< / xsd:complexType>
< x s d : c o m p l e x T y p e name= " D i g e s t A l g A n d V a l u e T y p e " >
    <xsd:sequence>
        < x s d : e l e m e n t name= " D i g e s t M e t h o d " t y p e = " d s : D i g e s t M e t h o d T y p e " / >
        < x s d : e l e m e n t name= " D i g e s t V a l u e " t y p e = " d s : D i g e s t V a l u e T y p e " / >
    </ xsd:sequence>
< / xsd:complexType>


                                                   Figure 3.19: SigningCertificate




   The SigningCertificate element is created using a set-Method, and because of its type is specified
as CertIDList ("(CertIDList SigningCertificate)").Again it is necessary to define the following condi-
tions:

    1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
       ((this._state == MODE_SIGN));

    2. And also, whether the XML-element (SigningCertificate) is not an empty one
       ((SigningCertificate!= null);

   If any one of these both statements is not fulfilled, no SigningCertificate element would be cre-
ated. This shall be illustrated in the next table:




                                                                      24
1   /∗∗
 2     ∗ Method s e t S i g n i n g C e r t i f i c a t e
 3     ∗
 4     ∗ @param S i g n i n g C e r t i f i c a t e
 5     ∗/
 6        public void s e t S i g n i n g C e r t i f i c a t e ( C e r t I D L i s t S i g n i n g C e r t i f i c a t e ) {
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g n i n g C e r t i f i c a t e ! = n u l l ) ) {
 8              t h i s . _constructionElement . appendChild ( S i g n i n g C e r t i f i c a t e . getElement ( ) ) ;
 9              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10            }
11        }



                                                 Figure 3.20: Method setSigningCertificate




     3.10 The SignaturePolicyIdentifier element
     The SignaturePolicyIdentifier is a combination of norms for the build up and validation of a sig-
     nature, so the validity of the signature can be confirmed. The uniqueness of the signer is protected, through a
     hash value of the signature policy. Moreover the implementation of the SignaturePolicyIdentifier
     element prevents the hash value and the identifier to be faked, thus it proves the globally unique reference
     of the signature policy to the XML signature and the signer as a part of the signature computation. With the
     SigningTime and the SigningCertificate elements it defines the XAdES-BES format. Only one
     SignaturePolicyIdentifier element must occur within the
     SignedSignatureProperties.On the next page follows the schema definition for this type, see Fig-
     ure 3.22 .
        There are two options for using the elements of the SignaturePolicyIdentifier:

        1. SignaturePolicyId has four sub-elements- SigPolicyId, Transforms,
           SigPolicyHash, SigPolicyQualifiers.
                 • SigPolicyId is required and it specifies the Identifier, Description and the
                   DocumentationReferences elements, which uniquely designates the specific version of
                   the signature policy.
                 • The Transforms element references to the Transforms in the SignedInfo.
                 • SigPolicyHash consists of two sub-elements- DigestMethod Algorithm, identifier of
                   the hash algorithm, and the DigestValue - hash value of the signature policy.
                 • Within the SigPolicyQualifiers extra information, qualifying the policy identifier can
                   appear.
        2. SignaturePolicyImplied
             Alternatively, an empty SignaturePolicyImplied element confirms that the data object(s) be-
             ing signed and other external data designate the signature policy.



        The SignaturePolicyId element is added as a child-element of the
     SignaturePolicyIdentifier, using a set-Method. Because of its specific type this element is de-
     fined as SignaturePolicyIdType. Like the other SignedProperties is necessary to define the
     following conditions:



                                                                            25
< x s d : e l e m e n t name= " S i g n a t u r e P o l i c y I d e n t i f i e r "
    type =" S i g n a t u r e P o l i c y I d e n t i f i e r T y p e " / > <xsd:complexType
    name= " S i g n a t u r e P o l i c y I d e n t i f i e r T y p e " >
        <xsd:choice>
            < x s d : e l e m e n t name= " S i g n a t u r e P o l i c y I d " t y p e = " S i g n a t u r e P o l i c y I d T y p e " / >
            < x s d : e l e m e n t name= " S i g n a t u r e P o l i c y I m p l i e d " / >
        </ xsd:choice>
    < / x s d : c o m p l e x T y p e > < x s d : c o m p l e x T y p e name= " S i g n a t u r e P o l i c y I d T y p e " >
        <xsd:sequence>
            < x s d : e l e m e n t name= " S i g P o l i c y I d " t y p e = " O b j e c t I d e n t i f i e r T y p e " / >
            < x s d : e l e m e n t r e f =" d s : T r a n s f o r m s " minOccurs=" 0 " / >
            < x s d : e l e m e n t name= " S i g P o l i c y H a s h " t y p e = " D i g e s t A l g A n d V a l u e T y p e " / >
            < x s d : e l e m e n t name= " S i g P o l i c y Q u a l i f i e r s "
                 t y p e =" S i g P o l i c y Q u a l i f i e r s L i s t T y p e " minOccurs=" 0 " / >
        </ xsd:sequence>
    < / xsd:complexType> <xsd:complexType
    name= " S i g P o l i c y Q u a l i f i e r s L i s t T y p e " >
        <xsd:sequence>
            < x s d : e l e m e n t name= " S i g P o l i c y Q u a l i f i e r " t y p e = " AnyType "
                 maxOccurs = " unbounded " / >
        </ xsd:sequence>
    < / xsd:complexType>


                                                          Figure 3.21: SignaturePolicyIdentifier


        1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
           ((this._state == MODE_SIGN));

        2. And also, whether the XML-element (SignaturePolicyId) is not an empty one
           ((SignaturePolicyId!= null));

    If any one of these both statements is not fulfilled, no SignaturePolicyIdelement would be created.
    By the SignaturePolicyId element we use the JUnit test to demonstrate the obligatorily occurrence,
    with other words: if this element is an empty one, an IllegalArgumentException should be executed with
    the relevant message:


1   i f ( S i g n a t u r e P o l i c y I d == n u l l ) {
2         throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g n a t u r e P o l i c y I d E l e m e n t
3         is required ! " );
4     }




                                                                                       26
1   /∗∗
 2     ∗ Method s e t S i g n a t u r e P o l i c y I d
 3     ∗
 4     ∗ @param S i g n a t u r e P o l i c y I d
 5     ∗/
 6        public void s e t S i g n a t u r e P o l i c y I d ( S i g n a t u r e P o l i c y I d T y p e S i g n a t u r e P o l i c y I d ){
 7            i f ( S i g n a t u r e P o l i c y I d == n u l l ) {
 8              throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g n a t u r e P o l i c y I d E l e m e n t
 9              is required ! " );
10            }
11            e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g n a t u r e P o l i c y I d ! = n u l l ) ) {
12              t h i s . _constructionElement . appendChild ( S i g n a t u r e P o l i c y I d . getElement ( ) ) ;
13              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
14            }
15        }



                                                       Figure 3.22: Method setSignaturePolicyId



     Refers to the negative JUnit test testNeg_SignaturePolicyId_Element_required in
     org.apache.xml.security.xades.tests.JUtests. The following codesamples can illustrate all this
     ( refer to the class:SignaturePolicyIdType).

 1   /∗∗
 2     ∗ Method s e t S i g P o l i c y I d
 3     ∗ @param S i g P o l i c y I d
 4     ∗/
 5        public void s e t S i g P o l i c y I d ( O b j e c t I d e n t i f i e r S i g P o l i c y I d ){
 6            i f ( S i g P o l i c y I d == n u l l ) {
 7              throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y I d E l e m e n t i s r e q u i r e d ! " ) ;
 8            }
 9            e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y I d ! = n u l l ) ) {
10              t h i s . _constructionElement . appendChild ( SigPolicyId . getElement ( ) ) ;
11              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
12            }
13        }
14
15   /∗∗
16     ∗ Method s e t S i g P o l i c y H a s h
17     ∗ @param S i g P o l i c y H a s h
18     ∗/
19        public void s e t S i g P o l i c y H a s h ( DigestAlgAndValue SigPolicyHash ){
20            i f ( S i g P o l i c y H a s h == n u l l ) {
21              throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y H a s h E l e m e n t i s r e q u i r e d ! " ) ;
22            }
23            else        i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y H a s h ! = n u l l ) ) {
24              t h i s . _constructionElement . appendChild ( SigPolicyHash . getElement ( ) ) ;
25              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
26            }
27        }



                                             Figure 3.23: Methods setSigPolicyId, setSigPolicyHash




     The child-elements, which define the format SignaturePolicyIdType - SigPolicyId,
     SigPolicyHash, Transforms, and SigPolicyQualifiers, are all created using set-Methods.
     Because of their occurrence, it is necessary to define the following conditions:



                                                                                      27
1   /∗∗
 2     ∗ Method s e t T r a n s f o r m s 1
 3     ∗ @param t r a n s f o r m s 1
 4     ∗/
 5        public void setTransforms1 ( Transforms1 t r a n s f o r m s 1 ){
 6            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( t r a n s f o r m s 1 ! = n u l l ) ) {
 7              t h i s . _constructionElement . appendChild ( transforms1 . getElement ( ) ) ;
 8              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
 9            }
10        }
11
12   /∗∗
13     ∗ Method s e t S i g P o l i c y Q u a l i f i e r s
14     ∗
15     ∗ @param S i g P o l i c y Q u a l i f i e r s
16     ∗/
17        public void s e t S i g P o l i c y Q u a l i f i e r s ( S i g P o l i c y Q u a l i f i e r s L i s t T y p e
18        S i g P o l i c y Q u a l i f i e r s ){
19               i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y Q u a l i f i e r s ! = n u l l ) ) {
20                 t h i s . _constructionElement . appendChild ( S i g P o l i c y Q u a l i f i e r s . getElement ( ) ) ;
21                 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
22               }
23        }



                                        Figure 3.24: Methods setTransforms1, setSigPolicyQualifiers


         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (SigPolicyId, SigPolicyHash, Transforms,
            and SigPolicyQualifiers) is not an empty one((SigPolicyId != null), (SigPolicyHash != null),
            (transforms1 != null), (SigPolicyQualifiers != null));

     If any one of these both statements is not fulfilled, no child-element of
     SignaturePolicyIdType would be created. By the SigPolicyId and SigPolicyHash elements
     we use the JUnit tests to demonstrate the obligatorily occurrence, with other words: if this element is an
     empty one, an IllegalArgumentException should be executed with the relevant message:


 1   i f ( S i g P o l i c y I d == n u l l ) {
 2         throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y I d E l e m e n t
 3         is required ! " );
 4     }
 5
 6    i f ( S i g P o l i c y H a s h == n u l l ) {
 7        throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y H a s h E l e m e n t
 8        is required ! " );
 9    }




                                                                                       28
Refers to the negative JUnit tests testNeg_SigPolicyId_Element_required and
     testNeg_SigPolicyHash_Element_required in org.apache.xml.security.xades.tests.JUtests.
        The SigPolicyQualifiers element is added as a child-element of the SignaturePolicyId,
     using a set-Method. Because of its specific type this element is defined as
     SigPolicyQualifiersListType. The following conditions is necessary to be defined:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (SigPolicyQualifiers) is not an empty one
            ((SigPolicyQualifiers != null));

       If any one of these both statements is not fulfilled, no SigPolicyQualifierselement would be
     created.

 1   /∗∗
 2     ∗ Method s e t S i g P o l i c y Q u a l i f i e r
 3     ∗
 4     ∗ @param S i g P o l i c y Q u a l i f i e r
 5     ∗/
 6        public void s e t S i g P o l i c y Q u a l i f i e r ( S t r i n g S i g P o l i c y Q u a l i f i e r ){
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y Q u a l i f i e r ! = n u l l ) ) {
 8              this . addStringElement ( SigPolicyQualifier ,
 9               C o n s t a n t s . _TAG_SIGPOLICYQUALIFIER ) ;
10              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
11            }
12        }



                                                  Figure 3.25: Method setSigPolicyQualifiers



       The child-element, which defines the format SigPolicyQualifiersListType -
     SigPolicyQualifier is created using set-Method. Because of its occurrence, it is necessary to define
     the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (SigPolicyQualifier) is not an empty one
            ((SigPolicyQualifier != null));

       If any one of these both statements is not fulfilled, no child-element of
     SigPolicyQualifiersListType would be created.




                                                                                29
3.11 The SignatureProductionPlace element
     The SignatureProductionPlace is a sub-element of SignedSignatureProperties just like
     SigningTime, SigningCertificate and SignaturePolicyIdentifier, but its use is op-
     tional. This element specifies the exact place where the signature is created, through its four "children" -
     City, StateOrProvince, PostalCode, CountryName. Within the SignedSignature-
     Properties can occur only one SignatureProductionPlace element.
        The schema definition of this element, as it follows:

     < x s d : e l e m e n t name= " S i g n a t u r e P r o d u c t i o n P l a c e "
     type =" S i g n a t u r e P r o d u c t i o n P l a c e T y p e " / >
     < x s d : c o m p l e x T y p e name= " S i g n a t u r e P r o d u c t i o n P l a c e T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " C i t y " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / >
             < x s d : e l e m e n t name= " S t a t e O r P r o v i n c e " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / >
             < x s d : e l e m e n t name= " P o s t a l C o d e " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / >
             < x s d : e l e m e n t name= " CountryName " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / >
         </ xsd:sequence>
     < / xsd:complexType>


                                                            Figure 3.26: SignatureProductionPlace




 1   /∗∗
 2     ∗ Method s e t C i t y
 3     ∗ @param C i t y
 4     ∗/
 5        public void s e t C i t y ( S t r i n g City ) {
 6            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( C i t y ! = n u l l ) ) {
 7              t h i s . a d d S t r i n g E l e m e n t ( C i t y , C o n s t a n t s . _TAG_CITY ) ;
 8              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
 9            }
10        }
11
12   /∗∗
13     ∗ Method s e t S t a t e O r P r o v i n c e
14     ∗ @param S t a t e O r P r o v i n c e
15     ∗/
16        public void s e t S t a t e O r P r o v i n c e ( S t r i n g S t a t e O r P r o v i n c e ) {
17            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S t a t e O r P r o v i n c e ! = n u l l ) ) {
18              t h i s . a d d S t r i n g E l e m e n t ( S t a t e O r P r o v i n c e , C o n s t a n t s . _TAG_STATEORPROVINCE ) ;
19              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
20            }
21        }



                                                  Figure 3.27: Methods: setStateOrProvince, setCity




                                                                                         30
1   /∗∗
 2     ∗ Method s e t P o s t a l C o d e
 3     ∗ @param P o s t a l C o d e
 4     ∗/
 5        public void s e t P o s t a l C o d e ( S t r i n g PostalCode ) {
 6            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( P o s t a l C o d e ! = n u l l ) ) {
 7              t h i s . a d d S t r i n g E l e m e n t ( P o s t a l C o d e , C o n s t a n t s . _TAG_POSTALCODE ) ;
 8              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
 9            }
10        }
11
12   /∗∗
13     ∗ Method s e t C o u n t r y N a m e
14     ∗ @param CountryName
15     ∗/
16        p u b l i c v o i d s e t C o u n t r y N a m e ( S t r i n g CountryName ) {
17                i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( CountryName ! = n u l l ) ) {
18                  t h i s . a d d S t r i n g E l e m e n t ( CountryName , C o n s t a n t s . _TAG_COUNTRYNAME ) ;
19                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
20               }
21        }



                                            Figure 3.28: Methods: setPostalCode, setCountryName




     The child-elements- City, StateOrProvince, PostalCode, CountryName, are created using a
     set-Method. Because of their way of occurrence, it is necessary to define the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (City, StateOrProvince, PostalCode,
            CountryName) is not an empty one((City != null), (StateOrProvince != null), (PostalCode != null),
            (CountryName != null));

       If any one of these both statements is not fulfilled, no child-element of
     SignatureProductionPlace would be created.


     3.12 The SignerRole element
     The SignerRole is a sub-element of SignedSignatureProperties. There can appear only one
     SignerRole element and its use is optional. The SignerRole has two "children" - ClaimedRoles
     and CertifiedRoles, from which leastwise one must be present. Within the ClaimedRoles can
     occur roles claimed by the signer, but they are not certified. On the opposite side is the CertifiedRoles
     element, which consists of wrapped attribute certificates for the signer.
        The schema definition of this element, as it follows:




                                                                                    31
< x s d : e l e m e n t name= " S i g n e r R o l e " t y p e = " S i g n e r R o l e T y p e " / >
     < x s d : c o m p l e x T y p e name= " S i g n e r R o l e T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " C l a i m e d R o l e s " t y p e = " C l a i m e d R o l e s L i s t T y p e "
                  minOccurs=" 0 " / >
             < x s d : e l e m e n t name= " C e r t i f i e d R o l e s " t y p e = " C e r t i f i e d R o l e s L i s t T y p e "
                  m i n O c c u r s = " 0 " / >< / x s d : s e q u e n c e >
     < / xsd:complexType>
     < x s d : c o m p l e x T y p e name= " C l a i m e d R o l e s L i s t T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " C l a i m e d R o l e " t y p e = " AnyType " maxOccurs = " unbounded " / >
         </ xsd:sequence>
     < / xsd:complexType>
     < x s d : c o m p l e x T y p e name= " C e r t i f i e d R o l e s L i s t T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " C e r t i f i e d R o l e " t y p e = " E n c a p s u l a t e d P K I D a t a T y p e "
                  maxOccurs = " unbounded " / >
         </ xsd:sequence>
     < / xsd:complexType>


                                                                  Figure 3.29: SignerRole




     The following java-Code fragments shall illustrate this XAdES - element in detail:


 1   / ∗ ∗ Method s e t C l a i m e d R o l e s
 2       ∗ @param C l a i m e d R o l e s
 3       ∗/
 4          public void setClaimedRoles ( ClaimedRolesList ClaimedRoles ) {
 5              i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C l a i m e d R o l e s ! = n u l l ) ) {
 6                t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( ClaimedRoles . getElement ( ) ) ;
 7                XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
 8              }
 9          }
10
11   / ∗ ∗ Method s e t C e r t i f i e d R o l e s
12       ∗ @param C e r t i f i e d R o l e s
13       ∗/
14          public void s e t C e r t i f i e d R o l e s ( C e r t i f i e d R o l e s L i s t C e r t i f i e d R o l e s ) {
15              i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C e r t i f i e d R o l e s ! = n u l l ) ) {
16                t h i s . _constructionElement . appendChild ( C e r t i f i e d R o l e s . getElement ( ) ) ;
17                XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
18              }
19          }



                                        Figure 3.30: Methods: setClaimedRoles, setCertifiedRoles




                                                                                  32
The child-elements- ClaimedRoles and CertifiedRoles, are created using a set-Method. Be-
     cause of their way of occurrence, it is necessary to define the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (ClaimedRoles, CertifiedRoles) is not an empty one
            ((ClaimedRoles != null), (CertifiedRoles != null);

        If any one of these both statements is not fulfilled, no child-element of SignerRole would be created.


 1   /∗∗
 2     ∗ Constructor CertifiedRolesList
 3     ∗
 4     ∗ @param doc
 5     ∗ @param C e r t i f i e d R o l e E n c a p s u l a t e d P K I D a t a T y p e
 6     ∗
 7     ∗/
 8        p u b l i c C e r t i f i e d R o l e s L i s t ( Document doc , E n c a p s u l a t e d P K I D a t a T y p e
 9          CertifiedRole ) {
10               s u p e r ( doc ) ;
11                i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C e r t i f i e d R o l e ! = n u l l ) ) {
12                  t h i s . _constructionElement . appendChild ( C e r t i f i e d R o l e . getElement ( ) ) ;
13                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
14               }
15        }



                                                      Figure 3.31: Constructor CertifiedRolesList




 1   /∗∗
 2     ∗ Constructor ClaimedRolesList
 3     ∗
 4     ∗ @param doc
 5     ∗ @param C l a i m e d R o l e
 6     ∗
 7     ∗/
 8        p u b l i c C l a i m e d R o l e s L i s t ( Document doc , S t r i n g C l a i m e d R o l e ) {
 9               s u p e r ( doc ) ;
10                i f ( ClaimedRole != n u l l ) {
11                  t h i s . a d d S t r i n g E l e m e n t ( C l a i m e d R o l e , C o n s t a n t s . _TAG_CLAIMEDROLE ) ;
12                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
13               }
14        }



                                                      Figure 3.32: Constructor ClaimedRolesList



     The CertifiedRolesListType and the ClaimedRolesListType - are created using specific
     Constructors. They have two different types of elements (CertifiedRole from
     EncapsulatedPKIDataType, and ClaimedRole from type String). Because of the occurrence of
     CertifiedRole, it is necessary to define the following conditions:




                                                                                      33
1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (CertifiedRole) is not an empty one
            ((CertifiedRole!= null));

       If any one of these both statements is not fulfilled, no child-element of
     CertifiedRolesListType would be created.
       For the ClaimedRole element it should be proved only whether it is not an empty one ((ClaimedRole!=
     null)).


     3.13 The DataObjectFormat element
     The DataObjectFormat element is a sub-element of the SignedDataObjectProperties. It sup-
     plies information about any signed data object. This element may appear, if one specific signed data object
     has to be qualified. Its presence is not required, so null, one or more occurrences are possible.
        The schema definition of this element, as it follows.

     < x s d : e l e m e n t name= " D a t a O b j e c t F o r m a t " t y p e = " D a t a O b j e c t F o r m a t T y p e " / >
     < x s d : c o m p l e x T y p e name= " D a t a O b j e c t F o r m a t T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " D e s c r i p t i o n " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / >
             < x s d : e l e m e n t name= " O b j e c t I d e n t i f i e r " t y p e = " O b j e c t I d e n t i f i e r T y p e "
                  minOccurs=" 0 " / >
             < x s d : e l e m e n t name= " MimeType " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / >
             < x s d : e l e m e n t name= " E n c o d i n g " t y p e = " x s d : a n y U R I " m i n O c c u r s = " 0 " / >
         </ xsd:sequence>
         < x s d : a t t r i b u t e name= " O b j e c t R e f e r e n c e " t y p e = " x s d : a n y U R I "
           use=" r e q u i r e d " / >
     < / xsd:complexType>


                                                              Figure 3.33: DataObjectFormat




 1   /∗∗
 2     ∗ Method s e t D e s c r i p t i o n
 3     ∗
 4     ∗ @param D e s c r i p t i o n
 5     ∗/
 6        public void s e t D e s c r i p t i o n ( S t r i n g D e s c r i p t i o n ) {
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( D e s c r i p t i o n ! = n u l l ) ) {
 8              t h i s . a d d S t r i n g E l e m e n t ( D e s c r i p t i o n , C o n s t a n t s . _TAG_DESCRIPTION ) ;
 9              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10            }
11        }



                                                           Figure 3.34: Method setDescription




                                                                                    34
1   /∗∗
 2     ∗ Method s e t O b j e c t I d e n t i f i e r
 3     ∗
 4     ∗ @param o b j e c t I d e n t i f i e r
 5     ∗/
 6        public void s e t O b j e c t I d e n t i f i e r ( O b j e c t I d e n t i f i e r o b j e c t I d e n t i f i e r ) {
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( o b j e c t I d e n t i f i e r ! = n u l l ) ) {
 8              t h i s . _constructionElement . appendChild ( o b j e c t I d e n t i f i e r . getElement ( ) ) ;
 9              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10            }
11        }



                                                            Figure 3.35: Method setObjectIdentifier




 1   /∗∗
 2     ∗ Method s e t M i m e T y p e
 3     ∗
 4     ∗ @param MimeType
 5     ∗/
 6        p u b l i c v o i d setMimeType ( S t r i n g MimeType ) {
 7                i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( MimeType ! = n u l l ) ) {
 8                  t h i s . a d d S t r i n g E l e m e n t ( MimeType , C o n s t a n t s . _TAG_MIMETYPE ) ;
 9                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10               }
11        }



                                                                Figure 3.36: Method setMimeType




 1   /∗∗
 2     ∗ Method s e t E n c o d i n g
 3     ∗
 4     ∗ @param E n c o d i n g
 5     ∗/
 6        public void setEncoding ( S t r i n g Encoding ) {
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( E n c o d i n g ! = n u l l ) ) {
 8              t h i s . a d d S t r i n g E l e m e n t ( Encoding , C o n s t a n t s . _TAG_ENCODING ) ;
 9              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10            }
11        }



                                                                 Figure 3.37: Method setEncoding




                                                                                           35
1   /∗∗
 2     ∗ S e t s t h e <code > O b j e c t R e f e r e n c e </ code > a t t r i b u t e
 3     ∗
 4     ∗ @param O b j e c t R e f e r e n c e ( anyURI )
 5     ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n ∗∗∗∗ b e c a u s e o f " u s e= r e q u i r e d " ∗∗∗∗
 6     ∗/
 7        public void s e t O b j e c t R e f e r e n c e ( S t r i n g ObjectReference ) {
 8              i f ( O b j e c t R e f e r e n c e == n u l l ) {
 9                throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " O b j e c t R e f e r e n c e A t t i b u t e i s r e q u i r e d ! " ) ;
10              }
11              e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( O b j e c t R e f e r e n c e ! = n u l l ) ) {
12                this . _constructionElement . setAttributeNS (
13                n u l l , C o n s t a n t s . _ATT_OBJECTREFERENCE , O b j e c t R e f e r e n c e ) ;
14              }
15        }



                                                   Figure 3.38: Method setObjectReference attribite


        All sub-elements of DataObjectFormat - Description, ObjectIdentifier, MimeType,
     Encoding, as well as the required ObjectReference attribute are created using set-Methods. Because
     of their way of occurrence, it is necessary to define the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element/-attribute(Description, ObjectIdentifier, MimeType,
            Encoding and ObjectReference) is not an empty one( (Description != null), (objectIdentifier!=
            null), (MimeType!= null), (Encoding!= null), (ObjectReference!= null);

        If any one of these both statements is not fulfilled, no child-element of DataObjectFormat would be
     created.
        By the ObjectReference attribute we use the JUnit test to demonstrate the obligatorily occurrence,
     with other words: if this attribute does not exist, an IllegalArgumentException should be executed with the
     relevant message.


 1      i f ( O b j e c t R e f e r e n c e == n u l l ) {
 2         throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " O b j e c t R e f e r e n c e A t t i b u t e i s r e q u i r e d ! " ) ;
 3      }




     Refers to the negative JUnit test testNeg_DataObjectFormat_Attr_ObjectReference_required in
     org.apache.xml.security.xades.tests.JUtests.




                                                                                         36
3.14 The CommitmentTypeIndication element
    The CommitmentTypeIndication is a sub-element of the SignedDataObjectProperties. Its
    presence is not required, so null, one or more occurrences are possible.
      The schema definition of this element, as it follows:

    < x s d : e l e m e n t name= " C o m m i t m e n t T y p e I n d i c a t i o n "
    type =" CommitmentTypeIndicationType " / >
    < x s d : c o m p l e x T y p e name= " C o m m i t m e n t T y p e I n d i c a t i o n T y p e " >
        <xsd:sequence>
            < x s d : e l e m e n t name= " CommitmentTypeId " t y p e = " O b j e c t I d e n t i f i e r T y p e " / >
            <xsd:choice>
                < x s d : e l e m e n t name= " O b j e c t R e f e r e n c e " t y p e = " x s d : a n y U R I "
                       m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >
                < x s d : e l e m e n t name= " A l l S i g n e d D a t a O b j e c t s " / >
            </ xsd:choice>
            < x s d : e l e m e n t name= " C o m m i t m e n t T y p e Q u a l i f i e r s "
                 t y p e = " C o m m i t m e n t T y p e Q u a l i f i e r s L i s t T y p e " m i n O c c u r s = " 0 " / >< / x s d : s e q u e n c e >
    < / xsd:complexType> <xsd:complexType
    name= " C o m m i t m e n t T y p e Q u a l i f i e r s L i s t T y p e " >
        <xsd:sequence>
            < x s d : e l e m e n t name= " C o m m i t m e n t T y p e Q u a l i f i e r "
                 t y p e = " AnyType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >< / x s d : s e q u e n c e >
    < / xsd:complexType>


                                                   Figure 3.39: CommitmentTypeIndication



    On the next page follows the java Constructor for the CommitmentTypeIndication XAdES element,
    see Figure 3.41. The CommitmentTypeIndication element is created using a specific constructor. As
    child-elements, which define the format CommitmentTypeIndication-
    Type : CommitmentTypeId, AllSignedDataObjects and CommitmentType-
    Qualifiers, are added. Because of their occurrence, it is necessary to define the following condition:
    whether the XML-element (CommitmentTypeId, AllSignedDataObjects,
    CommitmentTypeQualifiers) is not an empty one ((CommitmentTypeId!= null), (AllSignedDataOb-
    jects!= null), (commitmentTypeQualifiers!= null)). If this statement is not fulfilled, no child-element of
    CommitmentTypeIndicationType would be created. By the CommitmentTypeId element we use
    the JUnit test to demonstrate the obligatorily occurrence, with other words: if this element does not exist, an
    IllegalArgumentException should be executed with the relevant message:

1   i f ( CommitmentTypeId == n u l l ) {
2         throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " CommitmentTypeId E l e m e n t
3         is required ! " );
4     }




    Refers to the negative JUnit test
    testNeg_CommitmentTypeIndication_CommitmentTypeId_Element_required
    in org.apache.xml.security.xades.tests.JUtests.



                                                                              37
1   /∗∗
 2     ∗ Constructor CommitmentTypeIndication
 3     ∗
 4     ∗ @param doc
 5     ∗ @param C o m m i t m e n t T y p e I d O b j e c t I d e n t i f i e r
 6     ∗ @param c o m m i t m e n t T y p e Q u a l i f i e r s C o m m i t m e n t T y p e Q u a l i f i e r s L i s t
 7     ∗ @param A l l S i g n e d D a t a O b j e c t s
 8     ∗/
 9        p u b l i c C o m m i t m e n t T y p e I n d i c a t i o n ( Document doc , O b j e c t I d e n t i f i e r
10        CommitmentTypeId , A l l S i g n e d D a t a O b j e c t s A l l S i g n e d D a t a O b j e c t s ,
11        CommitmentTypeQualifiersList commitmentTypeQualifiers ) {
12               s u p e r ( doc ) ;
13                i f ( CommitmentTypeId == n u l l ) {
14                  throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " CommitmentTypeId e l e m e n t i s r e q u i r e d ! " ) ;
15               }
16                e l s e i f ( CommitmentTypeId ! = n u l l ) {
17                  t h i s . _ c o n s t r u c t i o n E l e m e n t . a p p e n d C h i l d ( CommitmentTypeId . g e t E l e m e n t ( ) ) ;
18                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
19               }
20                i f ( A l l S i g n e d D a t a O b j e c t s != n u l l ) {
21                  t h i s . _constructionElement . appendChild ( AllSignedDataObjects . getElement ( ) ) ;
22                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
23               }
24                i f ( c om m it me n tT yp e Qu al i fi er s != n u l l ) {
25                  t h i s . _constructionElement . appendChild ( commitmentTypeQualifiers . getElement ( ) ) ;
26                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
27               }
28        }



                                           Figure 3.40: Constructor CommitmentTypeIndication




 1   /∗∗
 2     ∗ Method s e t C o m m i t m e n t T y p e Q u a l i f i e r
 3     ∗
 4     ∗ @param C o m m i t m e n t T y p e Q u a l i f i e r
 5     ∗/
 6        public void setCommitmentTypeQualifier ( S t r i n g CommitmentTypeQualifier ) {
 7            i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C o m m i t m e n t T y p e Q u a l i f i e r ! = n u l l ) ) {
 8              t h i s . addStringElement ( CommitmentTypeQualifier ,
 9              C o n s t a n t s . _TAG_COMMITMENTTYPEQUALIFIER ) ;
10              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
11            }
12        }



                                             Figure 3.41: Method setCommitmentTypeQualifier



        The child-element, which defines the format CommitmentTypeQualifiersListType
     - CommitmentTypeQualifier is created using set-Method. Because of its occurrence, it is necessary
     to define the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));
         2. And also, whether the XML-element (CommitmentTypeQualifier) is not an empty one
            ((CommitmentTypeQualifier!= null));



                                                                                 38
If any one of these both statements is not fulfilled, no child-element of
     CommitmentTypeQualifiersListType would be created.


     3.15 The AllDataObjectsTimeStamp element
     The AllDataObjectsTimeStamp, and also the IndividualDataObjectsTimeStamp element
     (see further) consist of the time-stamp-calculated elements, which belong to Reference in the SignedInfo
     child-element, knowing that the signer can refer to any kind of elements, but the SignedProperties.
        The HashDataInfo must give a reference to all of these time-stamp-computed elements and is built
     up as a sequence of the mentioned above instances. Its presence is not required, so null, one or more
     occurrences are possible.
        The schema definition of this element, as it follows.


     < x s d : e l e m e n t name= " A l l D a t a O b j e c t s T i m e S t a m p " t y p e = " TimeStampType " / >


                                                        Figure 3.42: AllDataObjectsTimeStamp




 1   /∗∗
 2     ∗ Method s e t A l l D a t a O b j e c t s T i m e S t a m p
 3     ∗
 4     ∗ @param A l l D a t a O b j e c t s T i m e S t a m p
 5     ∗/
 6        p u b l i c v o i d s e t A l l D a t a O b j e c t s T i m e S t a m p ( TimeStampType A l l D a t a O b j e c t s T i m e S t a m p ) {
 7                i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( A l l D a t a O b j e c t s T i m e S t a m p ! = n u l l ) ) {
 8                  t h i s . _constructionElement . appendChild ( AllDataObjectsTimeStamp . getElement ( ) ) ;
 9                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10               }
11        }



                                               Figure 3.43: Method setAllDataObjectsTimeStamp



       The AllDataObjectsTimeStamp element is created using a set-Method, and because of its type is
     specified as TimeStampType ("(TimeStampType AllDataObjectsTimeStamp)"). It is necessary to define
     the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (AllDataObjectsTimeStamp) is not an empty one
            ((AllDataObjectsTimeStamp!= null);

       If any one of these both statements is not fulfilled, no AllDataObjectsTimeStamp element would
     be created.




                                                                                     39
3.16 The IndividualDataObjectsTimeStamp element
     The IndividualDataObjectsTimeStamp is a sub-element of the
     SignedDataObjectProperties. It consists of time-stamp, which is computed before the creation of
     the signature. Its presence is not required, so null, one or more occurrences are possible.
       Below follows the schema definition for this element.


     < x s d : e l e m e n t name= " I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p "
     t y p e = " TimeStampType " / >


                                                     Figure 3.44: IndividualDataObjectsTimeStamp




 1   /∗∗
 2     ∗ Method s e t I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p
 3     ∗
 4     ∗ @param i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p
 5     ∗/
 6        p u b l i c v o i d s e t I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p ( TimeStampType i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p ) {
 7                i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p ! = n u l l ) ) {
 8                  t h i s . _constructionElement . appendChild ( i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p . getElement ( ) ) ;
 9                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
10               }
11        }



                                            Figure 3.45: Method setIndividualDataObjectsTimeStamp




        The IndividualDataObjectsTimeStamp element is created using a set-Method, and because of
     its type is specified as TimeStampType ("(TimeStampType individualdataobjectstimestamp)"). It is neces-
     sary to define the following conditions:

         1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
            ((this._state == MODE_SIGN));

         2. And also, whether the XML-element (IndividualDataObjectsTimeStamp) is not an empty
            one ((individualdataobjectstimestamp!= null);

      If any one of these both statements is not fulfilled, no IndividualDataObjectsTimeStamp ele-
     ment would be created.




                                                                                        40
3.17 The CounterSignature element
The CounterSignature element is a sub-element of the UnsignedSignatureProperties, which
extends as a child-element the UnsignedProperties. Its use is optional (its presence is not required,
so null, one or more occurrences are possible) and belongs not to the scope of this thesis and the current
version of the project. Though, this implementation of the element offers the chance for future elaboration
of the project. A successful integration of the CounterSignature element shall extend the functional-
ity of the XAdES library to implement: Independent Signatures and Embedded Signatures, important for
evaluating the signing of contracts between parallel signer, and multi-signer parties with/without option for
signer ordering. For further information, please refer to: W3C XAdES specification[XAdES].
   The schema definition of this element, as it follows:

< x s d : e l e m e n t name= " C o u n t e r S i g n a t u r e " t y p e = " C o u n t e r S i g n a t u r e T y p e " / >
< x s d : c o m p l e x T y p e name= " C o u n t e r S i g n a t u r e T y p e " >
    <xsd:sequence>
        < xsd:element r e f =" d s : S i g n a t u r e " / >
    </ xsd:sequence>
< / xsd:complexType>


                                                   Figure 3.46: CounterSignature




                                                                      41
4 Datatypes
4.1 The ObjectIdentifierType
The ObjectIdentifierType data type identifies every single specific data object.


< x s d : c o m p l e x T y p e name= " O b j e c t I d e n t i f i e r T y p e " >
    <xsd:sequence>
        < x s d : e l e m e n t name= " I d e n t i f i e r " t y p e = " x s d : a n y U R I " / >
        < x s d : e l e m e n t name= " D e s c r i p t i o n " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / >
        < x s d : e l e m e n t name= " D o c u m e n t a t i o n R e f e r e n c e s "
             t y p e = " D o c u m e n t a t i o n R e f e r e n c e s T y p e " m i n O c c u r s = " 0 " / >< / x s d : s e q u e n c e >
< / xsd:complexType>


                                                     Figure 4.1: ObjectIdentifierType



Reassigning of the Identifier element is not permitted (that means: once the Identifier element is
assigned, it can never be reassigned again).The ObjectIdentifier element as an interface between the
URN specification of the data objects and the associated URI specification (Domain names).For the devel-
oper concerned, please refer to the Chapter 5.1.2 of the W3C XAdES specification. The ObjectIdenti-
fierType is extended by the DocumentationReferences, which give further explanation on the
documentation of the ObjectIdentifier. The optional element DocumentationReference is
from type ’anyURI’.
The next tables shall illustrate the IdentifierType and DocumentationReferencesType XAdES
complexTypes:


< x s d : c o m p l e x T y p e name= " I d e n t i f i e r T y p e " >
    <xsd:complexContent>
        < x s d : e x t e n s i o n base =" xsd:anyURI ">
            < x s d : a t t r i b u t e name= " Q u a l i f i e r " t y p e = " Q u a l i f i e r T y p e " u s e = " o p t i o n a l " / >
        < / x s d : e x t e n s i o n >< / x s d : c o m p l e x C o n t e n t >
< / x s d : c o m p l e x T y p e > < x s d : s i m p l e T y p e name= " Q u a l i f i e r T y p e " >
    < x s d : r e s t r i c t i o n base=" x s d : s t r i n g ">
        < x s d : e n u m e r a t i o n v a l u e = " OIDAsURI " / >
        < x s d : e n u m e r a t i o n v a l u e = "OIDAsURN" / >< / x s d : r e s t r i c t i o n >
</ xsd:simpleType>


                                                          Figure 4.2: IdentifierType




                                                                          42
< x s d : c o m p l e x T y p e name= " D o c u m e n t a t i o n R e f e r e n c e s T y p e " >
         < x s d : s e q u e n c e maxOccurs = " unbounded " >
             < x s d : e l e m e n t name= " D o c u m e n t a t i o n R e f e r e n c e " t y p e = " x s d : a n y U R I " / >
         </ xsd:sequence>
     < / xsd:complexType>


                                                      Figure 4.3: DocumentationReferencesType




 1   /∗∗
 2     ∗ Method s e t I d e n t i f i e r
 3     ∗
 4     ∗ @param I d e n t i f i e r S t r i n g
 5     ∗/
 6        public void s e t I d e n t i f i e r ( S t r i n g I d e n t i f i e r ) {
 7            i f ( I d e n t i f i e r == n u l l ) {
 8              throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " I d e n t i f i e r A t t i b u t e i s r e q u i r e d ! " ) ; }
 9            e l s e i f ( t h i s . _ s t a t e == MODE_SIGN) {
10              t h i s . a d d S t r i n g E l e m e n t ( I d e n t i f i e r , C o n s t a n t s . _TAG_IDENTIFIER ) ;
11              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
12            }
13        }
14
15   /∗∗
16     ∗ Method s e t D e s c r i p t i o n
17     ∗ @param D e s c r i p t i o n S t r i n g
18     ∗/
19        public void s e t D e s c r i p t i o n ( S t r i n g D e s c r i p t i o n ) {
20            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( D e s c r i p t i o n ! = n u l l ) ) {
21              t h i s . a d d S t r i n g E l e m e n t ( D e s c r i p t i o n , C o n s t a n t s . _TAG_DESCRIPTION ) ;
22              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
23            }
24        }
25
26   /∗∗
27     ∗ Method s e t D o c u m e n t a t i o n R e f e r e n c e s
28     ∗
29     ∗ @param D o c u m e n t a t i o n R e f e r e n c e s S t r i n g
30     ∗/
31        public void setDocumentationReferences ( S t r i n g DocumentationReferences ) {
32            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( D o c u m e n t a t i o n R e f e r e n c e s ! = n u l l ) ) {
33              t h i s . addStringElement ( DocumentationReferences ,
34              C o n s t a n t s . _TAG_DOCUMENTATIONREFERENCES ) ;
35              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
36            }
37        }



                          Figure 4.4: Methods setIdentifier, setDescription, setDocumentationReferences




                                                                                     43
The child-elements, which define the format ObjectIdentifierType - Identifier,
    Description and DocumentationReferences are created using set-Method. Because of their oc-
    currence, it is necessary to define the following conditions:

        1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
           ((this._state == MODE_SIGN));

        2. And also, whether the XML-element (Identifier, Description,
           DocumentationReferences) is not an empty one((Identifier!= null), (Description!= null), (Doc-
           umentationReferences!= null));

      If any one of these both statements is not fulfilled, no child-element of ObjectIdentifierType
    would be created.
      By the Identifier element we use the JUnit test to demonstrate the obligatorily occurrence, with other
    words: if this element does not exist, an IllegalArgumentException should be executed with the relevant
    message.


1     i f ( I d e n t i f i e r == n u l l ) {
2        throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " I d e n t i f i e r A t t i b u t e i s
3        required ! " );
4     }




    Refers to the negative JUnit test testNeg_ObjectIdentifier_Identifier_Attribute_required in
    org.apache.xml.security.xades.tests.JUtests.


    4.2 The EncapsulatedPKIDataType
    The EncapsulatedPKIDataType data type is a sophisticated extension, which acts as an interface to
    include PKI data into the XML structure. The encoding of the PKI data is conform to the ANS.1 encod-
    ing mechanism, which permits to be included X509 certificates revocation lists OCSP responses, attribute
    certificates and time-stamps.


    < x s d : c o m p l e x T y p e name= " E n c a p s u l a t e d P K I D a t a T y p e " >
        <xsd:complexContent>
            < x s d : e x t e n s i o n base=" xsd:base64Binary ">
                < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / >
            </ xsd:extension>
        < / xsd:complexContent>
    < / xsd:complexType>


                                                         Figure 4.5: EncapsulatedPKIDataType



       More detailed, this PKI data type is base64 encoded referred to the XMLDSIG specification.




                                                                                     44
1   /∗∗
 2     ∗ S e t s t h e <code >Id </ code > E l e m e n t
 3     ∗
 4     ∗ @param I d
 5     ∗/
 6        public void s e t I d ( S t r i n g Id ) {
 7              i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( I d ! = n u l l ) ) {
 8                t h i s . _constructionElement . s e t A t t r i b u t e N S ( null ,
 9                C o n s t a n t s . _ATT_ID , I d ) ;
10                IdResolver . registerElementById ( t h i s . _constructionElement , Id ) ;
11              }
12        }



                                                  Figure 4.6: Method setID

      The attribute, which extends the format EncapsulatedPKIDataType - Id is created using set-
     Method. Because of its occurrence, it is necessary to define the following conditions:
        1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
           ((this._state == MODE_SIGN));
        2. And also, whether the XML-attribute (Id) is not an empty one( (Id != null));
       If any one of these both statements is not fulfilled, no child-element of
     EncapsulatedPKIDataType would be created.


     4.3 The TimeStampType
     The use of the TimeStampType data type is fully explained in the chapter 5.1.4 of the W3C XAdES
     specification. The mechanism of the time-stamp could be explained as it follows: a given data, associated
     with its digest value, receives its time-stamp from the Time-Stamp Authority (TSA).The returned time-
     stamp represents the signed data, which contains the digest value, the identity of the TSA and the time of
     the calculation of the stamping process. NOTE that the given data exists before the computation process.


        The HashDataInfo element decrypts the time-stamp request to the TSA. On one hand referencing an
     uri attribute to the data object, on the other containing the Transforms element, refer to XMLDSIG.
        The following Java-code for the implementation of these elements:


       The elements, which extend the format TimeStampType - HashDataInfo,
     EncapsulatedTimeStamp, XMLTimeStamp are created using set-Method. Because of their occur-
     rence, it is necessary to define the following conditions:
        1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode"
           ((this._state == MODE_SIGN));
        2. And also, whether the XML-element TimeStampType - HashDataInfo,
           EncapsulatedTimeStamp, XMLTimeStamp) is not an empty one( (hashdatainfo!= null), (en-
           capsulatedtimestamp!= null), (XMLTimeStamp!= null));
       If any one of these both statements is not fulfilled, no child-element of TimeStampType would be
     created.



                                                               45
< x s d : c o m p l e x T y p e name= " TimeStampType " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " H a s h D a t a I n f o " t y p e = " H a s h D a t a I n f o T y p e "
                maxOccurs = " unbounded " / >
             <xsd:choice>
                 < x s d : e l e m e n t name= " E n c a p s u l a t e d T i m e S t a m p "
                   type =" EncapsulatedPKIDataType " / >
                 < x s d : e l e m e n t name= " XMLTimeStamp " t y p e = " AnyType " / >
             </ xsd:choice>
         </ xsd:sequence>
     < / xsd:complexType>
     < x s d : c o m p l e x T y p e name= " H a s h D a t a I n f o T y p e " >
         <xsd:sequence>
             < x s d : e l e m e n t name= " T r a n s f o r m s " t y p e = " d s : T r a n s f o r m s T y p e " m i n O c c u r s = " 0 " / >
         </ xsd:sequence>
         < x s d : a t t r i b u t e name= " u r i " t y p e = " x s d : a n y U R I " u s e = " r e q u i r e d " / >
     < / xsd:complexType>


                                                                  Figure 4.7: TimeStampType

 1   /∗∗
 2     ∗ Method s e t H a s h D a t a I n f o
 3     ∗
 4     ∗ @param h a s h d a t a i n f o
 5     ∗/
 6        public void setHashDataInfo ( HashDataInfoType h a s h d a t a i n f o ) {
 7            i f ( h a s h d a t a i n f o == n u l l ) {
 8              throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " H a s h D a t a I n f o E l e m e n t i s r e q u i r e d ! " ) ;
 9            }
10            else        i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( h a s h d a t a i n f o ! = n u l l ) ) {
11              t h i s . _constructionElement . appendChild ( hashdatainfo . getElement ( ) ) ;
12              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
13            }
14        }
15
16   /∗∗
17     ∗ Method s e t E n c a p s u l a t e d T i m e S t a m p
18     ∗
19     ∗ @param e n c a p s u l a t e d t i m e s t a m p
20     ∗/
21        public void setEncapsulatedTimeStamp ( EncapsulatedPKIDataType e n c a p s u l a t e d t i m e s t a m p ) {
22            i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( e n c a p s u l a t e d t i m e s t a m p ! = n u l l ) ) {
23              t h i s . _constructionElement . appendChild ( encapsulatedtimestamp . getElement ( ) ) ;
24              XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
25            }
26        }
27
28   /∗∗
29     ∗ Method setXMLTimeStamp
30     ∗
31     ∗ @param XMLTimeStamp
32     ∗/
33        p u b l i c v o i d setXMLTimeStamp ( S t r i n g XMLTimeStamp ) {
34                i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( XMLTimeStamp ! = n u l l ) ) {
35                  t h i s . a d d S t r i n g E l e m e n t ( XMLTimeStamp , C o n s t a n t s . _TAG_XMLTIMESTAMP ) ;
36                  XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ;
37               }
38        }



                    Figure 4.8: Method setHashDataInfo, setEncapsulatedTimeStamp, setXMLTimeStamp



                                                                                      46
5 Conclusion
At the end of this project thesis a brief discussion over the library’s functionality, associated test-cases and
further use/ future implementations will be made.
The reader/ developer/ user can refer to the Appendixes A and B , where the complete output from the Java
classes:

   • CreateSinature_XAdES,

   • CreateSignature_XAdES_BES,

can be found.
This illustrates the functionality of the library, which can generate the complete XAdES/ XAdES-BES spec-
ifications.
The case where, optional XAdES elements can meet their occurrence more than once, is demonstrated on
the example of the Java class: CreateSignature_XAdES_MoreThanOneElement, refer to Appendix C.
   Furthermore, there are three associated with these classes positive JUnit test cases, which verify the proper
execution of the Java classes and creation of the advanced electronic signatures, see Appendix D.
The other 16 negative JUnit tests validate the created signature, as every required element / attribute of the
XAdES specification is probed for its existence in the advanced electronic signature, see Appendix D.
The negative tests are created in a way , that if one required element/ attribute is an empty one, this particular
test gives a proper run, which is its expected value.This means that the signature’ creation has failed, and if
this is not the expected situation, there is no proper creation of the advanced electronic signature, because
a required XAdES element/ attribute is compromised with its 0 occurrence, which makes the signature
invalid.
The Eclipse IDE integrated JUnit plug-in delivers the complete execution time of all 19 tests of 3.438
seconds.
This confirms the good efficiency of the XAdES library.
These tests run as an example on a Pentium Celeron IV 1.7GHz, Single Core CPU PC with 768 MB of
DDR-I SD-RAM, Microsoft Windows XP SP2, refer to Appendix D.
   Beside the qualifying property and its sub-elements , which extend the security of the advanced elec-
tronic signature, required future development on the project’s library shall be the implementation of times-
tamps[TSP][TSPProf], which are explained in the XAdES-T, XAdES-X, XAdES-X-L and XAdES-A spec-
ifications.
Furthermore, an implementation of the countersignature is also seen in the future works of the project.
This shall give the chance to complete integration of advanced electronic signature to the Apache XML
Security Project.
   Finally, our XAdES project is developed as an OpenSource,so this gives the freedom for further imple-
mentations to the other developers, who can use our XAdES library as a fundament and extend its function-
ality.




                                                       47
6 Author’s addresses

Zdravko Danailov                              Krassen Deltchev

Ruhr-University of Bochum                     Ruhr-University of Bochum
Department of Applied Informatics, Block IC   Department of Applied Informatics, Block IC
Universitaetsstrasse 150                      Universitaetsstrasse 150
44801, Bochum                                 44801, Bochum

e-mail: nqkoi_ot_bg@yahoo.com                 e-mail: Krassen.Deltchev@rub.de




                                              48
Bibliography
[CMS] RFC 3852: Cryptographic Message Syntax. R. Housley. July 2004.
   http://tools.ietf.org/html/rfc3852

[ESI] ETSI TS 101 733: Electronic Signature Formats.
     http://www.etsi.org

[ESI-XAdES] ETSI TS 101 903: XML Advanced Electronic Signatures (XAdES).
     http://uri.etsi.org/01903/v1.1.1#

[ES-SMIME] RFC 2634: Enhanced Security Services for S/MIME. P. Hoffman. June 1999.
     http://www.ietf.org/rfc/rfc2634.txt
     update:
     RFC2634-update-00: Enhanced Security Services for S/MIME;
     draft-ietf-smime-rfc2634-update-00.txt, J Schaad, August 2004
     http://tools.ietf.org/html/draft-ietf-smime-rfc2634-update-00

[EU-DIR-ESIG] Directive 1999/93/EC of the European Parliament and of the Council of 13 December
    1999 on a Community framework for electronic signatures.

[Keywords] RFC 2119: Key words for use in RFCs to Indicate Requirement Levels. S. Bradner . March
    1997.
    http://www.ietf.org/rfc/rfc2119.txt

[OCSP] RFC 2560: X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP. M.
    Myers, R. Ankney, A. Malpani, S. Galperin, C. Adams. June 1999.
    http://www.ietf.org/rfc/rfc2560.txt

[TSP] RFC 3161: Internet X.509 Public Key Infrastructure Time Stamp Protocol (TSP). P. Cain, D. Pinkas,
    R. Zuccherato. August 2001.
    http://www.ietf.org/rfc/rfc3161.txt

[TSPProf] ETSI TS 101 861: Time stamping profile.
    http://www.etsi.org
    http://portal.etsi.org/docbox/EC_Files/EC_Files/ts_101861v010201p.pdf

[URI] RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax. T. Berners-Lee, R. Fielding, U.C.
    Irvine, L. Masinter. August 1998.
    http://www.ietf.org/rfc/rfc2396.txt
    update:
    RFC : Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee. January 2005
    http://www.ietf.org/rfc/rfc3986.txt

[URN] RFC 2141: URN Syntax. R. Moats. May 1997.
    http://www.ietf.org/rfc/rfc2141.txt




                                                  49
[URN-NM] RFC 2611: URN Namespace Definition Mechanisms. L. Daigle, D. van Gulik, R. Iannella, P.
    Falstrom. June 1999.
    http://www.ietf.org/rfc/rfc2611.txt
    update:
    RFC 3406: URN Namespace Definition Mechanisms. L. Daigle. October 2002
    http://ietfreport.isoc.org/idref/rfc3406/

[URN-OID] RFC 3061: A URN Namespace of Object Identifiers. M. Mealling. February 2001.
    http://www.ietf.org/rfc/rfc3061.txt

[XML] Extensible Markup Language (XML) 1.0 (Second Edition). W3C Recommendation. T. Bray, E.
   Maler, J. Paoli, C. M. Sperberg-McQueen. October 2000.
   http://www.w3.org/TR/2000/REC-xml-20001006
   update:
   Extensible Markup Language (XML) 1.0 (Fourth Edition), W3C Recommendation
   http://www.w3.org/TR/REC-xml/
   http://www.w3.org/TR/2006/PER-xml-20060614/

[XMLDSIG] XML-Signature Syntax and Processing. W3C Recommendation. Donald Eastlake, Joseph
   Reagle, David Solo. February 2002.
   http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/

[XAdES] XML Advanced Electronic Signatures (XAdES). W3C Recommendation. Juan Carlos Cruellas(
    UPC), Gregor Karlinger( IAIK), Denis Pinkas( Bull), John Ross( Security and Standards), Krishna
    Sankar( Cisco). February 2003.
    http://www.w3.org/TR/2003/NOTE-XAdES-20030220/
    update:
    http://www.w3.org/TR/XAdES/

[XML-schema-part-1] XML-Schema Part 1: Structures. W3C Recommendation. D. Beech, M. Maloney,
   N. Mendelsohn, H. Thompson. May 2001.
   http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/

[XML-schema-part-2] XML-Schema Part 2: Datatypes. W3C Recommendation. P. Biron, A. Malhotra.
   May 2001.
   http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/

[X509v3] ITU-T Recommendation X.509 version 3 (1997). "Information Technology - Open Systems In-
    terconnection - The Directory Authentication Framework" ISO/IEC 9594-8:1997.

[X509Prof] RFC 2459: Internet X.509 Public Key Infrastructure Certificate and CRL Profile. R. Housley,
    W. Polk, D. Solo. January 1999.
    http://www.ietf.org/rfc/rfc2459.txt




                                                50
A Appendix - XAdES

   <nds:RootElement xmlns:nds="http://www.nds.rub.de/xades">
     <nds:AI-NDS-HGI Id="AI-NDS-HGI-18378667">Some simple text</nds:AI-NDS-HGI>
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="SignatureId">
       <SignedInfo>
       <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
       <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" />
         <Reference URI="#AI-NDS-HGI-18378667">
            <Transforms>
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>+e0UhqPaZkX7+5xVrbg50ITch2I=</DigestValue>
         </Reference>
         <Reference URI="#SignedProperties-11626165">
            <Transforms>
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>5ZbU+3vplCMW1BCVNM+6n1N2klc=</DigestValue>
         </Reference>
         <Reference URI="#UnsignedProperties-25392791">
            <Transforms>
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>9E3pIezH0ZCKfO781NEOBxAEiE4=</DigestValue>
         </Reference>
       </SignedInfo>
       <SignatureValue>SVlS9m97Q0t12piyIqegQbR9mhqU8OcTtEV/IdclY4/fMOuHtBCx/Q==
       </SignatureValue>
       <KeyInfo>
         <X509Data>
            <X509Certificate>MIIC3DCCApoCBEY1vX .....</X509Certificate>
         </X509Data>
         <KeyValue>
            <DSAKeyValue>
               <P>/X9TgR11EilS30q´ .....</P>
               <Q>l2BQjxUjC8yykrmCouuEC/BYHPU=</Q>
               <G>+GghdabPd7LvKtc .....</G>
               <Y>OglcRuqvCSTioZQ .....</Y>
            </DSAKeyValue>
         </KeyValue>
       </KeyInfo>
       <Object>
         <QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.1.1#"
          Id="QualifyingProperties-26613447"
          Target="#SignatureId">
            <SignedProperties Id="SignedProperties-11626165">
               <SignedSignaturePropeties>
                 <SigningTime>2007-05-01T17:34:07.140+02:00</SigningTime>
                 <SigningCertificate>
                    <CertIDList>
                      <CertID>
                        <DigestAlgAndValue>
                           <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                           <DigestValue>Nqcd88piw69JTL7UsOPhTqS+YMw=</DigestValue>
                        </DigestAlgAndValue>




                                                i
<IssuerSerial xmlns="http://www.w3.org/2000/09/xmldsig#">
            <X509IssuerName>
            CN=DanDel,OU=AI-NDS-HGI,O=Ruhr-University-Bochum,C=DE
            </X509IssuerName>
            <X509SerialNumber>1177927027
            </X509SerialNumber>
          </IssuerSerial>
       </CertID>
     </CertIDList>
  </SigningCertificate>
  <SignaturePolicyIdentifier>
     <SignaturePolicyID>
       <ObjectIdentifier>
          <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
          <Description>Description of ObjectIdentifier</Description>
          <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
          </DocumentationReferences>
       </ObjectIdentifier>
       <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
       </Transforms>
       <DigestAlgAndValue>
          <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
          <DigestValue>uL+KWM9kVQ2vgVpD3QPz58Xyhpg=</DigestValue>
       </DigestAlgAndValue>
       <SigPolicyQualifiers>
          <SigPolicyQualifier>SigPolicyQualifier</SigPolicyQualifier>
       </SigPolicyQualifiers>
     </SignaturePolicyID>
  </SignaturePolicyIdentifier>
  <SignatureProductionPlace>
     <City>Bochum</City>
     <StateOrProvince>NRW</StateOrProvince>
     <PostalCode>44789</PostalCode>
     <CountryName>Germany</CountryName>
  </SignatureProductionPlace>
  <SignerRole>
     <CertifiedRolesList>
       <CertifiedRole>RXhhbXBsZSA=</CertifiedRole>
     </CertifiedRolesList>
     <ClaimedRolesList>
       <ClaimedRole>http://uri.etsi.org/01903/v1.1.1#</ClaimedRole>
     </ClaimedRolesList>
  </SignerRole>
</SignedSignaturePropeties>
<SignedDataObjectProperties>
  <DataObjectFormat ObjectReference="SignedProperties-11626165">
     <Description>Description</Description>
     <ObjectIdentifier>
       <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
       <Description>Description of ObjectIdentifier</Description>
       <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
       </DocumentationReferences>
     </ObjectIdentifier>
     <Encoding>UTF-8</Encoding>
     <MimeType>plain/text,charset=ISO-8859-1</MimeType>
  </DataObjectFormat>
  <CommitmentTypeIndication>
     <ObjectIdentifier>
       <Description>Description of CommitmentTypeId</Description>
       <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
       <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
       </DocumentationReferences>
     </ObjectIdentifier>
     <AllSignedDataObjects />
     <CommitmentTypeQualifiersList>
       <CommitmentTypeQualifier>CommitmentTypeQualifier
       </CommitmentTypeQualifier>




                                 ii
</CommitmentTypeQualifiersList>
              </CommitmentTypeIndication>
              <AllDataObjectsTimeStamp>
                 <TimeStampType>
                    <HashDataInfo URI="AI-NDS-HGI-18378667">
                      <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
                        <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                      </Transforms>
                    </HashDataInfo>
                    <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
                      <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
                      </EncapsulatedPKIData>
                    </EncapsulatedTimeStamp>
                    <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
                 </TimeStampType>
              </AllDataObjectsTimeStamp>
              <IndividualDataObjectsTimeStamp>
                 <TimeStampType>
                    <HashDataInfo URI="AI-NDS-HGI-18378667">
                      <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
                        <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                      </Transforms>
                    </HashDataInfo>
                    <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
                      <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
                      </EncapsulatedPKIData>
                    </EncapsulatedTimeStamp>
                    <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
                 </TimeStampType>
              </IndividualDataObjectsTimeStamp>
            </SignedDataObjectProperties>
         </SignedProperties>
         <UnsignedProperties Id="UnsignedProperties-25392791">
            <UnsignedSignatureProperties>
              <CounterSignature />
            </UnsignedSignatureProperties>
            <UnsignedDataObjectProperties />
         </UnsignedProperties>
       </QualifyingProperties>
    </Object>
  </Signature>
</nds:RootElement>

                                      Table A.1: XAdES




                                             iii
B Appendix - XAdES-BES

  <nds:RootElement xmlns:nds="http://www.nds.rub.de/xades">
    <nds:AI-NDS-HGI Id="AI-NDS-HGI-18378667">Some simple text</nds:AI-NDS-HGI>
    <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="SignatureId">
      <SignedInfo>
        <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
        <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" />
        <Reference URI="#AI-NDS-HGI-18378667">
           <Transforms>
              <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
           </Transforms>
           <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
           <DigestValue>+e0UhqPaZkX7+5xVrbg50ITch2I=</DigestValue>
        </Reference>
        <Reference URI="#SignedProperties-11626165">
           <Transforms>
              <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
           </Transforms>
           <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
           <DigestValue>5ZbU+3vplCMW1BCVNM+6n1N2klc=</DigestValue>
        </Reference>
      </SignedInfo>
      <SignatureValue>SVlS9m97Q0t12pi .....
      </SignatureValue>
      <KeyInfo>
        <X509Data>
           <X509Certificate>MIIC3DCCApoCBEY1 .....</X509Certificate>
        </X509Data>
        <KeyValue>
           <DSAKeyValue>
              <P>/X9TgR11EilS30qcLuz .....</P>
              <Q>l2BQjxUjC8yykrmCouuEC/BYHPU=</Q>
              <G>9+GghdabPd7LvKtc .....</G>
              <Y>OglcRuqvCSTioZQ .....</Y>
           </DSAKeyValue>
        </KeyValue>
      </KeyInfo>
      <Object>
        <QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.1.1#"
         Id="QualifyingProperties-26613447" Target="#SignatureId">
           <SignedProperties
           Id="SignedProperties-11626165">
              <SignedSignaturePropeties>
                <SigningTime>2007-05-01T17:34:07.140+02:00</SigningTime>
                <SigningCertificate>
                   <CertIDList>
                     <CertID>
                       <DigestAlgAndValue>
                          <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                          <DigestValue>Nqcd88piw69JTL7UsOPhTqS+YMw=</DigestValue>
                       </DigestAlgAndValue>
                       <IssuerSerial xmlns="http://www.w3.org/2000/09/xmldsig#">
                          <X509IssuerName>
                          CN=DanDel,OU=AI-NDS-HGI,O=Ruhr-University-Bochum,C=DE
                          </X509IssuerName>
                          <X509SerialNumber>1177927027</X509SerialNumber>
                       </IssuerSerial>
                     </CertID>




                                               iv
</CertIDList>
              </SigningCertificate>
              <SignaturePolicyIdentifier>
                 <SignaturePolicyID>
                    <ObjectIdentifier>
                      <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
                      <Description>Description of ObjectIdentifier</Description>
                      <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
                      </DocumentationReferences>
                    </ObjectIdentifier>
                    <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
                      <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
                    </Transforms>
                    <DigestAlgAndValue>
                      <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                      <DigestValue>uL+KWM9kVQ2vgVpD3QPz58Xyhpg=</DigestValue>
                    </DigestAlgAndValue>
                    <SigPolicyQualifiers>
                      <SigPolicyQualifier>SigPolicyQualifier</SigPolicyQualifier>
                    </SigPolicyQualifiers>
                 </SignaturePolicyID>
              </SignaturePolicyIdentifier>
            </SignedSignaturePropeties>
         </SignedProperties>
       </QualifyingProperties>
    </Object>
  </Signature>
</nds:RootElement>

                                     Table B.1: XAdES-BES




                                              v
C Appendix - XAdES-More then one Element

   <nds:RootElement xmlns:nds="http://www.nds.rub.de/xades">
     <nds:AI-NDS-HGI Id="AI-NDS-HGI-18378667">Some simple text</nds:AI-NDS-HGI>
     <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="SignatureId">
       <SignedInfo>
       <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
       <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" />
         <Reference URI="#AI-NDS-HGI-18378667">
            <Transforms>
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>+e0UhqPaZkX7+5xVrbg50ITch2I=</DigestValue>
         </Reference>
         <Reference URI="#SignedProperties-11626165">
            <Transforms>
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>5ZbU+3vplCMW1BCVNM+6n1N2klc=</DigestValue>
         </Reference>
         <Reference URI="#UnsignedProperties-25392791">
            <Transforms>
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>9E3pIezH0ZCKfO781NEOBxAEiE4=</DigestValue>
         </Reference>
       </SignedInfo>
       <SignatureValue>SVlS9m97Q0t12piyIqegQbR9mhqU8OcTtEV/IdclY4/fMOuHtBCx/Q==
       </SignatureValue>
       <KeyInfo>
         <X509Data>
            <X509Certificate>MIIC3DCCApoCBEY1vX .....</X509Certificate>
         </X509Data>
         <KeyValue>
            <DSAKeyValue>
               <P>/X9TgR11EilS30q´ .....</P>
               <Q>l2BQjxUjC8yykrmCouuEC/BYHPU=</Q>
               <G>+GghdabPd7LvKtc .....</G>
               <Y>OglcRuqvCSTioZQ .....</Y>
            </DSAKeyValue>
         </KeyValue>
       </KeyInfo>
       <Object>
         <QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.1.1#"
          Id="QualifyingProperties-26613447"
          Target="#SignatureId">
            <SignedProperties Id="SignedProperties-11626165">
               <SignedSignaturePropeties>
                 <SigningTime>2007-05-01T17:34:07.140+02:00</SigningTime>
                 <SigningCertificate>
                    <CertIDList>
                      <CertID>
                        <DigestAlgAndValue>
                           <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
                           <DigestValue>Nqcd88piw69JTL7UsOPhTqS+YMw=</DigestValue>
                        </DigestAlgAndValue>




                                               vi
<IssuerSerial xmlns="http://www.w3.org/2000/09/xmldsig#">
            <X509IssuerName>
            CN=DanDel,OU=AI-NDS-HGI,O=Ruhr-University-Bochum,C=DE
            </X509IssuerName>
            <X509SerialNumber>1177927027
            </X509SerialNumber>
          </IssuerSerial>
       </CertID>
     </CertIDList>
  </SigningCertificate>
  <SignaturePolicyIdentifier>
     <SignaturePolicyID>
       <ObjectIdentifier>
          <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
          <Description>Description of ObjectIdentifier</Description>
          <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
          </DocumentationReferences>
       </ObjectIdentifier>
       <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
          <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
       </Transforms>
       <DigestAlgAndValue>
          <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
          <DigestValue>uL+KWM9kVQ2vgVpD3QPz58Xyhpg=</DigestValue>
       </DigestAlgAndValue>
       <SigPolicyQualifiers>
          <SigPolicyQualifier>SigPolicyQualifier</SigPolicyQualifier>
       </SigPolicyQualifiers>
     </SignaturePolicyID>
  </SignaturePolicyIdentifier>
  <SignatureProductionPlace>
     <City>Bochum</City>
     <StateOrProvince>NRW</StateOrProvince>
     <PostalCode>44789</PostalCode>
     <CountryName>Germany</CountryName>
  </SignatureProductionPlace>
  <SignerRole>
     <CertifiedRolesList>
       <CertifiedRole>RXhhbXBsZSA=</CertifiedRole>
     </CertifiedRolesList>
     <ClaimedRolesList>
       <ClaimedRole>http://uri.etsi.org/01903/v1.1.1#</ClaimedRole>
     </ClaimedRolesList>
  </SignerRole>
</SignedSignaturePropeties>
<SignedDataObjectProperties>
  <DataObjectFormat ObjectReference="SignedProperties-11626165">
     <Description>Description</Description>
     <ObjectIdentifier>
       <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
       <Description>Description of ObjectIdentifier</Description>
       <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
       </DocumentationReferences>
     </ObjectIdentifier>
     <Encoding>UTF-8</Encoding>
     <MimeType>plain/text,charset=ISO-8859-1</MimeType>
  </DataObjectFormat>
  <DataObjectFormat ObjectReference="SignedProperties-11626165">
     <Description>Description</Description>
     <ObjectIdentifier>
       <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
       <Description>Description of ObjectIdentifier</Description>
       <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
       </DocumentationReferences>
     </ObjectIdentifier>
     <Encoding>UTF-8</Encoding>
     <MimeType>plain/text,charset=ISO-8859-1</MimeType>
  </DataObjectFormat>




                                 vii
<DataObjectFormat ObjectReference="SignedProperties-11626165">
  <Description>Description</Description>
  <ObjectIdentifier>
     <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
     <Description>Description of ObjectIdentifier</Description>
     <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
     </DocumentationReferences>
  </ObjectIdentifier>
  <Encoding>UTF-8</Encoding>
  <MimeType>plain/text,charset=ISO-8859-1</MimeType>
</DataObjectFormat>
<CommitmentTypeIndication>
  <ObjectIdentifier>
     <Description>Description of CommitmentTypeId</Description>
     <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
     <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
     </DocumentationReferences>
  </ObjectIdentifier>
  <AllSignedDataObjects />
  <CommitmentTypeQualifiersList>
     <CommitmentTypeQualifier>CommitmentTypeQualifier
     </CommitmentTypeQualifier>
  </CommitmentTypeQualifiersList>
</CommitmentTypeIndication>
<CommitmentTypeIndication>
  <ObjectIdentifier>
     <Description>Description of CommitmentTypeId</Description>
     <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
     <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
     </DocumentationReferences>
  </ObjectIdentifier>
  <AllSignedDataObjects />
  <CommitmentTypeQualifiersList>
     <CommitmentTypeQualifier>CommitmentTypeQualifier
     </CommitmentTypeQualifier>
  </CommitmentTypeQualifiersList>
</CommitmentTypeIndication>
<CommitmentTypeIndication>
  <ObjectIdentifier>
     <Description>Description of CommitmentTypeId</Description>
     <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier>
     <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt
     </DocumentationReferences>
  </ObjectIdentifier>
  <AllSignedDataObjects />
  <CommitmentTypeQualifiersList>
     <CommitmentTypeQualifier>CommitmentTypeQualifier
     </CommitmentTypeQualifier>
  </CommitmentTypeQualifiersList>
</CommitmentTypeIndication>
<AllDataObjectsTimeStamp>
  <TimeStampType>
     <HashDataInfo URI="AI-NDS-HGI-18378667">
       <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
         <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
       </Transforms>
     </HashDataInfo>
     <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
       <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
       </EncapsulatedPKIData>
     </EncapsulatedTimeStamp>
     <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
  </TimeStampType>
</AllDataObjectsTimeStamp>
<AllDataObjectsTimeStamp>
  <TimeStampType>
     <HashDataInfo URI="AI-NDS-HGI-18378667">
       <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">




                                  viii
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
             </Transforms>
          </HashDataInfo>
          <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
             <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
             </EncapsulatedPKIData>
          </EncapsulatedTimeStamp>
          <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
       </TimeStampType>
     </AllDataObjectsTimeStamp>
     <AllDataObjectsTimeStamp>
       <TimeStampType>
          <HashDataInfo URI="AI-NDS-HGI-18378667">
             <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
             </Transforms>
          </HashDataInfo>
          <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
             <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
             </EncapsulatedPKIData>
          </EncapsulatedTimeStamp>
          <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
       </TimeStampType>
     </AllDataObjectsTimeStamp>
     <IndividualDataObjectsTimeStamp>
       <TimeStampType>
          <HashDataInfo URI="AI-NDS-HGI-18378667">
             <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
             </Transforms>
          </HashDataInfo>
          <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
             <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
             </EncapsulatedPKIData>
          </EncapsulatedTimeStamp>
          <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
       </TimeStampType>
     </IndividualDataObjectsTimeStamp>
     <IndividualDataObjectsTimeStamp>
       <TimeStampType>
          <HashDataInfo URI="AI-NDS-HGI-18378667">
             <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
             </Transforms>
          </HashDataInfo>
          <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
             <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
             </EncapsulatedPKIData>
          </EncapsulatedTimeStamp>
          <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
       </TimeStampType>
     </IndividualDataObjectsTimeStamp>
     <IndividualDataObjectsTimeStamp>
       <TimeStampType>
          <HashDataInfo URI="AI-NDS-HGI-18378667">
             <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#">
               <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
             </Transforms>
          </HashDataInfo>
          <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp">
             <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ......
             </EncapsulatedPKIData>
          </EncapsulatedTimeStamp>
          <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp>
       </TimeStampType>
     </IndividualDataObjectsTimeStamp>
  </SignedDataObjectProperties>
</SignedProperties>




                                   ix
<UnsignedProperties Id="UnsignedProperties-25392791">
            <UnsignedSignatureProperties>
              <CounterSignature />
            </UnsignedSignatureProperties>
            <UnsignedDataObjectProperties />
         </UnsignedProperties>
       </QualifyingProperties>
    </Object>
  </Signature>
</nds:RootElement>

                             Table C.1: XAdES-More then one Element




                                               x
D Appendix - Screenshots
Short summary on the screenshots in this appendix:


      • Screenshot - Eclipse IDE Junit plug-in console output , gives an overview over the 19 different
        JUnit tests( positive and negative) and
        the reader can obtain information on the test execution time, proper run of the different tests,
        test errors and failures.
        The screenshot shows the complete Eclipse IDE frame and there is a pointer from the JUnit console,
        which is separately shown below, for the sake of a better illustration.

      • Screenshot - Eclipse IDE console output , gives the console output from the Eclipse IDE
        after successful execution of the Java class JUtests.
        The console delivers information on the correct
        verification of all ReferenceURIs for the
        XAdES root element, Signed- and Unsigned Properies;
        which proves on one hand the securing on all their subelements,
        which are referenced to the unique IDs of that ones and
        on another the sucessful creation of the XAdES signature.More detailed:

             - regarding CreateSignature_XAdES, the ReferenceURIs are:
         #AI-NDS-HGI-XXXXXXXX 1 , #SignedProperties-XXXXXXXX and #UnsignedProperties-XXXXXXXX;

             - regarding CreateSignature_XAdES_BES, the ReferenceURIs are:
         #AI-NDS-HGI-XXXXXXXX and #SignedProperties-XXXXXXXX
         NOTE: Unsigned Property element is empty for the
         Basic Electronic XAdES signatures;
             - regarding CreateSignature_XAdES_MoreThanOneElement, the ReferenceURIs are:
         #AI-NDS-HGI-XXXXXXXX, #SignedProperties-XXXXXXXX and #UnsignedProperties-XXXXXXXX.

         This second screenshot shows also the complete Eclipse IDE frame and with a pointer from the en-
         larged Eclipse output console,
         which is separately shown below, for the sake of a better illustration too.




 1
     The ’XXXXXXXX’ represent digits in the unique element ID, generated as a random hashcode, using SHA1




                                                             xi
Figure D.1: Screenshot - Eclipse IDE JUnit plug-in console output




                               xii
Figure D.2: Screenshot - Eclipse IDE console output




                       xiii

XAdES Specification based on the Apache XMLSec Project

  • 1.
    XAdES Specification basedon the Apache XMLSec Project Zdravko Danailov Krassen Deltchev Email: nqkoi_ot_bg@yahoo.com Email: Krassen.Deltchev@rub.de Project thesis at Chair for Network and Data Security Prof. Dr. Jörg Schwenk advised through Dipl.Ing. Lijun Liao 22.05.2007 Horst-Görtz Institute Ruhr-University of Bochum
  • 2.
    Abstract XML Advanced ElectronicSignature (XAdES) provides basic authentication and integrity protection, and satisfies the legal requirements for advanced electronic signatures.There are several implementations of XAdES, but most of them are not OpenSource, or are partialy proprietary software. Great project concerned with Digital Electronic Signatures is the OpenSource Apache XML Security Project. For the developer and common user there is an implementation for the XMLDSIG specification, but still no one for XAdES. The free source code implemetations of XAdES threat this project as a separate one and there is no interface, which can explicit assemble them into the Apache XML Sec. That’s why, the scope of our project is to create a library, that implements XAdES into the OpenSource Apache XML Security- to extend its functionality and level of security, so using the Apache XML Sec, gives the opportunity to handle Advanced Electronic Signatures, which is a standard of security nowadays. The library is developed in Java, because shouldn’t be any kind of OS platform - dependencies, using it as a plug-in to the Security Project of Apache. More detailed, to validate the signing and verifying of signatures, and also test our code, we use the text- based test suite of JUnit. i
  • 3.
    Acknowledgements We want toexpress our gratitude to our families and friends, who gave their moral support all the time and contributed for the better working atmosphere. To Dipl.Ing. Lijun Liao, we want to thank for the technical input and support. ii
  • 4.
    Contents 1 Introduction 1 1.1 Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1.2 Related works . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2 Background 4 2.1 Definitions and Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3 XML Advanced Electronic Signature Data Structures . . . . . . . . . . . . . . . . . . . . . 6 2.3.1 XML Signature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.3.2 XAdES- XML Advanced Electronic Signature . . . . . . . . . . . . . . . . . . . . 8 3 XAdES Elements 10 3.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 3.2 QualifyingProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3 SignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.4 UnsignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.5 SignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.6 SignedDataObjectProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.7 UnsignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 3.8 The SigningTime element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.9 The SigningCertificate element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.10 The SignaturePolicyIdentifier element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.11 The SignatureProductionPlace element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.12 The SignerRole element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.13 The DataObjectFormat element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.14 The CommitmentTypeIndication element . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.15 The AllDataObjectsTimeStamp element . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.16 The IndividualDataObjectsTimeStamp element . . . . . . . . . . . . . . . . . . . . . . . . 40 3.17 The CounterSignature element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4 Datatypes 42 4.1 The ObjectIdentifierType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.2 The EncapsulatedPKIDataType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.3 The TimeStampType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 5 Conclusion 47 6 Author’s addresses 48 7 Bibliography 49 A Appendix - XAdES i iii
  • 5.
    B Appendix -XAdES-BES iv C Appendix - XAdES-More then one Element vi D Appendix - Screenshots xi iv
  • 6.
    List of Figures 2.1 XMLDSIG Specification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 2.2 XMLDSIG example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 2.3 Advanced Electronic Signature(XAdES) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 2.4 XAdES Specification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9 3.1 QualifyingProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.2 Method setSignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 3.3 Method setUnsignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.4 Method setTarget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 3.5 SignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 3.6 Methods setSignedSignatureProperties, setSignedDataObjectProperties . . . . . . . . . . . 15 3.7 UnsignedProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.8 Method setUnsignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 3.9 Method setUnsignedDataObjectProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.10 SignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 3.11 Contructor SignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 3.12 SignedDataObjectProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 3.13 Methods setCommitmentTypeIndication, setDataObjectFormat . . . . . . . . . . . . . . . . 20 3.14 Methods setAllDataObjectsTimeStamp, setIndividualDataObjectsTimeStamp . . . . . . . . 21 3.15 UnsignedSignatureProperties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.16 Method setCounterSignature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 3.17 SigningTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.18 Constructor SigningTime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 3.19 SigningCertificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 3.20 Method setSigningCertificate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 3.21 SignaturePolicyIdentifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 3.22 Method setSignaturePolicyId . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.23 Methods setSigPolicyId, setSigPolicyHash . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 3.24 Methods setTransforms1, setSigPolicyQualifiers . . . . . . . . . . . . . . . . . . . . . . . . 28 3.25 Method setSigPolicyQualifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 3.26 SignatureProductionPlace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.27 Methods: setStateOrProvince, setCity . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 3.28 Methods: setPostalCode, setCountryName . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 3.29 SignerRole . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.30 Methods: setClaimedRoles, setCertifiedRoles . . . . . . . . . . . . . . . . . . . . . . . . . 32 3.31 Constructor CertifiedRolesList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.32 Constructor ClaimedRolesList . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 3.33 DataObjectFormat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.34 Method setDescription . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34 3.35 Method setObjectIdentifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.36 Method setMimeType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 v
  • 7.
    3.37 Method setEncoding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35 3.38 Method setObjectReference attribite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 3.39 CommitmentTypeIndication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 3.40 Constructor CommitmentTypeIndication . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.41 Method setCommitmentTypeQualifier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 3.42 AllDataObjectsTimeStamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.43 Method setAllDataObjectsTimeStamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 3.44 IndividualDataObjectsTimeStamp . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.45 Method setIndividualDataObjectsTimeStamp . . . . . . . . . . . . . . . . . . . . . . . . . 40 3.46 CounterSignature . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 4.1 ObjectIdentifierType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.2 IdentifierType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 4.3 DocumentationReferencesType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43 4.4 Methods setIdentifier, setDescription, setDocumentationReferences . . . . . . . . . . . . . 43 4.5 EncapsulatedPKIDataType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 4.6 Method setID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 4.7 TimeStampType . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 4.8 Method setHashDataInfo, setEncapsulatedTimeStamp, setXMLTimeStamp . . . . . . . . . 46 D.1 Screenshot - Eclipse IDE JUnit plug-in console output . . . . . . . . . . . . . . . . . . . . xii D.2 Screenshot - Eclipse IDE console output . . . . . . . . . . . . . . . . . . . . . . . . . . . . xiii vi
  • 8.
    List of Tables 2.1 Definitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 2.2 Abbreviations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 2.3 XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 A.1 XAdES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii B.1 XAdES-BES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v C.1 XAdES-More then one Element . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . x vii
  • 9.
    1 Introduction The XMLSignature is a method of associating a key with referenced data (octets); it does not normatively specify how keys are associated with persons or institutions, nor the meaning of the data, being referenced and signed. The main goal of our project is to build a library, which extends the Apache XML Security Project, to meet the XAdES specification, so that the user shall be able to create advanced electronic signatures and be able to validate them. The XAdES (XML Advanced Electronic Signature) specification is sophisticated and there are strong hierarchies among the different XML elements. Every one of them is discussed in separated sections of this thesis(in chapter 3 and chapter 4), where the reader gets an overview on the XML notation, regarding every specific XAdES element, associated with Java code samples: important constructors, variables, constants; and at last, but not at least a pointer to the JUnit test, which verifies the right execution of the code in the library, regarding this particular XAdES element. The XAdES specification is extended by the: XAdES-T, XAdES-C, XAdES-X, XAdES-X-L, XAdES-A; we describe in this thesis only the implemented specifications in our project library of XAdES and XAdES- BES (Basic Electronic Signature). We concentrate only on the creation and verification of electronic signatures, which are valid, requiring only one signer party; therefore, neither independent (parallel signers, without ordering requirement), nor embedded (multiple party signers with signer ordering requirement) digital signatures (such as: contracts, signed between two parties) are described in this work, or find implementation in this version of our project. 1.1 Tools In this section we will specify the necessary tools and mention some requirements, which are obligatory for the use, execution and further development of this project. 1. Tools for development: - Java Development Kit (at least version 1.5)1 - IBM Eclipse IDE2 - JUnit 3.8.1(Plug-In for Eclipse)3 2. Tools for the common user: - Java Runtime Environment (at least version 1.5)4 NOTE: We cannot test the functionality of this project and especially of our library with a lower version of JUnit, because there are no such ones available. 1 http://java.sun.com/ 2 http://www.eclipse.org/ NOTE: you can use also the Apache Ant toolkit, instead of Eclipse- http://ant.apache.org/ 3 http://www.junit.org/index.htm 4 http://java.sun.com/ 1
  • 10.
    1.2 Related works Atthis moment, there are two projects (JDigiDoc and DContract), which are concerned with XAdES. On one side, JDigiDoc is a framework and implementation of digital signatures. It validates the private keys of Estonian ID Cards and Mobile ID Cards for mobile PC devices. JDigiDoc is contrived as an OpenSource. The java project can be obtained from the website and tested with the Apache XML toolkit, but it is not designed explicit as a library for the Apache XML Project. • JDigiDoc Veiko Sinivee Veiko.Sinivee@seb.se openxades@openxades.org http://www.openxades.org/ On another side, DContract provides a toolbox for the management of digital contracts within Java.It supports all XML Advanced Electronic Signature types (XAdES v1.3.2 2006-03): XAdES-BES, XAdES- EPES, XAdES-T, XAdES-C, XAdES-X, XAdES-X-L. It uses PKCS12 key repository management and can generate RSA key pairs up to 2048 bit. The DContract project is not an OpenSource. • DContract Frank Cornelis http://www.frankcornelis.be info@frankcornelis.be Other contributions to XAdES shall be listed as follows: • Baltimore Technologies Vivekanand Sakaram (vsakaram@baltimore.com) Project information: Language: Java probably only commercial license (code source can be negotiated only on individual basis) • Institute for Applied Information Processing and Communications (IAIK), Graz University of Technology Martin Centner (mcentner@iaik.tugraz.at) Peter Lipp (plipp@iaik.tugraz.at) Project information: Language: Java free for educational use and research (code for commercial license only) 2
  • 11.
    • Kopint-Datorg Rt.(Kopdat) Balazs Andras Dohanyos (balazs.dohanyos@kopdat.hu) Project information: Language: C++ (compiled in VC6.0) contact sales( no source availability) • Microsoft Eddy Rubens (eddyrube@microsoft.com) Stefan Santesson (stefans@microsoft.com) Project information: Language: C# free library( code availability - yes) • Universitat Politecnica de Catalunya (UPC) Joan Arnedo (joanar@ac.upc.es) Juan Carlos Cruellas (cruellas@ac.upc.es) Project information: Language: Java probably commercial licence( no source availability) • Agencia Catalana de Certificacio [CATCert] Marta Cruellas (mcruellas@catcert.net) Project information: no furthur information 3
  • 12.
    2 Background For thebetter understanding of this thesis and the goal of our library, we shall specify some basic terms and expound the essence of the main ‘Building Blocks’. 2.1 Definitions and Abbreviations For the purposes of the current work, the following terms and definitions apply: Term Definition Arbitrator entity that arbitrates in disputes between a signer and a verifier Attributes Authorities provide users with attributes linked to public key certifi- cates Certification Authorities provide users with public key certificates Registration Authorities allow the identification and registration of entities before a CA generates certificates Repository Authorities publish CRLs issued by CAs, signature policies issued by signature policy issuers and optionally public key certifi- cates Signature Policy Issuers define the technical and procedural requirements for elec- tronic signature creation and validation, in order to meet a particular business need Signer entity that creates the electronic signature Time-Stamping Authorities attest that some data object was formed before a given trusted time Time-Marking Authorities record that some data was formed before a given trusted time Trusted Service Providers one or more entities that help to build trust relationships between the signer and verifier Verifier entity that verifies the electronic signature Table 2.1: Definitions 4
  • 13.
    Term Abbreviation Attribute Certificate AC Certification Authority CA Cryptographic Message Syntax CMS Certificate Revocation List CRL Document Type Definition DTD Electronic Signature ES Hyper Text Transfer Protocol HTTP Online Certificate Status Protocol OCSP Object IDentifier OID Public Key Certificate PKC Time-Stamping Authorities TSA Trusted Service Providers TSP Time Stamping Unit TSU Uniform Resource Identifier URI Uniform Resource Name URN XML Advanced Electronic Signature XAdES XAdES Archiving validation data XAdES-A XAdES Basic Electronic Signature XAdES-BES XAdES Complete validation data XAdES-C XAdES Explicit Policy based Elec- XAdES-EPES tronic Signature XAdES with Time-stamp XAdES-T XAdES eXtended validation data XAdES-X eXtensible Markup Language XML eXtensible Markup Language Digital XMLDSIG SIGnature eXtensible Stylesheet Language XSL eXtensible Stylesheet Language XSLT Transformations Table 2.2: Abbreviations 2.2 XML As mentioned above XML [XML][XML-schema-part-1][XML-schema-part-2] is the abbreviation for eX- tensible Markup Language. Its main purpose is to facilitate the sharing of data across different informa- tion systems, particularly via the Internet. By adding semantic constraints, application languages such as XHTML, RSS, MathML, GraphML, Scalable Vector Graphics, can be implemented in XML. Moreover, XML is sometimes used as the specification language for such application languages. XML is recommended by the World Wide Web Consortium (W3C). It is a fee-free open standard. The W3C recommendation specifies both the lexical grammar, and the requirements for parsing. 5
  • 14.
    eXtensible Markup Language File extension .xml Uniform Type public.xml MIME type application/xml, text/xml (deprecated) Developed by World Wide Web Consortium Type of format Markup language Extended from SGML Extended to XHTML, RSS, Atom, ... Standard(s) 1.0 (Fourth Edition) 1.1 (Second Edition) Table 2.3: XML 2.3 XML Advanced Electronic Signature Data Structures 2.3.1 XML Signature This section provides an overview and examples of XML digital signature syntax. An informal representa- tion and examples are used to describe the structure of the XML signature syntax. This representation and examples may omit attributes, details and potential features that are explained later. XML Signatures are applied to arbitrary digital content (data objects) via an indirection. Data objects are digested, the resulting value is placed in an element with other information and that element is then digested and cryptographically signed. XML digital signatures are represented by the Signature element which has the following structure: XMLDSIG < d s : S i g n a t u r e ID ? >− − − − − − − − −+− − − − −+ <ds:SignedInfo> | | <ds:CanonicalizationMethod /> | | <ds:SignatureMethod / > | | ( < d s : R e f e r e n c e URI? > | | (<ds:Transforms>)? | | <ds:DigestMethod> | | <ds:DigestValue> | | < / d s : R e f e r e n c e >)+ | | </ ds:SignedInfo> | | <ds:SignatureValue> | | ( < d s : K e y I n f o >)?− − − − − − − − − + | <ds:Object> | < d s : S i g n a t u r e >− − − − − − − − − − − − − − − −+ Figure 2.1: XMLDSIG Specification 6
  • 15.
    Signatures are relatedto data objects via URIs. Within an XML document, signatures are related to local data objects via fragment identifiers. Such local data can be included within an enveloping signature or can enclose an enveloped signature. Detached signatures are over external network resources or local data objects that reside within the same XML document as sibling elements; in this case, the signature is neither enveloping (signature is parent) nor enveloped attribute (signature is child). Since a Signature element (and its Id value/name) may co-exist or be combined with other elements (and their IDs) within a single XML document, care should be taken in choosing names such that there are no subsequent collisions that violate the ID uniqueness validity constraint. The following example is a detached signature of the content of the HTML4.01 in XML specification. < n d s : R o o t E l e m e n t x m l n s : n d s = " h t t p : / / www. n d s . r u b . de / x a d e s " > < n d s : A I −NDS−HGI I d = " AI−NDS−HGI−18378667 " >Some s i m p l e t e x t < / n d s : A I −NDS−HGI> < S i g n a t u r e xmlns = " h t t p : / / www. w3 . o r g / 2 0 0 0 / 0 9 / x m l d s i g # " I d = " S i g n a t u r e I d " > <SignedInfo> <CanonicalizationMethod A l g o r i t h m = " h t t p : / / www. w3 . o r g / TR / 2 0 0 1 / REC−xml−c14n −20010315 " / > < S i g n a t u r e M e t h o d A l g o r i t h m = " h t t p : / / www. w3 . o r g / 2 0 0 0 / 0 9 / x m l d s i g # dsa−s h a 1 " / > < R e f e r e n c e URI= " #AI−NDS−HGI−18378667 " > <Transforms> < T r a n s f o r m A l g o r i t h m = " h t t p : / / www. w3 . o r g / 2 0 0 1 / 1 0 / xml−exc−c14n # " / > < / Transforms> < D i g e s t M e t h o d A l g o r i t h m = " h t t p : / / www. w3 . o r g / 2 0 0 0 / 0 9 / x m l d s i g # s h a 1 " / > < D i g e s t V a l u e >+e0UhqPaZkX7+5 x V r b g 5 0 I T c h 2 I =< / D i g e s t V a l u e > </ Reference> +< R e f e r e n c e URI= " # S i g n e d P r o p e r t i e s −11626165 " >< / R e f e r e n c e > +< R e f e r e n c e URI= " # U n s i g n e d P r o p e r t i e s −25392791 " >< / R e f e r e n c e > </ SignedInfo> < S i g n a t u r e V a l u e >SVlS9m97Q0t12pi . . . . . < / S i g n a t u r e V a l u e > <KeyInfo> <X509Data > < X 5 0 9 C e r t i f i c a t e >MIIC3DCCApoCBEY1 . . . . . < / X 5 0 9 C e r t i f i c a t e > < / X509Data > <KeyValue > <DSAKeyValue> <P> / X9TgR11EilS30qcLuz . . . . . < / P> <Q>l2BQjxUjC8yykrmCouuEC /BYHPU=< / Q> <G>9+ GghdabPd7LvKtc . . . . . < / G> <Y>OglcRuqvCSTioZQ . . . . . < / Y> < / DSAKeyValue> < / KeyValue > < / KeyInfo> +< O b j e c t >< / O b j e c t > </ Signature> < / nds:RootElement> Figure 2.2: XMLDSIG example The required SignedInfo element is the information that is actually signed. Core validation of SignedInfo consists of two mandatory processes: validation of the signature over SignedInfo and validation of each 7
  • 16.
    Reference digest withinSignedInfo. Note that the algorithms used in calculating the SignatureValue are also included in the signed information while the SignatureValue element is outside SignedInfo. The CanonicalizationMethod is the algorithm that is used to canonicalize the SignedInfo element before it is digested as part of the signature operation. Note that the example in Figure 2.2 , as well as all examples in this specification, are not in canonical form. 2.3.2 XAdES- XML Advanced Electronic Signature An XML Advanced Electronic Signature [XAdES][ESI-XAdES] is illustrated in Figure 2.3 . Figure 2.3: Advanced Electronic Signature(XAdES) The XML Advanced Electronic Signature (XAdES)- its format is the one defined in [XMLDSIG] with the addition of signed properties (SigningTime, SigningCertificate, SignaturePolicyIdentifier, SignaturePro- ductionPlace, SignerRole, AllDataObjectsTimeStamp, IndividualDataObjectsTimeStamp, DataObjectFor- mat and CommitmentTypeIndication) and unsigned properties (CounterSignature) (where "?" denotes zero or one occurrence; "+" denotes one or more occurrences; and "*" denotes zero or more occurrences): 8
  • 17.
    XMLDSIG | < d s : S i g n a t u r e ID ? >− − − − − − − − −+− − − − −+ <ds:SignedInfo> | | <ds:CanonicalizationMethod /> | | <ds:SignatureMethod / > | | ( < d s : R e f e r e n c e URI? > | | (<ds:Transforms>)? | | <ds:DigestMethod> | | <ds:DigestValue> | | < / d s : R e f e r e n c e >)+ | | </ ds:SignedInfo> | | <ds:SignatureValue> | | ( < d s : K e y I n f o >)?− − − − − − − − − + | | <ds:Object> | | <QualifyingProperties> | | <SignedProperties> | | <SignedSignatureProperties> | ( SigningTime ) | ( SigningCertificate ) | ( SignaturePolicyIdentifier ) | ( SignatureProductionPlace )? | ( SignerRole )? | </ SignedSignatureProperties> | | <SignedDataObjectProperties> | ( DataObjectFormat )∗ | ( CommitmentTypeIndication )∗ | ( AllDataObjectsTimeStamp )∗ | ( IndividualDataObjectsTimeStamp )∗ | </ SignedDataObjectProperties> | | </ SignedProperties> | | <UnsignedProperties> | | <UnsignedSignatureProperties> | ( CounterSignature )∗ | </ UnsignedSignatureProperties> | | </ UnsignedProperties> | | </ QualifyingProperties> | | </ ds:Object> | | < / d s : S i g n a t u r e >− − − − − − − − − − − − − − − + | XAdES Figure 2.4: XAdES Specification 9
  • 18.
    3 XAdES Elements 3.1Overview The reader shall understand that, there are several requirements for the sake of the proper run of the project library. The original OpenSource Apache XML Security Project can be found at: http://santuario.apache.org/Java/index.html , where the developer can find the source and binary packages ( http://xml.apache.org/security/dist/ ) and important installation notes( http://santuario.apache.org/Java/installation.html) Our project library is tested on the former version of the Apache XMLSec Project- v1.3.0. Furthermore, the Apache Project is created as an ’Eclipse Java Project’ and we use Sun JDK 1.5.0_11. For the reader concerned, regarding the implementation of the Project, using JDK 1.4.x (only Windows NT 4.0 and old Unix-based distributions with kernel 2.4.x) please refer to the installation site of the project. The developer must be aware of the following facts: • Copy all files from ’xml-security-bin-1_3_0/xml-security-1_3_0/libs’ to the ’xml-security-src-1_3_0/ xml-security-1_3_0/libs’, so the Apache XMLSec Project( xml-security-src-1_3_0) can be loaded as a standard Eclipse Java Project and properly run, • In the new Eclipse Java Project load the JUnit 3.8.1 library, so the XAdES JUnit tests can be executed. We didn’t test our project library with the current version of JUnit namely version 4.1. We decided to separate the XAdES library package (.../xml-security-src-1_3_0/xml-security-src-1_3_0/ xml-security-1_3_0/src-xades/ ) in the following sub-packages: • ’.../input/ ’- where the Java Keystore data is specified; • ’.../doc/’- where the JavaDoc shall be found, • ’.../org/apache/xml/security/xades/ ’- where the user can find the source code of our XAdES library; the following Java classes are important for the discussion in this introduction to the thesis: – QualifyingProperties- the fundamental XAdES element, which embeds all qualifying properties of an Advanced XML Signature; The QualifyingProperties is a child element of Object (one of the four base XAdES elements-’SignedInfo’, ’SignatureValue’, ’KeyInfo’ and ’Object’); if we regret the use of the Object element, then an Advanced Electronic Signature cannot be built, because the other sub-elements: ’SignedInfo’, ’SignatureValue’, ’KeyInfo’ in their selves do not fulfill completely the XAdES specifi- cation , – Constants- all used constants for the different types of elements/attributes, namespaces, al- gorithms’ descriptions are defined, • ’.../org/apache/xml/security/xades/sp’- the SignedProperties XAdES element and its sub- elements ( conform to the XMLDSIG notation) are specified, • ’.../org/apache/xml/security/xades/up’- the user shall find all the classes, which describe the basic child-element UnsignedProperties( of the QualifyingProperties) and its sub-elements, which are optional( see further) 10
  • 19.
    • ’.../org/apache/xml/security/xades/tests’- wherewe have specified all Signature-creation tests and the JUnit tests: – The class CreateSignatureSDOPalland- every single element of the XAdES notation is created, so the XML notation of XAdES is fully described. The output is can be found in : /xml- security-src-1_3_0/xml-security-1_3_0/signature.xml (see Appendix A - XAdES specification) – The class CreateSignatureSignedSignatureProperties- where the XAdES-BES specification is implemented: the basic child-element of QualifyingProperties- SignedProperties, with its sub- element: SignedSignatureProperties, further its child-elements: SigningTime, SigningCertificate, SignaturePolicyIdentifier, which are all required elements in the XAdES notation. The output is illustrated in : /xml-security-src- 1_3_0/xml-security-1_3_0/signature1.xml (see Appendix B- XAdES-BES) – The class CreateSignatureMoreThanOneElements- according to the XAdES specifi- cation, XML elements, which can occur min. ’0’ and max. ’unbounded’, e.g. more than one el- ements from the same type are allowed to exist, are demonstrated for their multiple use. The out- put for this case is represented due : /xml-security-src-1_3_0/xml-security-1_3_0/signature2.xml (see Appendix C- XAdES More than one element) – The class JUtests- where we specify the different JUnit tests on our library, separated in two general sections: • positive tests- which illustrate the verification of the first three classes( CreateSignatureSDOPalland,CreateSignatureSignedSignatureProper- ties, CreateSignatureMoreThanOneElements) • negative tests- which verify the right implementation of all required elements of the XAdES notation in the project library (refer to the separate explanation on every test in the further sections of the thesis); if the library is able to create the signature without using a required element, nor giving an IllegalArgumentException the particular negative test shall fail. Now let’s concentrate more detailed on every one XML element of the XAdES notation with its specific use, structure and its implementation in the project library. 11
  • 20.
    3.2 QualifyingProperties The basic element of Object is the QualifyingProperties element, which contains the whole qual- ifying information for the Advanced Electronic Signature. This element has the following structure: < x s d : e l e m e n t name= " Q u a l i f y i n g P r o p e r t i e s " type =" Q u a l i f y i n g P r o p e r t i e s T y p e " / > < x s d : c o m p l e x T y p e name= " Q u a l i f y i n g P r o p e r t i e s T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " S i g n e d P r o p e r t i e s " t y p e = " S i g n e d P r o p e r t i e s T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " U n s i g n e d P r o p e r t i e s " t y p e = " U n s i g n e d P r o p e r t i e s T y p e " minOccurs=" 0 " / > </ xsd:sequence> < x s d : a t t r i b u t e name= " T a r g e t " t y p e = " x s d : a n y U R I " u s e = " r e q u i r e d " / > < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / > < / xsd:complexType> Figure 3.1: QualifyingProperties The QualifyingProperties element is extended by its two general sub-elements - the SignedProperties and the UnsignedProperties. The main function of the SignedProperties is to contribute to the cryptographic justification of the XML signature, while the UnsignedProperties is required, generally for an embracement of all variations of the XAdES nota- tion (XAdES, XAdES-T, XAdES-C, XAdES-X, XAdES-A1 and to illustrate all kind of different cases by creating Advanced Electronic signature: single signer - one signature; parallel signer without requirement of ordering for signing the sensitive data, multiple signer with ordering by signing the electronic document . The SignedProperties must be protected by a Reference element in SignedInfo and must ap- pear only once within the QualifyingProperties.The Target attribute is required and it’s used as a reference to the XML signature, and the optional Id attribute references to the container of the QualifyingProperties element. 1 /∗∗ 2 ∗ Method s e t S i g n e d P r o p e r t i e s 3 ∗ 4 ∗ @param s p 5 ∗/ 6 public void s e t S i g n e d P r o p e r t i e s ( S i g n e d P r o p e r t i e s sp ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( s p ! = n u l l ) ) 8 { 9 t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( sp . getElement ( ) ) ; 10 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 11 } 12 } Figure 3.2: Method setSignedProperties 1 http://www.w3.org/TR/XAdES/ 12
  • 21.
    1 /∗∗ 2 ∗ 3 ∗ Method s e t U n s i g n e d P r o p e r t i e s 4 ∗ 5 ∗ @param u s p 6 ∗/ 7 publ ic void s e t U n s i g n e d P r o p e r t i e s ( U n s i g n e d P r o p e r t i e s usp ) 8 { if 9 ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( u s p ! = n u l l ) ) 10 { 11 t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( usp . getElement ( ) ) ; 12 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 13 } 14 } Figure 3.3: Method setUnsignedProperties The two child-elements - SignedProperties and UnsignedProperties, are created using a set-Method. Because of their occurrence, it is necessary to define the conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (SignedProperties,UnsignedProperties) is not an empty one((sp != null)or (usp != null)); If any one of these both statements is not fulfilled, no child-element of QualifyingProperties would be created. 1 2 /∗∗ 3 ∗ S e t s t h e <code >T a r g e t </ code > a t t r i b u t e 4 ∗ 5 ∗ @param T a r g e t ( anyURI ) 6 ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n ∗∗∗∗ b e c a u s e o f " u s e= r e q u i r e d " ∗∗∗∗ 7 ∗/ 8 public void s e t T a r g e t ( S t r i n g Target ) { 9 i f ( T a r g e t == n u l l ) { throw new 10 IllegalArgumentException ( " Target Attibute is required ! " ) ; 11 } 12 e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( T a r g e t ! = n u l l ) ) { 13 this . _constructionElement . setAttributeNS 14 ( n u l l , C o n s t a n t s . _ATT_TARGET , T a r g e t ) ; 15 } 16 } Figure 3.4: Method setTarget 13
  • 22.
    The Target Attribute,as we already mentioned above, is a required one. Within a set-Method two general cases are tested: 1. First of all, whether this attribute is an empty one (which is forbidden), so an IllegalArgumentExcep- tion should be executed with the relevant message. 1 i f ( T a r g e t == n u l l } ) { 2 throw b f new I l l e g a l A r g u m e n t E x c e p t i o n ( " T a r g e t A t t i b u t e i s 3 required ! " ); 4 } 2. Second of all, whether the present state of the signature-creation is -"Signing Mode"((this._state == MODE_SIGN)), and whether the attribute is not an empty one((Target != null)); At the end, we shall mention this requirement of the Target attribute, as a test-case (JUnit test), which is implemented in our project library as a JUnit negative test ("testNeg_QP_Target_required"), refers to class JUtests in the package org.apache.xml.security.xades.tests. 3.3 SignedProperties The SignedProperties has two elements - SignedSignatureProperties and SignedDataObjectProperties. The SignedSignatureProperties element is required and must occur only once within the SignedProperties. The other sub-element of the SignedProperties, SignedDataObjectProperties, is optional and contains elements that can appear one or more than once in the XML signature, which is good illustrated in our JUnit tests. The schema definition of SignedProperties element as it follows: < x s d : e l e m e n t name= " S i g n e d P r o p e r t i e s " t y p e = " S i g n e d P r o p e r t i e s T y p e " / > < x s d : c o m p l e x T y p e name= " S i g n e d P r o p e r t i e s T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " S i g n e d S i g n a t u r e P r o p e r t i e s " type =" S i g n e d S i g n a t u r e P r o p e r t i e s T y p e " / > < x s d : e l e m e n t name= " S i g n e d D a t a O b j e c t P r o p e r t i e s " t y p e =" S i g n e d D a t a O b j e c t P r o p e r t i e s T y p e " minOccurs=" 0 " / > </ xsd:sequence> < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / > < / xsd:complexType> Figure 3.5: SignedProperties 14
  • 23.
    1 /∗∗ 2 ∗ Method s e t S i g n e d S i g n a t u r e P r o p e r t i e s 3 ∗ 4 ∗ @param s s p 5 ∗/ 6 public void s e t S i g n e d S i g n a t u r e P r o p e r t i e s ( S i g n e d S i g n a t u r e P r o p e r t i e s ssp ) { 7 i f ( s s p == n u l l ) { 8 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( 9 " S i g n e d S i g n a t u r e P r o p e r t i e s Element i s r e q u i r e d ! " ) ; 10 } 11 e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( s s p ! = n u l l ) ) { 12 t h i s . _constructionElement . appendChild ( ssp . getElement ( ) ) ; 13 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 14 } 15 } 16 17 /∗∗ 18 ∗ Method s e t S i g n e d D a t a O b j e c t P r o p e r t i e s 19 ∗ 20 ∗ @param s d o p 21 ∗/ 22 p u b l i c void s e t S i g n e d D a t a O b j e c t P r o p e r t i e s ( S i g n e d D a t a O b j e c t P r o p e r t i e s sdop ) { 23 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( s d o p ! = n u l l ) ) { 24 t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( sdop . getElement ( ) ) ; 25 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 26 } 27 } Figure 3.6: Methods setSignedSignatureProperties, setSignedDataObjectProperties The two child-elements - SignedSignatureProperties and SignedDataObjectProperties, are created using a set-Method. Because of their different way of occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (SignedSignatureProperties, SignedDataObjectProperties) is not an empty one((ssp != null)or (sdop != null)); If any one of these both statements is not fulfilled, no child-element of SignedProperties would be created. By the SignedSignatureProperties element we use the JUnit test to demonstrate the obligatorily occurrence, with other words: if this element is an empty one, an IllegalArgumentException should be executed with the relevant message. 1 i f ( s s p == n u l l } { 2 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g n e d S i g n a t u r e P r o p e r t i e s E l e m e n t i s 3 required ! " ); 4 } Refers to the negative JUnit test testNeg_SignedSignatureProperties in org.apache.xml.security.xades.tests.JUtests. 15
  • 24.
    3.4 UnsignedProperties The UnsignedProperties element and its sub-elements are not signed by the [XMLDSIG] signature. They are divided on *SignatureProperties and *DataObjectProperties just like the SignedProperties. < x s d : e l e m e n t name= " U n s i g n e d P r o p e r t i e s " t y p e = " U n s i g n e d P r o p e r t i e s T y p e " / > < x s d : c o m p l e x T y p e name= " U n s i g n e d P r o p e r t i e s T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " U n s i g n e d S i g n a t u r e P r o p e r t i e s " t y p e =" U n s i g n e d S i g n a t u r e P r o p e r t i e s T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " U n s i g n e d D a t a O b j e c t P r o p e r t i e s " t y p e =" U n s i g n e d D a t a O b j e c t P r o p e r t i e s T y p e " minOccurs=" 0 " / > </ xsd:sequence> < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / > < / xsd:complexType> Figure 3.7: UnsignedProperties In this case we can make a reference to the UnsignedProperties element using the optional Id attribute. The two child-elements - UnsignedSignatureProperties and UnsignedDataObjectProperties, are created using a set-Method. Because of their occurrence, it is necessary to define the following conditions: 1. It should not be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)), because the UnsignedProperties element consists of "chil- dren", that are not signed by the XMLDSIG signature; 2. So it appears only one condition to be proved, whether the XML-element (UnsignedSignatureProperties, UnsignedDataObjectProperties) is not an empty one((ussp != null)or (usdop != null)); 1 /∗∗ 2 ∗ Method s e t U n s i g n e d S i g n a t u r e P r o p e r t i e s 3 ∗ 4 ∗ @param u s s p 5 ∗/ 6 public void s e t U n s i g n e d S i g n a t u r e P r o p e r t i e s ( U n s i g n e d S i g n a t u r e P r o p e r t i e s ussp ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( u s s p ! = n u l l ) ) { 8 t h i s . _constructionElement . appendChild ( ussp . getElement ( ) ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.8: Method setUnsignedSignatureProperties 16
  • 25.
    1 /∗∗ 2 ∗ Method s e t U n s i g n e d D a t a O b j e c t P r o p e r t i e s 3 ∗ 4 ∗ @param u s d o p 5 ∗/ 6 p u b l i c void s e t U n s i g n e d D a t a O b j e c t P r o p e r t i e s ( U n s i g n e d D a t a O b j e c t P r o p e r t i e s usdop ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( u s s p ! = n u l l ) ) { 8 t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( usdop . get El eme nt ( ) ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.9: Method setUnsignedDataObjectProperties If the statement mentioned above, is not fulfilled, no child-element of UnsignedProperties would be created. 3.5 SignedSignatureProperties The SignedSignatureProperties has three required Elements (SigningTime, SigningCertificate, SignaturePolicyIdentifier) and two optional ones (SignatureProductionPlace, SignerRole).The XAdES-BES specification is applied through the SigningTime, SigningCertificate, SignaturePolicyIdentifier elements. < x s d : e l e m e n t name= " S i g n e d S i g n a t u r e P r o p e r t i e s " type =" S i g n e d S i g n a t u r e P r o p e r t i e s T y p e " / > < x s d : c o m p l e x T y p e name= " S i g n e d S i g n a t u r e P r o p e r t i e s T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " S i g n i n g T i m e " t y p e = " x s d : d a t e T i m e " / > < x s d : e l e m e n t name= " S i g n i n g C e r t i f i c a t e " t y p e = " C e r t I D L i s t T y p e " / > < x s d : e l e m e n t name= " S i g n a t u r e P o l i c y I d e n t i f e r " type =" S i g n a t u r e P o l i c y I d e n t i f i e r T y p e " / > < x s d : e l e m e n t name= " S i g n a t u r e P r o d u c t i o n P l a c e " t y p e =" S i g n a t u r e P r o d u c t i o n P l a c e T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " S i g n e r R o l e " t y p e = " S i g n e r R o l e T y p e " m i n O c c u r s = " 0 " / > </ xsd:sequence> < / xsd:complexType> Figure 3.10: SignedSignatureProperties The child-elements of the SignedSignatureProperties are added, using a constructor. As men- tioned above, the SigningTime, SigningCertificate and SignaturePolicyIdentifier elements are required. Thorough, their occurrence is tested: if one of these obligatory elements is missing, an IllegalArgumentException should be executed with the relevant message: 17
  • 26.
    1 i f ( s i g n i n g t i m e == n u l l } | | ( s i g n i n g c e r t i f i c a t e == n u l l } | | ( 2 s i g n a t u r e p o l i c y i d e n t i f i e r == n u l l ) 3 { 4 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " Wrong E l e m e n t V a l u e ! " ) ; 5 } Refers to the negative JUnit tests testNeg_SigningTime, testNeg_SigningCertificate and testNeg_SignaturePolicyIdentifier and to the positive JUnit test testPositive_SignedSignatureProperties_Elements_required in org.apache.xml.security.xades.tests.JUtests. The same statements are used to prove that the present phase of signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)), and the XML-element (SigningTime, SigningCertificate and SignaturePolicyIdentifier) is not an empty one((signingtime!= null)or (signingcertificate!= null)) or ((signaturepolicyidentifier!= null)).Likewise, for the other two elements the tested conditions are, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)), and also whether the XML-element ( SignatureProductionPlace, SignerRole) is not an empty one ((signatureproductionplace! = null) or (signerrole! = null)); 18
  • 27.
    1 /∗∗ 2 ∗ Constructor SignedSignatureProperties 3 ∗ 4 ∗ @param doc 5 ∗ @param s i g n i n g t i m e S i g n i n g T i m e 6 ∗ @param s i g n i n g c e r t i f i c a t e S i g n i n g C e r t i f i c a t e 7 ∗ @param s i g n a t u r e p o l i c y i d e n t i f i e r S i g n a t u r e P o l i c y I d e n t i f i e r 8 ∗ @param s i g n a t u r e p r o d u c t i o n p l a c e S i g n a t u r e P r o d u c t i o n P l a c e 9 ∗ @param s i g n e r r o l e S i g n e r R o l e 10 ∗/ 11 p u b l i c S i g n e d S i g n a t u r e P r o p e r t i e s ( Document doc , S i g n i n g T i m e s i g n i n g t i m e , 12 SigningCertificate signingcertificate , SignaturePolicyIdentifier 13 signaturepolicyidentifier , SignatureProductionPlace 14 signatureproductionplace , SignerRole s i g n e r r o l e ) { 15 s u p e r ( doc ) ; 16 i f ( s i g n i n g t i m e == n u l l | | s i g n i n g c e r t i f i c a t e == n u l l | | 17 s i g n a t u r e p o l i c y i d e n t i f i e r == n u l l ) 18 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " Wrong E l e m e n t V a l u e ! " ) ; 19 20 t h i s . _constructionElement . appendChild ( signingtime . getElement ( ) ) ; 21 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 22 23 t h i s . _constructionElement . appendChild ( s i g n i n g c e r t i f i c a t e . getElement ( ) ) ; 24 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 25 26 t h i s . _constructionElement . appendChild ( s i g n a t u r e p o l i c y i d e n t i f i e r . getElement ( ) ) ; 27 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 28 29 i f ( ( s i g n a t u r e p r o d u c t i o n p l a c e != n u l l ) { 30 t h i s . _constructionElement . appendChild ( s i g n a t u r e p r o d u c t i o n p l a c e . getElement ( ) ) ; 31 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 32 } 33 i f ( s i g n e r r o l e != n u l l ) { 34 t h i s . _constructionElement . appendChild ( s i g n e r r o l e . getElement ( ) ) ; 35 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 36 } 37 } Figure 3.11: Contructor SignedSignatureProperties 3.6 SignedDataObjectProperties SignedDataObjectProperties contains sub- elements that qualify some of the signed data objects. DataObjectFormat, CommitmentTypeIndication, AllDataObjectsTimeStamp, IndividualDataObjectsTimeStamp can occur more than once within the SignedDataObjectProperties elements. All these properties qualify the signed data object after all the required transforms have been made. 19
  • 28.
    < x sd : e l e m e n t name= " S i g n e d D a t a O b j e c t P r o p e r t i e s " type =" SignedDataObjectPropertiesType " / > < x s d : c o m p l e x T y p e name= " S i g n e d D a t a O b j e c t P r o p e r t i e s T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " D a t a O b j e c t F o r m a t " t y p e = " D a t a O b j e c t F o r m a t T y p e " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > < x s d : e l e m e n t name= " C o m m i t m e n t T y p e I n d i c a t i o n " t y p e =" CommitmentTypeIndicationType " minOccurs=" 0 " maxOccurs = " unbounded " / > < x s d : e l e m e n t name= " A l l D a t a O b j e c t s T i m e S t a m p " t y p e = " TimeStampType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > < x s d : e l e m e n t name= " I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p " t y p e = " TimeStampType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > </ xsd:sequence> < / xsd:complexType> Figure 3.12: SignedDataObjectProperties 1 /∗∗ 2 ∗ Method s e t D a t a O b j e c t F o r m a t 3 ∗ 4 ∗ @param d a t a o b j e c t f o r m a t 5 ∗/ 6 public void setDataObjectFormat ( DataObjectFormat d a t a o b j e c t f o r m a t ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( d a t a o b j e c t f o r m a t ! = n u l l ) ) { 8 t h i s . _constructionElement . appendChild ( d a t a o b j e c t f o r m a t . getElement ( ) ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } 12 /∗∗ 13 ∗ Method s e t C o m m i t m e n t T y p e I n d i c a t i o n 14 ∗ 15 ∗ @param c o m m i t m e n t t y p e i n d i c a t i o n 16 ∗/ 17 public void setCommitmentTypeIndication ( CommitmentTypeIndication 18 commitmenttypeindication ) { 19 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( c o m m i t m e n t t y p e i n d i c a t i o n ! = n u l l ) ) { 20 t h i s . _constructionElement . appendChild ( commitmenttypeindication . getElement ( ) ) ; 21 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 22 } 23 } Figure 3.13: Methods setCommitmentTypeIndication, setDataObjectFormat 20
  • 29.
    1 /∗∗ 2 ∗ Method s e t A l l D a t a O b j e c t s T i m e S t a m p 3 ∗ 4 ∗ @param a l l d a t a o b j e c t s t i m e s t a m p 5 ∗/ 6 public void setAllDataObjectsTimeStamp ( AllDataObjectsTimeStamp 7 alldataobjectstimestamp ) { 8 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&&( a l l d a t a o b j e c t s t i m e s t a m p ! = n u l l ) ) 9 { t h i s . _constructionElement . appendChild ( a l l d a t a o b j e c t s t i m e s t a m p . getElement ( ) ) ; 10 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 11 } 12 } 13 14 /∗∗ 15 ∗ Method s e t I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p 16 ∗ 17 ∗ @param i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p 18 ∗/ 19 public void setIn dividual DataObje ctsTimeS tamp ( IndividualDataObjectsTimeStamp 20 individualdataobjectstimestamp ) { 21 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p ! = 22 null )){ 23 t h i s . _constructionElement . appendChild 24 ( ind ivid uald ata obje ctst imes tamp . getElement ( ) ) ; 25 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 26 } 27 } Figure 3.14: Methods setAllDataObjectsTimeStamp, setIndividualDataObjectsTimeStamp The child-elements - DataObjectFormat, CommitmentTypeIndicationType, AllDataObjectsTimeStamp and IndividualDataObjectsTimeStamp, are created using a set- Method. Because of their occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (DataObjectFormat, CommitmentTypeIndicationType, AllDataObjectsTimeStamp and IndividualDataObjectsTimeStamp) is not an empty one((dataobjectformat!= null), (commitmenttypeindication!= null), (alldataobjectstimestamp != null), (individualdataobjectstimestamp != null)); If any one of these both statements is not fulfilled, no child-element of SignedDataObjectProperties would be created. 3.7 UnsignedSignatureProperties The UnsignedSignatureProperties element contains CounterSignature, SignatureTimeStamp, CompleteCertificateRefs, CompleteCertificateRefs, SigAndRefsTimeStamp, RefsOnlyTimeStamp, CertificateValues, RevocationValues, ArchiveTimeStamp. In our Project we will pay attention only to the CounterSignature element, because of the structure of XAdES. This will be discussed more detailed in section 3.17. 21
  • 30.
    < x sd : e l e m e n t name= " U n s i g n e d S i g n a t u r e P r o p e r t i e s " type =" U n s i g n e d S i g n a t u r e P r o p e r t i e s T y p e " / > < x s d : c o m p l e x T y p e name= " U n s i g n e d S i g n a t u r e P r o p e r t i e s T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C o u n t e r S i g n a t u r e " t y p e = " C o u n t e r S i g n a t u r e T y p e " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > < x s d : e l e m e n t name= " S i g n a t u r e T i m e S t a m p " t y p e = " TimeStampType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > < x s d : e l e m e n t name= " C o m p l e t e C e r t i f i c a t e R e f s " t y p e =" C o m p l e t e C e r t i f i c a t e R e f s T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " C o m p l e t e R e v o c a t i o n R e f s " t y p e =" CompleteRevocationRefsType " minOccurs=" 0 " / > <xsd:choice> < x s d : e l e m e n t name= " SigAndRefsTimeStamp " t y p e = " TimeStampType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > < x s d : e l e m e n t name= " RefsOnlyTimeStamp " t y p e = " TimeStampType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > </ xsd:choice> < x s d : e l e m e n t name= " C e r t i f i c a t e V a l u e s " t y p e = " C e r t i f i c a t e V a l u e s T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " R e v o c a t i o n V a l u e s " t y p e = " R e v o c a t i o n V a l u e s T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " A r c h i v e T i m e S t a m p " t y p e = " TimeStampType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > </ xsd:sequence> < / xsd:complexType> Figure 3.15: UnsignedSignatureProperties Only the CounterSignature element, using a set-Method, is specified, because the other sub-elements of the UnsignedSignatureProperties are not included in the XAdES XML structure. Note, that only the value of the element is tested, because the "children" of UnsignedProperties element, are not signed by the XMLDSIG signature. 1 /∗∗ 2 ∗ Method s e t C o u n t e r S i g n a t u r e 3 ∗ @param s i g n a t u r e 4 ∗/ 5 public void s e t C o u n t e r S i g n a t u r e ( C o u n t e r S i g n a t u r e signature ) { 6 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( s i g n a t u r e ! = n u l l ) ) { 7 t h i s . _constructionElement . appendChild ( s i g n a t u r e . getElement ( ) ) ; 8 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 9 } 10 } Figure 3.16: Method setCounterSignature 22
  • 31.
    3.8 The SigningTimeelement The SigningTime element is meant for showing the date and time at which the signer has created the signed XML signature. It is a sub-element of SignedSignatureProperties and in view of that contributes for the cryptographic justification of the XML signature. This element must occur exactly once within the signature. However the SigningTime can take only the local time of the computer on which the signature is created. The definition of this element, as it follows: < x s d : e l e m e n t name= " S i g n i n g T i m e " t y p e = " x s d : d a t e T i m e " / > Figure 3.17: SigningTime 1 /∗∗ 2 ∗ Constructor SigningTime 3 ∗ 4 ∗ @param doc 5 ∗ @param d a t e T i m e 6 ∗/ 7 p u b l i c S i g n i n g T i m e ( Document doc , D a t e d a t e T i m e ) { 8 s u p e r ( doc ) ; 9 t h i s . a d d T e x t ( toXMLDate ( d a t e T i m e ) . t o S t r i n g ( ) ) ; 10 } Figure 3.18: Constructor SigningTime The SigningTime is created using a specific constructor, with two variables doc and dateTime. For this function we use the javax.xml.datatype.XMLGregorianCalendar and java.util.GregorianCalendar libraries. 23
  • 32.
    3.9 The SigningCertificateelement Using the SigningCertificate element could be avoided a simple substitution of the certificate. As sub-elements, it has the CertDigest and IssuerSerial elements, which consist of references to the DigestMethod URI and DigestValue, as well as a reference to the X509IssuerSerial (X509IssuerName, X509SerialNumber).Just like the SigningTime element, SigningCertificate is sub-element of the SignedSignatureProperties, its use is required and must appear only once. Below follows the schema definition: < x s d : e l e m e n t name= " S i g n i n g C e r t i f i c a t e " t y p e = " C e r t I D L i s t T y p e " / > < x s d : c o m p l e x T y p e name= " C e r t I D L i s t T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C e r t " t y p e = " C e r t I D T y p e " maxOccurs = " unbounded " / > </ xsd:sequence> < / xsd:complexType> < x s d : c o m p l e x T y p e name= " C e r t I D T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C e r t D i g e s t " t y p e = " D i g e s t A l g A n d V a l u e T y p e " / > < x s d : e l e m e n t name= " I s s u e r S e r i a l " t y p e = " d s : X 5 0 9 I s s u e r S e r i a l T y p e " / > </ xsd:sequence> < / xsd:complexType> < x s d : c o m p l e x T y p e name= " D i g e s t A l g A n d V a l u e T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " D i g e s t M e t h o d " t y p e = " d s : D i g e s t M e t h o d T y p e " / > < x s d : e l e m e n t name= " D i g e s t V a l u e " t y p e = " d s : D i g e s t V a l u e T y p e " / > </ xsd:sequence> < / xsd:complexType> Figure 3.19: SigningCertificate The SigningCertificate element is created using a set-Method, and because of its type is specified as CertIDList ("(CertIDList SigningCertificate)").Again it is necessary to define the following condi- tions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (SigningCertificate) is not an empty one ((SigningCertificate!= null); If any one of these both statements is not fulfilled, no SigningCertificate element would be cre- ated. This shall be illustrated in the next table: 24
  • 33.
    1 /∗∗ 2 ∗ Method s e t S i g n i n g C e r t i f i c a t e 3 ∗ 4 ∗ @param S i g n i n g C e r t i f i c a t e 5 ∗/ 6 public void s e t S i g n i n g C e r t i f i c a t e ( C e r t I D L i s t S i g n i n g C e r t i f i c a t e ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g n i n g C e r t i f i c a t e ! = n u l l ) ) { 8 t h i s . _constructionElement . appendChild ( S i g n i n g C e r t i f i c a t e . getElement ( ) ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.20: Method setSigningCertificate 3.10 The SignaturePolicyIdentifier element The SignaturePolicyIdentifier is a combination of norms for the build up and validation of a sig- nature, so the validity of the signature can be confirmed. The uniqueness of the signer is protected, through a hash value of the signature policy. Moreover the implementation of the SignaturePolicyIdentifier element prevents the hash value and the identifier to be faked, thus it proves the globally unique reference of the signature policy to the XML signature and the signer as a part of the signature computation. With the SigningTime and the SigningCertificate elements it defines the XAdES-BES format. Only one SignaturePolicyIdentifier element must occur within the SignedSignatureProperties.On the next page follows the schema definition for this type, see Fig- ure 3.22 . There are two options for using the elements of the SignaturePolicyIdentifier: 1. SignaturePolicyId has four sub-elements- SigPolicyId, Transforms, SigPolicyHash, SigPolicyQualifiers. • SigPolicyId is required and it specifies the Identifier, Description and the DocumentationReferences elements, which uniquely designates the specific version of the signature policy. • The Transforms element references to the Transforms in the SignedInfo. • SigPolicyHash consists of two sub-elements- DigestMethod Algorithm, identifier of the hash algorithm, and the DigestValue - hash value of the signature policy. • Within the SigPolicyQualifiers extra information, qualifying the policy identifier can appear. 2. SignaturePolicyImplied Alternatively, an empty SignaturePolicyImplied element confirms that the data object(s) be- ing signed and other external data designate the signature policy. The SignaturePolicyId element is added as a child-element of the SignaturePolicyIdentifier, using a set-Method. Because of its specific type this element is de- fined as SignaturePolicyIdType. Like the other SignedProperties is necessary to define the following conditions: 25
  • 34.
    < x sd : e l e m e n t name= " S i g n a t u r e P o l i c y I d e n t i f i e r " type =" S i g n a t u r e P o l i c y I d e n t i f i e r T y p e " / > <xsd:complexType name= " S i g n a t u r e P o l i c y I d e n t i f i e r T y p e " > <xsd:choice> < x s d : e l e m e n t name= " S i g n a t u r e P o l i c y I d " t y p e = " S i g n a t u r e P o l i c y I d T y p e " / > < x s d : e l e m e n t name= " S i g n a t u r e P o l i c y I m p l i e d " / > </ xsd:choice> < / x s d : c o m p l e x T y p e > < x s d : c o m p l e x T y p e name= " S i g n a t u r e P o l i c y I d T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " S i g P o l i c y I d " t y p e = " O b j e c t I d e n t i f i e r T y p e " / > < x s d : e l e m e n t r e f =" d s : T r a n s f o r m s " minOccurs=" 0 " / > < x s d : e l e m e n t name= " S i g P o l i c y H a s h " t y p e = " D i g e s t A l g A n d V a l u e T y p e " / > < x s d : e l e m e n t name= " S i g P o l i c y Q u a l i f i e r s " t y p e =" S i g P o l i c y Q u a l i f i e r s L i s t T y p e " minOccurs=" 0 " / > </ xsd:sequence> < / xsd:complexType> <xsd:complexType name= " S i g P o l i c y Q u a l i f i e r s L i s t T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " S i g P o l i c y Q u a l i f i e r " t y p e = " AnyType " maxOccurs = " unbounded " / > </ xsd:sequence> < / xsd:complexType> Figure 3.21: SignaturePolicyIdentifier 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (SignaturePolicyId) is not an empty one ((SignaturePolicyId!= null)); If any one of these both statements is not fulfilled, no SignaturePolicyIdelement would be created. By the SignaturePolicyId element we use the JUnit test to demonstrate the obligatorily occurrence, with other words: if this element is an empty one, an IllegalArgumentException should be executed with the relevant message: 1 i f ( S i g n a t u r e P o l i c y I d == n u l l ) { 2 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g n a t u r e P o l i c y I d E l e m e n t 3 is required ! " ); 4 } 26
  • 35.
    1 /∗∗ 2 ∗ Method s e t S i g n a t u r e P o l i c y I d 3 ∗ 4 ∗ @param S i g n a t u r e P o l i c y I d 5 ∗/ 6 public void s e t S i g n a t u r e P o l i c y I d ( S i g n a t u r e P o l i c y I d T y p e S i g n a t u r e P o l i c y I d ){ 7 i f ( S i g n a t u r e P o l i c y I d == n u l l ) { 8 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g n a t u r e P o l i c y I d E l e m e n t 9 is required ! " ); 10 } 11 e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g n a t u r e P o l i c y I d ! = n u l l ) ) { 12 t h i s . _constructionElement . appendChild ( S i g n a t u r e P o l i c y I d . getElement ( ) ) ; 13 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 14 } 15 } Figure 3.22: Method setSignaturePolicyId Refers to the negative JUnit test testNeg_SignaturePolicyId_Element_required in org.apache.xml.security.xades.tests.JUtests. The following codesamples can illustrate all this ( refer to the class:SignaturePolicyIdType). 1 /∗∗ 2 ∗ Method s e t S i g P o l i c y I d 3 ∗ @param S i g P o l i c y I d 4 ∗/ 5 public void s e t S i g P o l i c y I d ( O b j e c t I d e n t i f i e r S i g P o l i c y I d ){ 6 i f ( S i g P o l i c y I d == n u l l ) { 7 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y I d E l e m e n t i s r e q u i r e d ! " ) ; 8 } 9 e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y I d ! = n u l l ) ) { 10 t h i s . _constructionElement . appendChild ( SigPolicyId . getElement ( ) ) ; 11 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 12 } 13 } 14 15 /∗∗ 16 ∗ Method s e t S i g P o l i c y H a s h 17 ∗ @param S i g P o l i c y H a s h 18 ∗/ 19 public void s e t S i g P o l i c y H a s h ( DigestAlgAndValue SigPolicyHash ){ 20 i f ( S i g P o l i c y H a s h == n u l l ) { 21 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y H a s h E l e m e n t i s r e q u i r e d ! " ) ; 22 } 23 else i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y H a s h ! = n u l l ) ) { 24 t h i s . _constructionElement . appendChild ( SigPolicyHash . getElement ( ) ) ; 25 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 26 } 27 } Figure 3.23: Methods setSigPolicyId, setSigPolicyHash The child-elements, which define the format SignaturePolicyIdType - SigPolicyId, SigPolicyHash, Transforms, and SigPolicyQualifiers, are all created using set-Methods. Because of their occurrence, it is necessary to define the following conditions: 27
  • 36.
    1 /∗∗ 2 ∗ Method s e t T r a n s f o r m s 1 3 ∗ @param t r a n s f o r m s 1 4 ∗/ 5 public void setTransforms1 ( Transforms1 t r a n s f o r m s 1 ){ 6 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( t r a n s f o r m s 1 ! = n u l l ) ) { 7 t h i s . _constructionElement . appendChild ( transforms1 . getElement ( ) ) ; 8 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 9 } 10 } 11 12 /∗∗ 13 ∗ Method s e t S i g P o l i c y Q u a l i f i e r s 14 ∗ 15 ∗ @param S i g P o l i c y Q u a l i f i e r s 16 ∗/ 17 public void s e t S i g P o l i c y Q u a l i f i e r s ( S i g P o l i c y Q u a l i f i e r s L i s t T y p e 18 S i g P o l i c y Q u a l i f i e r s ){ 19 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y Q u a l i f i e r s ! = n u l l ) ) { 20 t h i s . _constructionElement . appendChild ( S i g P o l i c y Q u a l i f i e r s . getElement ( ) ) ; 21 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 22 } 23 } Figure 3.24: Methods setTransforms1, setSigPolicyQualifiers 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (SigPolicyId, SigPolicyHash, Transforms, and SigPolicyQualifiers) is not an empty one((SigPolicyId != null), (SigPolicyHash != null), (transforms1 != null), (SigPolicyQualifiers != null)); If any one of these both statements is not fulfilled, no child-element of SignaturePolicyIdType would be created. By the SigPolicyId and SigPolicyHash elements we use the JUnit tests to demonstrate the obligatorily occurrence, with other words: if this element is an empty one, an IllegalArgumentException should be executed with the relevant message: 1 i f ( S i g P o l i c y I d == n u l l ) { 2 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y I d E l e m e n t 3 is required ! " ); 4 } 5 6 i f ( S i g P o l i c y H a s h == n u l l ) { 7 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " S i g P o l i c y H a s h E l e m e n t 8 is required ! " ); 9 } 28
  • 37.
    Refers to thenegative JUnit tests testNeg_SigPolicyId_Element_required and testNeg_SigPolicyHash_Element_required in org.apache.xml.security.xades.tests.JUtests. The SigPolicyQualifiers element is added as a child-element of the SignaturePolicyId, using a set-Method. Because of its specific type this element is defined as SigPolicyQualifiersListType. The following conditions is necessary to be defined: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (SigPolicyQualifiers) is not an empty one ((SigPolicyQualifiers != null)); If any one of these both statements is not fulfilled, no SigPolicyQualifierselement would be created. 1 /∗∗ 2 ∗ Method s e t S i g P o l i c y Q u a l i f i e r 3 ∗ 4 ∗ @param S i g P o l i c y Q u a l i f i e r 5 ∗/ 6 public void s e t S i g P o l i c y Q u a l i f i e r ( S t r i n g S i g P o l i c y Q u a l i f i e r ){ 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S i g P o l i c y Q u a l i f i e r ! = n u l l ) ) { 8 this . addStringElement ( SigPolicyQualifier , 9 C o n s t a n t s . _TAG_SIGPOLICYQUALIFIER ) ; 10 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 11 } 12 } Figure 3.25: Method setSigPolicyQualifiers The child-element, which defines the format SigPolicyQualifiersListType - SigPolicyQualifier is created using set-Method. Because of its occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (SigPolicyQualifier) is not an empty one ((SigPolicyQualifier != null)); If any one of these both statements is not fulfilled, no child-element of SigPolicyQualifiersListType would be created. 29
  • 38.
    3.11 The SignatureProductionPlaceelement The SignatureProductionPlace is a sub-element of SignedSignatureProperties just like SigningTime, SigningCertificate and SignaturePolicyIdentifier, but its use is op- tional. This element specifies the exact place where the signature is created, through its four "children" - City, StateOrProvince, PostalCode, CountryName. Within the SignedSignature- Properties can occur only one SignatureProductionPlace element. The schema definition of this element, as it follows: < x s d : e l e m e n t name= " S i g n a t u r e P r o d u c t i o n P l a c e " type =" S i g n a t u r e P r o d u c t i o n P l a c e T y p e " / > < x s d : c o m p l e x T y p e name= " S i g n a t u r e P r o d u c t i o n P l a c e T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C i t y " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / > < x s d : e l e m e n t name= " S t a t e O r P r o v i n c e " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / > < x s d : e l e m e n t name= " P o s t a l C o d e " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / > < x s d : e l e m e n t name= " CountryName " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / > </ xsd:sequence> < / xsd:complexType> Figure 3.26: SignatureProductionPlace 1 /∗∗ 2 ∗ Method s e t C i t y 3 ∗ @param C i t y 4 ∗/ 5 public void s e t C i t y ( S t r i n g City ) { 6 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( C i t y ! = n u l l ) ) { 7 t h i s . a d d S t r i n g E l e m e n t ( C i t y , C o n s t a n t s . _TAG_CITY ) ; 8 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 9 } 10 } 11 12 /∗∗ 13 ∗ Method s e t S t a t e O r P r o v i n c e 14 ∗ @param S t a t e O r P r o v i n c e 15 ∗/ 16 public void s e t S t a t e O r P r o v i n c e ( S t r i n g S t a t e O r P r o v i n c e ) { 17 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( S t a t e O r P r o v i n c e ! = n u l l ) ) { 18 t h i s . a d d S t r i n g E l e m e n t ( S t a t e O r P r o v i n c e , C o n s t a n t s . _TAG_STATEORPROVINCE ) ; 19 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 20 } 21 } Figure 3.27: Methods: setStateOrProvince, setCity 30
  • 39.
    1 /∗∗ 2 ∗ Method s e t P o s t a l C o d e 3 ∗ @param P o s t a l C o d e 4 ∗/ 5 public void s e t P o s t a l C o d e ( S t r i n g PostalCode ) { 6 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( P o s t a l C o d e ! = n u l l ) ) { 7 t h i s . a d d S t r i n g E l e m e n t ( P o s t a l C o d e , C o n s t a n t s . _TAG_POSTALCODE ) ; 8 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 9 } 10 } 11 12 /∗∗ 13 ∗ Method s e t C o u n t r y N a m e 14 ∗ @param CountryName 15 ∗/ 16 p u b l i c v o i d s e t C o u n t r y N a m e ( S t r i n g CountryName ) { 17 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( CountryName ! = n u l l ) ) { 18 t h i s . a d d S t r i n g E l e m e n t ( CountryName , C o n s t a n t s . _TAG_COUNTRYNAME ) ; 19 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 20 } 21 } Figure 3.28: Methods: setPostalCode, setCountryName The child-elements- City, StateOrProvince, PostalCode, CountryName, are created using a set-Method. Because of their way of occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (City, StateOrProvince, PostalCode, CountryName) is not an empty one((City != null), (StateOrProvince != null), (PostalCode != null), (CountryName != null)); If any one of these both statements is not fulfilled, no child-element of SignatureProductionPlace would be created. 3.12 The SignerRole element The SignerRole is a sub-element of SignedSignatureProperties. There can appear only one SignerRole element and its use is optional. The SignerRole has two "children" - ClaimedRoles and CertifiedRoles, from which leastwise one must be present. Within the ClaimedRoles can occur roles claimed by the signer, but they are not certified. On the opposite side is the CertifiedRoles element, which consists of wrapped attribute certificates for the signer. The schema definition of this element, as it follows: 31
  • 40.
    < x sd : e l e m e n t name= " S i g n e r R o l e " t y p e = " S i g n e r R o l e T y p e " / > < x s d : c o m p l e x T y p e name= " S i g n e r R o l e T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C l a i m e d R o l e s " t y p e = " C l a i m e d R o l e s L i s t T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " C e r t i f i e d R o l e s " t y p e = " C e r t i f i e d R o l e s L i s t T y p e " m i n O c c u r s = " 0 " / >< / x s d : s e q u e n c e > < / xsd:complexType> < x s d : c o m p l e x T y p e name= " C l a i m e d R o l e s L i s t T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C l a i m e d R o l e " t y p e = " AnyType " maxOccurs = " unbounded " / > </ xsd:sequence> < / xsd:complexType> < x s d : c o m p l e x T y p e name= " C e r t i f i e d R o l e s L i s t T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C e r t i f i e d R o l e " t y p e = " E n c a p s u l a t e d P K I D a t a T y p e " maxOccurs = " unbounded " / > </ xsd:sequence> < / xsd:complexType> Figure 3.29: SignerRole The following java-Code fragments shall illustrate this XAdES - element in detail: 1 / ∗ ∗ Method s e t C l a i m e d R o l e s 2 ∗ @param C l a i m e d R o l e s 3 ∗/ 4 public void setClaimedRoles ( ClaimedRolesList ClaimedRoles ) { 5 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C l a i m e d R o l e s ! = n u l l ) ) { 6 t h i s . _ c o n s t r u c t i o n E l e m e n t . appendChild ( ClaimedRoles . getElement ( ) ) ; 7 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 8 } 9 } 10 11 / ∗ ∗ Method s e t C e r t i f i e d R o l e s 12 ∗ @param C e r t i f i e d R o l e s 13 ∗/ 14 public void s e t C e r t i f i e d R o l e s ( C e r t i f i e d R o l e s L i s t C e r t i f i e d R o l e s ) { 15 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C e r t i f i e d R o l e s ! = n u l l ) ) { 16 t h i s . _constructionElement . appendChild ( C e r t i f i e d R o l e s . getElement ( ) ) ; 17 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 18 } 19 } Figure 3.30: Methods: setClaimedRoles, setCertifiedRoles 32
  • 41.
    The child-elements- ClaimedRolesand CertifiedRoles, are created using a set-Method. Be- cause of their way of occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (ClaimedRoles, CertifiedRoles) is not an empty one ((ClaimedRoles != null), (CertifiedRoles != null); If any one of these both statements is not fulfilled, no child-element of SignerRole would be created. 1 /∗∗ 2 ∗ Constructor CertifiedRolesList 3 ∗ 4 ∗ @param doc 5 ∗ @param C e r t i f i e d R o l e E n c a p s u l a t e d P K I D a t a T y p e 6 ∗ 7 ∗/ 8 p u b l i c C e r t i f i e d R o l e s L i s t ( Document doc , E n c a p s u l a t e d P K I D a t a T y p e 9 CertifiedRole ) { 10 s u p e r ( doc ) ; 11 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C e r t i f i e d R o l e ! = n u l l ) ) { 12 t h i s . _constructionElement . appendChild ( C e r t i f i e d R o l e . getElement ( ) ) ; 13 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 14 } 15 } Figure 3.31: Constructor CertifiedRolesList 1 /∗∗ 2 ∗ Constructor ClaimedRolesList 3 ∗ 4 ∗ @param doc 5 ∗ @param C l a i m e d R o l e 6 ∗ 7 ∗/ 8 p u b l i c C l a i m e d R o l e s L i s t ( Document doc , S t r i n g C l a i m e d R o l e ) { 9 s u p e r ( doc ) ; 10 i f ( ClaimedRole != n u l l ) { 11 t h i s . a d d S t r i n g E l e m e n t ( C l a i m e d R o l e , C o n s t a n t s . _TAG_CLAIMEDROLE ) ; 12 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 13 } 14 } Figure 3.32: Constructor ClaimedRolesList The CertifiedRolesListType and the ClaimedRolesListType - are created using specific Constructors. They have two different types of elements (CertifiedRole from EncapsulatedPKIDataType, and ClaimedRole from type String). Because of the occurrence of CertifiedRole, it is necessary to define the following conditions: 33
  • 42.
    1. It shouldbe proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (CertifiedRole) is not an empty one ((CertifiedRole!= null)); If any one of these both statements is not fulfilled, no child-element of CertifiedRolesListType would be created. For the ClaimedRole element it should be proved only whether it is not an empty one ((ClaimedRole!= null)). 3.13 The DataObjectFormat element The DataObjectFormat element is a sub-element of the SignedDataObjectProperties. It sup- plies information about any signed data object. This element may appear, if one specific signed data object has to be qualified. Its presence is not required, so null, one or more occurrences are possible. The schema definition of this element, as it follows. < x s d : e l e m e n t name= " D a t a O b j e c t F o r m a t " t y p e = " D a t a O b j e c t F o r m a t T y p e " / > < x s d : c o m p l e x T y p e name= " D a t a O b j e c t F o r m a t T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " D e s c r i p t i o n " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / > < x s d : e l e m e n t name= " O b j e c t I d e n t i f i e r " t y p e = " O b j e c t I d e n t i f i e r T y p e " minOccurs=" 0 " / > < x s d : e l e m e n t name= " MimeType " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / > < x s d : e l e m e n t name= " E n c o d i n g " t y p e = " x s d : a n y U R I " m i n O c c u r s = " 0 " / > </ xsd:sequence> < x s d : a t t r i b u t e name= " O b j e c t R e f e r e n c e " t y p e = " x s d : a n y U R I " use=" r e q u i r e d " / > < / xsd:complexType> Figure 3.33: DataObjectFormat 1 /∗∗ 2 ∗ Method s e t D e s c r i p t i o n 3 ∗ 4 ∗ @param D e s c r i p t i o n 5 ∗/ 6 public void s e t D e s c r i p t i o n ( S t r i n g D e s c r i p t i o n ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( D e s c r i p t i o n ! = n u l l ) ) { 8 t h i s . a d d S t r i n g E l e m e n t ( D e s c r i p t i o n , C o n s t a n t s . _TAG_DESCRIPTION ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.34: Method setDescription 34
  • 43.
    1 /∗∗ 2 ∗ Method s e t O b j e c t I d e n t i f i e r 3 ∗ 4 ∗ @param o b j e c t I d e n t i f i e r 5 ∗/ 6 public void s e t O b j e c t I d e n t i f i e r ( O b j e c t I d e n t i f i e r o b j e c t I d e n t i f i e r ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( o b j e c t I d e n t i f i e r ! = n u l l ) ) { 8 t h i s . _constructionElement . appendChild ( o b j e c t I d e n t i f i e r . getElement ( ) ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.35: Method setObjectIdentifier 1 /∗∗ 2 ∗ Method s e t M i m e T y p e 3 ∗ 4 ∗ @param MimeType 5 ∗/ 6 p u b l i c v o i d setMimeType ( S t r i n g MimeType ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( MimeType ! = n u l l ) ) { 8 t h i s . a d d S t r i n g E l e m e n t ( MimeType , C o n s t a n t s . _TAG_MIMETYPE ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.36: Method setMimeType 1 /∗∗ 2 ∗ Method s e t E n c o d i n g 3 ∗ 4 ∗ @param E n c o d i n g 5 ∗/ 6 public void setEncoding ( S t r i n g Encoding ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( E n c o d i n g ! = n u l l ) ) { 8 t h i s . a d d S t r i n g E l e m e n t ( Encoding , C o n s t a n t s . _TAG_ENCODING ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.37: Method setEncoding 35
  • 44.
    1 /∗∗ 2 ∗ S e t s t h e <code > O b j e c t R e f e r e n c e </ code > a t t r i b u t e 3 ∗ 4 ∗ @param O b j e c t R e f e r e n c e ( anyURI ) 5 ∗ @throws I l l e g a l A r g u m e n t E x c e p t i o n ∗∗∗∗ b e c a u s e o f " u s e= r e q u i r e d " ∗∗∗∗ 6 ∗/ 7 public void s e t O b j e c t R e f e r e n c e ( S t r i n g ObjectReference ) { 8 i f ( O b j e c t R e f e r e n c e == n u l l ) { 9 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " O b j e c t R e f e r e n c e A t t i b u t e i s r e q u i r e d ! " ) ; 10 } 11 e l s e i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( O b j e c t R e f e r e n c e ! = n u l l ) ) { 12 this . _constructionElement . setAttributeNS ( 13 n u l l , C o n s t a n t s . _ATT_OBJECTREFERENCE , O b j e c t R e f e r e n c e ) ; 14 } 15 } Figure 3.38: Method setObjectReference attribite All sub-elements of DataObjectFormat - Description, ObjectIdentifier, MimeType, Encoding, as well as the required ObjectReference attribute are created using set-Methods. Because of their way of occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element/-attribute(Description, ObjectIdentifier, MimeType, Encoding and ObjectReference) is not an empty one( (Description != null), (objectIdentifier!= null), (MimeType!= null), (Encoding!= null), (ObjectReference!= null); If any one of these both statements is not fulfilled, no child-element of DataObjectFormat would be created. By the ObjectReference attribute we use the JUnit test to demonstrate the obligatorily occurrence, with other words: if this attribute does not exist, an IllegalArgumentException should be executed with the relevant message. 1 i f ( O b j e c t R e f e r e n c e == n u l l ) { 2 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " O b j e c t R e f e r e n c e A t t i b u t e i s r e q u i r e d ! " ) ; 3 } Refers to the negative JUnit test testNeg_DataObjectFormat_Attr_ObjectReference_required in org.apache.xml.security.xades.tests.JUtests. 36
  • 45.
    3.14 The CommitmentTypeIndicationelement The CommitmentTypeIndication is a sub-element of the SignedDataObjectProperties. Its presence is not required, so null, one or more occurrences are possible. The schema definition of this element, as it follows: < x s d : e l e m e n t name= " C o m m i t m e n t T y p e I n d i c a t i o n " type =" CommitmentTypeIndicationType " / > < x s d : c o m p l e x T y p e name= " C o m m i t m e n t T y p e I n d i c a t i o n T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " CommitmentTypeId " t y p e = " O b j e c t I d e n t i f i e r T y p e " / > <xsd:choice> < x s d : e l e m e n t name= " O b j e c t R e f e r e n c e " t y p e = " x s d : a n y U R I " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / > < x s d : e l e m e n t name= " A l l S i g n e d D a t a O b j e c t s " / > </ xsd:choice> < x s d : e l e m e n t name= " C o m m i t m e n t T y p e Q u a l i f i e r s " t y p e = " C o m m i t m e n t T y p e Q u a l i f i e r s L i s t T y p e " m i n O c c u r s = " 0 " / >< / x s d : s e q u e n c e > < / xsd:complexType> <xsd:complexType name= " C o m m i t m e n t T y p e Q u a l i f i e r s L i s t T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " C o m m i t m e n t T y p e Q u a l i f i e r " t y p e = " AnyType " m i n O c c u r s = " 0 " maxOccurs = " unbounded " / >< / x s d : s e q u e n c e > < / xsd:complexType> Figure 3.39: CommitmentTypeIndication On the next page follows the java Constructor for the CommitmentTypeIndication XAdES element, see Figure 3.41. The CommitmentTypeIndication element is created using a specific constructor. As child-elements, which define the format CommitmentTypeIndication- Type : CommitmentTypeId, AllSignedDataObjects and CommitmentType- Qualifiers, are added. Because of their occurrence, it is necessary to define the following condition: whether the XML-element (CommitmentTypeId, AllSignedDataObjects, CommitmentTypeQualifiers) is not an empty one ((CommitmentTypeId!= null), (AllSignedDataOb- jects!= null), (commitmentTypeQualifiers!= null)). If this statement is not fulfilled, no child-element of CommitmentTypeIndicationType would be created. By the CommitmentTypeId element we use the JUnit test to demonstrate the obligatorily occurrence, with other words: if this element does not exist, an IllegalArgumentException should be executed with the relevant message: 1 i f ( CommitmentTypeId == n u l l ) { 2 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " CommitmentTypeId E l e m e n t 3 is required ! " ); 4 } Refers to the negative JUnit test testNeg_CommitmentTypeIndication_CommitmentTypeId_Element_required in org.apache.xml.security.xades.tests.JUtests. 37
  • 46.
    1 /∗∗ 2 ∗ Constructor CommitmentTypeIndication 3 ∗ 4 ∗ @param doc 5 ∗ @param C o m m i t m e n t T y p e I d O b j e c t I d e n t i f i e r 6 ∗ @param c o m m i t m e n t T y p e Q u a l i f i e r s C o m m i t m e n t T y p e Q u a l i f i e r s L i s t 7 ∗ @param A l l S i g n e d D a t a O b j e c t s 8 ∗/ 9 p u b l i c C o m m i t m e n t T y p e I n d i c a t i o n ( Document doc , O b j e c t I d e n t i f i e r 10 CommitmentTypeId , A l l S i g n e d D a t a O b j e c t s A l l S i g n e d D a t a O b j e c t s , 11 CommitmentTypeQualifiersList commitmentTypeQualifiers ) { 12 s u p e r ( doc ) ; 13 i f ( CommitmentTypeId == n u l l ) { 14 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " CommitmentTypeId e l e m e n t i s r e q u i r e d ! " ) ; 15 } 16 e l s e i f ( CommitmentTypeId ! = n u l l ) { 17 t h i s . _ c o n s t r u c t i o n E l e m e n t . a p p e n d C h i l d ( CommitmentTypeId . g e t E l e m e n t ( ) ) ; 18 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 19 } 20 i f ( A l l S i g n e d D a t a O b j e c t s != n u l l ) { 21 t h i s . _constructionElement . appendChild ( AllSignedDataObjects . getElement ( ) ) ; 22 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 23 } 24 i f ( c om m it me n tT yp e Qu al i fi er s != n u l l ) { 25 t h i s . _constructionElement . appendChild ( commitmentTypeQualifiers . getElement ( ) ) ; 26 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 27 } 28 } Figure 3.40: Constructor CommitmentTypeIndication 1 /∗∗ 2 ∗ Method s e t C o m m i t m e n t T y p e Q u a l i f i e r 3 ∗ 4 ∗ @param C o m m i t m e n t T y p e Q u a l i f i e r 5 ∗/ 6 public void setCommitmentTypeQualifier ( S t r i n g CommitmentTypeQualifier ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( C o m m i t m e n t T y p e Q u a l i f i e r ! = n u l l ) ) { 8 t h i s . addStringElement ( CommitmentTypeQualifier , 9 C o n s t a n t s . _TAG_COMMITMENTTYPEQUALIFIER ) ; 10 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 11 } 12 } Figure 3.41: Method setCommitmentTypeQualifier The child-element, which defines the format CommitmentTypeQualifiersListType - CommitmentTypeQualifier is created using set-Method. Because of its occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (CommitmentTypeQualifier) is not an empty one ((CommitmentTypeQualifier!= null)); 38
  • 47.
    If any oneof these both statements is not fulfilled, no child-element of CommitmentTypeQualifiersListType would be created. 3.15 The AllDataObjectsTimeStamp element The AllDataObjectsTimeStamp, and also the IndividualDataObjectsTimeStamp element (see further) consist of the time-stamp-calculated elements, which belong to Reference in the SignedInfo child-element, knowing that the signer can refer to any kind of elements, but the SignedProperties. The HashDataInfo must give a reference to all of these time-stamp-computed elements and is built up as a sequence of the mentioned above instances. Its presence is not required, so null, one or more occurrences are possible. The schema definition of this element, as it follows. < x s d : e l e m e n t name= " A l l D a t a O b j e c t s T i m e S t a m p " t y p e = " TimeStampType " / > Figure 3.42: AllDataObjectsTimeStamp 1 /∗∗ 2 ∗ Method s e t A l l D a t a O b j e c t s T i m e S t a m p 3 ∗ 4 ∗ @param A l l D a t a O b j e c t s T i m e S t a m p 5 ∗/ 6 p u b l i c v o i d s e t A l l D a t a O b j e c t s T i m e S t a m p ( TimeStampType A l l D a t a O b j e c t s T i m e S t a m p ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( A l l D a t a O b j e c t s T i m e S t a m p ! = n u l l ) ) { 8 t h i s . _constructionElement . appendChild ( AllDataObjectsTimeStamp . getElement ( ) ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.43: Method setAllDataObjectsTimeStamp The AllDataObjectsTimeStamp element is created using a set-Method, and because of its type is specified as TimeStampType ("(TimeStampType AllDataObjectsTimeStamp)"). It is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (AllDataObjectsTimeStamp) is not an empty one ((AllDataObjectsTimeStamp!= null); If any one of these both statements is not fulfilled, no AllDataObjectsTimeStamp element would be created. 39
  • 48.
    3.16 The IndividualDataObjectsTimeStampelement The IndividualDataObjectsTimeStamp is a sub-element of the SignedDataObjectProperties. It consists of time-stamp, which is computed before the creation of the signature. Its presence is not required, so null, one or more occurrences are possible. Below follows the schema definition for this element. < x s d : e l e m e n t name= " I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p " t y p e = " TimeStampType " / > Figure 3.44: IndividualDataObjectsTimeStamp 1 /∗∗ 2 ∗ Method s e t I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p 3 ∗ 4 ∗ @param i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p 5 ∗/ 6 p u b l i c v o i d s e t I n d i v i d u a l D a t a O b j e c t s T i m e S t a m p ( TimeStampType i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p ! = n u l l ) ) { 8 t h i s . _constructionElement . appendChild ( i n d i v i d u a l d a t a o b j e c t s t i m e s t a m p . getElement ( ) ) ; 9 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 10 } 11 } Figure 3.45: Method setIndividualDataObjectsTimeStamp The IndividualDataObjectsTimeStamp element is created using a set-Method, and because of its type is specified as TimeStampType ("(TimeStampType individualdataobjectstimestamp)"). It is neces- sary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (IndividualDataObjectsTimeStamp) is not an empty one ((individualdataobjectstimestamp!= null); If any one of these both statements is not fulfilled, no IndividualDataObjectsTimeStamp ele- ment would be created. 40
  • 49.
    3.17 The CounterSignatureelement The CounterSignature element is a sub-element of the UnsignedSignatureProperties, which extends as a child-element the UnsignedProperties. Its use is optional (its presence is not required, so null, one or more occurrences are possible) and belongs not to the scope of this thesis and the current version of the project. Though, this implementation of the element offers the chance for future elaboration of the project. A successful integration of the CounterSignature element shall extend the functional- ity of the XAdES library to implement: Independent Signatures and Embedded Signatures, important for evaluating the signing of contracts between parallel signer, and multi-signer parties with/without option for signer ordering. For further information, please refer to: W3C XAdES specification[XAdES]. The schema definition of this element, as it follows: < x s d : e l e m e n t name= " C o u n t e r S i g n a t u r e " t y p e = " C o u n t e r S i g n a t u r e T y p e " / > < x s d : c o m p l e x T y p e name= " C o u n t e r S i g n a t u r e T y p e " > <xsd:sequence> < xsd:element r e f =" d s : S i g n a t u r e " / > </ xsd:sequence> < / xsd:complexType> Figure 3.46: CounterSignature 41
  • 50.
    4 Datatypes 4.1 TheObjectIdentifierType The ObjectIdentifierType data type identifies every single specific data object. < x s d : c o m p l e x T y p e name= " O b j e c t I d e n t i f i e r T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " I d e n t i f i e r " t y p e = " x s d : a n y U R I " / > < x s d : e l e m e n t name= " D e s c r i p t i o n " t y p e = " x s d : s t r i n g " m i n O c c u r s = " 0 " / > < x s d : e l e m e n t name= " D o c u m e n t a t i o n R e f e r e n c e s " t y p e = " D o c u m e n t a t i o n R e f e r e n c e s T y p e " m i n O c c u r s = " 0 " / >< / x s d : s e q u e n c e > < / xsd:complexType> Figure 4.1: ObjectIdentifierType Reassigning of the Identifier element is not permitted (that means: once the Identifier element is assigned, it can never be reassigned again).The ObjectIdentifier element as an interface between the URN specification of the data objects and the associated URI specification (Domain names).For the devel- oper concerned, please refer to the Chapter 5.1.2 of the W3C XAdES specification. The ObjectIdenti- fierType is extended by the DocumentationReferences, which give further explanation on the documentation of the ObjectIdentifier. The optional element DocumentationReference is from type ’anyURI’. The next tables shall illustrate the IdentifierType and DocumentationReferencesType XAdES complexTypes: < x s d : c o m p l e x T y p e name= " I d e n t i f i e r T y p e " > <xsd:complexContent> < x s d : e x t e n s i o n base =" xsd:anyURI "> < x s d : a t t r i b u t e name= " Q u a l i f i e r " t y p e = " Q u a l i f i e r T y p e " u s e = " o p t i o n a l " / > < / x s d : e x t e n s i o n >< / x s d : c o m p l e x C o n t e n t > < / x s d : c o m p l e x T y p e > < x s d : s i m p l e T y p e name= " Q u a l i f i e r T y p e " > < x s d : r e s t r i c t i o n base=" x s d : s t r i n g "> < x s d : e n u m e r a t i o n v a l u e = " OIDAsURI " / > < x s d : e n u m e r a t i o n v a l u e = "OIDAsURN" / >< / x s d : r e s t r i c t i o n > </ xsd:simpleType> Figure 4.2: IdentifierType 42
  • 51.
    < x sd : c o m p l e x T y p e name= " D o c u m e n t a t i o n R e f e r e n c e s T y p e " > < x s d : s e q u e n c e maxOccurs = " unbounded " > < x s d : e l e m e n t name= " D o c u m e n t a t i o n R e f e r e n c e " t y p e = " x s d : a n y U R I " / > </ xsd:sequence> < / xsd:complexType> Figure 4.3: DocumentationReferencesType 1 /∗∗ 2 ∗ Method s e t I d e n t i f i e r 3 ∗ 4 ∗ @param I d e n t i f i e r S t r i n g 5 ∗/ 6 public void s e t I d e n t i f i e r ( S t r i n g I d e n t i f i e r ) { 7 i f ( I d e n t i f i e r == n u l l ) { 8 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " I d e n t i f i e r A t t i b u t e i s r e q u i r e d ! " ) ; } 9 e l s e i f ( t h i s . _ s t a t e == MODE_SIGN) { 10 t h i s . a d d S t r i n g E l e m e n t ( I d e n t i f i e r , C o n s t a n t s . _TAG_IDENTIFIER ) ; 11 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 12 } 13 } 14 15 /∗∗ 16 ∗ Method s e t D e s c r i p t i o n 17 ∗ @param D e s c r i p t i o n S t r i n g 18 ∗/ 19 public void s e t D e s c r i p t i o n ( S t r i n g D e s c r i p t i o n ) { 20 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( D e s c r i p t i o n ! = n u l l ) ) { 21 t h i s . a d d S t r i n g E l e m e n t ( D e s c r i p t i o n , C o n s t a n t s . _TAG_DESCRIPTION ) ; 22 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 23 } 24 } 25 26 /∗∗ 27 ∗ Method s e t D o c u m e n t a t i o n R e f e r e n c e s 28 ∗ 29 ∗ @param D o c u m e n t a t i o n R e f e r e n c e s S t r i n g 30 ∗/ 31 public void setDocumentationReferences ( S t r i n g DocumentationReferences ) { 32 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( D o c u m e n t a t i o n R e f e r e n c e s ! = n u l l ) ) { 33 t h i s . addStringElement ( DocumentationReferences , 34 C o n s t a n t s . _TAG_DOCUMENTATIONREFERENCES ) ; 35 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 36 } 37 } Figure 4.4: Methods setIdentifier, setDescription, setDocumentationReferences 43
  • 52.
    The child-elements, whichdefine the format ObjectIdentifierType - Identifier, Description and DocumentationReferences are created using set-Method. Because of their oc- currence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element (Identifier, Description, DocumentationReferences) is not an empty one((Identifier!= null), (Description!= null), (Doc- umentationReferences!= null)); If any one of these both statements is not fulfilled, no child-element of ObjectIdentifierType would be created. By the Identifier element we use the JUnit test to demonstrate the obligatorily occurrence, with other words: if this element does not exist, an IllegalArgumentException should be executed with the relevant message. 1 i f ( I d e n t i f i e r == n u l l ) { 2 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " I d e n t i f i e r A t t i b u t e i s 3 required ! " ); 4 } Refers to the negative JUnit test testNeg_ObjectIdentifier_Identifier_Attribute_required in org.apache.xml.security.xades.tests.JUtests. 4.2 The EncapsulatedPKIDataType The EncapsulatedPKIDataType data type is a sophisticated extension, which acts as an interface to include PKI data into the XML structure. The encoding of the PKI data is conform to the ANS.1 encod- ing mechanism, which permits to be included X509 certificates revocation lists OCSP responses, attribute certificates and time-stamps. < x s d : c o m p l e x T y p e name= " E n c a p s u l a t e d P K I D a t a T y p e " > <xsd:complexContent> < x s d : e x t e n s i o n base=" xsd:base64Binary "> < x s d : a t t r i b u t e name= " I d " t y p e = " x s d : I D " u s e = " o p t i o n a l " / > </ xsd:extension> < / xsd:complexContent> < / xsd:complexType> Figure 4.5: EncapsulatedPKIDataType More detailed, this PKI data type is base64 encoded referred to the XMLDSIG specification. 44
  • 53.
    1 /∗∗ 2 ∗ S e t s t h e <code >Id </ code > E l e m e n t 3 ∗ 4 ∗ @param I d 5 ∗/ 6 public void s e t I d ( S t r i n g Id ) { 7 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( I d ! = n u l l ) ) { 8 t h i s . _constructionElement . s e t A t t r i b u t e N S ( null , 9 C o n s t a n t s . _ATT_ID , I d ) ; 10 IdResolver . registerElementById ( t h i s . _constructionElement , Id ) ; 11 } 12 } Figure 4.6: Method setID The attribute, which extends the format EncapsulatedPKIDataType - Id is created using set- Method. Because of its occurrence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-attribute (Id) is not an empty one( (Id != null)); If any one of these both statements is not fulfilled, no child-element of EncapsulatedPKIDataType would be created. 4.3 The TimeStampType The use of the TimeStampType data type is fully explained in the chapter 5.1.4 of the W3C XAdES specification. The mechanism of the time-stamp could be explained as it follows: a given data, associated with its digest value, receives its time-stamp from the Time-Stamp Authority (TSA).The returned time- stamp represents the signed data, which contains the digest value, the identity of the TSA and the time of the calculation of the stamping process. NOTE that the given data exists before the computation process. The HashDataInfo element decrypts the time-stamp request to the TSA. On one hand referencing an uri attribute to the data object, on the other containing the Transforms element, refer to XMLDSIG. The following Java-code for the implementation of these elements: The elements, which extend the format TimeStampType - HashDataInfo, EncapsulatedTimeStamp, XMLTimeStamp are created using set-Method. Because of their occur- rence, it is necessary to define the following conditions: 1. It should be proved, whether the present state of the signature’ creation is -"Signing Mode" ((this._state == MODE_SIGN)); 2. And also, whether the XML-element TimeStampType - HashDataInfo, EncapsulatedTimeStamp, XMLTimeStamp) is not an empty one( (hashdatainfo!= null), (en- capsulatedtimestamp!= null), (XMLTimeStamp!= null)); If any one of these both statements is not fulfilled, no child-element of TimeStampType would be created. 45
  • 54.
    < x sd : c o m p l e x T y p e name= " TimeStampType " > <xsd:sequence> < x s d : e l e m e n t name= " H a s h D a t a I n f o " t y p e = " H a s h D a t a I n f o T y p e " maxOccurs = " unbounded " / > <xsd:choice> < x s d : e l e m e n t name= " E n c a p s u l a t e d T i m e S t a m p " type =" EncapsulatedPKIDataType " / > < x s d : e l e m e n t name= " XMLTimeStamp " t y p e = " AnyType " / > </ xsd:choice> </ xsd:sequence> < / xsd:complexType> < x s d : c o m p l e x T y p e name= " H a s h D a t a I n f o T y p e " > <xsd:sequence> < x s d : e l e m e n t name= " T r a n s f o r m s " t y p e = " d s : T r a n s f o r m s T y p e " m i n O c c u r s = " 0 " / > </ xsd:sequence> < x s d : a t t r i b u t e name= " u r i " t y p e = " x s d : a n y U R I " u s e = " r e q u i r e d " / > < / xsd:complexType> Figure 4.7: TimeStampType 1 /∗∗ 2 ∗ Method s e t H a s h D a t a I n f o 3 ∗ 4 ∗ @param h a s h d a t a i n f o 5 ∗/ 6 public void setHashDataInfo ( HashDataInfoType h a s h d a t a i n f o ) { 7 i f ( h a s h d a t a i n f o == n u l l ) { 8 throw new I l l e g a l A r g u m e n t E x c e p t i o n ( " H a s h D a t a I n f o E l e m e n t i s r e q u i r e d ! " ) ; 9 } 10 else i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( h a s h d a t a i n f o ! = n u l l ) ) { 11 t h i s . _constructionElement . appendChild ( hashdatainfo . getElement ( ) ) ; 12 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 13 } 14 } 15 16 /∗∗ 17 ∗ Method s e t E n c a p s u l a t e d T i m e S t a m p 18 ∗ 19 ∗ @param e n c a p s u l a t e d t i m e s t a m p 20 ∗/ 21 public void setEncapsulatedTimeStamp ( EncapsulatedPKIDataType e n c a p s u l a t e d t i m e s t a m p ) { 22 i f ( ( t h i s . _ s t a t e == MODE_SIGN) && ( e n c a p s u l a t e d t i m e s t a m p ! = n u l l ) ) { 23 t h i s . _constructionElement . appendChild ( encapsulatedtimestamp . getElement ( ) ) ; 24 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 25 } 26 } 27 28 /∗∗ 29 ∗ Method setXMLTimeStamp 30 ∗ 31 ∗ @param XMLTimeStamp 32 ∗/ 33 p u b l i c v o i d setXMLTimeStamp ( S t r i n g XMLTimeStamp ) { 34 i f ( ( t h i s . _ s t a t e == MODE_SIGN)&& ( XMLTimeStamp ! = n u l l ) ) { 35 t h i s . a d d S t r i n g E l e m e n t ( XMLTimeStamp , C o n s t a n t s . _TAG_XMLTIMESTAMP ) ; 36 XMLUtils . a d d R e t u r n T o E l e m e n t ( t h i s . _ c o n s t r u c t i o n E l e m e n t ) ; 37 } 38 } Figure 4.8: Method setHashDataInfo, setEncapsulatedTimeStamp, setXMLTimeStamp 46
  • 55.
    5 Conclusion At theend of this project thesis a brief discussion over the library’s functionality, associated test-cases and further use/ future implementations will be made. The reader/ developer/ user can refer to the Appendixes A and B , where the complete output from the Java classes: • CreateSinature_XAdES, • CreateSignature_XAdES_BES, can be found. This illustrates the functionality of the library, which can generate the complete XAdES/ XAdES-BES spec- ifications. The case where, optional XAdES elements can meet their occurrence more than once, is demonstrated on the example of the Java class: CreateSignature_XAdES_MoreThanOneElement, refer to Appendix C. Furthermore, there are three associated with these classes positive JUnit test cases, which verify the proper execution of the Java classes and creation of the advanced electronic signatures, see Appendix D. The other 16 negative JUnit tests validate the created signature, as every required element / attribute of the XAdES specification is probed for its existence in the advanced electronic signature, see Appendix D. The negative tests are created in a way , that if one required element/ attribute is an empty one, this particular test gives a proper run, which is its expected value.This means that the signature’ creation has failed, and if this is not the expected situation, there is no proper creation of the advanced electronic signature, because a required XAdES element/ attribute is compromised with its 0 occurrence, which makes the signature invalid. The Eclipse IDE integrated JUnit plug-in delivers the complete execution time of all 19 tests of 3.438 seconds. This confirms the good efficiency of the XAdES library. These tests run as an example on a Pentium Celeron IV 1.7GHz, Single Core CPU PC with 768 MB of DDR-I SD-RAM, Microsoft Windows XP SP2, refer to Appendix D. Beside the qualifying property and its sub-elements , which extend the security of the advanced elec- tronic signature, required future development on the project’s library shall be the implementation of times- tamps[TSP][TSPProf], which are explained in the XAdES-T, XAdES-X, XAdES-X-L and XAdES-A spec- ifications. Furthermore, an implementation of the countersignature is also seen in the future works of the project. This shall give the chance to complete integration of advanced electronic signature to the Apache XML Security Project. Finally, our XAdES project is developed as an OpenSource,so this gives the freedom for further imple- mentations to the other developers, who can use our XAdES library as a fundament and extend its function- ality. 47
  • 56.
    6 Author’s addresses ZdravkoDanailov Krassen Deltchev Ruhr-University of Bochum Ruhr-University of Bochum Department of Applied Informatics, Block IC Department of Applied Informatics, Block IC Universitaetsstrasse 150 Universitaetsstrasse 150 44801, Bochum 44801, Bochum e-mail: nqkoi_ot_bg@yahoo.com e-mail: Krassen.Deltchev@rub.de 48
  • 57.
    Bibliography [CMS] RFC 3852:Cryptographic Message Syntax. R. Housley. July 2004. http://tools.ietf.org/html/rfc3852 [ESI] ETSI TS 101 733: Electronic Signature Formats. http://www.etsi.org [ESI-XAdES] ETSI TS 101 903: XML Advanced Electronic Signatures (XAdES). http://uri.etsi.org/01903/v1.1.1# [ES-SMIME] RFC 2634: Enhanced Security Services for S/MIME. P. Hoffman. June 1999. http://www.ietf.org/rfc/rfc2634.txt update: RFC2634-update-00: Enhanced Security Services for S/MIME; draft-ietf-smime-rfc2634-update-00.txt, J Schaad, August 2004 http://tools.ietf.org/html/draft-ietf-smime-rfc2634-update-00 [EU-DIR-ESIG] Directive 1999/93/EC of the European Parliament and of the Council of 13 December 1999 on a Community framework for electronic signatures. [Keywords] RFC 2119: Key words for use in RFCs to Indicate Requirement Levels. S. Bradner . March 1997. http://www.ietf.org/rfc/rfc2119.txt [OCSP] RFC 2560: X.509 Internet Public Key Infrastructure Online Certificate Status Protocol - OCSP. M. Myers, R. Ankney, A. Malpani, S. Galperin, C. Adams. June 1999. http://www.ietf.org/rfc/rfc2560.txt [TSP] RFC 3161: Internet X.509 Public Key Infrastructure Time Stamp Protocol (TSP). P. Cain, D. Pinkas, R. Zuccherato. August 2001. http://www.ietf.org/rfc/rfc3161.txt [TSPProf] ETSI TS 101 861: Time stamping profile. http://www.etsi.org http://portal.etsi.org/docbox/EC_Files/EC_Files/ts_101861v010201p.pdf [URI] RFC 2396: Uniform Resource Identifiers (URI): Generic Syntax. T. Berners-Lee, R. Fielding, U.C. Irvine, L. Masinter. August 1998. http://www.ietf.org/rfc/rfc2396.txt update: RFC : Uniform Resource Identifier (URI): Generic Syntax. T. Berners-Lee. January 2005 http://www.ietf.org/rfc/rfc3986.txt [URN] RFC 2141: URN Syntax. R. Moats. May 1997. http://www.ietf.org/rfc/rfc2141.txt 49
  • 58.
    [URN-NM] RFC 2611:URN Namespace Definition Mechanisms. L. Daigle, D. van Gulik, R. Iannella, P. Falstrom. June 1999. http://www.ietf.org/rfc/rfc2611.txt update: RFC 3406: URN Namespace Definition Mechanisms. L. Daigle. October 2002 http://ietfreport.isoc.org/idref/rfc3406/ [URN-OID] RFC 3061: A URN Namespace of Object Identifiers. M. Mealling. February 2001. http://www.ietf.org/rfc/rfc3061.txt [XML] Extensible Markup Language (XML) 1.0 (Second Edition). W3C Recommendation. T. Bray, E. Maler, J. Paoli, C. M. Sperberg-McQueen. October 2000. http://www.w3.org/TR/2000/REC-xml-20001006 update: Extensible Markup Language (XML) 1.0 (Fourth Edition), W3C Recommendation http://www.w3.org/TR/REC-xml/ http://www.w3.org/TR/2006/PER-xml-20060614/ [XMLDSIG] XML-Signature Syntax and Processing. W3C Recommendation. Donald Eastlake, Joseph Reagle, David Solo. February 2002. http://www.w3.org/TR/2002/REC-xmldsig-core-20020212/ [XAdES] XML Advanced Electronic Signatures (XAdES). W3C Recommendation. Juan Carlos Cruellas( UPC), Gregor Karlinger( IAIK), Denis Pinkas( Bull), John Ross( Security and Standards), Krishna Sankar( Cisco). February 2003. http://www.w3.org/TR/2003/NOTE-XAdES-20030220/ update: http://www.w3.org/TR/XAdES/ [XML-schema-part-1] XML-Schema Part 1: Structures. W3C Recommendation. D. Beech, M. Maloney, N. Mendelsohn, H. Thompson. May 2001. http://www.w3.org/TR/2001/REC-xmlschema-1-20010502/ [XML-schema-part-2] XML-Schema Part 2: Datatypes. W3C Recommendation. P. Biron, A. Malhotra. May 2001. http://www.w3.org/TR/2001/REC-xmlschema-2-20010502/ [X509v3] ITU-T Recommendation X.509 version 3 (1997). "Information Technology - Open Systems In- terconnection - The Directory Authentication Framework" ISO/IEC 9594-8:1997. [X509Prof] RFC 2459: Internet X.509 Public Key Infrastructure Certificate and CRL Profile. R. Housley, W. Polk, D. Solo. January 1999. http://www.ietf.org/rfc/rfc2459.txt 50
  • 59.
    A Appendix -XAdES <nds:RootElement xmlns:nds="http://www.nds.rub.de/xades"> <nds:AI-NDS-HGI Id="AI-NDS-HGI-18378667">Some simple text</nds:AI-NDS-HGI> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="SignatureId"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" /> <Reference URI="#AI-NDS-HGI-18378667"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>+e0UhqPaZkX7+5xVrbg50ITch2I=</DigestValue> </Reference> <Reference URI="#SignedProperties-11626165"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>5ZbU+3vplCMW1BCVNM+6n1N2klc=</DigestValue> </Reference> <Reference URI="#UnsignedProperties-25392791"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>9E3pIezH0ZCKfO781NEOBxAEiE4=</DigestValue> </Reference> </SignedInfo> <SignatureValue>SVlS9m97Q0t12piyIqegQbR9mhqU8OcTtEV/IdclY4/fMOuHtBCx/Q== </SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIC3DCCApoCBEY1vX .....</X509Certificate> </X509Data> <KeyValue> <DSAKeyValue> <P>/X9TgR11EilS30q´ .....</P> <Q>l2BQjxUjC8yykrmCouuEC/BYHPU=</Q> <G>+GghdabPd7LvKtc .....</G> <Y>OglcRuqvCSTioZQ .....</Y> </DSAKeyValue> </KeyValue> </KeyInfo> <Object> <QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.1.1#" Id="QualifyingProperties-26613447" Target="#SignatureId"> <SignedProperties Id="SignedProperties-11626165"> <SignedSignaturePropeties> <SigningTime>2007-05-01T17:34:07.140+02:00</SigningTime> <SigningCertificate> <CertIDList> <CertID> <DigestAlgAndValue> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>Nqcd88piw69JTL7UsOPhTqS+YMw=</DigestValue> </DigestAlgAndValue> i
  • 60.
    <IssuerSerial xmlns="http://www.w3.org/2000/09/xmldsig#"> <X509IssuerName> CN=DanDel,OU=AI-NDS-HGI,O=Ruhr-University-Bochum,C=DE </X509IssuerName> <X509SerialNumber>1177927027 </X509SerialNumber> </IssuerSerial> </CertID> </CertIDList> </SigningCertificate> <SignaturePolicyIdentifier> <SignaturePolicyID> <ObjectIdentifier> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <Description>Description of ObjectIdentifier</Description> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestAlgAndValue> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>uL+KWM9kVQ2vgVpD3QPz58Xyhpg=</DigestValue> </DigestAlgAndValue> <SigPolicyQualifiers> <SigPolicyQualifier>SigPolicyQualifier</SigPolicyQualifier> </SigPolicyQualifiers> </SignaturePolicyID> </SignaturePolicyIdentifier> <SignatureProductionPlace> <City>Bochum</City> <StateOrProvince>NRW</StateOrProvince> <PostalCode>44789</PostalCode> <CountryName>Germany</CountryName> </SignatureProductionPlace> <SignerRole> <CertifiedRolesList> <CertifiedRole>RXhhbXBsZSA=</CertifiedRole> </CertifiedRolesList> <ClaimedRolesList> <ClaimedRole>http://uri.etsi.org/01903/v1.1.1#</ClaimedRole> </ClaimedRolesList> </SignerRole> </SignedSignaturePropeties> <SignedDataObjectProperties> <DataObjectFormat ObjectReference="SignedProperties-11626165"> <Description>Description</Description> <ObjectIdentifier> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <Description>Description of ObjectIdentifier</Description> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <Encoding>UTF-8</Encoding> <MimeType>plain/text,charset=ISO-8859-1</MimeType> </DataObjectFormat> <CommitmentTypeIndication> <ObjectIdentifier> <Description>Description of CommitmentTypeId</Description> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <AllSignedDataObjects /> <CommitmentTypeQualifiersList> <CommitmentTypeQualifier>CommitmentTypeQualifier </CommitmentTypeQualifier> ii
  • 61.
    </CommitmentTypeQualifiersList> </CommitmentTypeIndication> <AllDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </AllDataObjectsTimeStamp> <IndividualDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </IndividualDataObjectsTimeStamp> </SignedDataObjectProperties> </SignedProperties> <UnsignedProperties Id="UnsignedProperties-25392791"> <UnsignedSignatureProperties> <CounterSignature /> </UnsignedSignatureProperties> <UnsignedDataObjectProperties /> </UnsignedProperties> </QualifyingProperties> </Object> </Signature> </nds:RootElement> Table A.1: XAdES iii
  • 62.
    B Appendix -XAdES-BES <nds:RootElement xmlns:nds="http://www.nds.rub.de/xades"> <nds:AI-NDS-HGI Id="AI-NDS-HGI-18378667">Some simple text</nds:AI-NDS-HGI> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="SignatureId"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" /> <Reference URI="#AI-NDS-HGI-18378667"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>+e0UhqPaZkX7+5xVrbg50ITch2I=</DigestValue> </Reference> <Reference URI="#SignedProperties-11626165"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>5ZbU+3vplCMW1BCVNM+6n1N2klc=</DigestValue> </Reference> </SignedInfo> <SignatureValue>SVlS9m97Q0t12pi ..... </SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIC3DCCApoCBEY1 .....</X509Certificate> </X509Data> <KeyValue> <DSAKeyValue> <P>/X9TgR11EilS30qcLuz .....</P> <Q>l2BQjxUjC8yykrmCouuEC/BYHPU=</Q> <G>9+GghdabPd7LvKtc .....</G> <Y>OglcRuqvCSTioZQ .....</Y> </DSAKeyValue> </KeyValue> </KeyInfo> <Object> <QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.1.1#" Id="QualifyingProperties-26613447" Target="#SignatureId"> <SignedProperties Id="SignedProperties-11626165"> <SignedSignaturePropeties> <SigningTime>2007-05-01T17:34:07.140+02:00</SigningTime> <SigningCertificate> <CertIDList> <CertID> <DigestAlgAndValue> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>Nqcd88piw69JTL7UsOPhTqS+YMw=</DigestValue> </DigestAlgAndValue> <IssuerSerial xmlns="http://www.w3.org/2000/09/xmldsig#"> <X509IssuerName> CN=DanDel,OU=AI-NDS-HGI,O=Ruhr-University-Bochum,C=DE </X509IssuerName> <X509SerialNumber>1177927027</X509SerialNumber> </IssuerSerial> </CertID> iv
  • 63.
    </CertIDList> </SigningCertificate> <SignaturePolicyIdentifier> <SignaturePolicyID> <ObjectIdentifier> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <Description>Description of ObjectIdentifier</Description> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestAlgAndValue> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>uL+KWM9kVQ2vgVpD3QPz58Xyhpg=</DigestValue> </DigestAlgAndValue> <SigPolicyQualifiers> <SigPolicyQualifier>SigPolicyQualifier</SigPolicyQualifier> </SigPolicyQualifiers> </SignaturePolicyID> </SignaturePolicyIdentifier> </SignedSignaturePropeties> </SignedProperties> </QualifyingProperties> </Object> </Signature> </nds:RootElement> Table B.1: XAdES-BES v
  • 64.
    C Appendix -XAdES-More then one Element <nds:RootElement xmlns:nds="http://www.nds.rub.de/xades"> <nds:AI-NDS-HGI Id="AI-NDS-HGI-18378667">Some simple text</nds:AI-NDS-HGI> <Signature xmlns="http://www.w3.org/2000/09/xmldsig#" Id="SignatureId"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#dsa-sha1" /> <Reference URI="#AI-NDS-HGI-18378667"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>+e0UhqPaZkX7+5xVrbg50ITch2I=</DigestValue> </Reference> <Reference URI="#SignedProperties-11626165"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>5ZbU+3vplCMW1BCVNM+6n1N2klc=</DigestValue> </Reference> <Reference URI="#UnsignedProperties-25392791"> <Transforms> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>9E3pIezH0ZCKfO781NEOBxAEiE4=</DigestValue> </Reference> </SignedInfo> <SignatureValue>SVlS9m97Q0t12piyIqegQbR9mhqU8OcTtEV/IdclY4/fMOuHtBCx/Q== </SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIIC3DCCApoCBEY1vX .....</X509Certificate> </X509Data> <KeyValue> <DSAKeyValue> <P>/X9TgR11EilS30q´ .....</P> <Q>l2BQjxUjC8yykrmCouuEC/BYHPU=</Q> <G>+GghdabPd7LvKtc .....</G> <Y>OglcRuqvCSTioZQ .....</Y> </DSAKeyValue> </KeyValue> </KeyInfo> <Object> <QualifyingProperties xmlns="http://uri.etsi.org/01903/v1.1.1#" Id="QualifyingProperties-26613447" Target="#SignatureId"> <SignedProperties Id="SignedProperties-11626165"> <SignedSignaturePropeties> <SigningTime>2007-05-01T17:34:07.140+02:00</SigningTime> <SigningCertificate> <CertIDList> <CertID> <DigestAlgAndValue> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>Nqcd88piw69JTL7UsOPhTqS+YMw=</DigestValue> </DigestAlgAndValue> vi
  • 65.
    <IssuerSerial xmlns="http://www.w3.org/2000/09/xmldsig#"> <X509IssuerName> CN=DanDel,OU=AI-NDS-HGI,O=Ruhr-University-Bochum,C=DE </X509IssuerName> <X509SerialNumber>1177927027 </X509SerialNumber> </IssuerSerial> </CertID> </CertIDList> </SigningCertificate> <SignaturePolicyIdentifier> <SignaturePolicyID> <ObjectIdentifier> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <Description>Description of ObjectIdentifier</Description> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> <DigestAlgAndValue> <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>uL+KWM9kVQ2vgVpD3QPz58Xyhpg=</DigestValue> </DigestAlgAndValue> <SigPolicyQualifiers> <SigPolicyQualifier>SigPolicyQualifier</SigPolicyQualifier> </SigPolicyQualifiers> </SignaturePolicyID> </SignaturePolicyIdentifier> <SignatureProductionPlace> <City>Bochum</City> <StateOrProvince>NRW</StateOrProvince> <PostalCode>44789</PostalCode> <CountryName>Germany</CountryName> </SignatureProductionPlace> <SignerRole> <CertifiedRolesList> <CertifiedRole>RXhhbXBsZSA=</CertifiedRole> </CertifiedRolesList> <ClaimedRolesList> <ClaimedRole>http://uri.etsi.org/01903/v1.1.1#</ClaimedRole> </ClaimedRolesList> </SignerRole> </SignedSignaturePropeties> <SignedDataObjectProperties> <DataObjectFormat ObjectReference="SignedProperties-11626165"> <Description>Description</Description> <ObjectIdentifier> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <Description>Description of ObjectIdentifier</Description> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <Encoding>UTF-8</Encoding> <MimeType>plain/text,charset=ISO-8859-1</MimeType> </DataObjectFormat> <DataObjectFormat ObjectReference="SignedProperties-11626165"> <Description>Description</Description> <ObjectIdentifier> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <Description>Description of ObjectIdentifier</Description> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <Encoding>UTF-8</Encoding> <MimeType>plain/text,charset=ISO-8859-1</MimeType> </DataObjectFormat> vii
  • 66.
    <DataObjectFormat ObjectReference="SignedProperties-11626165"> <Description>Description</Description> <ObjectIdentifier> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <Description>Description of ObjectIdentifier</Description> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <Encoding>UTF-8</Encoding> <MimeType>plain/text,charset=ISO-8859-1</MimeType> </DataObjectFormat> <CommitmentTypeIndication> <ObjectIdentifier> <Description>Description of CommitmentTypeId</Description> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <AllSignedDataObjects /> <CommitmentTypeQualifiersList> <CommitmentTypeQualifier>CommitmentTypeQualifier </CommitmentTypeQualifier> </CommitmentTypeQualifiersList> </CommitmentTypeIndication> <CommitmentTypeIndication> <ObjectIdentifier> <Description>Description of CommitmentTypeId</Description> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <AllSignedDataObjects /> <CommitmentTypeQualifiersList> <CommitmentTypeQualifier>CommitmentTypeQualifier </CommitmentTypeQualifier> </CommitmentTypeQualifiersList> </CommitmentTypeIndication> <CommitmentTypeIndication> <ObjectIdentifier> <Description>Description of CommitmentTypeId</Description> <Identifier>URN:OID:0.9.2342.19200300.100.4</Identifier> <DocumentationReferences>http://www.ietf.org/rfc/rfc3061.txt </DocumentationReferences> </ObjectIdentifier> <AllSignedDataObjects /> <CommitmentTypeQualifiersList> <CommitmentTypeQualifier>CommitmentTypeQualifier </CommitmentTypeQualifier> </CommitmentTypeQualifiersList> </CommitmentTypeIndication> <AllDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </AllDataObjectsTimeStamp> <AllDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> viii
  • 67.
    <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </AllDataObjectsTimeStamp> <AllDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </AllDataObjectsTimeStamp> <IndividualDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </IndividualDataObjectsTimeStamp> <IndividualDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </IndividualDataObjectsTimeStamp> <IndividualDataObjectsTimeStamp> <TimeStampType> <HashDataInfo URI="AI-NDS-HGI-18378667"> <Transforms xmlns="http://www.w3.org/2000/09/xmldsig#"> <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /> </Transforms> </HashDataInfo> <EncapsulatedTimeStamp Id="EncapsulatedTimeStamp"> <EncapsulatedPKIData>MIIC3DCCApoCBEY1vXMwCwYH ...... </EncapsulatedPKIData> </EncapsulatedTimeStamp> <XMLTimeStamp>XMLTimeStamp</XMLTimeStamp> </TimeStampType> </IndividualDataObjectsTimeStamp> </SignedDataObjectProperties> </SignedProperties> ix
  • 68.
    <UnsignedProperties Id="UnsignedProperties-25392791"> <UnsignedSignatureProperties> <CounterSignature /> </UnsignedSignatureProperties> <UnsignedDataObjectProperties /> </UnsignedProperties> </QualifyingProperties> </Object> </Signature> </nds:RootElement> Table C.1: XAdES-More then one Element x
  • 69.
    D Appendix -Screenshots Short summary on the screenshots in this appendix: • Screenshot - Eclipse IDE Junit plug-in console output , gives an overview over the 19 different JUnit tests( positive and negative) and the reader can obtain information on the test execution time, proper run of the different tests, test errors and failures. The screenshot shows the complete Eclipse IDE frame and there is a pointer from the JUnit console, which is separately shown below, for the sake of a better illustration. • Screenshot - Eclipse IDE console output , gives the console output from the Eclipse IDE after successful execution of the Java class JUtests. The console delivers information on the correct verification of all ReferenceURIs for the XAdES root element, Signed- and Unsigned Properies; which proves on one hand the securing on all their subelements, which are referenced to the unique IDs of that ones and on another the sucessful creation of the XAdES signature.More detailed: - regarding CreateSignature_XAdES, the ReferenceURIs are: #AI-NDS-HGI-XXXXXXXX 1 , #SignedProperties-XXXXXXXX and #UnsignedProperties-XXXXXXXX; - regarding CreateSignature_XAdES_BES, the ReferenceURIs are: #AI-NDS-HGI-XXXXXXXX and #SignedProperties-XXXXXXXX NOTE: Unsigned Property element is empty for the Basic Electronic XAdES signatures; - regarding CreateSignature_XAdES_MoreThanOneElement, the ReferenceURIs are: #AI-NDS-HGI-XXXXXXXX, #SignedProperties-XXXXXXXX and #UnsignedProperties-XXXXXXXX. This second screenshot shows also the complete Eclipse IDE frame and with a pointer from the en- larged Eclipse output console, which is separately shown below, for the sake of a better illustration too. 1 The ’XXXXXXXX’ represent digits in the unique element ID, generated as a random hashcode, using SHA1 xi
  • 70.
    Figure D.1: Screenshot- Eclipse IDE JUnit plug-in console output xii
  • 71.
    Figure D.2: Screenshot- Eclipse IDE console output xiii