Lab

Selective Disclosure - Experiments

This is a set of "printouts" from a PoC using SD-CWT as foundation but rather building on Deterministically Encoded CBOR and Embedded Signatures.

This PoC is based on the IETF draft https://www.ietf.org/archive/id/draft-ietf-spice-sd-cwt-04.html.

Note: this is NOT a standards proposal!
Disclosures
Note: although the input data and salts are identical to those in the IETF draft, the resulting blinded claims differ. This is because there is no obvious need to wrap claims in bstr when you have deterministic encoding.
# The Selectable Disclosures
[
  [
    / salt /   h'bae611067bb823486797da1ebbb52f83',
    / value /  "ABCD-123456",
    / claim /  501           # inspector_license_number
  ], [
    / salt /   h'8de86a012b3043ae6e4457b9e1aaab80',
    / value /  1549560720    # inspected 7-Feb-2019
  ], [
    / salt /   h'7af7084b50badeb57d49ea34627c7a52',
    / value /  1612560720    # inspected 4-Feb-2021
  ], [
    / salt /   h'ec615c3035d5a4ff2f5ae29ded683c8e',
    / value /  "ca",
    / claim /  "region"      # region=California
  ], [
    / salt /   h'37c23d4ec4db0806601e6b6dc6670df9',
    / value /  "94188",
    / claim /  "postal_code"
  ]
]
Enhanced "SD-CWT" Using an Embedded Signature
Note: there is no "typ" entry. This is because embedded signatures span over the entire container, and therefore make a top-level CBOR embedding tag a more logical place for object IDs. Unlike the CWT solution, this way of typing CBOR objects is universal.

A side-effect of this arrangement is that top-level object IDs eliminate the need for application-specific media types; application/cbor suffice.

The following is a verifiable and authentic toString() printout of the enhanced SD-CWT object:

1010(["https://example.com/sd-cde", {
  1: "https://issuer.example",
  2: "https://device.example",
  4: 1725330600,
  5: 1725243900,
  6: 1725244200,
  8: {
    1: {
      1: 2,
      -1: 1,
      -2: h'8554eb275dcd6fbd1c7ac641aa2c90d92022fd0d3024b5af18c7cc61ad527a2d',
      -3: h'4dc7ae2c677e96d0cc82597655ce92d5503f54293d87875d1e79ce4770194343'
    },
    2: -16
  },
  500: true,
  502: [
    60(h'3e2fcbd972ed38c068af06771916cd89871d96c327e5c2eee99476e313b6d632'),
    60(h'c3cb1cc05eeb7b2abd5f4c2febdedab35d5dee5e358c4c5956ebe808fdb58370'),
    1674004740
  ],
  503: {
    "country": "us",
    simple(59): [
      h'3e66c2ae99733a76d0e55884fc92bb11b4abbcf8f84bbf9006bd09db570b0e32',
      h'e6f908ed313a889f3981e3d3fe84991e3d80f5f081b9f5b6e4666a0ac74cf8f5'
    ]
  },
  simple(59): [
    h'd9df03da474fcb3c65771748e2e0608cf437504ecc24f450aaeacd40dd552b3f'
  ],
  simple(99): {
    1: -51,
    3: "https://issuer.example/cwk3.cbor",
    6: h'89bfaf9c460cd8f1fbfafd7a9d4d6dbe8400b27f4b2b1b3614b6ef938263f0a1efb8bd6a3cec2619092f8b8c16149060398a2cae9a281e93d99bf01a5fbb09e35966e7c6357041f24cb0d7d301b4bbe4a09b131d61bcfb9cf59a263c94015896'
  },
  simple(100): [
    [h'bae611067bb823486797da1ebbb52f83', "ABCD-123456", 501],
    [h'8de86a012b3043ae6e4457b9e1aaab80', 1549560720],
    [h'7af7084b50badeb57d49ea34627c7a52', 1612560720],
    [h'ec615c3035d5a4ff2f5ae29ded683c8e', "ca", "region"],
    [h'37c23d4ec4db0806601e6b6dc6670df9', "94188", "postal_code"]
  ]
}])
The elimination of bstr for holding application data makes documents maintain an appearance that is close to the publishing format.

The following is a toString() printout of the original (IETF) SD-CWT:

