JSF
 
JSON Signature Format
Table of Contents
1. Introduction
2. Sample Object
3. Notation
4. Data Types
5. JSF Objects
Top Level Property
signaturecore
Global Signature Options
multisignature
signaturechain
publicKey
6. Signature Validation
7. Signature Creation
8. Multiple Signatures
9. Signature Chains
10. Security Considerations
Appendix A: Test Vectors
Appendix B: ECMAScript Mode
Appendix C: Counter Signatures
Appendix D: Usage in Applications
Appendix E: Acknowledgements
Appendix F: References
Appendix G: Document History
Appendix H: Author
1. Introduction
JSF is a scheme for signing data expressed as JSON [RFC7159] objects, loosely modeled after XML DSig's [XMLDSIG] "enveloped" signatures.
Unlike JSON Web Signature (JWS) [RFC7515] which was designed for signing any kind of data, a JSF signature is intended to be an integral part of a JSON object with message centric systems like Yasmin [YASMIN] as the primary target. This concept was not originally considered due to the lack of a standardized canonicalization method for JSON data. However, with the introduction of the JSON Canonicalization Scheme [JCS] both data and header information could be provided in plain text while still being subject to cryptographic operations.
In order to make library support of JSF straightforward in spite of having a different structure compared to JWS, JSF uses the same JWA [RFC7518] cryptographic algorithms.
JSF may also be used for "in-object" JavaScript signatures, making JSF suitable for HTML5 applications. See ECMAScript Mode.
There is also a "companion" specification for encryption coined JEF [JEF].
2. Sample Object
The following cryptographically verifiable sample signature is used to visualize the JSF specification:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES256",
    "publicKey": {
      "kty": "EC",
      "crv": "P-256",
      "x": "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
      "y": "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY"
    },
    "value": "DaLAAenX3yOC7ycVyfjIe3tLyrH0U04lPcnQ7ct72ixryZVHdAWQazgDlWhpIDnrgLC0Pq03AvgsCc4ROOCInQ"
  }
}
The sample signature's payload consists of the properties above the "signature" property. Note: JSF does not mandate any specific ordering of properties like in the sample.
For more examples see Test Vectors.
The scope of a signature (what is actually signed) comprises all properties including possible child objects of the JSON object holding the "value" property except for the "value" property itself (shaded area in the sample).
3. Notation
JSF consists of an arbitrary but unique top level property (see p256#es256@name-jwk.json) holding a composite JSON object (signaturecore, multisignature or signaturechain).
JSON objects are described as tables with associated properties. When a property holds a JSON object this is denoted by a link to the actual definition.
Properties may either be mandatory (M) or optional (O) as defined in the "Req" column.
Array properties are identified by [ ] x-y where the range expression represents the valid number of array elements.
In some JSON objects there is a choice from a set of mutually exclusive alternatives.
This is manifested in object tables like the following:
Property selection 1Type selection 1ReqComment selection 1
Property selection 2Type selection 2Comment selection 2
4. Data Types
The table below shows how the data types used by this specification are mapped into native JSON types:
TypeMappingDescription
stringstringArbitrary string
byte[]stringBase64URL-encoded [RFC4648] binary data
cryptostringBase64URL-encoded positive integer with arbitrary precision. Note that the value must not contain leading zero-valued bytes
object{}JSON object
Note that "Type" refers to the element type for arrays.
5. JSF Objects
The following tables describe the JSF JSON structures in detail.
Top Level Property
PropertyTypeReqComment
"...": signaturecoreobjectMUnique top level property for simple signatures.
"...": multisignatureobjectUnique top level property for Multiple Signatures
"...": signaturechainobjectUnique top level property for Signature Chains
signaturecore
PropertyTypeReqComment
"algorithm": "Algorithm"stringMSignature algorithm. The currently recognized JWA [RFC7518] asymmetric key algorithms include:
  • RS256
  • RS384
  • RS512
  • ES256
  • ES384
  • ES512
The currently recognized JWA [RFC7518] symmetric key algorithms include:
  • HS256
  • HS384
  • HS512
Note: If proprietary signature algorithms are added, they must be expressed as URIs.
JWS counterpart: "alg".
"keyId": "Identifier"stringOOptional. Application specific string identifying the signature key.
JWS counterpart: "kid".
"publicKey": publicKeyobjectOOptional. Public key object.
JWS counterpart: "jwk".
"certificatePath": ["Certificate Path"] 1-nbyte[]Optional. Sorted array of X.509 [RFC5280] certificates, where the first element must contain the signature certificate. The certificate path must be contiguous but is not required to be complete.
JWS counterpart: "x5c".
"value": "Signature"byte[]MThe signature data. Note that the binary representation must follow the JWA [RFC7518] specifications.
Note that asymmetric key signatures are not required providing an associated "publicKey" or "certificatePath" property since the key may be given by the context or through the "keyId" property.
Global Signature Options
PropertyTypeReqComment
"extensions": ["Property List"] 1-nstringOOptional. Array holding the names of one or more application specific extension properties also featured within the signaturecore signature object.
Extension names must not be duplicated or use any of the JSF reserved words "algorithm", "certificatePath", "chain", "extensions", "excludes", "keyId", "publicKey", "signers" or "value".
Extensions intended for public consumption are preferably expressed as URIs (unless registered with IANA), while private schemes are free using any valid property name.
A conforming JSF implementation must support optional extensions values, as well as an option to only accept predefined extension property names.
See also the p256#es256@exts-jwk.json and p256#es256,r2048#rs256@mult-exts-kid.json test vectors.
JWS counterpart: "crit".
"excludes": ["Property List"] 1-nstringOOptional. Array holding the names of one or more application level properties that must be excluded from the signature process.
Note that the "excludes" property itself, must also be excluded from the signature process.
Since both the "excludes" property and the associated data it points to are unsigned, a conforming JSF implementation must provide options for specifying which properties to accept.
See also the p256#es256@excl-jwk.json and p256#es256,r2048#rs256@mult-excl-kid.json test vectors.
Note that these options must only be specified at the top level of a JSF signature object.
multisignature
PropertyTypeReqComment
"signers": [signaturecore] 1-nobjectMArray holding Multiple Signatures
signaturechain
PropertyTypeReqComment
"chain": [signaturecore] 1-nobjectMArray holding Signature Chains
publicKey
PropertyTypeReqComment
"kty": "Key Type"stringMKey type indicator. Currently the following types are recognized:
Additional EC Properties
"crv": "Curve Name"stringMEC curve name. The currently recognized EC curves include:
  • P-256
  • P-384
  • P-521
Note: If proprietary curve names are added, they must be expressed as URIs.
"x": "Coordinate"byte[]MEC curve point X. The length of this field must be the full size of a coordinate for the curve specified in the "crv" parameter. For example, if the value of "crv" is "P-521", the decoded argument must be 66 bytes.
"y": "Coordinate"byte[]MEC curve point Y. The length of this field must be the full size of a coordinate for the curve specified in the "crv" parameter. For example, if the value of "crv" is "P-256", the decoded argument must be 32 bytes.
Additional RSA Properties
"n": "Modulus"cryptoMRSA modulus. See also the crypto data type.
"e": "Exponent"cryptoMRSA exponent. See also the crypto data type.
This object represents a true subset of JWK [RFC7517].
6. Signature Validation
JSF implementors are presumed to be familiar with JWS [RFC7515].
Prerequisite: A JSON object in accordance with [RFC7159] containing an arbitrary but unique top level property (see p256#es256@name-jwk.json) holding a JSF signaturecore, multisignature or signaturechain object.
Note that there must not be any not here defined properties inside of the signature object and that the use of JCS [JCS] implies certain constraints on the JSON data.
Since JSF uses the same algorithms as JWS, the JWA [RFC7518] reference apply. The process for recreating the signed data must be performed as follows:
  1. The "value" property is deleted from the JSF signature object.
  2. The signed data is retrieved by running the JCS [JCS] canonicalization method over the remaining object in its entirety.
Note that data that is unsigned (as defined by the excludes property), must be excluded from the JCS process.
Applied on the Sample Object, a conforming JCS process should return the following JSON string:
{"id":2200063,"name":"Joe","now":"2019-02-10T11:23:06Z","signature":{"algorithm":"ES256","publicKey":{"crv":"
P-256","kty":"EC","x":"censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q","y":"xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU
7t6nVeY"}}}
Note that the output string was folded for improving readability.
The signature supplied in the value property can now be validated by applying the algorithm specified in the algorithm property (together with the appropriate signature verification key), on the UTF-8 representation of the canonicalized textual data.
Path validation (when applicable), is out of scope for JSF, but is preferably carried out as described in X.509 [RFC5280].
7. Signature Creation
The process to sign a JSON object using JSF is as follows:
  1. Create a JSF object with all components defined except for the "value" property.
  2. Add the JSF object to the top level JSON object to be signed using any valid JSON property name which does not clash with the other top level properties.
  3. Generate the required format of the JSON object to be signed by running the JCS [JCS] canonicalization method over the JSON object in its entirety.
  4. Apply the selected signature algorithm and key to the value generated in the previous step.
  5. Complete the process by adding the "value" property (with the argument set to the result of the previous step), to the JSF object.
.Note that data that should not be signed (as defined by the excludes property), must be excluded from the JCS process.
8. Multiple Signatures
Multiple signatures enable different keys to independently of each other add a signature to a JSON object. See the Multi Signature Sample.
The normalization procedure is essentially the same as for simple signatures but must also take the following in account:See also Counter Signatures.
9. Signature Chains
Signature chains require that each added signature object does not only sign the data but the preceding signature objects as well. See the Signature Chain Sample.
The normalization procedure is essentially the same as for simple signatures but must also take the following in account:See also Counter Signatures.
10. Security Considerations
This specification does (to the author's knowledge), not introduce additional vulnerabilities over what is specified for JWS [RFC7515].
Appendix A: Test Vectors
This section holds test data which can be used to verify the correctness of a JSF implementation.
p256privatekey.jwk
The Sample Object was signed by the following EC private key in the JWK [RFC7517] format:
{
  "kid": "example.com:p256",
  "kty": "EC",
  "crv": "P-256",
  "x": "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
  "y": "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY",
  "d": "nEsftLbi5u9pI8B0-drEjIuJzQgZie3yeqUR3BwWDl4"
}
p256#es256@kid.json
The following object was signed by the p256privatekey.jwk key while the public key is identified by a keyId property:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES256",
    "keyId": "example.com:p256",
    "value": "LOQWD_W6fdaGnolsKHztGco78WHfsZ9cNiJkGoYMCWkBQSPh5D8OmV_XkNnKM6Yu2WvMgovHvs_oxmnNaazPng"
  }
}
p256#es256@imp.json
The following object was signed by the p256privatekey.jwk key while the public key is supposed to be implicitly known by the verifier:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES256",
    "value": "dfkNQOOsCCEU_EX78U2p3Qm9bkwpKJxlTPwdQ8Yovry1WxhhfKWYmkzUaFDqkeYffqfm3_ltwrDkdpbjxYkbnA"
  }
}
p256#es256@cer.json
The following object was signed by the p256privatekey.jwk key while the public key is featured in a certificatePath:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES256",
    "certificatePath": [
      "MIIB-TCCAVigAwIBAgIGAWFcc4YkMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3
ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGF
tcGxlLmNvbTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABHHp7A83DBJIInj8-g1we3A7sBXprIQBUfdFDVUBQoPExq8rze6ewG0-eVcSF72J
77gKiD0IHnzpwHaU7t6nVeajXTBbMAkGA1UdEwQCMAAwDgYDVR0PAQH_BAQDAgP4MB0GA1UdDgQWBBQQyJ9rXSIskoUuA946von62LoxqzAfB
gNVHSMEGDAWgBTUWrS54qC2NgG3UK6rVAr0gbQ0MTAMBggqhkjOPQQDBAUAA4GMADCBiAJCAaWoVQ0r6jFjhO5e0WJTgyMmA8BhpO1t7gXQ6x
oKGso9jCOYf9OG9BFfZoVmdIyfYiwkhy1ld27tiOJ5X4m6WasRAkIBpEkUDf8irbSZ1V7zXALaR2mJTjKQV_5jRHsiBQWA-5DxEa-x_zJVRz8
tpp-jjT2tSCU82bwUOBLu6te1YIDpWCA",
      "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IE
NBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTM
wgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3
VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwD
wYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh
0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5p
Eec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7
tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O27
6sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQH
S6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1
tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbc
AEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
    ],
    "value": "OyltWriKjFuc2QLty_FvgEutNZcRHhNPDhi_lSBCn_zI-8pYhlwsY7cR4DcxlBFJ1rTr1L1tC1YaG59Hyt2tWQ"
  }
}
p256#es256@name-jwk.json
The following object was signed by the p256privatekey.jwk key but uses another property name than in the other samples for holding the signaturecore object:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "authorizationSignature": {
    "algorithm": "ES256",
    "publicKey": {
      "kty": "EC",
      "crv": "P-256",
      "x": "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
      "y": "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY"
    },
    "value": "_5X5hahBoA_HsbvbXstKKvDKMl-b36GZa0rNBw9oZqC2sk5FdkWrpywy8X55cTXeIRNcFd1LxDPdDDHUQqwmVA"
  }
}
p256#es256@exts-jwk.json
The following object was signed by the p256privatekey.jwk key. There is also an extensions list:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES256",
    "publicKey": {
      "kty": "EC",
      "crv": "P-256",
      "x": "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
      "y": "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY"
    },
    "extensions": ["otherExt", "https://example.com/extension"],
    "otherExt": "Cool Stuff",
    "https://example.com/extension": {
      "life-is-great": true
    },
    "value": "THxzfI5M3V-ZofagQcW97YuQBEIUZpo28p2Gq4xxSw4EesqTAkKqPgVKJAjceZSsWgYu6KMgdxH26T2bcgtkBQ"
  }
}
p256#es256@excl-jwk.json
The following object was signed by the p256privatekey.jwk key. There is also an excludes list:
{
  "mySignedData": "something",
  "myUnsignedData": "something else",
  "signature": {
    "algorithm": "ES256",
    "publicKey": {
      "kty": "EC",
      "crv": "P-256",
      "x": "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
      "y": "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY"
    },
    "excludes": ["myUnsignedData"],
    "value": "18HYl2jLzfVNhmTFPcK4eycWU-0_bSpCKYXXDztwFUt5asXboZCe61jelMU8l1u4EUoUXVXXBE4_qMkmj7Zafw"
  }
}
p384privatekey.jwk
EC private key associated with subsequent objects:
{
  "kid": "example.com:p384",
  "kty": "EC",
  "crv": "P-384",
  "x": "GLfdsvEwphRzS_twup7UFPVOk7_CKgHZ7dt_fJ2QHPBdJa1c5pfJcRIWTfT0lpg9",
  "y": "ovA5_QXmFbj9U4pjZ1AX_ZdVyIRZUBWW9cuZda_tupKfWQfmcQHzDmHGHbxl9Xxl",
  "d": "Qsgq80kMs40sAn1gB7gLxAk1se37Kmh9AG18wWZ3SqgcPPRq1wwidNTi866Gt4_0"
}
p384#es384@jwk.json
The following object was signed by the p384privatekey.jwk key:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES384",
    "publicKey": {
      "kty": "EC",
      "crv": "P-384",
      "x": "GLfdsvEwphRzS_twup7UFPVOk7_CKgHZ7dt_fJ2QHPBdJa1c5pfJcRIWTfT0lpg9",
      "y": "ovA5_QXmFbj9U4pjZ1AX_ZdVyIRZUBWW9cuZda_tupKfWQfmcQHzDmHGHbxl9Xxl"
    },
    "value": "2NwqrIoF841LlI6A-aWme0ig0TfEVCkGwIVbfp_I_3nUi6ez307B508JE61viwMcPUYaFHz8YeZ1M1krUYH-qmscfXHUN3O
