Digitally sign PSKC data: PSKC Library (libpskc) Manual

## Digitally sign PSKC data

PSKC files can be integrity protected and authenticated using XML Digital Signatures. We support using a X.509 end-entity certificate together with a private key. To verify the signature, you will need to supply the issuer of the end-entity certificate as a trusted root. To illustrate this, we first show how to generate example root and end-entity private keys and certificates using GnuTLS. First generate the root private key and certificate:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    jas@latte:~$ certtool --generate-privkey --outfile pskc-root-key.pem
    Generating a 2432 bit RSA private key...
    jas@latte:~$ certtool --generate-self-signed --load-privkey pskc-root-key.pem --outfile pskc-root-crt.pem
    Generating a self signed certificate...
    Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
    Country name (2 chars):
    Organization name:
    Organizational unit name:
    Locality name:
    State or province name:
    Common name: My PSKC root
    UID:
    This field should not be used in new certificates.
    E-mail:
    Enter the certificate's serial number in decimal (default: 1350939670):

    Activation/Expiration time.
    The certificate will expire in (days): 100

    Extensions.
    Does the certificate belong to an authority? (y/N): y
    Path length constraint (decimal, -1 for no constraint):
    Is this a TLS web client certificate? (y/N):
    Will the certificate be used for IPsec IKE operations? (y/N):
    Is this also a TLS web server certificate? (y/N):
    Enter the e-mail of the subject of the certificate:
    Will the certificate be used to sign other certificates? (y/N): y
    Will the certificate be used to sign CRLs? (y/N):
    Will the certificate be used to sign code? (y/N):
    Will the certificate be used to sign OCSP requests? (y/N):
    Will the certificate be used for time stamping? (y/N):
    Enter the URI of the CRL distribution point:
    X.509 Certificate Information:
    	Version: 3
    	Serial Number (hex): 5085b416
    	Validity:
    		Not Before: Mon Oct 22 21:01:11 UTC 2012
    		Not After: Wed Jan 30 21:01:13 UTC 2013
    	Subject: CN=My PSKC root
    	Subject Public Key Algorithm: RSA
    	Certificate Security Level: Normal
    		Modulus (bits 2432):
    			00:d3:cf:07:f9:75:df:61:91:a4:a9:e2:a6:54:fa:48
    			b1:70:8c:a1:83:4e:ce:fa:01:d7:01:96:7a:5f:57:27
    			1a:5a:fb:02:f4:50:b5:40:b6:67:8a:63:e3:60:8f:ed
    			6e:9d:40:df:46:0d:8c:42:31:d9:74:08:f9:7d:48:fc
    			e2:21:2e:fe:fd:e1:02:55:54:b5:6e:57:f8:5f:a0:8c
    			81:5e:ca:5c:bd:64:41:5d:71:b5:81:84:1b:dc:36:75
    			cc:19:62:19:f1:36:ed:00:98:13:5c:ce:3b:8c:ba:f9
    			7f:9f:21:20:c2:0d:08:4e:e5:08:ad:5c:83:4e:c3:7c
    			2a:4d:e0:7c:45:d2:b6:b9:42:8b:de:48:5f:60:2d:2e
    			18:a7:f5:da:81:cf:24:d6:de:6d:31:07:63:20:d9:5e
    			7c:ba:88:fa:1b:d8:98:3c:ab:05:4e:ca:a8:60:8d:6e
    			9c:13:35:01:23:82:53:36:5b:e1:01:62:7f:ce:41:d1
    			74:67:1b:f8:60:4b:87:e4:2c:52:6a:0a:67:4c:0d:27
    			80:2d:6d:f7:2e:6f:2e:12:fb:d2:09:dc:d9:11:b1:b8
    			c0:a4:34:00:3b:a0:87:c7:f2:2f:7f:30:6a:b6:c7:f1
    			96:fc:6f:de:df:40:ac:2b:1a:d7:24:18:ae:1a:d7:8a
    			4b:6b:a8:93:36:af:72:0e:93:15:30:47:fa:58:8a:4e
    			97:86:14:a0:ef:84:46:5f:b4:a1:cd:98:d5:eb:97:fb
    			4e:94:10:08:ba:c6:3f:57:0d:ef:1b:1b:21:af:4a:bd
    			e7
    		Exponent (bits 24):
    			01:00:01
    	Extensions:
    		Basic Constraints (critical):
    			Certificate Authority (CA): TRUE
    		Key Usage (critical):
    			Certificate signing.
    		Subject Key Identifier (not critical):
    			1f2507c525358817404c90b7f36e3b97dbbec098
    Other Information:
    	Public Key Id:
    		1f2507c525358817404c90b7f36e3b97dbbec098

    Is the above information ok? (y/N): y

    Signing certificate...
    jas@latte:~$

