Passa al contenuto principale

Appendice C. Esempi

Questa appendice include una serie di esempi che mostrano le diverse funzionalità e tipi di messaggi che sono stati definiti in questo documento. Per rendere gli esempi più facili da leggere, sono presentati utilizzando la notazione diagnostica CBOR estesa (definita in [RFC8610]) piuttosto che come dump binario.

È stato creato un progetto GitHub su [GitHub-Examples] che contiene non solo gli esempi presentati in questo documento, ma anche un set più completo di esempi di test. Ogni esempio si trova in un file JSON che contiene gli input utilizzati per creare l'esempio, alcuni dei valori intermedi che possono essere utilizzati nel debug dell'esempio e l'output dell'esempio presentato sia come dump esadecimale che nel formato di notazione diagnostica CBOR. Alcuni degli esempi sul sito sono progettati per essere casi di test di fallimento; questi sono chiaramente contrassegnati come tali nel file JSON. Se vengono trovati errori negli esempi in questo documento, gli esempi su GitHub verranno aggiornati e una nota in tal senso verrà inserita nel file JSON.

Come notato, gli esempi sono presentati utilizzando la notazione diagnostica di CBOR. Esiste uno strumento basato su Ruby che può convertire tra la notazione diagnostica e il binario. Questo strumento può essere installato con la riga di comando:

gem install cbor-diag

La notazione diagnostica può essere convertita in file binari utilizzando la seguente riga di comando:

diag2cbor.rb < inputfile > outputfile