TimgTxGKUk7dsv_WLfi5TdccvkMP6Nuvf"
  }
}
p384#es384@kid.json
The following object was signed by the p384privatekey.jwk key while the public key is identified by a keyId property:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES384",
    "keyId": "example.com:p384",
    "value": "OdEQM8N1m36PbTEOLs0Q3m-pBDyKLKDD1WMr76DsOqJ-0IjeVBPhK4TuacCxRl1uOv8egRrUWhZf5lenOKZ-NMZDcNtqAIs
2j40Vl85wqjBI-GFcbtU3UOcz4vQeeZ9L"
  }
}
p384#es384@imp.json
The following object was signed by the p384privatekey.jwk key while the public key is supposed to be implicitly known by the verifier:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES384",
    "value": "rIZo67puCjHUAygCvrPLPAmj__6XsDCnxItzwAPJKcPwNHK8sPscFivVga7ie0ClRRoQNp5sBlJk6wpAjL95td8dCe4WnVV
5sBOTyc4_WIjUnxGRgoEtdW_KnvFGWRB7"
  }
}
p384#es384@cer.json
The following object was signed by the p384privatekey.jwk key while the public key is featured in a certificatePath:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES384",
    "certificatePath": [
      "MIICFjCCAXWgAwIBAgIGAWFcc4yUMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3
ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGF
tcGxlLmNvbTB2MBAGByqGSM49AgEGBSuBBAAiA2IABBi33bLxMKYUc0v7cLqe1BT1TpO_wioB2e3bf3ydkBzwXSWtXOaXyXESFk309JaYPaLw
Of0F5hW4_VOKY2dQF_2XVciEWVAVlvXLmXWv7bqSn1kH5nEB8w5hxh28ZfV8ZaNdMFswCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCA_gwHQYDV
R0OBBYEFG9foq5m0pyZG7r3G23hxzYTkFZ1MB8GA1UdIwQYMBaAFNRatLnioLY2AbdQrqtUCvSBtDQxMAwGCCqGSM49BAMEBQADgYwAMIGIAk
IBtNCYJ9-XaOGtdIEbxYUcqQZRtiX54Ltx7YGWtk1bK51m6plv8_AspvX1mhA8nZ__hmoKChMLccZIicMXBmJV26oCQgDO34bxnJ1MVBTNbhB
kHfEiJAJZNtW2tXdEnduJpfYMb4lWJNssCVBS8YtyKEQRuGT8uKN7inbi6L_8FQTtJ9yLhg",
      "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IE
NBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTM
wgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3
VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwD
wYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh
0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5p
Eec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7
tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O27
6sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQH
S6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1
tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbc
AEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
    ],
    "value": "oHdu5BWvOVRWkce145PEXJzoBq6h9uwmUdULD7IZBDjdxMgAzEvIH0a-rQZxJBHxjoo8bQGK_AZEMUXKWkAUUVh0eA42p8I