18([
  h'a401382204582068747470733a2f2f6973737565722e6578616d706c652f636f73652d6b65793310726170706c69636174696f6e2f73642d637774122f',
  {
    17: [
      h'8350bae611067bb823486797da1ebbb52f836b414243442d3132333435361901f5',
      h'82508de86a012b3043ae6e4457b9e1aaab801a5c5c6b90',
      h'82507af7084b50badeb57d49ea34627c7a521a601db950',
      h'8350ec615c3035d5a4ff2f5ae29ded683c8e62636166726567696f6e',
      h'835037c23d4ec4db0806601e6b6dc6670df96539343138386b706f7374616c5f636f6465'
    ]
  },
  h'aa017668747470733a2f2f6973737565722e6578616d706c65027668747470733a2f2f6465766963652e6578616d706c65041a66d674a8051a66d521fc061a66d5232808a101a4010220012158208554eb275dcd6fbd1c7ac641aa2c90d92022fd0d3024b5af18c7cc61ad527a2d2258204dc7ae2c677e96d0cc82597655ce92d5503f54293d87875d1e79ce47701943431901f4f51901f683d83c58201b7fc8ecf4b1290712497d226c04b503b4aa126c603c83b75d2679c3c613f3fdd83c582064afccd3ad52da405329ad935de1fb36814ec48fdfd79e3a108ef858e291e1461a63c749041901f7a267636f756e747279627573f83b8258200d4b8c6123f287a1698ff2db15764564a976fb742606e8fd00e2140656ba0df35820c0b7747f960fc2e201c4d47c64fee141b78e3ab768ce941863dc8914e8f5815ff83b815820af375dc3fba1d082448642c00be7b2f7bb05c9d8fb61cfc230ddfdfb4616a693',
  h'9c9022e57adb33c853f30b6e8a590f406ca55849d7b8cd2a2519d3aec03e61b9ef0ecd85fe96103f916f58d73cd2f7754c390401945f0683b144d3504e500f94d30433c3445417dc3c920f7a155548e91994601827d0a46ead66ff450485e85f'
])
This object is obviously rather hard to "decipher" (and debug) compared to its Authored Counterpart, although they are (with respect to CBOR), identical.
Enhanced "SD-KBT" Using an Embedded Signature
The following is a verifiable and authentic toString() printout of an enhanced SD-KBT object holding 3 disclosures:
1010(["https://example.com/sd-kbt", {
  3: "https://verifier.example/app",
  6: 1725244237,
  13: 1010(["https://example.com/sd-cde", {
    1: "https://issuer.example",
    2: "https://device.example",
    4: 1725330600,
    5: 1725243900,
    6: 1725244200,
    8: {
      1: {
        1: 2,
        -1: 1,
        -2: h'8554eb275dcd6fbd1c7ac641aa2c90d92022fd0d3024b5af18c7cc61ad527a2d',
        -3: h'4dc7ae2c677e96d0cc82597655ce92d5503f54293d87875d1e79ce4770194343'
      },
      2: -16
    },
    500: true,
    502: [
      60(h'3e2fcbd972ed38c068af06771916cd89871d96c327e5c2eee99476e313b6d632'),
      60(h'c3cb1cc05eeb7b2abd5f4c2febdedab35d5dee5e358c4c5956ebe808fdb58370'),
      1674004740
    ],
    503: {
      "country": "us",
      simple(59): [
        h'3e66c2ae99733a76d0e55884fc92bb11b4abbcf8f84bbf9006bd09db570b0e32',
        h'e6f908ed313a889f3981e3d3fe84991e3d80f5f081b9f5b6e4666a0ac74cf8f5'
      ]
    },
    simple(59): [
      h'd9df03da474fcb3c65771748e2e0608cf437504ecc24f450aaeacd40dd552b3f'
    ],
    simple(99): {
      1: -51,
      3: "https://issuer.example/cwk3.cbor",
      6: h'89bfaf9c460cd8f1fbfafd7a9d4d6dbe8400b27f4b2b1b3614b6ef938263f0a1efb8bd6a3cec2619092f8b8c16149060398a2cae9a281e93d99bf01a5fbb09e35966e7c6357041f24cb0d7d301b4bbe4a09b131d61bcfb9cf59a263c94015896'
    },
    simple(100): [
      [h'bae611067bb823486797da1ebbb52f83', "ABCD-123456", 501],
      [h'8de86a012b3043ae6e4457b9e1aaab80', 1549560720],
      [h'ec615c3035d5a4ff2f5ae29ded683c8e', "ca", "region"]
    ]
  }]),
  39: h'8c0f5f523b95bea44a9a48c649240803',
  simple(99): {
    1: -9,
    6: h'e5412a854f501d3f14ec4b20f91b5de187a08688a947ee49d5505f3c6238b08f6b02120cdb9cd7b16cf99b27e7f5873255d15640412be031d115cc6756598789'
  }
}])
Note that embedded signatures preserve the underlying data in clear.

