Slide 1

Slide 1 text

ABC’s of CWT CBOR, COSE, CWT

Slide 2

Slide 2 text

3 RFCs CBOR RFC7049 COSE RFC8152 CWT RFC8392

Slide 3

Slide 3 text

3 RFCs CBOR RFC7049 COSE RFC8152 CWT RFC8392 JSON JOSE (JWS, JWE, JWK, JWA) JWT

Slide 4

Slide 4 text

3行で ✘ CBOR : コンパクトなバイナリ表現 ✘ COSE : 署名,暗号化 ✘ CWT : コンパクトなクレーム定義

Slide 5

Slide 5 text

1. CBOR Concise Binary Object Representation RFC 7049

Slide 6

Slide 6 text

CBOR The Concise Binary Object Representation (CBOR) is a data format whose design goals include the possibility of extremely small code size, fairly small message size, and extensibility without the need for version negotiation. コードサイズ > メッセージサイズ

Slide 7

Slide 7 text

GOAL ✘ 一般的なデータフォーマットのエンコード ✘ エンコーダ/デコーダをコンパクトに実装可能 ✘ デコードのためのスキーマ不要 ✘ 合理的なコンパクトシリアライゼーション ✘ CPU使用率 ✘ JSON互換 ✘ 拡張性

Slide 8

Slide 8 text

表現可能なデータ ✘ 整数 (unsigned, negative) ✘ バイナリ / テキスト ✘ Array / Map ✘ 浮動小数点数 / 多倍長整数 ✘ true / false / null / undefined ✘ 日付 / 日時

Slide 9

Slide 9 text

CBORを試すには http://cbor.me

Slide 10

Slide 10 text

整数 # 0 (unsigned int8) 00 # unsigned(0) # 23 17 # unsigned(23) # 24 18 18 # unsigned(24) # 255 18 FF # unsigned(255) ✘ 0 ~ 23 までは そのまま1 バイトで表現 ✘ 24 ~ 255 までは先頭 18(<<24>>) の後に “18 ~ FF” が続く

Slide 11

Slide 11 text

整数 # 256 (unsigned int16) 19 0100 # unsigned(256) # 65535 19 FFFF # unsigned(65535) # 65536 (unsigned int32) 1A 00010000 # unsigned(65536) # 4294967296 (unsigned int64) 1B 0000000100000000 # unsigned(4294967296) # 18446744073709551615 1B FFFFFFFFFFFFFFFF # unsigned(18446744073709551615) ✘ 256 ~ 65535 は先頭 19(<<25>>) の後に“0100 ~ FFFF” が続く

Slide 12

Slide 12 text

バイナリ #h'6162636465' 45 # bytes(5) 6162636465 # "abcde" #h'6162636465666768696A6B6C6D6E6F707172737475767778' 58 18 # bytes(24) 6162636465666768696A6B6C6D6E6F707172737475767778 # "abcdefghijklmnopqrstuvwx" ✘ バイナリを表現する先頭 バイトは 40~ ✘ 長さが5なので先頭は 40 + 5 ✘ 長さが24なので先頭は40 + 18, その後ろに18

Slide 13

Slide 13 text

テキスト # "abcde" 65 # text(5) 6162636465 # "abcde" # "abcdefghijklmnopqrstuvwx" 78 18 # text(24) 6162636465666768696A6B6C6D6E6F707172737475767778 # "abcdefghijklmnopqrstuvwx" ✘ バイナリを表現する先頭 バイトは 60~ ✘ 長さが5なので先頭は 60 + 5 ✘ 長さが24なので先頭は60 + 18, その後ろに18

Slide 14

Slide 14 text

Array / Map # [1, "a"] 82 # array(2) 01 # unsigned(1) 61 # text(1) 61 # "a" # {1:"a"} A1 # map(1) 01 # unsigned(1) 61 # text(1) 61 # "a"

Slide 15

Slide 15 text

不定長 # [_ 1, "a"] 9F # array(*) 01 # unsigned(1) 61 # text(1) 61 # "a" FF # primitive(*) # {_ 1:"a"} BF # map(*) 01 # unsigned(1) 61 # text(1) 61 # "a" FF # primitive(*)

Slide 16

Slide 16 text

value CBOR JSON [] 1 2 [1, 2, 3, 4] 5 9 [“a”, “b”, “c”, “d”] 9 17 {} 1 2 {1:2, 3:4} 5 13 {“a”:”b”, “c”:”d”} 9 17 CBOR vs JSON

Slide 17

Slide 17 text

value CBOR JSON 0 1 1 23 1 2 18446744073709551615 9 20 18446744073709551616 11 20 "12345678901234567890123" 24 25 "123456789012345678901234" 26 26 h’01020304’ 5 10(Base64 encoded) 32bytes binary 34 46(Base64 encoded)

Slide 18

Slide 18 text

2. COSE CBOR Object Signing and Encryption RFC 8152

Slide 19

Slide 19 text

COSE vs JOSE COSE 内容 JOSE Signing 署名つきオブジェクト JWS(alg=RSXXX, ESXXX) Encryption 暗号化されたオブジェクト JWE MAC MAC値つきオブジェクト JWS(alg=HSXXX) Algorithms 使用するアルゴリズム JWA Key 鍵の表現 JWK