2uE3d9ggz84wk5zqK9bL6zXvs40dFiYn2"
  }
}
p521privatekey.jwk
EC private key associated with subsequent objects:
{
  "kid": "example.com:p521",
  "kty": "EC",
  "crv": "P-521",
  "x": "AT9Hw32aVQCGd5csltC1dqhSB4fFt-mEWO-QxZqrr9Yrwn69_q7n1YOYrHSWjk_qMkCGk6qQ4f9ZRYIJPGqjfxC9",
  "y": "AeVHV1elHFzR_P5Lzb22hMyhAzcGSTT1sdwVmFkJGBYt55RKXGNO1H9De2v_p5S-kkK8BZVh3JGzixMyT0Eo_ckS",
  "d": "AYSlWWbGUougMnE2r7pRkiHZfXBgUzaVTuWfE0X7PDYodsVXVzRiz4KMgfs5Xowwk2roUsbJV7wdyZ83qMrQM1Fv"
}
p521#es512@jwk.json
The following object was signed by the p521privatekey.jwk key:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES512",
    "publicKey": {
      "kty": "EC",
      "crv": "P-521",
      "x": "AT9Hw32aVQCGd5csltC1dqhSB4fFt-mEWO-QxZqrr9Yrwn69_q7n1YOYrHSWjk_qMkCGk6qQ4f9ZRYIJPGqjfxC9",
      "y": "AeVHV1elHFzR_P5Lzb22hMyhAzcGSTT1sdwVmFkJGBYt55RKXGNO1H9De2v_p5S-kkK8BZVh3JGzixMyT0Eo_ckS"
    },
    "value": "AJ659xkbRdTlQQQpcV0dSbZ9DvtpIPTP2l00Xsrbp3PrXPzmJtGzDTnL4hz813SzLgq7ZJZ5ZR7fGvMQ6E_XO-2MAPrGAe5
Kny4M2IPbeYuSTRXNvGhshNmhrSveTSqcAOZ3NLd-7KL55KKvF81eAkSxyRF1uyiPy2qK9bozrpz3oWem"
  }
}
p521#es512@kid.json
The following object was signed by the p521privatekey.jwk key while the public key is identified by a keyId property:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES512",
    "keyId": "example.com:p521",
    "value": "AUK-81LqhaknISR5uMF6pObvaniK3DOlcIovfa8neZ6scO504OkWvBwjpPj89iVyDcfoEpYxHK0ejHc42mK5Vmj1AdiZUt5
Z7W_d973g3SHqR4o_pufkBMHPL2sSccXUvk7nBpKsOHS1ZacMU6Z_prRRGd4-2tpBpHcbyTqPgmSsAlZD"
  }
}
p521#es512@imp.json
The following object was signed by the p521privatekey.jwk key while the public key is supposed to be implicitly known by the verifier:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES512",
    "value": "AX8iryVyPAGmbo58p5a-7MkyeOEnOgYFHWl2H0TFC4tIEWsYdea4XkksTt0aEFGx-k0XgNcmgAiDgE1B1jbANuu8AVGXqUq
nXiTGDLUMr_t7_lMGf2rxO6ADOQntAuh0AuOuCmfM_DAhVxDOM4HrCUA6VLXK0kSiW9b4lTxwIC7Opj9B"
  }
}
p521#es512@cer.json
The following object was signed by the p521privatekey.jwk key while the public key is featured in a certificatePath:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "ES512",
    "certificatePath": [
      "MIICOzCCAZugAwIBAgIGAWFcc5MjMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3
ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGF
tcGxlLmNvbTCBmzAQBgcqhkjOPQIBBgUrgQQAIwOBhgAEAT9Hw32aVQCGd5csltC1dqhSB4fFt-mEWO-QxZqrr9Yrwn69_q7n1YOYrHSWjk_q
MkCGk6qQ4f9ZRYIJPGqjfxC9AeVHV1elHFzR_P5Lzb22hMyhAzcGSTT1sdwVmFkJGBYt55RKXGNO1H9De2v_p5S-kkK8BZVh3JGzixMyT0Eo_
ckSo10wWzAJBgNVHRMEAjAAMA4GA1UdDwEB_wQEAwID-DAdBgNVHQ4EFgQUa-tPMR1eN_0bbadpgzj-C5t-fMswHwYDVR0jBBgwFoAU1Fq0ue
KgtjYBt1Cuq1QK9IG0NDEwDAYIKoZIzj0EAwQFAAOBiwAwgYcCQgFNJcVPfnQh7VeKnsXp1ay6oX9WSDN6RtTDAQ-4LZlIj8quUsKN7JH78fc
qJgB3no8s6-N6vkyNTdAUQuhnuqeS0AJBEIF9NuLOuIaQW7ZPR1x95OworMGyXq0vKonMnijD5utltRmhZLdwI-GVX5k0V2-cGoTBKp3K2uFH
PsTFVGSFRlU",
      "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IE
NBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTM
wgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3
VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwD
wYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh
0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5p
Eec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7
tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O27
6sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQH
S6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1
tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbc
AEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
    ],
    "value": "AV0Xqspq7jQ5a-dKIZFVGRA0HyejUP60IbJo1DxeiuoY3yFiqm6Ipf5740S0nKFnKVxk_w3frx4wXOpAGqZUVcfmAN5IdEq
