Skip to content

Instantly share code, notes, and snippets.

@ritou
Last active February 23, 2018 08:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ritou/ad90812a3978ce67662ffce1d581a96a to your computer and use it in GitHub Desktop.
Save ritou/ad90812a3978ce67662ffce1d581a96a to your computer and use it in GitHub Desktop.
# JOSE.JWK を用いて鍵を作成
iex(1)> jwk = JOSE.JWK.generate_key(:secp256r1)
%JOSE.JWK{
  fields: %{},
  keys: :undefined,
  kty: {:jose_jwk_kty_ec,
   {:ECPrivateKey, 1,
    <<37, 161, 110, 23, 211, 111, 64, 142, 98, 207, 153, 90, 139, 91, 212, 33,
      7, 33, 46, 49, 54, 147, 176, 233, 129, 106, 146, 224, 95, 18, 172, 219>>,
    {:namedCurve, {1, 2, 840, 10045, 3, 1, 7}},
    <<4, 230, 110, 45, 194, 1, 67, 24, 70, 254, 108, 225, 155, 37, 224, 200, 27,
      140, 59, 16, 121, 75, 206, 241, 87, 60, 168, 191, 113, 168, 13, 176, 56,
      206, 63, 224, 192, 81, 29, 77, ...>>}}
}map表現への変換
iex(2)> jwk |> JOSE.JWK.to_map()
{%{kty: :jose_jwk_kty_ec},
 %{
   "crv" => "P-256",
   "d" => "JaFuF9NvQI5iz5lai1vUIQchLjE2k7DpgWqS4F8SrNs",
   "kty" => "EC",
   "x" => "5m4twgFDGEb-bOGbJeDIG4w7EHlLzvFXPKi_cagNsDg",
   "y" => "zj_gwFEdTXDGwBqLZuqROQXsb6ns0xn2Fgpts8nrkUM"
 }}
 
# PrivateKeyの取得
iex(3)> %JOSE.JWK{kty: {:jose_jwk_kty_ec, private_key}} = jwk
%JOSE.JWK{
  fields: %{},
  keys: :undefined,
  kty: {:jose_jwk_kty_ec,
   {:ECPrivateKey, 1,
    <<37, 161, 110, 23, 211, 111, 64, 142, 98, 207, 153, 90, 139, 91, 212, 33,
      7, 33, 46, 49, 54, 147, 176, 233, 129, 106, 146, 224, 95, 18, 172, 219>>,
    {:namedCurve, {1, 2, 840, 10045, 3, 1, 7}},
    <<4, 230, 110, 45, 194, 1, 67, 24, 70, 254, 108, 225, 155, 37, 224, 200, 27,
      140, 59, 16, 121, 75, 206, 241, 87, 60, 168, 191, 113, 168, 13, 176, 56,
      206, 63, 224, 192, 81, 29, 77, ...>>}}
}

# :public_key を用いてsign
iex(4)> message = :public_key.sign("hoge", :sha256, private_key)      
<<48, 68, 2, 32, 72, 229, 146, 8, 238, 238, 65, 248, 66, 220, 103, 92, 44, 14,
  250, 81, 188, 106, 89, 177, 59, 124, 9, 77, 62, 250, 97, 227, 73, 16, 180,
  183, 2, 32, 14, 58, 190, 133, 163, 15, 174, 19, 242, 64, 186, 227, ...>>
# 同じ鍵でverify
iex(5)> :public_key.verify("hoge", :sha256, message, private_key)
true

# mapからJOSE.JWK生成
iex(6)> key_map = %{"kty" => "EC", "crv" => "P-256", "d" => ("6c1382765aec5358f117733d281c1c7bdc39884d04a45a1e6c67c858bc206c19" |> Base.decode16!(case: :lower) |> Base.url_encode64(padding: false)), "y" => "60f7f1a780d8a783bfb7a2dd6b2796e8128dbbcef9d3d168db9529971a36e7b9" |> Base.decode16!(case: :lower) |> Base.url_encode64(padding: false), "x" => "143329cce7868e416927599cf65a34f3ce2ffda55a7eca69ed8919a394d42f0f" |> Base.decode16!(case: :lower) |> Base.url_encode64(padding: false)}  
%{
  "crv" => "P-256",
  "d" => "bBOCdlrsU1jxF3M9KBwce9w5iE0EpFoebGfIWLwgbBk",
  "kty" => "EC",
  "x" => "FDMpzOeGjkFpJ1mc9lo0884v_aVafspp7YkZo5TULw8", 
  "y" => "YPfxp4DYp4O_t6LdayeW6BKNu87509Fo25Uplxo257k"
}
iex(7)> jwk = JOSE.JWK.from_map(key_map)
%JOSE.JWK{
  fields: %{},
  keys: :undefined,
  kty: {:jose_jwk_kty_ec,
   {:ECPrivateKey, 1,
    <<108, 19, 130, 118, 90, 236, 83, 88, 241, 23, 115, 61, 40, 28, 28, 123,
      220, 57, 136, 77, 4, 164, 90, 30, 108, 103, 200, 88, 188, 32, 108, 25>>,
    {:namedCurve, {1, 2, 840, 10045, 3, 1, 7}},
    <<4, 20, 51, 41, 204, 231, 134, 142, 65, 105, 39, 89, 156, 246, 90, 52, 243,
      206, 47, 253, 165, 90, 126, 202, 105, 237, 137, 25, 163, 148, 212, 47, 15,
      96, 247, 241, 167, 128, 216, 167, ...>>}}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment