Skip to main content

ForeignCurve

Constructors

new ForeignCurve()

new ForeignCurve(g: {
"x": number | bigint | Field3 | AlmostForeignField;
"y": number | bigint | Field3 | AlmostForeignField;
}): ForeignCurve

Create a new ForeignCurve from an object representing the (affine) x and y coordinates.

Note: Inputs must be range checked if they originate from a different field with a different modulus or if they are not constants. Please refer to the ForeignField constructor comments for more details.

Parameters

g

g.x: number | bigint | Field3 | AlmostForeignField

g.y: number | bigint | Field3 | AlmostForeignField

Returns

ForeignCurve

Example

let x = new ForeignCurve({ x: 1n, y: 1n });

Important: By design, there is no way for a ForeignCurve to represent the zero point.

Warning: This fails for a constant input which does not represent an actual point on the curve.

Source

lib/provable/crypto/foreign-curve.ts:49

Properties

x

x: AlmostForeignField;

Source

lib/provable/crypto/foreign-curve.ts:32


y

y: AlmostForeignField;

Source

lib/provable/crypto/foreign-curve.ts:33


_Bigint?

static optional _Bigint: {};

Source

lib/provable/crypto/foreign-curve.ts:362


_Field?

static optional _Field: typeof AlmostForeignField;

Source

lib/provable/crypto/foreign-curve.ts:363


_Scalar?

static optional _Scalar: typeof AlmostForeignField;

Source

lib/provable/crypto/foreign-curve.ts:364


_provable?

static optional _provable: ProvablePureExtended<ForeignCurve, {
"x": bigint;
"y": bigint;
}, {
"x": string;
"y": string;
}>;

Source

lib/provable/crypto/foreign-curve.ts:365

Accessors

Constructor

get Constructor(): typeof ForeignCurve

Returns

typeof ForeignCurve

Source

lib/provable/crypto/foreign-curve.ts:359


modulus

get modulus(): bigint

The size of the curve's base field.

Returns

bigint

Source

lib/provable/crypto/foreign-curve.ts:203


Bigint

get static Bigint(): {}

Curve arithmetic on JS bigints.

Returns

{}

Source

lib/provable/crypto/foreign-curve.ts:374


Field

get static Field(): typeof AlmostForeignField

The base field of this curve as a ForeignField.

Returns

typeof AlmostForeignField

Source

lib/provable/crypto/foreign-curve.ts:381


Scalar

get static Scalar(): typeof AlmostForeignField

The scalar field of this curve as a ForeignField.

Returns

typeof AlmostForeignField

Source

lib/provable/crypto/foreign-curve.ts:388


generator

get static generator(): ForeignCurve

The constant generator point.

Returns

ForeignCurve

Source

lib/provable/crypto/foreign-curve.ts:191


modulus

get static modulus(): bigint

The size of the curve's base field.

Returns

bigint

Source

lib/provable/crypto/foreign-curve.ts:197


provable

get static provable(): ProvablePureExtended<ForeignCurve, {
"x": bigint;
"y": bigint;
}, {
"x": string;
"y": string;
}>

Provable<ForeignCurve>

Returns

ProvablePureExtended\<ForeignCurve, { "x": bigint; "y": bigint; }, { "x": string; "y": string; }>

Source

lib/provable/crypto/foreign-curve.ts:395

Methods

add()

add(h: ForeignCurve | FlexiblePoint): ForeignCurve

Elliptic curve addition.

let r = p.add(q); // r = p + q

Important: this is incomplete addition and does not handle the degenerate cases:

  • Inputs are equal, g = h (where you would use double). In this case, the result of this method is garbage and can be manipulated arbitrarily by a malicious prover.
  • Inputs are inverses of each other, g = -h, so that the result would be the zero point. In this case, the proof fails.

If you want guaranteed soundness regardless of the input, use addSafe instead.

Parameters

h: ForeignCurve | FlexiblePoint

Returns

ForeignCurve

Throws

if the inputs are inverses of each other.

Source

lib/provable/crypto/foreign-curve.ts:243


addSafe()

addSafe(h: ForeignCurve | FlexiblePoint): ForeignCurve

Safe elliptic curve addition.

This is the same as add, but additionally proves that the inputs are not equal. Therefore, the method is guaranteed to either fail or return a valid addition result.

Beware: this is more expensive than add, and is still incomplete in that it does not succeed on equal or inverse inputs.

Parameters

h: ForeignCurve | FlexiblePoint

Returns

ForeignCurve

Throws

if the inputs are equal or inverses of each other.

Source

lib/provable/crypto/foreign-curve.ts:261


assertInSubgroup()

assertInSubgroup(): void

Assert that this point lies in the subgroup defined by order*P = 0.

Note: this is a no-op if the curve has cofactor equal to 1. Otherwise it performs the full scalar multiplication order*P and is expensive.

Returns

void

Source

lib/provable/crypto/foreign-curve.ts:341