zpA0VzDTZASnrSk0vjiHXs97_9rxHMaksJldqHafzMht3RMboKa7lJxYjWLFnMw2E4JkmmmTPxuwgkLty"
  }
}
r2048privatekey.jwk
RSA private key associated with subsequent objects:
{
  "kid": "example.com:r2048",
  "kty": "RSA",
  "n": "hFWEXArvaZEpSP5qNX7x4C4Hl28GJQTNvnDwkfqiWs63kXbdyPeS06bz6GnY3tfQ_093nGauWsimqKBmGAGMPtsV83Qxw1OIeO4uj
bIIb9pema0qtVqs0MWlHxklZGFkYfAmbuEUFxYDeLDHe0bkkXbSlB7_t8pCSvc8HLgHjEQjYOlFRwjR0D-uLo-xgsCbpmCtYkB5lcT_zFgpRg
Y4zJNLSv7GZiz2S4Fc5ArGjd34lL47-L8bozuYjqNOv9sqX0Zgll5XaJ1ndvr7UqZu1xQFgm38reoM3IarBP_SkEFbt_v9iak602VO3k28fQh
MaocP7JWR2YLT3kZM0-WTFw",
  "e": "AQAB",
  "d": "Q6iBYpnIrB2mkQZagP1lZuvBv9_osVaSZpLRvKD7DxhvbDTs0coaTJIoVCSB1_VZip8zlUg-TnYWF1Liv9VSwfQ7ddxrcOUtej60m
Id0ntNz2HhbxJsWjiru8EZoArl0nEovLDNxlRgRMEyZwOKPC_xHT6nFrk7_s9pR5pEEcubGLAVBKnLCoPdLr-CBjCvWfJo73W5AZxoSb8MdWQ
Oi5viXHURpr1Y_uBRsMuclovM56Vt05etMsB1AbcTLUDwAuYrZWa1c08ql60ft7b3v6Q_rCL7EHtFU3PHAuP0mV7tM5BfAPf4T0g9pbr4GOw7
eqQCiYgPFE7gmCR_PDxv5YQ",
  "p": "6DIM343hAtj1hQprJaVQ3T8YeIytIQ7Ma544C0A8BX-irjJfARy4fAlTSyBFeauZ0WdbMGtKpAIgNVmfCfuP7W1bXw7UaxpqsQlbw
54K1VtBs8xG-lee_2YQ3lUlIiC1at6L0jxWYNkvp-LIfU2F5ZQir5ZWVXwgdMcgoNBABMc",
  "q": "keacq0goV7pAtG2h33OAk-XOSclIF1agvEMMOKuud5V-vGQ6OaYldlYqZmSGgF7RVlX0GZO70nPqatjd2G-tI8wEq5K_xmLQurUPF
W8g___z0CTgJ62KbjFxCtGny5rsObX9im6cCc_EOtWZRaApzO8ykxfo1QcEjT4k1na7DzE",
  "dp": "nPmJPnFal2Q5x_GdMlwq6QhI8OaZ_OlWRcM3PFP2v_jj8ERZehUCm8hqKTXuAi2C1dC8E2XVlj9hqu-l10fcq7Tsurz52laHnpwn
D35-8HK7XmRR79jgwuUrrkN90S6vt0ow2La15s-tqiBlTmDkjqqxMGfAghZiktA0PMPNI-0",
  "dq": "D3c1lkZw2FPK9hVE-m3A7GyIwHOQq8CoCyzER-GS_eQf6hJpxaCiCfg6SF5Rj5v9brxvwqJRX46gA7F3WrED1m6S9Cj7ISlqXNBC
iBAenGRiUOcHx8zyhpnBFNeChOeoMLnk5V6yNawLbf0kYSgIJkwYvVTkfmhfCCXVO9KcI5E",
  "qi": "wV0NzfCakfog1NFjtPzcga1MtkpizgPkxcP9LjNdvXW2YQZhM6GIEGjsu3ivTrHrrM-4_bTQHOoTtfIY7wdqBKlwQTJOI0dH9FbN
J4ecGojRwgv83TN8aNKh17Tt44jI5oibs2P-31B_VW9R1wwhnnOuCYpABfoSbtHIoCRme5I"
}
r2048#rs256@jwk.json
The following object was signed by the r2048privatekey.jwk key:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "RS256",
    "publicKey": {
      "kty": "RSA",
      "n": "hFWEXArvaZEpSP5qNX7x4C4Hl28GJQTNvnDwkfqiWs63kXbdyPeS06bz6GnY3tfQ_093nGauWsimqKBmGAGMPtsV83Qxw1OIe
O4ujbIIb9pema0qtVqs0MWlHxklZGFkYfAmbuEUFxYDeLDHe0bkkXbSlB7_t8pCSvc8HLgHjEQjYOlFRwjR0D-uLo-xgsCbpmCtYkB5lcT_zF
gpRgY4zJNLSv7GZiz2S4Fc5ArGjd34lL47-L8bozuYjqNOv9sqX0Zgll5XaJ1ndvr7UqZu1xQFgm38reoM3IarBP_SkEFbt_v9iak602VO3k2
8fQhMaocP7JWR2YLT3kZM0-WTFw",
      "e": "AQAB"
    },
    "value": "fiW4-E8CAtqAFhJw3vhloMk8F5JK-rByK7b8H7uOsVnKwl5KFJOVsJIIEO6O5eLYmaET4ewWr93TWGiVt1WmasgTmU1xgDm
UG4O_tvsZeWQ9iJJ4dZ6W1KowlYFx24n6eWfOqrJHVl5CZFBYmoQpwkg26yArvBuPJKWDbMPGth4QTtbttkm-rSfr30_mjCQou6F6QhVGxZxe
Ms7PyeKQnq5qUY2NeCEjCnrIxMPcLP0FXgBRlGfFBLj-HLQOkWLYH9LDZ24vj4Z7vZrCRZBa0EehAcRp5cDa2kX_ex-rm02AmbdjxmsWqnL_L
KDTzlQciI6t4E6AR27y4f_G7FnrGA"
  }
}
r2048#rs256@kid.json
The following object was signed by the r2048privatekey.jwk key while the public key is identified by a keyId property:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "RS256",
    "keyId": "example.com:r2048",
    "value": "AC8GELBS_2i1KXg8pXMaJwPTF1czAJiLRdj6Fxi85Wm3Eb7nOIMhM1LVE8-9BHeNl5lBCoIl1qsEeHly_Ub5J969aWLdHxB