Next we generate a private key and certificate for the end-entity that will sign the PSKC data.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    jas@latte:~$ certtool --generate-privkey --outfile pskc-ee-key.pem
    Generating a 2432 bit RSA private key...
    jas@latte:~$ certtool --generate-certificate --load-ca-privkey pskc-root-key.pem --load-ca-certificate pskc-root-crt.pem --load-privkey pskc-ee-key.pem --outfile pskc-ee-crt.pem
    Generating a signed certificate...
    Please enter the details of the certificate's distinguished name. Just press enter to ignore a field.
    Country name (2 chars):
    Organization name:
    Organizational unit name:
    Locality name:
    State or province name:
    Common name: My PSKC end entity
    UID:
    This field should not be used in new certificates.
    E-mail:
    Enter the certificate's serial number in decimal (default: 1350939833):

    Activation/Expiration time.
    The certificate will expire in (days): 50

    Extensions.
    Does the certificate belong to an authority? (y/N):
    Is this a TLS web client certificate? (y/N):
    Will the certificate be used for IPsec IKE operations? (y/N):
    Is this also a TLS web server certificate? (y/N):
    Enter the e-mail of the subject of the certificate:
    Will the certificate be used for signing (required for TLS)? (y/N): y
    Will the certificate be used for encryption (not required for TLS)? (y/N):
    X.509 Certificate Information:
    	Version: 3
    	Serial Number (hex): 5085b4b9
    	Validity:
    		Not Before: Mon Oct 22 21:03:54 UTC 2012
    		Not After: Tue Dec 11 21:03:57 UTC 2012
    	Subject: CN=My PSKC end entity
    	Subject Public Key Algorithm: RSA
    	Certificate Security Level: Normal
    		Modulus (bits 2432):
    			00:c4:4c:2b:8d:33:29:14:0f:4b:49:f5:8e:0c:f6:5b
    			9f:0f:e3:17:aa:c5:77:8d:d4:64:16:c4:d4:4d:7d:04
    			2d:0d:14:78:77:ba:4c:3c:bd:5c:46:9e:d0:24:b9:bb
    			3d:92:2c:21:29:c3:e6:ea:5f:4e:e7:2e:60:c6:0e:0e
    			fe:a3:ac:94:e9:0e:bf:84:8f:3b:db:97:45:2b:72:58
    			07:0b:1f:5a:4e:b3:c6:e4:99:32:8a:56:a7:40:6e:a5
    			93:62:99:9d:eb:5e:64:20:8a:bc:de:4d:9e:e3:62:22
    			b4:6f:c8:50:c1:09:42:a8:90:c1:76:75:57:05:ab:b0
    			f9:f6:e8:26:73:23:45:c4:3e:31:2b:3a:d0:23:db:42
    			d7:1b:d2:57:be:16:cc:71:4d:2b:b1:4f:59:88:0f:29
    			9f:ff:b8:05:4a:f7:8f:c6:c4:cb:a0:77:6d:0b:35:5b
    			35:7a:ad:d3:d7:1b:b4:dd:dc:d8:a0:8d:ab:fb:c0:ab
    			ec:1b:37:47:0b:06:d9:14:1f:f2:fc:bb:3d:ed:2d:5e
    			b4:a5:cb:ec:4e:ab:ba:52:02:40:21:a6:8e:3e:3b:78
    			0f:a7:73:62:30:4b:05:72:2a:71:1a:81:31:d5:e4:c4
    			12:e9:7e:95:a2:9c:1f:53:2f:bb:f0:33:ce:37:c4:58
    			fc:da:35:2b:09:18:3c:94:21:d3:7d:d9:d9:b0:ce:d0
    			b9:c8:77:b5:e1:ce:9b:83:7c:e5:84:7d:4e:64:5f:c0
    			2b:db:1a:0e:06:47:e4:24:44:ed:14:05:49:6f:17:78
    			e3
    		Exponent (bits 24):
    			01:00:01
    	Extensions:
    		Basic Constraints (critical):
    			Certificate Authority (CA): FALSE
    		Key Usage (critical):
    			Digital signature.
    		Subject Key Identifier (not critical):
    			0d8aed9f4ed4e2c3e12f7ca45fc6e8c8f56bb9c2
    		Authority Key Identifier (not critical):
    			1f2507c525358817404c90b7f36e3b97dbbec098
    Other Information:
    	Public Key Id:
    		0d8aed9f4ed4e2c3e12f7ca45fc6e8c8f56bb9c2

    Is the above information ok? (y/N): y

    Signing certificate...
    jas@latte:~$

