LoginSignup
1
2

備忘録:ECDSAのトリビア

Posted at

Y 座標が真偽値?

CBOR / COSE / CWT 用の Java ライブラリ (authlete/cbor) に、ES256 / ES384 / ES512 アルゴリズムでの署名処理を実装していたとき、IANA COSE Key Type Parameters が「EC2 鍵の Y 座標は数値ではなく真偽値になることがある」と述べていることに気が付きました。

ネット検索の結果、『SEC 1: Elliptic Curve Cryptography』という文書の『2.3.3 Elliptic-Curve-Point-to-Octet-String Conversion』に下記の文を見つけました。

Derive from yP a single bit ỹP as follows (this allows the y-coordinate to be represented compactly using a single bit)

Y 座標が単一ビットで表現されているとき (つまり真偽値で表現可能ということ)、Y 座標の実際の値は、X 座標や楕円曲線のパラメーターといった他のパラメーターを用いて計算する必要があります。

位数が素数の有限体の場合、これは ES256 / ES384 / ES512 が使用する P-256 / P-384 / P-521 楕円曲線にあてはまりますが、Y 座標の値は『2.3.4 Octet-String-to-Elliptic-Curve-Point Conversion』で説明されている下記の手順で計算します。

  1. $ \alpha \equiv {x^3} $ $ _P + {ax} $ $ _P + b $ (mod p) を計算します。
  2. $ \alpha $ modulo p の平方根を計算します。
  3. 平方根が得られなければ無効として処理をやめます。
  4. $ \beta \equiv $ ỹP (mod 2) であれば $ \beta $ を Y 座標の値とします。そうでなければ p - $ \beta $ を Y 座標の値とします。

Stack Overflow で見つけた回答を元にこの計算処理を実装してみました (ECDSA.javauncompressY())。しかし、正直に言うとテストをしていないので、正しい実装になっているかどうか自信はありません。

DER または P1363?

アルゴリズムの結果、整数の組 (R, S) が生成されます。この二つの整数をバイト配列にエンコードする主要な方法が二つあります。一つは DER で、もう一つは P1363 です。

java.security.Signature クラスの getInstance(String) メソッドに "SHA256withECDSA" を渡すと、返される Signature インスタンスは署名のフォーマットが DER だと想定します。

COSE ECDSA (RFC 9053, 2.1. ECDSA) で採用されている P1363 フォーマット用に Signature インスタンスを作成するためには、代わりに "SHA256withECDSAinP1363Format" を渡します。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2