The following is a toString() printout of the original (IETF) SD-KBT:

18([
  h'a301260dd284583da401382204582068747470733a2f2f6973737565722e6578616d706c652f636f73652d6b65793310726170706c69636174696f6e2f73642d637774122fa1118358218350bae611067bb823486797da1ebbb52f836b414243442d3132333435361901f55782508de86a012b3043ae6e4457b9e1aaab801a5c5c6b90581c8350ec615c3035d5a4ff2f5ae29ded683c8e62636166726567696f6e590161aa017668747470733a2f2f6973737565722e6578616d706c65027668747470733a2f2f6465766963652e6578616d706c65041a66d674a8051a66d521fc061a66d5232808a101a4010220012158208554eb275dcd6fbd1c7ac641aa2c90d92022fd0d3024b5af18c7cc61ad527a2d2258204dc7ae2c677e96d0cc82597655ce92d5503f54293d87875d1e79ce47701943431901f4f51901f683d83c58201b7fc8ecf4b1290712497d226c04b503b4aa126c603c83b75d2679c3c613f3fdd83c582064afccd3ad52da405329ad935de1fb36814ec48fdfd79e3a108ef858e291e1461a63c749041901f7a267636f756e747279627573f83b8258200d4b8c6123f287a1698ff2db15764564a976fb742606e8fd00e2140656ba0df35820c0b7747f960fc2e201c4d47c64fee141b78e3ab768ce941863dc8914e8f5815ff83b815820af375dc3fba1d082448642c00be7b2f7bb05c9d8fb61cfc230ddfdfb4616a69358609c9022e57adb33c853f30b6e8a590f406ca55849d7b8cd2a2519d3aec03e61b9ef0ecd85fe96103f916f58d73cd2f7754c390401945f0683b144d3504e500f94d30433c3445417dc3c920f7a155548e91994601827d0a46ead66ff450485e85f10726170706c69636174696f6e2f6b622b637774',
  {},
  h'a303781c68747470733a2f2f76657269666965722e6578616d706c652f617070061a66d5234d1827508c0f5f523b95bea44a9a48c649240803',
  h'd895729e72a3a7c801d5a20e9daf510327858aecbb39b8b2e4bc11cbbd625ea8c60b78da31fc9762c46b7cd61094d0475ff1f19a7496cde53ab11600a5859d10'
])
Issuer Key
Issuer COSE Key in Extended Diagnostic Notation (EDN).
{
  /kty/  1 : 2,     # EC2
  /kid/  2 : "https://issuer.example/cwk3.cbor",
  /alg/  3 : -51,   # ESP384
  /crv/ -1 : 2,     # P-384
  /x/   -2 : h'c31798b0c7885fa3528fbf877e5b4c3a6dc67a5a5dc6b307b728c3725926f2abe5fb4964cd91e3948a5493f6ebb6cbbf',
  /y/   -3 : h'8f6c7ec761691cad374c4daa9387453f18058ece58eb0a8e84a055a31fb7f9214b27509522c159e764f8711e11609554',
  /d/   -4 : h'71c54d2221937ea612db1221f0d3ddf771c9381c4e3be41d5aa0a89d685f09cfef74c4bbf104783fd57e87ab227d074c'
}
Holder Key
Holder COSE Key in Extended Diagnostic Notation (EDN).
{
  /kty/  1 : 2,     # EC2
  /alg/  3 : -9,    # ESP256
  /crv/ -1 : 1,     # P-256
  /x/   -2 : h'8554eb275dcd6fbd1c7ac641aa2c90d92022fd0d3024b5af18c7cc61ad527a2d',
  /y/   -3 : h'4dc7ae2c677e96d0cc82597655ce92d5503f54293d87875d1e79ce4770194343',
  /d/   -4 : h'5759a86e59bb3b002dde467da4b52f3d06e6c2cd439456cf0485b9b864294ce5'
}
The Original (IETF) SD-CWT
/ cose-sign1 / 18([  / issuer SD-CWT /
  / CWT protected / << {
    / alg /    1  : -35, / ES384 /
    / kid /    4  : 'https://issuer.example/cose-key3',
    / typ /    16 : "application/sd-cwt",
    / sd_alg / 18 : -16  / SHA256 /
  } >>,
  / CWT unprotected / {
    / sd_claims / 17 : [ / these are all the disclosures /
        <<[
            /salt/   h'bae611067bb823486797da1ebbb52f83',
            /value/  "ABCD-123456",
            /claim/  501   / inspector_license_number /
        ]>>,
        <<[
            /salt/   h'8de86a012b3043ae6e4457b9e1aaab80',
            /value/  1549560720   / inspected 7-Feb-2019 /
        ]>>,
        <<[
            /salt/   h'7af7084b50badeb57d49ea34627c7a52',
            /value/  1612560720   / inspected 4-Feb-2021 /
        ]>>,
        <<[
            /salt/   h'ec615c3035d5a4ff2f5ae29ded683c8e',
            /value/  "ca",
            /claim/  "region"   / region=California /
        ]>>,
        <<[
            /salt/   h'37c23d4ec4db0806601e6b6dc6670df9',
            /value/  "94188",
            /claim/  "postal_code"
        ]>>
    ]
  },
  / CWT payload / << {
    / iss / 1   : "https://issuer.example",
    / sub / 2   : "https://device.example",
    / exp / 4   : 1725330600,  /2024-09-03T02:30:00+00:00Z/
    / nbf / 5   : 1725243900,  /2024-09-02T02:25:00+00:00Z/
    / iat / 6   : 1725244200,  /2024-09-02T02:30:00+00:00Z/
    / cnf / 8   : {
      / cose key / 1 : {
        / kty /  1: 2,  / EC2   /
        / crv / -1: 1,  / P-256 /
        / x /   -2: h'8554eb275dcd6fbd1c7ac641aa2c90d9
                      2022fd0d3024b5af18c7cc61ad527a2d',
        / y /   -3: h'4dc7ae2c677e96d0cc82597655ce92d5
                      503f54293d87875d1e79ce4770194343'
      }
    },
    /most_recent_inspection_passed/ 500: true,
    /inspection_dates/ 502 : [
        / redacted inspection date 7-Feb-2019 /
        60(h'1b7fc8ecf4b1290712497d226c04b503
             b4aa126c603c83b75d2679c3c613f3fd'),
        / redacted inspection date 4-Feb-2021 /
        60(h'64afccd3ad52da405329ad935de1fb36
             814ec48fdfd79e3a108ef858e291e146'),
        1674004740   / 2023-01-17T17:19:00 /
    ],
    / inspection_location / 503 : {
        "country" : "us",            / United States /
        / redacted_claim_keys / simple(59) : [
            / redacted region /
            h'0d4b8c6123f287a1698ff2db15764564
              a976fb742606e8fd00e2140656ba0df3',
            / redacted postal_code /
            h'c0b7747f960fc2e201c4d47c64fee141
              b78e3ab768ce941863dc8914e8f5815f'
      ]
    },
    / redacted_claim_keys / simple(59) : [
        / redacted inspector_license_number /
        h'af375dc3fba1d082448642c00be7b2f7
          bb05c9d8fb61cfc230ddfdfb4616a693'
    ]
  } >>,
  / CWT signature / h'9c9022e57adb33c853f30b6e8a590f40
                      6ca55849d7b8cd2a2519d3aec03e61b9
                      ef0ecd85fe96103f916f58d73cd2f775
                      4c390401945f0683b144d3504e500f94
                      d30433c3445417dc3c920f7a155548e9
                      1994601827d0a46ead66ff450485e85f'
])
Slightly edited with respect to comma separators 😉
Author and Version
Author: Anders Rundgren
Current version: 2025-09-11.1