oGH_z1aEEDhQUNnQ1mT2kL3J9bwYSL2LxqwpINnh2iDM4FaL3fwRRtMSwcsuXqTVXpS2anvlCShll4EFLSFIG527FCCGH0JMVUZmhaOeR7lH2
MOsdC-MsZ_7LzKmGgydfaF1xu4u3jmC78H1wSme5Arl7DSNBDFQhK2ZqjWIztIkhfZwmxW0OvzUSC3wdXKKNUE53EETIQSoZkTDW8v5_Bz-eb
GEF5T7YVwG8M5MZdCE_ZPy-c5tXng"
  }
}
r2048#rs256@imp.json
The following object was signed by the r2048privatekey.jwk key while the public key is supposed to be implicitly known by the verifier:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "RS256",
    "value": "JG4PrnwSHk3eBfYRyuKwiybbBnZ-aJWAG0_3-X9eJJg9Xxe_zGHcUiNrH2o77quxXcFSykV1LQALyS7blqecOBTRYYEPaMv
KYmNNouXphAtCjfTRfK6zrxo8WQW6kHaJh4JQ-_4JZgr7f2r0iMuycnC-1cXQ5YUQsTsqfNXZrI8drWFDNxUGMTzoPx8lcR1V5nyZyXMwHdtE
84Zy9V2q-Fd38vobcpYzrUJQSweCVr8MiGLWFmLtmknH2ckm6t8S45JQr3zjHHrE42_9BqN4o7ggNoHfMAeZYIn09EBdpD0EwCXZ-Kti2VTSl
3X-wHfbkLrScKWFuAa6i8BuZrEZBg"
  }
}
r2048#rs256@cer.json
The following object was signed by the r2048privatekey.jwk key while the public key is featured in a certificatePath:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "RS256",
    "certificatePath": [
      "MIICxDCCAiOgAwIBAgIGAWFcc5ruMAwGCCqGSM49BAMEBQAwLTELMAkGA1UEBhMCRVUxHjAcBgNVBAMTFVRydXN0IE5ldHdvcmsgU3
ViIENBMzAeFw0xODAxMDEwMDAwMDBaFw0yMjEyMzEyMzU5NTlaMDIxCzAJBgNVBAYTAkZSMQ0wCwYDVQQFEwQ0NTAxMRQwEgYDVQQDEwtleGF
tcGxlLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAIRVhFwK72mRKUj-ajV-8eAuB5dvBiUEzb5w8JH6olrOt5F23cj3ktOm
8-hp2N7X0P9Pd5xmrlrIpqigZhgBjD7bFfN0McNTiHjuLo2yCG_aXpmtKrVarNDFpR8ZJWRhZGHwJm7hFBcWA3iwx3tG5JF20pQe_7fKQkr3P
By4B4xEI2DpRUcI0dA_ri6PsYLAm6ZgrWJAeZXE_8xYKUYGOMyTS0r-xmYs9kuBXOQKxo3d-JS-O_i_G6M7mI6jTr_bKl9GYJZeV2idZ3b6-1
KmbtcUBYJt_K3qDNyGqwT_0pBBW7f7_YmpOtNlTt5NvH0ITGqHD-yVkdmC095GTNPlkxcCAwEAAaNdMFswCQYDVR0TBAIwADAOBgNVHQ8BAf8
EBAMCA_gwHQYDVR0OBBYEFIGmjEZHXHRSGub_c6jTyxuZClVHMB8GA1UdIwQYMBaAFNRatLnioLY2AbdQrqtUCvSBtDQxMAwGCCqGSM49BAME
BQADgYwAMIGIAkIA57GembY0hb9d_Qx2ZJRfFqoR_Q1S87xSx_AUK2xnuZgaclPKv6q4GT5sFD1V1DxbLUnM3q1yYCPZUQBAeeab-UYCQgEV-
HvFgA8de7dKOQzpGRQ9FHLdhlT1dYsrIxjziZkleFLUgs01-fV-ITx5RMeT9w681je1LW2aQK5_nRrErARerw",
      "MIIDsTCCAZmgAwIBAgIBAzANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMWVHJ1c3QgTmV0d29yayBSb290IE
NBMTAeFw0xNjA3MTAxMDAwMDBaFw0yNTA3MTAwOTU5NTlaMC0xCzAJBgNVBAYTAkVVMR4wHAYDVQQDExVUcnVzdCBOZXR3b3JrIFN1YiBDQTM
wgZswEAYHKoZIzj0CAQYFK4EEACMDgYYABAGJzPZsjniwyZeXrgrlQM3Y13r3znR8FSQpKbC2bplrOWySQJPGm-GFObe5Dk4t3Jrtk_Pbs8-3
VW_4q5drL0YqYwBYNJPhqjbSM6SGHrc6wNdPZRw_WnJVa0ELXKICC73lkjskWPfE-cLpZ3sTq1ovEmoNjgaySVRUH1wFDdkqyReJaKNjMGEwD
wYDVR0TAQH_BAUwAwEB_zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFNRatLnioLY2AbdQrqtUCvSBtDQxMB8GA1UdIwQYMBaAFEkmC1HDAh
0fXehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQAs2KADYyGQCVy8tJZWakNtGdww4OumZpBuR66p_2xK7veRubQEhG-nJn7oVkJ4w5p
Eec3sYQEqtPbHyZcEKEYbOJ2cVf1nMH-DvFZ6ypQocGRp3WSWsTzL3SgqiWrQdPX1Y5dO6Hvx7p9ST9H2WgkxB-Q75Jov1gVF3bScAbxb7Mw7
tf5z3Cvqmfo0Gatkgzz6-jDPrtUK7AAAOw3C0kHMbE3EnNarsfhBkUerE8QVmHIvz373mWt0SnguaHq0A9ZuSia_pF7bgfVRZi2ZzIzpu2O27
6sB2Yji9tcSn5l21jq63rXtvY_DLAi4kaLyf9sHT_tkH-gkTdkdkfQq8sA5ysRW21wPQbmjTIVwsfY4JjajVIUitjPbkUJqURpf2VD0JXdYQH
S6KVPWqHWTlKPlsKbhw4ghuLqCMYda88L9rxWnSC5L8s0DJSuBBm-nq23NtHl5FbCzeXWcKRayIgimT-An1WIOeJP4F7-BctYLIooKoQzJZR1
tOWvprUs22_xAivVBz7J_LmJyVlKesB2ic8qYdt7YVoCsWrnEUgoNoJPwLHeva8KPvd0gLXrwaMyTCCjeoemXFj6nCbbMHJeVffh6jYBAzlbc
AEvTiZcdzrVVr54kOtWskyaeDnAcMXW4Of1vWdUJ2as5nyfletfTp4E6A9P2dZ5g7nMoL90yIw"
    ],
    "value": "ANp5RuiwVkpwvo_AvAhGhYGtCYDAaR0cOPTuG8J7VxswMTiHKf8LvLeC1QljtV0oVKX8PaQe9GIo1xnqGlRt4hZbjwEnxMm
