Table of Contents

Class Ed25519

Namespace
Org.BouncyCastle.Math.EC.Rfc8032
Assembly
BouncyCastle.Cryptography.dll

A low-level implementation of the Ed25519, Ed25519ctx, and Ed25519ph instantiations of the Edwards-Curve Digital Signature Algorithm specified in RFC 8032.

public static class Ed25519
Inheritance
Ed25519
Inherited Members

Remarks

The implementation strategy is mostly drawn from Mike Hamburg, "Fast and compact elliptic-curve cryptography", notably the "signed multi-comb" algorithm (for scalar multiplication by a fixed point), the "half Niels coordinates" (for precomputed points), and the "extensible coordinates" (for accumulators). Standard extended coordinates are used during precomputations, needing only a single extra point addition formula.

Fields

PrehashSize

public static readonly int PrehashSize

Field Value

int

PublicKeySize

public static readonly int PublicKeySize

Field Value

int

SecretKeySize

public static readonly int SecretKeySize

Field Value

int

SignatureSize

public static readonly int SignatureSize

Field Value

int

Methods

CreatePrehash()

public static IDigest CreatePrehash()

Returns

IDigest

EncodePublicPoint(PublicPoint, byte[], int)

public static void EncodePublicPoint(Ed25519.PublicPoint publicPoint, byte[] pk, int pkOff)

Parameters

publicPoint Ed25519.PublicPoint
pk byte[]
pkOff int

EncodePublicPoint(PublicPoint, Span<byte>)

public static void EncodePublicPoint(Ed25519.PublicPoint publicPoint, Span<byte> pk)

Parameters

publicPoint Ed25519.PublicPoint
pk Span<byte>

GeneratePrivateKey(SecureRandom, byte[])

public static void GeneratePrivateKey(SecureRandom random, byte[] k)

Parameters

random SecureRandom
k byte[]

GeneratePrivateKey(SecureRandom, Span<byte>)

public static void GeneratePrivateKey(SecureRandom random, Span<byte> k)

Parameters

random SecureRandom
k Span<byte>

GeneratePublicKey(byte[], int)

public static Ed25519.PublicPoint GeneratePublicKey(byte[] sk, int skOff)

Parameters

sk byte[]
skOff int

Returns

Ed25519.PublicPoint

GeneratePublicKey(byte[], int, byte[], int)

public static void GeneratePublicKey(byte[] sk, int skOff, byte[] pk, int pkOff)

Parameters

sk byte[]
skOff int
pk byte[]
pkOff int

GeneratePublicKey(ReadOnlySpan<byte>)

public static Ed25519.PublicPoint GeneratePublicKey(ReadOnlySpan<byte> sk)

Parameters

sk ReadOnlySpan<byte>

Returns

Ed25519.PublicPoint

GeneratePublicKey(ReadOnlySpan<byte>, Span<byte>)

public static void GeneratePublicKey(ReadOnlySpan<byte> sk, Span<byte> pk)

Parameters

sk ReadOnlySpan<byte>
pk Span<byte>

Precompute()

public static void Precompute()

Sign(byte[], int, byte[], byte[], int, int, byte[], int)