At this point, we have the following files:

- "pskc-root-key.pem" root private key;

- "pskc-root-crt.pem" root certificate;

- "pskc-ee-key.pem" end entity private key;

- "pskc-ee-crt.pem" end entity certificate.

Let's use these files to digitally sign the following PSKC data, stored in a file "pskc-hotp.xml".

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    <?xml version="1.0" encoding="UTF-8"?>
    <KeyContainer Version="1.0"
    	      xmlns="urn:ietf:params:xml:ns:keyprov:pskc">
      <KeyPackage>
        <DeviceInfo>
          <Manufacturer>Manufacturer</Manufacturer>
          <SerialNo>987654321</SerialNo>
        </DeviceInfo>
        <Key Id="12345678"
             Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp">
          <AlgorithmParameters>
            <ResponseFormat Length="8" Encoding="DECIMAL"/>
          </AlgorithmParameters>
          <Data>
            <Secret>
              <PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=
              </PlainValue>
            </Secret>
            <Counter>
              <PlainValue>0</PlainValue>
            </Counter>
          </Data>
        </Key>
      </KeyPackage>
    </KeyContainer>

The --sign mode flag requires the --sign-key and --sign-crt which specify the private key and certificate to use for signing.

    1
    2
    $ pskctool --sign --sign-key pskc-ee-key.pem --sign-crt pskc-ee-crt.pem pskc-hotp.xml > pskc-hotp-signed.xml
    $

