Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ABC's of CWT - idcon vol.24

658c29959d8a9fd352afa440a5813137?s=47 ritou
June 08, 2018

ABC's of CWT - idcon vol.24

#idcon vol.24 ~ #fidcon 再び の発表で使用したスライドです。
https://idcon.connpass.com/event/84839/

658c29959d8a9fd352afa440a5813137?s=128

ritou

June 08, 2018
Tweet

Transcript

  1. ABC’s of CWT CBOR, COSE, CWT

  2. 3 RFCs CBOR RFC7049 COSE RFC8152 CWT RFC8392

  3. 3 RFCs CBOR RFC7049 COSE RFC8152 CWT RFC8392 JSON JOSE

    (JWS, JWE, JWK, JWA) JWT
  4. 3行で ✘ CBOR : コンパクトなバイナリ表現 ✘ COSE : 署名,暗号化 ✘

    CWT : コンパクトなクレーム定義
  5. 1. CBOR Concise Binary Object Representation RFC 7049

  6. 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. コードサイズ > メッセージサイズ
  7. GOAL ✘ 一般的なデータフォーマットのエンコード ✘ エンコーダ/デコーダをコンパクトに実装可能 ✘ デコードのためのスキーマ不要 ✘ 合理的なコンパクトシリアライゼーション ✘

    CPU使用率 ✘ JSON互換 ✘ 拡張性
  8. 表現可能なデータ ✘ 整数 (unsigned, negative) ✘ バイナリ / テキスト ✘

    Array / Map ✘ 浮動小数点数 / 多倍長整数 ✘ true / false / null / undefined ✘ 日付 / 日時
  9. CBORを試すには http://cbor.me

  10. 整数 # 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” が続く
  11. 整数 # 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” が続く
  12. バイナリ #h'6162636465' 45 # bytes(5) 6162636465 # "abcde" #h'6162636465666768696A6B6C6D6E6F707172737475767778' 58

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

    "abcdefghijklmnopqrstuvwx" 78 18 # text(24) 6162636465666768696A6B6C6D6E6F707172737475767778 # "abcdefghijklmnopqrstuvwx" ✘ バイナリを表現する先頭 バイトは 60~ ✘ 長さが5なので先頭は 60 + 5 ✘ 長さが24なので先頭は60 + 18, その後ろに18
  14. 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"
  15. 不定長 # [_ 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(*)
  16. 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
  17. 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)
  18. 2. COSE CBOR Object Signing and Encryption RFC 8152

  19. COSE vs JOSE COSE 内容 JOSE Signing 署名つきオブジェクト JWS(alg=RSXXX, ESXXX)

    Encryption 暗号化されたオブジェクト JWE MAC MAC値つきオブジェクト JWS(alg=HSXXX) Algorithms 使用するアルゴリズム JWA Key 鍵の表現 JWK
  20. Basic COSE Object 全てのCOSEメッセージはCBOR配列形式、最初の3要素は 1. バイナリ文字列で表現された protected header の集合. 暗

    号処理に関わるパラメータ 2. Map で表現された unprotected header の集合 3. 平文(Signing, MAC)もしくは暗号化された(Encryption)メッ セージの内容
  21. Signing Objects 署名つきオブジェクト ✘ COSE_Sign : 1つのコンテンツに対する複数の署名を含む 形式。 JOSE で言う所の

    JWS JSON Serialization ✘ COSE_Sign1 : 1つのコンテンツに対して1つの署名を含む形 式。 JOSE で言う所の JWS Compact Serialization
  22. COSE_Sign1 # COSE_Sign1 用の CBOR Tag は 18 COSE_Sign1_Tagged =

    #6.18(COSE_Sign1) # ヘッダー、ペイロード、署名から構成される COSE_Sign1 = [ Headers, payload : bstr / nil, signature : bstr ]
  23. Sample 18( [ / protected / h' a10126' / {

    \ alg \ 1:-7 \ ECDSA 256 \ } / , / unprotected / { / kid / 4:'11' }, / payload / 'This is the content.', / signature / h'8eb33e4ca31d1c465ab05aac34cc6b23d58fef5c083106c4d25a91aef0b0117e2af9a291aa32e14ab834 dc56ed2a223444547e01f11d3b0916e5a4c345cacb36'])
  24. Decoded D2 8443 A10126 A10442313154 546869732069732074686520636F6E74656E742E5840 8EB33E4CA31D1C465AB05AAC34CC6B23D58FEF5C083 106C4D25A91AEF0B0117E2AF9A291AA32E14AB834DC5 6ED2A223444547E01F11D3B0916E5A4C345CACB36

  25. Signature Algorithms RFCで定義されているもの ✘ ES256, ES384, ES512 : ECDSA w/

    SHA-XXX ✘ EdDSA : EdDSA
  26. 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
  27. 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 }
  28. 3. CWT CBOR Web Token RFC 8392

  29. 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
  30. 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
  31. 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' }
  32. 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バイト
  33. CWT CBOR Tag / CWT CBOR tag / 61( /

    COSE_Mac0 CBOR tag / 17( / COSE_Mac0 object / ) ) ->「61 から始まるのはCWTで次に来るのがCOSEのTag」
  34. もう一度、3行で ✘ CBOR : コンパクトなバイナリ表現 ✘ COSE : 署名,暗号化 ✘

    CWT : コンパクトなクレーム定義など
  35. thanks! https://qiita.com/search?q=CWT入門 CREDIT ✘ Presentation template by SlidesCarnival ✘ Photographs

    by Unsplash