public static void Sign(byte[] sk, int skOff, byte[] ctx, byte[] m, int mOff, int mLen, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
ctx byte[]
m byte[]
mOff int
mLen int
sig byte[]
sigOff int

Sign(byte[], int, byte[], int, byte[], byte[], int, int, byte[], int)

public static void Sign(byte[] sk, int skOff, byte[] pk, int pkOff, byte[] ctx, byte[] m, int mOff, int mLen, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
pk byte[]
pkOff int
ctx byte[]
m byte[]
mOff int
mLen int
sig byte[]
sigOff int

Sign(byte[], int, byte[], int, byte[], int, int, byte[], int)

public static void Sign(byte[] sk, int skOff, byte[] pk, int pkOff, byte[] m, int mOff, int mLen, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
pk byte[]
pkOff int
m byte[]
mOff int
mLen int
sig byte[]
sigOff int

Sign(byte[], int, byte[], int, int, byte[], int)

public static void Sign(byte[] sk, int skOff, byte[] m, int mOff, int mLen, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
m byte[]
mOff int
mLen int
sig byte[]
sigOff int

Sign(ReadOnlySpan<byte>, byte[], ReadOnlySpan<byte>, Span<byte>)

public static void Sign(ReadOnlySpan<byte> sk, byte[] ctx, ReadOnlySpan<byte> m, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
ctx byte[]
m ReadOnlySpan<byte>
sig Span<byte>

Sign(ReadOnlySpan<byte>, ReadOnlySpan<byte>, byte[], ReadOnlySpan<byte>, Span<byte>)

public static void Sign(ReadOnlySpan<byte> sk, ReadOnlySpan<byte> pk, byte[] ctx, ReadOnlySpan<byte> m, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
ctx byte[]
m ReadOnlySpan<byte>
sig Span<byte>

Sign(ReadOnlySpan<byte>, ReadOnlySpan<byte>, ReadOnlySpan<byte>, Span<byte>)

public static void Sign(ReadOnlySpan<byte> sk, ReadOnlySpan<byte> pk, ReadOnlySpan<byte> m, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
m ReadOnlySpan<byte>
sig Span<byte>

Sign(ReadOnlySpan<byte>, ReadOnlySpan<byte>, Span<byte>)

public static void Sign(ReadOnlySpan<byte> sk, ReadOnlySpan<byte> m, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
m ReadOnlySpan<byte>
sig Span<byte>

SignPrehash(byte[], int, byte[], IDigest, byte[], int)

public static void SignPrehash(byte[] sk, int skOff, byte[] ctx, IDigest ph, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
ctx byte[]
ph IDigest
sig byte[]
sigOff int

SignPrehash(byte[], int, byte[], byte[], int, byte[], int)

public static void SignPrehash(byte[] sk, int skOff, byte[] ctx, byte[] ph, int phOff, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
ctx byte[]
ph byte[]
phOff int
sig byte[]
sigOff int

SignPrehash(byte[], int, byte[], int, byte[], IDigest, byte[], int)

public static void SignPrehash(byte[] sk, int skOff, byte[] pk, int pkOff, byte[] ctx, IDigest ph, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
pk byte[]
pkOff int
ctx byte[]
ph IDigest
sig byte[]
sigOff int

SignPrehash(byte[], int, byte[], int, byte[], byte[], int, byte[], int)

public static void SignPrehash(byte[] sk, int skOff, byte[] pk, int pkOff, byte[] ctx, byte[] ph, int phOff, byte[] sig, int sigOff)

Parameters

sk byte[]
skOff int
pk byte[]
pkOff int
ctx byte[]
ph byte[]
phOff int
sig byte[]
sigOff int

SignPrehash(ReadOnlySpan<byte>, byte[], IDigest, Span<byte>)

public static void SignPrehash(ReadOnlySpan<byte> sk, byte[] ctx, IDigest ph, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
ctx byte[]
ph IDigest
sig Span<byte>

SignPrehash(ReadOnlySpan<byte>, byte[], ReadOnlySpan<byte>, Span<byte>)

public static void SignPrehash(ReadOnlySpan<byte> sk, byte[] ctx, ReadOnlySpan<byte> ph, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
ctx byte[]
ph ReadOnlySpan<byte>
sig Span<byte>

SignPrehash(ReadOnlySpan<byte>, ReadOnlySpan<byte>, byte[], IDigest, Span<byte>)

public static void SignPrehash(ReadOnlySpan<byte> sk, ReadOnlySpan<byte> pk, byte[] ctx, IDigest ph, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
ctx byte[]
ph IDigest
sig Span<byte>

SignPrehash(ReadOnlySpan<byte>, ReadOnlySpan<byte>, byte[], ReadOnlySpan<byte>, Span<byte>)

public static void SignPrehash(ReadOnlySpan<byte> sk, ReadOnlySpan<byte> pk, byte[] ctx, ReadOnlySpan<byte> ph, Span<byte> sig)

Parameters

sk ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
ctx byte[]
ph ReadOnlySpan<byte>
sig Span<byte>

ValidatePublicKeyFull(byte[], int)

public static bool ValidatePublicKeyFull(byte[] pk, int pkOff)

Parameters

pk byte[]
pkOff int

Returns

bool

ValidatePublicKeyFull(ReadOnlySpan<byte>)

public static bool ValidatePublicKeyFull(ReadOnlySpan<byte> pk)

Parameters

pk ReadOnlySpan<byte>

Returns

bool

ValidatePublicKeyFullExport(byte[], int)

public static Ed25519.PublicPoint ValidatePublicKeyFullExport(byte[] pk, int pkOff)

Parameters

pk byte[]
pkOff int

Returns

Ed25519.PublicPoint

ValidatePublicKeyFullExport(ReadOnlySpan<byte>)

public static Ed25519.PublicPoint ValidatePublicKeyFullExport(ReadOnlySpan<byte> pk)

Parameters

pk ReadOnlySpan<byte>

Returns

Ed25519.PublicPoint

ValidatePublicKeyPartial(byte[], int)

public static bool ValidatePublicKeyPartial(byte[] pk, int pkOff)

Parameters

pk byte[]
pkOff int

Returns

bool

ValidatePublicKeyPartial(ReadOnlySpan<byte>)

public static bool ValidatePublicKeyPartial(ReadOnlySpan<byte> pk)

Parameters

pk ReadOnlySpan<byte>

Returns

bool

ValidatePublicKeyPartialExport(byte[], int)

public static Ed25519.PublicPoint ValidatePublicKeyPartialExport(byte[] pk, int pkOff)

Parameters

pk byte[]
pkOff int

Returns

Ed25519.PublicPoint

ValidatePublicKeyPartialExport(ReadOnlySpan<byte>)

public static Ed25519.PublicPoint ValidatePublicKeyPartialExport(ReadOnlySpan<byte> pk)

Parameters

pk ReadOnlySpan<byte>

Returns

Ed25519.PublicPoint

Verify(byte[], int, PublicPoint, byte[], byte[], int, int)

public static bool Verify(byte[] sig, int sigOff, Ed25519.PublicPoint publicPoint, byte[] ctx, byte[] m, int mOff, int mLen)

Parameters

sig byte[]
sigOff int
publicPoint Ed25519.PublicPoint
ctx byte[]
m byte[]
mOff int
mLen int

Returns

bool

Verify(byte[], int, PublicPoint, byte[], int, int)

public static bool Verify(byte[] sig, int sigOff, Ed25519.PublicPoint publicPoint, byte[] m, int mOff, int mLen)

Parameters

sig byte[]
sigOff int
publicPoint Ed25519.PublicPoint
m byte[]
mOff int
mLen int

Returns

bool

Verify(byte[], int, byte[], int, byte[], byte[], int, int)

public static bool Verify(byte[] sig, int sigOff, byte[] pk, int pkOff, byte[] ctx, byte[] m, int mOff, int mLen)

Parameters

sig byte[]
sigOff int
pk byte[]
pkOff int
ctx byte[]
m byte[]
mOff int
mLen int

Returns

bool

Verify(byte[], int, byte[], int, byte[], int, int)

public static bool Verify(byte[] sig, int sigOff, byte[] pk, int pkOff, byte[] m, int mOff, int mLen)

Parameters

sig byte[]
sigOff int
pk byte[]
pkOff int
m byte[]
mOff int
mLen int

Returns

bool

Verify(ReadOnlySpan<byte>, PublicPoint, byte[], ReadOnlySpan<byte>)

public static bool Verify(ReadOnlySpan<byte> sig, Ed25519.PublicPoint publicPoint, byte[] ctx, ReadOnlySpan<byte> m)

Parameters

sig ReadOnlySpan<byte>
publicPoint Ed25519.PublicPoint
ctx byte[]
m ReadOnlySpan<byte>

Returns

bool

Verify(ReadOnlySpan<byte>, PublicPoint, ReadOnlySpan<byte>)

public static bool Verify(ReadOnlySpan<byte> sig, Ed25519.PublicPoint publicPoint, ReadOnlySpan<byte> m)

Parameters

sig ReadOnlySpan<byte>
publicPoint Ed25519.PublicPoint
m ReadOnlySpan<byte>

Returns

bool

Verify(ReadOnlySpan<byte>, ReadOnlySpan<byte>, byte[], ReadOnlySpan<byte>)

public static bool Verify(ReadOnlySpan<byte> sig, ReadOnlySpan<byte> pk, byte[] ctx, ReadOnlySpan<byte> m)

Parameters

sig ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
ctx byte[]
m ReadOnlySpan<byte>

Returns

bool

Verify(ReadOnlySpan<byte>, ReadOnlySpan<byte>, ReadOnlySpan<byte>)

public static bool Verify(ReadOnlySpan<byte> sig, ReadOnlySpan<byte> pk, ReadOnlySpan<byte> m)

Parameters

sig ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
m ReadOnlySpan<byte>

Returns

bool

VerifyPrehash(byte[], int, PublicPoint, byte[], IDigest)

public static bool VerifyPrehash(byte[] sig, int sigOff, Ed25519.PublicPoint publicPoint, byte[] ctx, IDigest ph)

Parameters

sig byte[]
sigOff int
publicPoint Ed25519.PublicPoint
ctx byte[]
ph IDigest

Returns

bool

VerifyPrehash(byte[], int, PublicPoint, byte[], byte[], int)

public static bool VerifyPrehash(byte[] sig, int sigOff, Ed25519.PublicPoint publicPoint, byte[] ctx, byte[] ph, int phOff)

Parameters

sig byte[]
sigOff int
publicPoint Ed25519.PublicPoint
ctx byte[]
ph byte[]
phOff int

Returns

bool

VerifyPrehash(byte[], int, byte[], int, byte[], IDigest)

public static bool VerifyPrehash(byte[] sig, int sigOff, byte[] pk, int pkOff, byte[] ctx, IDigest ph)

Parameters

sig byte[]
sigOff int
pk byte[]
pkOff int
ctx byte[]
ph IDigest

Returns

bool

VerifyPrehash(byte[], int, byte[], int, byte[], byte[], int)

public static bool VerifyPrehash(byte[] sig, int sigOff, byte[] pk, int pkOff, byte[] ctx, byte[] ph, int phOff)

Parameters

sig byte[]
sigOff int
pk byte[]
pkOff int
ctx byte[]
ph byte[]
phOff int

Returns

bool

VerifyPrehash(ReadOnlySpan<byte>, PublicPoint, byte[], IDigest)

public static bool VerifyPrehash(ReadOnlySpan<byte> sig, Ed25519.PublicPoint publicPoint, byte[] ctx, IDigest ph)

Parameters

sig ReadOnlySpan<byte>
publicPoint Ed25519.PublicPoint
ctx byte[]
ph IDigest

Returns

bool

VerifyPrehash(ReadOnlySpan<byte>, PublicPoint, byte[], ReadOnlySpan<byte>)

public static bool VerifyPrehash(ReadOnlySpan<byte> sig, Ed25519.PublicPoint publicPoint, byte[] ctx, ReadOnlySpan<byte> ph)

Parameters

sig ReadOnlySpan<byte>
publicPoint Ed25519.PublicPoint
ctx byte[]
ph ReadOnlySpan<byte>

Returns

bool

VerifyPrehash(ReadOnlySpan<byte>, ReadOnlySpan<byte>, byte[], IDigest)

public static bool VerifyPrehash(ReadOnlySpan<byte> sig, ReadOnlySpan<byte> pk, byte[] ctx, IDigest ph)

Parameters

sig ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
ctx byte[]
ph IDigest

Returns

bool

VerifyPrehash(ReadOnlySpan<byte>, ReadOnlySpan<byte>, byte[], ReadOnlySpan<byte>)

public static bool VerifyPrehash(ReadOnlySpan<byte> sig, ReadOnlySpan<byte> pk, byte[] ctx, ReadOnlySpan<byte> ph)

Parameters

sig ReadOnlySpan<byte>
pk ReadOnlySpan<byte>
ctx byte[]
ph ReadOnlySpan<byte>

Returns

bool