Slide 20

Slide 20 text

Basic COSE Object 全てのCOSEメッセージはCBOR配列形式、最初の3要素は 1. バイナリ文字列で表現された protected header の集合. 暗 号処理に関わるパラメータ 2. Map で表現された unprotected header の集合 3. 平文(Signing, MAC)もしくは暗号化された(Encryption)メッ セージの内容

Slide 21

Slide 21 text

Signing Objects 署名つきオブジェクト ✘ COSE_Sign : 1つのコンテンツに対する複数の署名を含む 形式。 JOSE で言う所の JWS JSON Serialization ✘ COSE_Sign1 : 1つのコンテンツに対して1つの署名を含む形 式。 JOSE で言う所の JWS Compact Serialization

Slide 22

Slide 22 text

COSE_Sign1 # COSE_Sign1 用の CBOR Tag は 18 COSE_Sign1_Tagged = #6.18(COSE_Sign1) # ヘッダー、ペイロード、署名から構成される COSE_Sign1 = [ Headers, payload : bstr / nil, signature : bstr ]

Slide 23

Slide 23 text

Sample 18( [ / protected / h' a10126' / { \ alg \ 1:-7 \ ECDSA 256 \ } / , / unprotected / { / kid / 4:'11' }, / payload / 'This is the content.', / signature / h'8eb33e4ca31d1c465ab05aac34cc6b23d58fef5c083106c4d25a91aef0b0117e2af9a291aa32e14ab834 dc56ed2a223444547e01f11d3b0916e5a4c345cacb36'])

Slide 24

Slide 24 text

Decoded D2 8443 A10126 A10442313154 546869732069732074686520636F6E74656E742E5840 8EB33E4CA31D1C465AB05AAC34CC6B23D58FEF5C083 106C4D25A91AEF0B0117E2AF9A291AA32E14AB834DC5 6ED2A223444547E01F11D3B0916E5A4C345CACB36

Slide 25

Slide 25 text

Signature Algorithms RFCで定義されているもの ✘ ES256, ES384, ES512 : ECDSA w/ SHA-XXX ✘ EdDSA : EdDSA

Slide 26

Slide 26 text

Signature Algorithms WebAuthn で追加されたもの ✘ RS256, RS384, RS512 : RSASSA-PKCS1-v1_5 w/ SHA-XXX ✘ ED256 : TPM_ECC_BN_P256 curve w/ SHA-256 ✘ ED512 : ECC_BN_ISOP512 curve ✘ RS1 : RSASSA-PKCS1-v1_5 w/ SHA-1

Slide 27

Slide 27 text

Key Object Parameters COSE_Key = { 1 => tstr / int, ; kty ? 2 => bstr, ; kid ? 3 => tstr / int, ; alg ? 4 => [+ (tstr / int) ], ; key_ops ? 5 => bstr, ; Base IV * label => values }

Slide 28

Slide 28 text

3. CWT CBOR Web Token RFC 8392

Slide 29

Slide 29 text

JWT (RFC 7519) Registered Claims Name Value Type iss text string sub text string aud text string(array of text string) exp integer of floating-point number nbf integer of floating-point number iat integer of floating-point number jti text string

Slide 30

Slide 30 text

CWT Registered Claims Name Value Type Key iss text string 1 sub text string 2 aud text string(array of text string) 3 exp integer of floating-point number 4 nbf integer of floating-point number 5 iat integer of floating-point number 6 cti byte string 7

Slide 31

Slide 31 text

Example CWT Claims Set { / iss / 1: "coap://as.example.com", / sub / 2: "erikw", / aud / 3: "coap://light.example.com", / exp / 4: 1444064944, / nbf / 5: 1443944944, / iat / 6: 1443944944, / cti / 7: h'0b71' }

Slide 32

Slide 32 text

A7 # map(7) 01 # unsigned(1) 75 # text(21) 636F61703A2F2F61732E6578616D706C652E636F6D # "coap://as.example.com" 02 # unsigned(2) 65 # text(5) 6572696B77 # "erikw" 03 # unsigned(3) 78 18 # text(24) 636F61703A2F2F6C696768742E6578616D706C652E636F6D # "coap://light.example.com" 04 # unsigned(4) 1A 5612AEB0 # unsigned(1444064944) 05 # unsigned(5) 1A 5610D9F0 # unsigned(1443944944) 06 # unsigned(6) 1A 5610D9F0 # unsigned(1443944944) 07 # unsigned(7) 42 # bytes(2) 0B71 # "\vq"            -> 80バイト

Slide 33

Slide 33 text

CWT CBOR Tag / CWT CBOR tag / 61( / COSE_Mac0 CBOR tag / 17( / COSE_Mac0 object / ) ) ->「61 から始まるのはCWTで次に来るのがCOSEのTag」

Slide 34

Slide 34 text

もう一度、3行で ✘ CBOR : コンパクトなバイナリ表現 ✘ COSE : 署名,暗号化 ✘ CWT : コンパクトなクレーム定義など

Slide 35

Slide 35 text

thanks! https://qiita.com/search?q=CWT入門 CREDIT ✘ Presentation template by SlidesCarnival ✘ Photographs by Unsplash