This document is also available in these non-normative formats: XML.
Copyright © 2012-2013 Claudius Teodorescu, published by the EXPath Community Group under the W3C Community Contributor License Agreement (CLA) . A human-readable summary is available.
This specification was published by the EXPath Community Group . It is not a W3C Standard nor is it on the W3C Standards Track. Please note that under the W3C Community Contributor License Agreement (CLA) there is a limited opt-out and other conditions apply. Learn more about W3C Community and Business Groups .
This proposal defines a set of XPath 3.0 extension functions to perform cryptographic operations. It defines extension functions related to XML Digital Signature, to encryption and decryption, and to hash and digest messages. It has been designed to be compatible with XQuery 3.0 and XSLT 3.0, as well as any other standard based on XPath 3.0.
1 Introduction
1.1 Namespace conventions
1.2 Error management
2 Cryptographic Service Providers
2.1 The crypto:list-providers function
2.1.1 The crypto:providers-list element
2.1.2 The crypto:provider element
2.2 The crypto:list-services function
2.2.1 The crypto:services-list element
2.2.2 The crypto:service element
3 Integrity and Authentication of Data
3.1 The crypto:hash function
3.2 The crypto:hmac function
4 Key Management
4.1 The crypto:generate-key-pair function
4.2 The crypto:generate-secret-key function
4.3 The crypto:compare-keys function
4.4 The crypto:key-agrement function
4.5 The crypto:convert-key-specification-to-key-object, crypto:convert-key-object-to-key-specification
function
5 Digital Signature
5.1 The crypto:generate-signature function
5.2 The crypto:validate-signature function
6 Encryption and Decryption
6.1 The crypto:encrypt function
6.2 The crypto:decrypt function
7 Secure Storing of Sensitive Keying and Data Material
7.1 The crypto:create-secure-store function
7.2 The crypto:load-secure-store function
7.3 The crypto:convert-secure-store function
7.4 The crypto:get-secure-store-metadata function
7.4.1 The crypto:metadata element
7.5 The crypto:add-entry function
7.6 The crypto:get-entry function
7.7 The crypto:delete-entry function
7.8 The crypto:get-entry-metadata function
7.8.1 The crypto:metadata element
7.9 The crypto:list-trusted-certificate-authorities function
8 Digital Certificates
8.1 The crypto:generate-certificate function
8.2 The crypto:validate-certificate function
8.3 The crypto:parse-certificate function
8.4 The crypto:generate-certification-path function
8.5 The crypto:validate-certification-path function
8.6 The crypto:generate-certification-request function
8.7 The crypto:validate-certification-request function
8.8 The crypto:validate-certificate-revocation-list function
9 Cryptographic Hardware
10 Random Sequences Generation
10.1 The crypto:generate-random-number function
11 The crypto:options element
11.1 The provider option
11.2 The canonicalization-algorithm option
11.3 The digest-algorithm option
11.4 The signature-algorithm option
11.5 The signature-namespace-prefix option
Cryptography is the science of communicating in secret code, by conversion of data with the help of a key. In modern times, cryptography is necessary when communicating over any untrusted medium, particularly the Internet.
Encryption of data can be of two types: symmetric and asymmetric. Symmetric encryption means that the same key is used for encryption and decryption. Asymmetric encryption means that a message can be encrypted by using a key that is public, but the decryption can be made only by using a private key, which form a pair with the respective public key.
A related technique of cryptography is to apply a one-way hash or digest function to data; replicating the operation with the same data and function can check the integrity and authentication of the data.
The module defined by this document defines functions and elements in the namespace
http://expath.org/ns/crypto
. In this document, the
crypto
prefix, when used, is bound to this namespace URI.
Error codes are defined in the same namespace (http://expath.org/ns/crypto
),
and in this document are displayed with the same prefix, crypto
.
Cryptographic providers provide cryptographic services, involving cryptographic operations (encryption, digital signatures, message digests, message authentication), generators and converters of cryptographic material and cryptographic objects (keystores or certificates) containing the cryptographic data. They can be implemented using software, hardware, or both.
Cryptographic Service QName | Cryptographic Service Description |
---|---|
crypto:hash | See 3.1 The crypto:hash function. |
crypto:hmac | See 3.2 The crypto:hmac function. |
crypto:list-providers
function
This function lists the available cryptographic providers.
crypto:list-providers
() aselement(crypto:provider-list)
crypto:list-services
function
This function lists the cryptographic services a provider provides.
crypto:list-services
($provider-name asxs:string
) aselement(crypto:service-list)
$provider-name
is the provider's name. TBD: case when provider is not registered, etc.
crypto:hash
function
This function generates a "message digest" of the input data, by using a cryptographic algorithm. It returns the hash value as a string.
crypto:hash
($data asxs:anyAtomicType
, $algorithm asxs:string
) asxs:string
crypto:hash
($data asxs:anyAtomicType
, $algorithm asxs:string
, $format asxs:string
?) asxs:string
$data
is the data to be hashed. This parameter can be of type xs:string, xs:base64Binary,
or xs:hexBinary.
$algorithm
is the cryptographic hashing algorithm. If it is specified an unsupported algorithm,
this
is an error [crypto:unknown-algorithm].
$format
is the format of the output. The legal values are "hex" and "base64". The default
value is "base64".
If the format is not supprted, this is an error [crypto.output-format].
crypto:hmac
function
HMAC (Keyed-Hashing for Message Authentication) is a mechanism for message authentication using cryptographic hash functions. HMAC can be used with any iterative cryptographic hash function, e.g. MD5 or SHA-1, in combination with a secret shared key. Typically, message authentication codes are used between two parties that share a secret key in order to validate information transmitted between these parties.
This function generates a message authentication code, based on the input message, by using a cryptographic algorithm and a secret key. It returns the hash-based message authentication code as base64 string.
crypto:hmac
($data asxs:anyAtomicType
, $key asxs:anyAtomicType
, $algorithm asxs:string
) asxs:string
crypto:hmac
($data asxs:anyAtomicType
, $key asxs:anyAtomicType
, $algorithm asxs:string
, $format asxs:string
) asxs:string
$data
is the data to be authenticated. This parameter can be of type xs:string, xs:base64Binary,
or xs:hexBinary.
$key
is the secret key used for calculating the authentication code. This parameter can
be of type
xs:string, xs:base64Binary, or xs:hexBinary.
$algorithm
is the cryptographic hashing algorithm. If it is specified an unsupported algorithm,
this
is an error [crypto:unknown-algorithm].
$format
is the format of the output. The legal values are "hex" and "base64". The default
value is "base64".
If the format is not supprted, this is an error [crypto.output-format].
TBD.
crypto:generate-key-pair
function
This function generates a new pair of public and private cryptographic keys, to be used with a specific cryptographic algorithm.
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. 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.
crypto:generate-signature
function
The function has its parameters passed as a map(xs:string, item())
. If any of these parameters is missing, a default value will be used
instead. After the function's signature, an example of parameters is given. The syntax
for the $references
parameter is inspired by [XML Signature].
crypto:generate-signature
($data asnode()*
, $parameters asmap(xs:string, item()+)?
) asnode()+
Example of parameters:
map { "canonicalization-algorithm" := "inclusive-with-comments", "digest-algorithm" := "SHA1", "signature-algorithm" := "RSA_SHA1", "signature-namespace-prefix" := "dsig", "signature-type" := "enveloped", "references" := ( <Reference xmlns="http://www.w3.org/2000/09/xmldsig#" URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2002/06/xmldsig-filter2"> <XPath Filter="intersect">//ToBeSigned</XPath> <XPath Filter="subtract">//NotToBeSigned</XPath> <XPath Filter="union">//ReallyToBeSigned</XPath> </Transform> </Transforms> </Reference>, <Reference xmlns="http://www.w3.org/2000/09/xmldsig#" URI="#id"> <Transforms> <Transform Algorithm="http://www.w3.org/TR/2001/10/xml-exc-c14n" /> </Transforms> </Reference> ) "digital-certificate" := map { "keystore-type" := "JKS", "keystore-password" := "password", "key-alias" := "alias", "private-key-password" := "password", "keystore-url" := "/db/mykeystore" } }
$data
is the data to be signed.
$canonicalization-algorithm
is the canonicalization algorithm
applied to the SignedInfo element prior to performing signature calculations.
Possible values are: "exclusive", "exclusive-with-comments", "inclusive", and
"inclusive-with-comments". The default value is "inclusive-with-comments". If
the parameter specifies an unsupported algorithm, this is an error [crypto:unknown-algorithm].
$digest-algorithm
is the digest algorithm to be applied to the
signed object. Possible values are: "SHA1", "SHA256", and "SHA512". The default
value is "SHA1". If the parameter specifies an unsupported algorithm, this is
an error [crypto:unknown-algorithm].
$signature-algorithm
is the algorithm used for signature
generation and validation. Possible values are: "DSA_SHA1", and "RSA_SHA1". The
default value is "RSA_SHA1". If the parameter specifies an unsupported
algorithm, this is an error [crypto:unknown-algorithm].
$signature-namespace-prefix
is the namespace prefix for signature.
$signature-type
is the method used for signing the content of signature. Possible values are: 'enveloping',
'enveloped', and 'detached'. The
default value is 'enveloped'. If the parameter specifies an unsupported signature
type, this is an error [crypto:signature-type].
$references
represents the resources to be signed. If this parameter is missing, the whole input
document will be signed.
$digital-certificate
is the digital certificate to be used for signing the references. If this parameter
is missing, an auto-generated key pair
will be used. The components of this parameter are:
keystore-type
is the keystore type. If the type is not supported, this is an error [crypto:keystore-type].
keystore-password
is the keystore's password. If the keystore cannot be loaded or the password is incorrect,
this is an error
[crypto:unreadable-keystore].
key-alias
is the alias for the key pair used for signing. If no key pair exists for this alias,
this is an error [crypto:alias-key].
private-key-password
is the password for the selected key.
keystore-url
is the URL of the keystore. If the URL is not correct, this is an error [crypto:keystore-url]. If the user has no
acces to the keystore, this is an error [crypto:denied-keystore].
crypto:validate-signature
function
This function validates an XML Digital Signature.
crypto:validate-signature
($data asnode()
) asxs:boolean
$data
is the enveloped, enveloping, or detached signature. If
the Signature element cannot be found, this is an error [crypto:signature-element].
Encryption represents the process of conversion of data, by using a secret key (a cipher), in a form (called cipher text) that cannot be understood by unautorized persons.
The decryption represents the reverse process, of converting encrypted data back to plain text (original text).
There are two main types of encryption: symmetric encryption, when both parties, the sender and the receiver, use the same secret key, previously exchanged, and asymmetric encryption, when a key pair, consisting of a private key and a private key, is used, of which the public key is used by sender to encrypt a message that can only be decrypted by the receiver, who holds the private key of that key pair.
crypto:encrypt
function
This function encrypts data.
crypto:encrypt
($data asxs:anyAtomicType
, $type asxs:string
, $parameters asmap(xs:string, item())?
) asxs:anyAtomicType
$data
is the data to be encrypted. This parameter can be of type xs:string, xs:base64Binary,
or xs:hexBinary. When a particular padding mechanism
is requested, but is not available, this is an error [crypto:inexistent-padding]. Also, when a particular padding mechanism is expected, but the data is not
padded properly, this is an error [crypto:incorrect-padding].
$type
is the type of encryption. Legal values: "symmetric", and "asymmetric". If the parameter
has an illegal value, this is an error
[crypto:encryption-type].
$parameters
represents the parameters needed for the current operation. The parameters are the
following:
key
as xs:anyAtomicType
is the cryptographic key used for encryption. This parameter can be of type xs:string,
xs:base64Binary, or xs:hexBinary.
If the key is invalid, this is an error [crypto:ecret-key]. If the length of data provided to the block cipher is incorrect, this is an error
[crypto:block-size].
algorithm
as xs:string
is the cryptographic algorithm used for encryption. For symmetric encryption, a transformation
name can be used.
If the parameter specifies an unsupported algorithm or transformation
name, this is an error [crypto:unknown-algorithm].
iv
as xs:string
is the initialization vector for symmetric encryption.
provider
as xs:string
is the cryptographic provider for the current operation. If the provider is not specified,
the implementation will use the
default provider. If the provider does not exist, this is an error
[crypto:no-provider].
crypto:decrypt
function
This function decrypts data.
crypto:decrypt
($data asxs:anyAtomicType
, $type asxs:string
, $parameters asmap(xs:string, item())?
) asxs:anyAtomicType
$data
is the data to be decrypted. This parameter can be of type xs:string, xs:base64Binary,
or xs:hexBinary. When a particular padding mechanism
is requested, but is not available, this is an error [crypto:inexistent-padding]. Also, when a particular padding mechanism is expected, but the data is not
padded properly, this is an error [crypto:incorrect-padding].
$type
is the type of decryption. Legal values: "symmetric", and "asymmetric". If the parameter
has an illegal value, this is an error
[crypto:decryption-type].
$parameters
represents the parameters needed for the current operation. The parameters are the
following:
key
as xs:anyAtomicType
is the cryptographic key used for decryption. This parameter can be of type xs:string,
xs:base64Binary, or xs:hexBinary.
If the key is invalid, this is an error [crypto:ecret-key]. If the length of data provided to the block cipher is incorrect, this is an error
[crypto:block-size].
algorithm
as xs:string
is the cryptographic algorithm used for decryption. For symmetric decryption, a transformation
name can be used.
If the parameter specifies an unsupported algorithm or transformation
name, this is an error [crypto:unknown-algorithm].
iv
as xs:string?
is the initialization vector for symmetric encryption.
provider
as xs:string
is the cryptographic provider for the current operation. If the provider is not specified,
the implementation will use the
default provider. If the provider does not exist, this is an error
[crypto:no-provider].
A secure storage is a collection of CRLs, cryptographic keys, cryptographic certificates, cryptographic certificate chains, various secrets, and extensions. It may have different implementation, according to different cryptographic providers. Every entry has a unique alias name and can be protected by its own password.
crypto:create-secure-store
function
This function creates a secure store. It returns the store as xs:base64binary if successfully completed, empty sequence if not.
crypto:create-secure-store
($store-format asxs:string
, $store-password asxs:string
) asxs:base64binary
$store-format
is the format of the secure store.
$store-password
is the password for the secure store.
crypto:load-secure-store
function
This function loads a secure store in order to operate against it. It returns an xs:long representing the secure store handle.
crypto:load-secure-store
($secure-store asxs:base64binary
, $store-password asxs:string
) asxs:long
$secure-store
is the secure store.
$store-password
is the password for the secure store.
crypto:convert-secure-store
function
This function converts a secure store from one format to another. It returns the converted store as xs:base64binary if successfully completed, empty sequence if not.
crypto:convert-secure-store
($input-store asxs:base64binary
, $input-format asxs:string
, $output-format asxs:string
) asxs:base64binary
$input-store
is the secure store to be converted.
$input-format
is the format of the input secure store.
$output-format
is the format of the output secure store.
crypto:get-secure-store-metadata
function
This function gets metadata for a secure store. It returns a crypto:metadata element.
crypto:get-secure-store-metadata
($secure-store-handle asxs:long
) aselement(crypto:metadata)
$secure-store-handle
is the secure store handle.
crypto:metadata
element
The crypto:metadata
element contains metadata about a resource.
<crypto:metadata> <crypto:secure-store-type>xs:string</crypto:secure-store-type> <crypto:provider>xs:string</crypto:provider> <crypto:aliases-list>xs:string</crypto:aliases-list> <crypto:size>xs:integer</crypto:size> </crypto:metadata>
secure-store-type
is the type of the secure store.
provider
is the provider that generated the secure store.
aliases-list
is the list of all the aliases in the secure store.
size
is the number of entries in the secure store.
crypto:add-entry
function
This function adds an entry to a secure store. It returns true if successfully completed, false if not.
crypto:add-entry
($secure-store-handle asxs:long
, $data asxs:base64binary
, $alias asxs:string
, $entry-password asxs:string?
) asxs:boolean
$secure-store-handle
is the secure store handle.
$data
is the data to be stored.
$alias
is the alias for the data to be stored.
$entry-password
is the password for the entry.
crypto:get-entry
function
This function gets an entry from a secure store. It returns the entry.
crypto:get-entry
($secure-store-handle asxs:long
, $alias asxs:string
, $entry-password asxs:string?
) asxs:base64binary
$secure-store-handle
is the secure store handle.
$alias
is the alias for the data to be stored.
$entry-password
is the password for the entry.
crypto:delete-entry
function
This function delets an entry from a secure store. It returns true if successfully completed, false if not.
crypto:delete-entry
($secure-store-handle asxs:long
, $alias asxs:string
, $entry-password asxs:string?
) asxs:boolean
$secure-store-handle
is the secure store handle.
$alias
is the alias for the data to be stored.
$entry-password
is the password for the entry.
crypto:get-entry-metadata
function
This function gets metadata for a secure store entry. It returns a crypto:metadata element if entry exists, empty sequence if the entry does not exist.
crypto:get-entry-metadata
($secure-store-handle asxs:long
, $alias asxs:string
) aselement(crypto:metadata)?
$secure-store-handle
is the secure store handle.
$alias
is the alias for the data to be stored.
crypto:metadata
element
The crypto:metadata
element contains metadata about a resource.
<crypto:metadata> <crypto:creation-date>xs:dateTime</crypto:creation-date> <crypto:type>("certificate" | "key" | "other")</crypto:provider> </crypto:metadata>
creation-date
is the entry's creation date.
type
is the entry's type.
TBD.
crypto:generate-certification-path
function
This function validates the certification path for a digital certificate.
crypto:validate-certification-path
function
This function validates the certification path for a digital certificate.
crypto:generate-certification-request
function
This function generates a certificate signing request, in order to apply for a digital identity certificate, which is to be issued by a Certificate Authority .
crypto:options
element
The crypto:options
element represents the options needed for the functions included in this module.
Users will specify for a certain functions only the options mentioned in function's
description above. In case a needed option
is not mentioned for a function, its default value will be used.
<crypto:options> <crypto:option name = xs:string value? = xs:string> any* </crypto:option> * </crypto:options> ?
provider
option
Represents the provider for the current operation. If the provider does not exist, this is an error [crypto:no-provider].
<crypto:option name = "provider" value = xs:string/>
canonicalization-algorithm
option
This option represents the canonicalization algorithm applied to the SignedInfo
element prior to performing
signature calculations. The default value is "inclusive-with-comments". If the parameter
specifies an unsupported algorithm,
this is an error [crypto:unknown-algorithm].
<crypto:option name = "canonicalization-algorithm" value = "exclusive" | "exclusive-with-comments" | "inclusive" | "inclusive-with-comments" /> ?
digest-algorithm
option
This option represents the digest algorithm to be applied to the signed object. If the parameter specifies an unsupported algorithm, this is an error [crypto:unknown-algorithm].
<crypto:option name = "digest-algorithm" value = xs:string />
signature-algorithm
option
This option represents the algorithm used for signature generation and validation. If the parameter specifies an unsupported algorithm, this is an error [crypto:unknown-algorithm].
<crypto:option name = "signature-algorithm" value = xs:string />