O_lVvjlChTxHE4N7YICFjMrkJI0cWkFykhvr2eaWOcrcit8bezPpmwH6BUlEGoGPrrKZTmKFPYnsUkNnbc4DUNvpAr0XYZTfjWeiy9G9ed-8Q
04JXO7lXhluVnhe-MeXvjAZ8GoX3jaJBWQ_Y46ILCn8mLMw0R1PseE3frnyzhrMWHYWtgJam0JwSrKDn_BSf-w8J36BT_V7xymlH_MeKE2g5v
sfY3IpLNULY1ynfCdaW3tY0_qcaig"
  }
}
HMAC key named "a256bitkey" here provided in hexadecimal notation:
7fdd851a3b9d2dafc5f0d00030e22b9343900cd42ede4948568a4a2ee655291a
a256#hs256@kid.json
The following object was signed by the key above:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "HS256",
    "keyId": "a256bitkey",
    "value": "GJ6Jhb-PfHpN6KPcjHBNxbO9j56ShgUh13JfmZ3ORkI"
  }
}
HMAC key named "a384bitkey" here provided in hexadecimal notation:
37b7daeedc3403eb865a506c19597a37582ad5059e08438ada8bf544ee44bb3024a15f8fa191bbe7a533a56c9fc1db1d
a384#hs384@kid.json
The following object was signed by the key above:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "HS384",
    "keyId": "a384bitkey",
    "value": "FjkRAZS-HsGsC_WPKsF2fmaNO7CPp90asbgXfOPQjolyK_qQaOuJH_u7PgonjzN9"
  }
}
HMAC key named "a512bitkey" here provided in hexadecimal notation:
83d26e96b71a5dd767c215f201ef5884fb03dfe5a8ee9612d4e3c942e84d45dfdc5801cb8379958f3af600d68eba1a14e945c90f16556
71f042cea7b34d53236
a512#hs512@kid.json
The following object was signed by the key above:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "algorithm": "HS512",
    "keyId": "a512bitkey",
    "value": "VJHJXrZhVMMWTKTJktmdE5J4xBjKwtdf25eItui4fIGuyYsiZD5M9n573WZ0XgM9q48gG1KpTee4q8LCW4a7qQ"
  }
}
p256#es256,r2048#rs256@mult-jwk.json
The following object was signed by multiple signatures (see Multiple Signatures) using the p256privatekey.jwk and r2048privatekey.jwk keys:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "signers": [{
      "algorithm": "ES256",
      "publicKey": {
        "kty": "EC",
        "crv": "P-256",
        "x": "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
        "y": "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY"
      },
      "value": "yI_ucBjb2uOGK07B5y5swXmTRO8jqrCAktE4mQlxLhc05hAksE-MuSEgnO14InByLcxWwe2xp6qXDQZlOHjFAg"
    },{
      "algorithm": "RS256",
      "publicKey": {
        "kty": "RSA",
        "n": "hFWEXArvaZEpSP5qNX7x4C4Hl28GJQTNvnDwkfqiWs63kXbdyPeS06bz6GnY3tfQ_093nGauWsimqKBmGAGMPtsV83Qxw1O
IeO4ujbIIb9pema0qtVqs0MWlHxklZGFkYfAmbuEUFxYDeLDHe0bkkXbSlB7_t8pCSvc8HLgHjEQjYOlFRwjR0D-uLo-xgsCbpmCtYkB5lcT_
zFgpRgY4zJNLSv7GZiz2S4Fc5ArGjd34lL47-L8bozuYjqNOv9sqX0Zgll5XaJ1ndvr7UqZu1xQFgm38reoM3IarBP_SkEFbt_v9iak602VO3
k28fQhMaocP7JWR2YLT3kZM0-WTFw",
        "e": "AQAB"
      },
      "value": "aF3qTpIFGcJxB5En-JFQZWGqX-vOoGrs27SKBz_mNjmJRDdAeE-0NnmF16elUh2YmFWFfZd_SLnbrlkKE2adlOqxqWiQY
cB1smKSOQ3dTwAYLcD4ebuBgDBKRs9ZO_GPBeSpwH5FGpUQbSPGh7BWD69OPF6Ik5vHPikfls-fr1qgrxpYARY1vUhXvl-QFtBvnd3Xn_n63k
FQl4GZDeP6TZyuoaulTKsFBvhHu0OfqknoOzEUYJYMhS9r5rDz_AVbnx_F1Key-gQnm6UmuVothu_ApYy_NW4HEVKZfxhU_nYzuGYQD9VUI9W
YmstBcLyS3uNPHDECoEy0hQ4UpZPMBg"
    }]
  }
}
p256#es256,r2048#rs256@mult-exts-kid.json
The following object was signed by multiple signatures (see Multiple Signatures) using the p256privatekey.jwk and r2048privatekey.jwk keys while the public keys are identified by keyId properties. There is also an extensions list. Note that this JSF features optional extension arguments (the second signature lacks one element):
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "signers": [{
      "algorithm": "ES256",
      "keyId": "example.com:p256",
      "otherExt": "Cool Stuff",
      "https://example.com/extension": {
        "life-is-great": true
      },
      "value": "T-7QWCI4GDMutdCOi4MDca_6Jpq2YLasrfOduvYgt8YlqVlY9gYrNfotLN3JjQbCrW6ShIrhErUY0sJ9VGBseg"
    },{
      "algorithm": "RS256",
      "keyId": "example.com:r2048",
      "otherExt": "Other Data",
      "value": "fEy3hW0MXzpK9kC_gjPtpVBXBdBkuVVoY8DMugjMTJBw2t5iABpH_oNKmp3LQl-zB0LcSpINh0bRgv2sErgPFHEH0fcg1
omJ8N7jee4yPkA4-r9qW_vWOKAOQOArcUnoGYtQTcOMlaNz5B-qbn-aX0faxm3zGOrizWVdQTG7fJe8dQW4M3JdGy01zlA37fpX9ucKvM2nKk
SZtAjFRtKA504UEbww3wLcQlbocZPpVpYoaiN_Oi6X7zpIhxvTbYR1bhh9D9uuXaaYSIG5VjokpVo0vTvhrMg4rT29QRq70RyH45cA_ydwr18
gwHLvXU0-4lSkB_d1F7f7rjwRnMlwAw"
    }],
    "extensions": ["otherExt", "https://example.com/extension"]
  }
}
p256#es256,r2048#rs256@mult-excl-kid.json
The following object was signed by multiple signatures (see Multiple Signatures) using the p256privatekey.jwk and r2048privatekey.jwk keys while the public keys are identified by keyId properties. There is also an excludes list:
{
  "mySignedData": "something",
  "myUnsignedData": "something else",
  "signature": {
    "signers": [{
      "algorithm": "ES256",
      "keyId": "example.com:p256",
      "value": "4TNtGVbvViLLvHnxK-_V_yCdCljWyDBCgKLFV5109OXNu78gKxPbKERqIPwJ_pr2-rx7_nsHXk4cLzuPW8B8UQ"
    },{
      "algorithm": "RS256",
      "keyId": "example.com:r2048",
      "value": "gi4VgggTcn1jKAFANRBK9a8BLN5oIlABLdZERnhHTDY31l57P26WbY5Q7ACqE9w24BE6cRXEDACD3gLFsGIEPhu3EOE38
fWWkR-5Y9hfGSJO64vSFxVEktYsf5XKyeCTtMLApmJu1wjggmB5UuC1gKuecy0ChnfJFnrPE46B9TLGOoYskjEqGJRlgPHvvqo7euFkDM61Wz
1vggIq-xfqih_FYgz42280Yy2HzE-GDZXTNfji1ka7DTjujLnCjfLAQa7-65H60KFHnrMULe6k9PZiwfoSykMm3TYOF-c9hWdjwpbqOBeB-CP
Og92ACBSh6cOtcHqVGVTqW_-9hj0G_w"
    }],
    "excludes": ["myUnsignedData"]
  }
}
p256#es256,r2048#rs256@chai-jwk.json
The following object was signed by a chain of signatures (see Signature Chains) using the p256privatekey.jwk and r2048privatekey.jwk keys:
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "chain": [{
      "algorithm": "ES256",
      "publicKey": {
        "kty": "EC",
        "crv": "P-256",
        "x": "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
        "y": "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY"
      },
      "value": "z3YILoyx1GURBuQaF6Oo9XBIOEXfzeulkq_8kDyXGo3raAmGMLiRTsyqwgLFHNMuih41GIdmYfJ4zs7pvtF6uA"
    },{
      "algorithm": "RS256",
      "publicKey": {
        "kty": "RSA",
        "n": "hFWEXArvaZEpSP5qNX7x4C4Hl28GJQTNvnDwkfqiWs63kXbdyPeS06bz6GnY3tfQ_093nGauWsimqKBmGAGMPtsV83Qxw1O
IeO4ujbIIb9pema0qtVqs0MWlHxklZGFkYfAmbuEUFxYDeLDHe0bkkXbSlB7_t8pCSvc8HLgHjEQjYOlFRwjR0D-uLo-xgsCbpmCtYkB5lcT_
zFgpRgY4zJNLSv7GZiz2S4Fc5ArGjd34lL47-L8bozuYjqNOv9sqX0Zgll5XaJ1ndvr7UqZu1xQFgm38reoM3IarBP_SkEFbt_v9iak602VO3
k28fQhMaocP7JWR2YLT3kZM0-WTFw",
        "e": "AQAB"
      },
      "value": "G0ZEFIhcsVPG5r7-XMNjruXXvN7V63H9dnAVzcrsbwWk9Z8x9fIjT0UEazsWzpMvgKRsDayuMk6WIl7nOYiDrTOM6C_BI
0U7jDxrK7dunIGQ-z5RN6pvF4Q27mOHx7yjVVsPBN5VTl4JVT6HQnfpzPe1uZiFRG2hw5BYZa-vvkBcZb6bWOClTsn2i7zLQbVA-5vTGa7zJt
OmuLwBEf_GFf_o3pN0Bjx94S87KwoaWfLAaBPMgFZIDoNGgW5hmBJj1-YKp4l9WgsX2I7M8rvg5ptEupV9HDRiH3kivybUHDibOoun1-D1bkK
RgA447ug1gxrvpI3dSLKb-QQd4j7b7A"
    }]
  }
}
p256#es256,r2048#rs256@chai-exts-kid.json
The following object was signed by a chain of signatures (see Signature Chains) using the p256privatekey.jwk and r2048privatekey.jwk keys while the public keys are identified by keyId properties. There is also an extensions list. Note that this JSF features optional extension arguments (the second signature lacks one element):
{
  "now": "2019-02-10T11:23:06Z",
  "name": "Joe",
  "id": 2200063,
  "signature": {
    "chain": [{
      "algorithm": "ES256",
      "keyId": "example.com:p256",
      "otherExt": "Cool Stuff",
      "https://example.com/extension": {
        "life-is-great": true
      },
      "value": "sQGISSMlWQACetPXZmeG_8bnFmBOnHAH58o9E3vkMf7czyjxa2bFQZpEuf3pp1VPT0dWPMKY30thKw7PoHs6mQ"
    },{
      "algorithm": "RS256",
      "keyId": "example.com:r2048",
      "otherExt": "Other Data",
      "value": "T9xlcO-jalkA9DS8ybTCKuNWnjge8-QALxQXOSEc0STsaTKDtgFixh_DwzHUZndiI0fE529dD0j7Zr5T0NM53VqztlM-j
DHw7hy_MJKn6szJdlH5dYmLR7_QY6QK_wMltrA0qqCh36e_AI8J1ivHOodIDSitizYldI6v_tmaDkvXLIjSwsCVPVJmR19iis6bd5hdVAh8He
JAjk7plx-hDKO08FkA0dIIB0F-PZIe1FaLkMfIEto9OFtxTTacSauERV_o-lZRXNOOA_2Hnfp2BC4W4lswhTMIw-eWPEaJl510AAINuASBu0D
7U-PwtcKG8VKiw17JX6NaMjEQNbDwuA"
    }],
    "extensions": ["otherExt", "https://example.com/extension"]
  }
}
rootca.pem
The certificate based signatures share a common root (here supplied in PEM [RFC7468] format), which can be used for path validation:
-----BEGIN CERTIFICATE-----
MIIFOjCCAyKgAwIBAgIBATANBgkqhkiG9w0BAQ0FADAuMQswCQYDVQQGEwJVUzEfMB0GA1UEAxMW
VHJ1c3QgTmV0d29yayBSb290IENBMTAeFw0xNTA3MTAxMDAwMDBaFw0zMDA3MTAwOTU5NTlaMC4x
CzAJBgNVBAYTAlVTMR8wHQYDVQQDExZUcnVzdCBOZXR3b3JrIFJvb3QgQ0ExMIICIjANBgkqhkiG
9w0BAQEFAAOCAg8AMIICCgKCAgEAmhJBTeP6sCLA3bkZURJA3z8OmEUmuu18nEDaVVTfnT1UJWXY
A37xF8MQu3UZ6pCBEBiNIl41rjA17KFA1gBtJGTeSAza98acS+/AM3bsTDUrhjBD1vj3B63tnU2H
Ib/XFzqY9CLo3XkTwkrs1k4m6nxH7DX2VrsqddzeHduoDIwuBYfjwJZIPo+UX03xkD2OYBYr9xBW
EDcyEt+jOSb1Ftdstsm8ASMR5L01roHsAdsM75NDd2rKE0xGteHw/aAK0SWvSm23AiXTFX3BcHgm
5/c4OkvPodP+IJTb4EaLTD2rcFwe5AzF9+pkABVZZUwGwysORwuCVRZsgfODFm/Qan4xTtC2kRkz
XZdLplxAWZx/j+GRuYbppIzcS6v9XGnHBs7j58Jp6OF1TX4SLjQ7v2Ff1caPesPGCnO7gVAaiMTl
ctHONY3rCvsQb4KF65qoyQPXWtL5HiqQ96T8bxc4ycdeHfD0Owvielg1aKWDF8Amf4/s6r09rKNR
L47YTmp/3FK6XIfLLrMldbugpekF7pBGs9KxT6afQNGiVeRU0cUv5CrFg2e+044edc0kCqM1rCgD
W3ksHMlBLsp0FbU+yPt1aYni8T+9TgeFLObCBDSt77JCFrQIC/MmC3HlnB5rnOynKxLkYmy73+GI
WXx1JyCep7fW2Au/67RTrXNMF2kCAwEAAaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAOBgNVHQ8BAf8E
BAMCAQYwHQYDVR0OBBYEFEkmC1HDAh0fXehpiUhUGE868Hk2MB8GA1UdIwQYMBaAFEkmC1HDAh0f
XehpiUhUGE868Hk2MA0GCSqGSIb3DQEBDQUAA4ICAQBrV9ON1pjwwABptKwnh3WDK9Q0qVrTJMYW
OfI/7AdrGlut6IR8h+ObKUAsfQqQcM1HYOKXHSJYKJjNkn+lX+BcXrlTpo/+gKqEavRabSFHYn28
jFqoUqMMMnDO2XhccHS9zN9HListfG0c+2Hg8FY2Bz1UnueipzQPN85drUGQUyRKRDgJuc8Ib47r
sQlxNeo3XCL88MgvTRMlRKCV5g5ufVowNbo4VWn936bUZxNQ0ivhYpv5bFTmQSuUzDJSC9+/hln7
FqxpnTaaIJEGXI7iXM+QDW0CHjhse69yE0x+DhuF1heqeQT1BU6Va1lNEIjWY2e/xjSrWAZ05RPd
Cs+DuerNMbBatOlXhcpBFYzEhjrCK1r2vu0WNKNznsVyuJ1EU1aw9Rfn5xQ5+CRO00CF6mxTwuhA
rwE5CpBt4fi2YyDzDa1kjho0MZfAvuF1ZNvovD1k6dQ36UU5U5RBoZO112tQwMqGPFzBZHJMbvqK
oAXtmSef7JK9NOEtiFnCL8GklOJlFn+zfGSqNvwqMwaMnEVTjsJnwqzK7gXGZmVj/2dkk4zzO3W8
EL48x5vpaX9/IXw0HHLGEj9CAIVk2oOes+Vp/49siuwBQm58VV0fIIHewDmwkgZV3RTPFrOrDYTf
pfjf8EV2t0G5ef13s4qXg7p3If75LR7h/gXpNHhw4A==
-----END CERTIFICATE-----
Appendix B: ECMAScript Mode
ECMAScript mode in this context refers to the ability to sign JavaScript objects as well as using the standard JSON support for parsing and creating signed data.
The code snippet below shows a signed JavaScript object:
var signedObject = {
  // Data to be signed
  statement: "Hello Signed World!",
  otherProperties: [2000, true],
  // Signature
  signature: {
    algorithm: "ES256",
    publicKey: {
      kty: "EC",
      crv: "P-256",
      x: "censDzcMEkgiePz6DXB7cDuwFemshAFR90UNVQFCg8Q",
      y: "xq8rze6ewG0-eVcSF72J77gKiD0IHnzpwHaU7t6nVeY"
    },
    value: "P93N3T3NAtFy2K871gLfaq0mid4GyDxZmOZVX2IUe_VIO7lFQSAcg0wl-07kPBu2jatIanlILic3gpjc1rh_2w"
  }
};
Due to the fact that the JSON.stringify() method converts JavaScript objects like above into JSON-compliant strings no special considerations are required for JavaScript.
Appendix C: Counter Signatures
For counter signatures there are several different solutions where Signature Chains is the most straightforward.
Another way dealing with counter signatures is using an application level counter signing solution like the following:
{
  "id": "lADU_sO067Wlgoo52-9L",
  "object": {"type": "house", "price": "$635,000"},
  "role": "buyer",
  "timeStamp": "2019-03-08T13:56:08Z",
  "signature": {
    
Original signature...
  }
}
Counter signed JSON object:
{
  "attesting": {
    "id": "lADU_sO067Wlgoo52-9L",
    "object": {"type": "house", "price": "$635,000"},
    "role": "buyer",
    "timeStamp": "2019-03-08T13:56:08Z",
    "signature": {
      
Original signature...
    }
  },
  "role": "notary",
  "timeStamp": "2016-12-08T13:58:42Z",
  "signature": {
    
Counter signature...
  }
}
For sophisticated peer based counter signature schemes another possibility is using Multiple Signatures, optionally including JSF extensions holding application specific (per signature) metadata.
Appendix D: Usage in Applications
JSF is a core element in a proof-of-concept application [PKIDROID] running on Android.
The sample code below is based on the Java reference implementation [OPENKEY] which features an integrated JSON encoder, decoder and signature solution:
public void signAndVerifyJCS(PrivateKey privateKey, PublicKey publicKey) throws IOException {

  // Create an empty JSON document
  JSONObjectWriter writer = new JSONObjectWriter();

  // Fill it with some data
  writer.setString("myProperty", "Some data");

  // Sign document
  writer.setSignature(new JSONAsymKeySigner(privateKey, publicKey, null));

  // Serialize document
  String json = writer.toString();

  // Print document on the console
  System.out.println("Signed doc: " + json);

  // Parse document
  JSONObjectReader reader = JSONParser.parse(json);

  // Get and verify signature
  JSONSignatureDecoder signature = reader.getSignature(new JSONCryptoHelper.Options());
  signature.verify(new JSONAsymKeyVerifier(publicKey));

  // Print document payload on the console
  System.out.println("Returned data: " + reader.getString("myProperty"));
}
Appendix E: Acknowledgements
During the initial phases of the design process, highly appreciated feedback were provided by Manu Sporny, Jim Klo, Jeffrey Walton, David Chadwick, Jim Schaad, Mike Jones, David Waite, Douglas Crockford, Arne Riiber, Brian Campbell, Sergey Beryozkin, and others.
Special thanks go to James Manger who pointed out the ECMAScript [ES6] number serialization scheme as well as reviewing a related Internet draft.
An early prototype was funded by PrimeKey Solutions AB and the Swedish Innovation Board (VINNOVA).
Appendix F: References
ReferenceDescription
[ES6]A. Wirfs-Brock, "ECMAScript 2015 Language Specification", ECMA-262, June 2015.
https://www.ecma-international.org/ecma-262/6.0/ECMA-262.pdf
[JCS]A. Rundgren, B. Jordan, S. Erdtman, "JCS - JSON Canonicalization Scheme", Work in progress, September 2019. https://tools.ietf.org/html/draft-rundgren-json-canonicalization-scheme-13
[JEF]A. Rundgren, "JEF - JSON Encryption Format", Work in progress, V0.60, Mars 2019. https://cyberphone.github.io/doc/security/jef.html
[OPENKEY]"OpenKeyStore Project", https://github.com/cyberphone/openkeystore
[PKIDROID]"WebPKI Suite", https://play.google.com/store/apps/details?id=org.webpki.mobile.android
[RFC4648]S. Josefsson, "The Base16, Base32, and Base64 Data Encodings", RFC 4648, October 2006. https://tools.ietf.org/html/rfc4648
[RFC5280]D. Cooper, S. Santesson, S. Farrell, S. Boeyen, R. Housley, W. Polk, "Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile", RFC 5280, May 2008. https://tools.ietf.org/html/rfc5280
[RFC7159]T. Bray, "The JavaScript Object Notation (JSON) Data Interchange Format", RFC 7159, March 2014. https://tools.ietf.org/html/rfc7159
[RFC7468]S. Josefsson, S. Leonard, "Textual Encodings of PKIX, PKCS, and CMS Structures", RFC 7468, April 2015. https://tools.ietf.org/html/rfc7468
[RFC7515]M. Jones, J. Bradley, N. Sakimura, "JSON Web Signature (JWS)", RFC 7515, May 2015. https://tools.ietf.org/html/rfc7515
[RFC7517]M. Jones, "JSON Web Key (JWK)", RFC 7517, May 2015. https://tools.ietf.org/html/rfc7517
[RFC7518]M. Jones, "JSON Web Algorithms (JWA)", RFC 7518, May 2015. https://tools.ietf.org/html/rfc7518
[XMLDSIG]D. Eastlake, J. Reagle, D. Solo, F. Hirsch, M. Nystrom, T. Roessler, K. Yiu, "XML Signature Syntax and Processing Version 1.1.", W3C Recommendation, April 2013.
https://www.w3.org/TR/2013/REC-xmldsig-core1-20130411/
[YASMIN]A. Rundgren, "YASMIN - Yet Another jSon Message notatIoN", Work in progress, V0.6, April 2017. https://cyberphone.github.io/doc/web/yasmin.html
Appendix G: Document History
DateVerComment
2013-12-170.3Initial publication in HTML5
2013-12-200.4Changed from Base64 to Base64URL everywhere
2013-12-290.5Added the (now obsoleted) extension facility
2014-01-210.51Added clarification to public key parameter representation
2014-01-260.52Added note regarding the (now obsoleted) signerCertificate option
2014-04-150.53Embedded (the now obsoleted) bigint in JS string
2014-09-170.54Changed canonicalization to normalization
2014-09-230.55Aligned EC parameter representation with JWS [RFC7515]
2014-12-080.56Removed [XMLDSIG] bloat and added support for JWA [RFC7515] algorithm identifiers
2014-12-190.57Added an interoperability section
2015-01-120.58Added clarification to signature value representation
2016-01-110.59Added ECMAScript compatibility mode
2017-04-190.60Changed public keys to use JWK [RFC7517] format
2017-05-180.70Added multiple signatures and test vectors
2019-03-050.80Rewritten to use the JCS [JCS] canonicalization scheme
2019-10-120.81Added signature chains (chain)
Appendix H: Author
JSF was developed by Anders Rundgren (anders.rundgren.net@gmail.com) as a part of the OpenKeyStore project [OPENKEY].