assertOnCurve()

assertOnCurve(): void

Assert that this point lies on the elliptic curve, which means it satisfies the equation y^2 = x^3 + ax + b

Returns

void

Source

lib/provable/crypto/foreign-curve.ts:325


double()

double(): ForeignCurve

Elliptic curve doubling.

Returns

ForeignCurve

Example

let r = p.double(); // r = 2 * p

Source

lib/provable/crypto/foreign-curve.ts:280


isConstant()

isConstant(): boolean

Checks whether this curve point is constant.

See FieldVar to understand constants vs variables.

Returns

boolean

Source

lib/provable/crypto/foreign-curve.ts:212


negate()

negate(): ForeignCurve

Elliptic curve negation.

Returns

ForeignCurve

Example

let r = p.negate(); // r = -p

Source

lib/provable/crypto/foreign-curve.ts:294


scale()

scale(scalar: number | bigint | AlmostForeignField): ForeignCurve

Elliptic curve scalar multiplication, where the scalar is represented as a ForeignField element.

Important: this proves that the result of the scalar multiplication is not the zero point.

Parameters

scalar: number | bigint | AlmostForeignField

Returns

ForeignCurve

Throws

if the scalar multiplication results in the zero point; for example, if the scalar is zero.

Example

let r = p.scale(s); // r = s * p

Source

lib/provable/crypto/foreign-curve.ts:310


toBigint()

toBigint(): GroupAffine

Convert this curve point to a point with bigint coordinates.

Returns

GroupAffine

Source

lib/provable/crypto/foreign-curve.ts:219


assertInSubgroup()

static assertInSubgroup(g: ForeignCurve): void

Parameters

g: ForeignCurve

Returns

void

Source

lib/provable/crypto/foreign-curve.ts:329


assertOnCurve()

static assertOnCurve(g: ForeignCurve): void

Parameters

g: ForeignCurve

Returns

void

Source

lib/provable/crypto/foreign-curve.ts:317


check()

static check(g: ForeignCurveNotNeeded): void

Check that this is a valid element of the target subgroup of the curve:

  • Check that the coordinates are valid field elements
  • Use () to check that the point lies on the curve
  • If the curve has cofactor unequal to 1, use ().

Parameters

g: ForeignCurveNotNeeded

Returns

void

Source

lib/provable/crypto/foreign-curve.ts:351


from()

static from(g: ForeignCurve | FlexiblePoint): ForeignCurve

Coerce the input to a ForeignCurve.

Parameters

g: ForeignCurve | FlexiblePoint

Returns

ForeignCurve

Source

lib/provable/crypto/foreign-curve.ts:65


fromEthers()

static fromEthers(hex: string): ForeignCurve

Create a new ForeignCurve instance from an Ethereum public key in hex format, which may be either compressed or uncompressed. This method is designed to handle the parsing of public keys as used by the ethers.js library.

The input should represent the affine x and y coordinates of the point, in hexadecimal format. Compressed keys are 33 bytes long and begin with 0x02 or 0x03, while uncompressed keys are 65 bytes long and begin with 0x04.

Warning: This method is specifically designed for use with the Secp256k1 curve. Using it with other curves may result in incorrect behavior or errors. Ensure that the curve setup matches Secp256k1, as shown in the example, to avoid unintended issues.

Parameters

hex: string

The public key as a hexadecimal string (without the "0x" prefix).

Returns

ForeignCurve

A new instance of the curve representing the given public key.

Example

import { Wallet, Signature, getBytes } from 'ethers';

class Secp256k1 extends createForeignCurve(Crypto.CurveParams.Secp256k1) {}

const wallet = Wallet.createRandom();

const publicKey = Secp256k1.fromEthers(wallet.publicKey.slice(2));

Source

lib/provable/crypto/foreign-curve.ts:143


fromHex()

static fromHex(hex: string): ForeignCurve

Parses a hexadecimal string representing an uncompressed elliptic curve point and coerces it into a ForeignCurve point.

The method extracts the x and y coordinates from the provided hex string and verifies that the resulting point lies on the curve.

Note: This method only supports uncompressed elliptic curve points, which are 65 bytes in total (1-byte prefix + 32 bytes for x + 32 bytes for y).

Parameters

hex: string

The hexadecimal string representing the uncompressed elliptic curve point.

Returns

ForeignCurve

  • A point on the foreign curve, parsed from the given hexadecimal string.

Throws

  • Throws an error if the input is not a valid public key.

Example

class Secp256k1 extends createForeignCurve(Crypto.CurveParams.Secp256k1) {}

const publicKeyHex = '04f8b8db25c619d0c66b2dc9e97ecbafafae...'; // Example hex string for uncompressed point
const point = Secp256k1.fromHex(publicKeyHex);

Important: This method is only designed to handle uncompressed elliptic curve points in hex format.

Source

lib/provable/crypto/foreign-curve.ts:92