The Copenhagen Book

Elliptic curve digital signature algorithm (ECDSA)

ECDSA is a digital signature algorithm using elliptic-curve cryptography. A private key is used to sign a message and a public key is used verify the signature.

The message is hashed with algorithms like SHA-256 before signing.

import (
	"crypto/ecdsa"
	"crypto/rand"
	"crypto/sha256"
)

msg := "Hello world!"
hash := sha256.Sum256([]byte(msg))
signature, err := ecdsa.SignASN1(rand.Reader, privateKey, hash[:])

Signatures

ECDSA signatures are represented using a pair of positive integers, (r, s).

IEEE P1363

In the IEEE P1363 format, the signature is the concatenation of r and s. The values are encoded as big-endian bytes with a size equivalent to the curve size. For example, P-256 is 256 bits or 32 bytes in size.

r || s;

PKIX

In RFC 5480 by the PKIX working group, the signature is ASN.1 DER encoded sequence of r and s.

SEQUENCE {
    r     INTEGER,
    s     INTEGER
}

Public keys

ECDSA public keys are represented as a pair of positive integers, (x, y).

SEC1

In SEC 1, public keys can either be encoded in an uncompressed or compressed form. Uncompressed keys are the concatenation of x and y, with a leading 0x04 byte. The values are encoded as big-endian bytes with a size equivalent to the curve size. For example, P-256 is 256 bits or 32 bytes in size.

0x04 || x || y

Compressed keys are the x value with a leading 0x02 byte if x is even or 0x03 byte if x is odd. The y value can be derived from x and the curve.

0x02 || x
0x03 || x

PKIX

In RFC 5480 by the PKIX working group, the public key is represented as a SubjectPublicKeyInfo ASN.1 sequence. The subjectPublicKey is either the compressed or uncompressed SEC1 public key.

SubjectPublicKeyInfo := SEQUENCE {
    algorithm           AlgorithmIdentifier,
    subjectPublicKey    BIT STRING
}

The AlgorithmIdentifier for ECDSA is an ASN.1 sequence with the ECDSA object identifier (1.2.840.10045.2.1) and the curve (e.g. 1.2.840.10045.3.1.7 for P-256 curve)

AlgorithmIdentifier := SEQUENCE {
    algorithm   OBJECT IDENTIFIER
    namedCurve  OBJECT IDENTIFIER
}