Gli esempi possono essere estratti dalla versione XML di questo documento tramite un'espressione XPath, poiché tutto il codice sorgente è etichettato con l'attributo type='cbor-diag'. (A seconda del valutatore XPath che si sta utilizzando, potrebbe essere necessario trattare > come un'entità.)

//sourcecode[@type='cbor-diag']/text()

C.1. Esempi di messaggi firmati

C.1.1. Firma singola

Questo esempio utilizza quanto segue:

  • Algoritmo di firma: ECDSA con SHA-256, Curva P-256

La dimensione del file binario è 103 byte

98(
[
/ protected / h'',
/ unprotected / {},
/ payload / 'This is the content.',
/ signatures / [
[
/ protected h'a10126' / &lt;&lt; {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
]
]
]
)

C.1.2. Firmatari multipli

Questo esempio utilizza quanto segue:

  • Algoritmo di firma: ECDSA con SHA-256, Curva P-256

  • Algoritmo di firma: ECDSA con SHA-512, Curva P-521

La dimensione del file binario è 277 byte

98(
[
/ protected / h'',
/ unprotected / {},
/ payload / 'This is the content.',
/ signatures / [
[
/ protected h'a10126' / &lt;&lt; {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
],
[
/ protected h'a1013823' / &lt;&lt; {
/ alg / 1:-36 / ECDSA 521 /
} >> ,
/ unprotected / {
/ kid / 4:'[email protected]'
},
/ signature / h'00a2d28a7c2bdb1587877420f65adf7d0b9a06635dd1
de64bb62974c863f0b160dd2163734034e6ac003b01e8705524c5c4ca479a952f024
7ee8cb0b4fb7397ba08d009e0c8bf482270cc5771aa143966e5a469a09f613488030
c5b07ec6d722e3835adb5b2d8c44e95ffb13877dd2582866883535de3bb03d01753f
83ab87bb4f7a0297'
]
]
]
)

C.1.3. Firma con criticità

Questo esempio utilizza quanto segue:

  • Algoritmo di firma: ECDSA con SHA-256, Curva P-256

  • C'è un marcatore di criticità sul parametro di intestazione "reserved".

La dimensione del file binario è 125 byte

98(
[
/ protected h'a2687265736572766564f40281687265736572766564' /
&lt;&lt; {
"reserved":false,
/ crit / 2:[
"reserved"
]
} >>,
/ unprotected / {},
/ payload / 'This is the content.',
/ signatures / [
[
/ protected h'a10126' / &lt;&lt; {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ signature / h'3fc54702aa56e1b2cb20284294c9106a63f91bac658d
69351210a031d8fc7c5ff3e4be39445b1a3e83e1510d1aca2f2e8a7c081c7645042b
18aba9d1fad1bd9c'
]
]
]
)

C.2. Esempi di firmatario singolo

C.2.1. Firma ECDSA singola

Questo esempio utilizza quanto segue:

  • Algoritmo di firma: ECDSA con SHA-256, Curva P-256

La dimensione del file binario è 98 byte

18(
[
/ protected h'a10126' / &lt;&lt; {
/ alg / 1:-7 / ECDSA 256 /
} >>,
/ unprotected / {
/ kid / 4:'11'
},
/ payload / 'This is the content.',
/ signature / h'8eb33e4ca31d1c465ab05aac34cc6b23d58fef5c083106c4
d25a91aef0b0117e2af9a291aa32e14ab834dc56ed2a223444547e01f11d3b0916e5
a4c345cacb36'
]
)

C.3. Esempi di messaggi in busta

C.3.1. ECDH diretto

Questo esempio utilizza quanto segue:

  • CEK: AES-GCM con chiave a 128 bit

  • Classe destinatario: ECDH Ephemeral-Static, Curva P-256

La dimensione del file binario è 151 byte

96(
[
/ protected h'a10101' / &lt;&lt; {
/ alg / 1:1 / AES-GCM 128 /
} >>,
/ unprotected / {
/ iv / 5:h'c9cf4df2fe6c632bf7886413'
},
/ ciphertext / h'7adbe2709ca818fb415f1e5df66f4e1a51053ba6d65a1a0
c52a357da7a644b8070a151b0',
/ recipients / [
[
/ protected h'a1013818' / &lt;&lt; {
/ alg / 1:-25 / ECDH-ES + HKDF-256 /
} >>,
/ unprotected / {
/ ephemeral / -1:{
/ kty / 1:2,
/ crv / -1:1,
/ x / -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbf
bf054e1c7b4d91d6280',
/ y / -3:true
},
/ kid / 4:'[email protected]'
},
/ ciphertext / h''
]
]
]
)

C.3.2. Derivazione chiave diretta più

Questo esempio utilizza quanto segue:

  • CEK: AES-CCM con chiave a 128 bit, troncare il tag a 64 bit

  • Classe destinatario: Utilizzare HKDF su un segreto condiviso con i seguenti campi impliciti come parte del contesto.

    • salt: "aabbccddeeffgghh"

    • Identità PartyU: "lighting-client"

    • Identità PartyV: "lighting-server"

    • Altro pubblico supplementare: "Encryption Example 02"

La dimensione del file binario è 91 byte

96(
[
/ protected h'a1010a' / &lt;&lt; {
/ alg / 1:10 / AES-CCM-16-64-128 /
} >>,
/ unprotected / {
/ iv / 5:h'89f52f65a1c580933b5261a76c'
},
/ ciphertext / h'753548a19b1307084ca7b2056924ed95f2e3b17006dfe93
1b687b847',
/ recipients / [
[
/ protected h'a10129' / &lt;&lt; {
/ alg / 1:-10
} >>,
/ unprotected / {
/ salt / -20:'aabbccddeeffgghh',
/ kid / 4:'our-secret'
},
/ ciphertext / h''
]
]
]
)

C.3.3. Contenuto cifrato con dati esterni

Questo esempio utilizza quanto segue:

  • CEK: AES-GCM con chiave a 128 bit

  • Classe destinatario: ECDH Static-Static, Curva P-256 con AES Key Wrap

  • AAD fornito esternamente: h'0011bbcc22dd44ee55ff660077'

La dimensione del file binario è 173 byte

96(
[
/ protected h'a10101' / &lt;&lt; {
/ alg / 1:1 / AES-GCM 128 /
} >> ,
/ unprotected / {
/ iv / 5:h'02d1f7e6f26c43d4868d87ce'
},
/ ciphertext / h'64f84d913ba60a76070a9a48f26e97e863e28529d8f5335
e5f0165eee976b4a5f6c6f09d',
/ recipients / [
[
/ protected / h'a101381f' / {
\ alg \ 1:-32 \ ECDH-SS+A128KW \
} / ,
/ unprotected / {
/ static kid / -3:'[email protected]',
/ kid / 4:'[email protected]',
/ U nonce / -22:h'0101'
},
/ ciphertext / h'41e0d76f579dbd0d936a662d54d8582037de2e366fd
e1c62'
]
]
]
)

C.4. Esempi di messaggi cifrati

C.4.1. Messaggio cifrato semplice

Questo esempio utilizza quanto segue:

  • CEK: AES-CCM con chiave a 128 bit e un tag a 64 bit

La dimensione del file binario è 52 byte

16(
[
/ protected h'a1010a' / &lt;&lt; {
/ alg / 1:10 / AES-CCM-16-64-128 /
} >> ,
/ unprotected / {
/ iv / 5:h'89f52f65a1c580933b5261a78c'
},
/ ciphertext / h'5974e1b99a3a4cc09a659aa2e9e7fff161d38ce71cb45ce
460ffb569'
]
)

C.4.2. Messaggio cifrato con un IV parziale

Questo esempio utilizza quanto segue:

  • CEK: AES-CCM con chiave a 128 bit e un tag a 64 bit

  • Il prefisso per IV è 89F52F65A1C580933B52

La dimensione del file binario è 41 byte

16(
[
/ protected h'a1010a' / &lt;&lt; {
/ alg / 1:10 / AES-CCM-16-64-128 /
} >> ,
/ unprotected / {
/ partial iv / 6:h'61a7'
},
/ ciphertext / h'252a8911d465c125b6764739700f0141ed09192de139e05
3bd09abca'
]
)

C.5. Esempi di messaggi MAC

C.5.1. Segreto condiviso MAC diretto

Questo esempio utilizza quanto segue:

  • MAC: AES-CMAC, chiave a 256 bit, troncata a 64 bit

  • Classe destinatario: segreto condiviso diretto

La dimensione del file binario è 57 byte

97(
[
/ protected h'a1010f' / &lt;&lt; {
/ alg / 1:15 / AES-CBC-MAC-256//64 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'9e1226ba1f81b848',
/ recipients / [
[
/ protected / h'',
/ unprotected / {
/ alg / 1:-6 / direct /,
/ kid / 4:'our-secret'
},
/ ciphertext / h''
]
]
]
)

C.5.2. MAC diretto ECDH

Questo esempio utilizza quanto segue:

  • MAC: HMAC con SHA-256, chiave a 256 bit

  • Classe destinatario: Accordo chiave ECDH, due chiavi statiche, HKDF con struttura di contesto

La dimensione del file binario è 214 byte

97(
[
/ protected h'a10105' / &lt;&lt; {
/ alg / 1:5 / HMAC 256//256 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'81a03448acd3d305376eaa11fb3fe416a955be2cbe7ec96f012c99
4bc3f16a41',
/ recipients / [
[
/ protected h'a101381a' / &lt;&lt; {
/ alg / 1:-27 / ECDH-SS + HKDF-256 /
} >> ,
/ unprotected / {
/ static kid / -3:'[email protected]',
/ kid / 4:'[email protected]',
/ U nonce / -22:h'4d8553e7e74f3c6a3a9dd3ef286a8195cbf8a23d
19558ccfec7d34b824f42d92bd06bd2c7f0271f0214e141fb779ae2856abf585a583
68b017e7f2a9e5ce4db5'
},
/ ciphertext / h''
]
]
]
)

C.5.3. MAC avvolto

Questo esempio utilizza quanto segue:

  • MAC: AES-MAC, chiave a 128 bit, troncata a 64 bit

  • Classe destinatario: AES Key Wrap con una chiave pre-condivisa a 256 bit

La dimensione del file binario è 109 byte

97(
[
/ protected h'a1010e' / &lt;&lt; {
/ alg / 1:14 / AES-CBC-MAC-128//64 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'36f5afaf0bab5d43',
/ recipients / [
[
/ protected / h'',
/ unprotected / {
/ alg / 1:-5 / A256KW /,
/ kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
},
/ ciphertext / h'711ab0dc2fc4585dce27effa6781c8093eba906f227
b6eb0'
]
]
]
)

C.5.4. Messaggio MAC con destinatari multipli

Questo esempio utilizza quanto segue:

  • MAC: HMAC con SHA-256, chiave a 128 bit

  • Classe destinatario: Utilizza due metodi diversi.

    1. ECDH Ephemeral-Static, Curva P-521, AES Key Wrap con chiave a 128 bit

    2. AES Key Wrap con chiave a 256 bit

La dimensione del file binario è 309 byte

97(
[
/ protected h'a10105' / &lt;&lt; {
/ alg / 1:5 / HMAC 256//256 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'bf48235e809b5c42e995f2b7d5fa13620e7ed834e337f6aa43df16
1e49e9323e',
/ recipients / [
[
/ protected h'a101381c' / &lt;&lt; {
/ alg / 1:-29 / ECDH-ES+A128KW /
} >> ,
/ unprotected / {
/ ephemeral / -1:{
/ kty / 1:2,
/ crv / -1:3,
/ x / -2:h'0043b12669acac3fd27898ffba0bcd2e6c366d53bc4db
71f909a759304acfb5e18cdc7ba0b13ff8c7636271a6924b1ac63c02688075b55ef2
d613574e7dc242f79c3',
/ y / -3:true
},
/ kid / 4:'[email protected]'
},
/ ciphertext / h'339bc4f79984cdc6b3e6ce5f315a4c7d2b0ac466fce
a69e8c07dfbca5bb1f661bc5f8e0df9e3eff5'
],
[
/ protected / h'',
/ unprotected / {
/ alg / 1:-5 / A256KW /,
/ kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
},
/ ciphertext / h'0b2c7cfce04e98276342d6476a7723c090dfdd15f9a
518e7736549e998370695e6d6a83b4ae507bb'
]
]
]
)

C.6. Esempi di messaggi MAC0

C.6.1. Segreto condiviso MAC diretto

Questo esempio utilizza quanto segue:

  • MAC: AES-CMAC, chiave a 256 bit, troncata a 64 bit

  • Classe destinatario: segreto condiviso diretto

La dimensione del file binario è 37 byte

17(
[
/ protected h'a1010f' / &lt;&lt; {
/ alg / 1:15 / AES-CBC-MAC-256//64 /
} >> ,
/ unprotected / {},
/ payload / 'This is the content.',
/ tag / h'726043745027214f'
]
)

Notare che questo esempio utilizza gli stessi input dell'Appendice C.5.1.

C.7. Chiavi COSE

C.7.1. Chiavi pubbliche

Questo è un esempio di un set di chiavi COSE. Questo esempio include le chiavi pubbliche per tutti gli esempi precedenti.

In ordine, le chiavi sono:

La dimensione del file binario è 481 byte

[
{
-1:1,
-2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
-3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
1:2,
2:'[email protected]'
},
{
-1:1,
-2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
-3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
1:2,
2:'11'
},
{
-1:3,
-2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
-3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
1:2,
2:'[email protected]'
},
{
-1:1,
-2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
-3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
1:2,
2:'[email protected]'
}
]

C.7.2. Chiavi private

Questo è un esempio di un set di chiavi COSE. Questo esempio include le chiavi private per tutti gli esempi precedenti.

In ordine, le chiavi sono:

  • Una chiave EC con un kid di "[email protected]"

  • Una chiave EC con un kid di "11"

  • Una chiave EC con un kid di "[email protected]"

  • Una chiave a segreto condiviso con un kid di "our-secret"

  • Una chiave EC con un kid di "[email protected]"

  • Una chiave a segreto condiviso con kid "our-secret2"

  • Una chiave a segreto condiviso con un kid di "018c0ae5-4d9b-471b-bfd6-eef314bc7037"

La dimensione del file binario è 816 byte

[
{
1:2,
2:'[email protected]',
-1:1,
-2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
-3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
-4:h'aff907c99f9ad3aae6c4cdf21122bce2bd68b5283e6907154ad911840fa
208cf'
},
{
1:2,
2:'11',
-1:1,
-2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
-3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
-4:h'57c92077664146e876760c9520d054aa93c3afb04e306705db609030850
7b4d3'
},
{
1:2,
2:'[email protected]',
-1:3,
-2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
-3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
-4:h'00085138ddabf5ca975f5860f91a08e91d6d5f9a76ad4018766a476680b
55cd339e8ab6c72b5facdb2a2a50ac25bd086647dd3e2e6e99e84ca2c3609fdf177f
eb26d'
},
{
1:4,
2:'our-secret',
-1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
},
{
1:2,
-1:1,
2:'[email protected]',
-2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
-3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
-4:h'02d1f7e6f26c43d4868d87ceb2353161740aacf1f7163647984b522a848
df1c3'
},
{
1:4,
2:'our-secret2',
-1:h'849b5786457c1491be3a76dcea6c4271'
},
{
1:4,
2:'018c0ae5-4d9b-471b-bfd6-eef314bc7037',
-1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
}
]