Below is the signed XML output. As you can see, due to the signature it becomes rather unreadable. You may use "pskctool --info" to analyse it, or "pskctool --info --verbose --quiet" to print indented XML (however that will invalidate signature).

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?xml version="1.0"?>
    <KeyContainer xmlns="urn:ietf:params:xml:ns:keyprov:pskc" Version="1.0"><KeyPackage><DeviceInfo><Manufacturer>Manufacturer</Manufacturer><SerialNo>987654321</SerialNo></DeviceInfo><Key Id="12345678" Algorithm="urn:ietf:params:xml:ns:keyprov:pskc:hotp"><AlgorithmParameters><ResponseFormat Encoding="DECIMAL" Length="8"/></AlgorithmParameters><Data><Secret><PlainValue>MTIzNDU2Nzg5MDEyMzQ1Njc4OTA=</PlainValue></Secret><Counter><PlainValue>0</PlainValue></Counter></Data></Key></KeyPackage><Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
    <SignedInfo>
    <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
    <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
    <Reference>
    <Transforms>
    <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
    </Transforms>
    <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
    <DigestValue>scw48LN8ec/vu7/f7F1AGcfjDpI=</DigestValue>
    </Reference>
    </SignedInfo>
    <SignatureValue>HYDZFC205862s+zoas+Ny6h0ckDJmqDGz81lEPjvjGcN1AYzT7PATsIUVure0QNl
    Kvt2TxdSDgnYlWwAJWjAtmp0UHRzF6hsmDl7WiHpeCkfxpwvdz8K469rbLPUwB6I
    Zyfx/msTwJGbycPek9SFoaEqn8G7oNU59UH1HjDO0ERyKXhkiIrRaIWfGdqy4v0z
    xYbPnAvzdHcEBdVOVQ3d+zeR/3nWGINjmxPnYGiCrY4YoktKm/VPNw3yuo3CNTIs
    N4Vs4rjNVr7NcplFKLOmBBsQwKRg3JXnVW7kQu9ZonJyJEeDoNXdrG8uCa7EYT+s
    eh6486o/Wvb7oUVbUN3JW5VRTnVK8YNOwAnxB1fTa92pJwffLB+knBlzVNteWCyA
    BciIcboYbMdxLVmNKcF5pA==</SignatureValue>
    <KeyInfo>
    <X509Data>
    <X509Certificate>MIIDdzCCAi+gAwIBAgIEUOYFHTANBgkqhkiG9w0BAQsFADAXMRUwEwYDVQQDEwxN
    eSBQU0tDIHJvb3QwIhgPMjAxMzAxMDMyMjI0MzBaGA8yMjg2MTAxOTIyMjQzMlow
    HTEbMBkGA1UEAxMSTXkgUFNLQyBlbmQgZW50aXR5MIIBUjANBgkqhkiG9w0BAQEF
    AAOCAT8AMIIBOgKCATEAxEwrjTMpFA9LSfWODPZbnw/jF6rFd43UZBbE1E19BC0N
    FHh3ukw8vVxGntAkubs9kiwhKcPm6l9O5y5gxg4O/qOslOkOv4SPO9uXRStyWAcL
    H1pOs8bkmTKKVqdAbqWTYpmd615kIIq83k2e42IitG/IUMEJQqiQwXZ1VwWrsPn2
    6CZzI0XEPjErOtAj20LXG9JXvhbMcU0rsU9ZiA8pn/+4BUr3j8bEy6B3bQs1WzV6
    rdPXG7Td3Nigjav7wKvsGzdHCwbZFB/y/Ls97S1etKXL7E6rulICQCGmjj47eA+n
    c2IwSwVyKnEagTHV5MQS6X6VopwfUy+78DPON8RY/No1KwkYPJQh033Z2bDO0LnI
    d7XhzpuDfOWEfU5kX8Ar2xoOBkfkJETtFAVJbxd44wIDAQABo2EwXzAMBgNVHRMB
    Af8EAjAAMA8GA1UdDwEB/wQFAwMHgAAwHQYDVR0OBBYEFHYGbZIa17d44czfdCkT
    Mn+rWSBNMB8GA1UdIwQYMBaAFNLIhrjU/J0jWFX4rjsfsUkz1PQcMA0GCSqGSIb3
    DQEBCwUAA4IBMQCxI1JOMqwgi/mj9KNutqGbTHdgKptt9lBylilwjMaNaY2lZe8S
    5XNg9SoupGr1xBbMsDwWLILSuwPiedbn50fBpAAUW31WKKio6xRCJVmWeo0iY0Cr
    rIXbwqKhnBP943U4Ch31oEbZtbo+XRbiq11wv6dLNsi76TNGDqsjTKgEcSIYI6Vd
    rMxnil6ChoIBvSSPGHhJuj1bW1EPW92JtIa6byrAj1m4RwSviQy2i65YoIdtrhRt
    CWekj2zuL/0szv5rZMCCvxioOCA8znqELEPMfs0Aa/cACD2MZcC4gGXehNCvzYJr
    TmB6lFpxP6f0g6eO7PVcqYN9NCwECxb5Cvx2j2uNlereY35/9oPR6YJx+V7sL+DB
    n6F0mN8OUAFxDamepKdGRApU8uZ35624o/I4
    </X509Certificate>
    </X509Data>
    </KeyInfo>
    </Signature></KeyContainer>