weierstrass: make weierstrassPoints fromBytes / toBytes optional
This commit is contained in:
parent
a8b8192714
commit
f3c21eb347
@ -82,8 +82,8 @@ export interface ProjConstructor<T> extends GroupConstructor<ProjPointType<T>> {
|
|||||||
|
|
||||||
export type CurvePointsType<T> = BasicWCurve<T> & {
|
export type CurvePointsType<T> = BasicWCurve<T> & {
|
||||||
// Bytes
|
// Bytes
|
||||||
fromBytes: (bytes: Uint8Array) => AffinePoint<T>;
|
fromBytes?: (bytes: Uint8Array) => AffinePoint<T>;
|
||||||
toBytes: (c: ProjConstructor<T>, point: ProjPointType<T>, compressed: boolean) => Uint8Array;
|
toBytes?: (c: ProjConstructor<T>, point: ProjPointType<T>, isCompressed: boolean) => Uint8Array;
|
||||||
};
|
};
|
||||||
|
|
||||||
function validatePointOpts<T>(curve: CurvePointsType<T>) {
|
function validatePointOpts<T>(curve: CurvePointsType<T>) {
|
||||||
@ -93,8 +93,6 @@ function validatePointOpts<T>(curve: CurvePointsType<T>) {
|
|||||||
{
|
{
|
||||||
a: 'field',
|
a: 'field',
|
||||||
b: 'field',
|
b: 'field',
|
||||||
fromBytes: 'function',
|
|
||||||
toBytes: 'function',
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
allowedPrivateKeyLengths: 'array',
|
allowedPrivateKeyLengths: 'array',
|
||||||
@ -102,6 +100,8 @@ function validatePointOpts<T>(curve: CurvePointsType<T>) {
|
|||||||
isTorsionFree: 'function',
|
isTorsionFree: 'function',
|
||||||
clearCofactor: 'function',
|
clearCofactor: 'function',
|
||||||
allowInfinityPoint: 'boolean',
|
allowInfinityPoint: 'boolean',
|
||||||
|
fromBytes: 'function',
|
||||||
|
toBytes: 'function',
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
const { endo, Fp, a } = opts;
|
const { endo, Fp, a } = opts;
|
||||||
@ -184,6 +184,23 @@ export function weierstrassPoints<T>(opts: CurvePointsType<T>) {
|
|||||||
const CURVE = validatePointOpts(opts);
|
const CURVE = validatePointOpts(opts);
|
||||||
const { Fp } = CURVE; // All curves has same field / group length as for now, but they can differ
|
const { Fp } = CURVE; // All curves has same field / group length as for now, but they can differ
|
||||||
|
|
||||||
|
const toBytes =
|
||||||
|
CURVE.toBytes ||
|
||||||
|
((c: ProjConstructor<T>, point: ProjPointType<T>, isCompressed: boolean) => {
|
||||||
|
const a = point.toAffine();
|
||||||
|
return ut.concatBytes(Uint8Array.from([0x04]), Fp.toBytes(a.x), Fp.toBytes(a.y));
|
||||||
|
});
|
||||||
|
const fromBytes =
|
||||||
|
CURVE.fromBytes ||
|
||||||
|
((bytes: Uint8Array) => {
|
||||||
|
// const head = bytes[0];
|
||||||
|
const tail = bytes.subarray(1);
|
||||||
|
// if (head !== 0x04) throw new Error('Only non-compressed encoding is supported');
|
||||||
|
const x = Fp.fromBytes(tail.subarray(0, Fp.BYTES));
|
||||||
|
const y = Fp.fromBytes(tail.subarray(Fp.BYTES, 2 * Fp.BYTES));
|
||||||
|
return { x, y };
|
||||||
|
});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* y² = x³ + ax + b: Short weierstrass curve formula
|
* y² = x³ + ax + b: Short weierstrass curve formula
|
||||||
* @returns y²
|
* @returns y²
|
||||||
@ -280,7 +297,7 @@ export function weierstrassPoints<T>(opts: CurvePointsType<T>) {
|
|||||||
* @param hex short/long ECDSA hex
|
* @param hex short/long ECDSA hex
|
||||||
*/
|
*/
|
||||||
static fromHex(hex: Hex): Point {
|
static fromHex(hex: Hex): Point {
|
||||||
const P = Point.fromAffine(CURVE.fromBytes(ensureBytes('pointHex', hex)));
|
const P = Point.fromAffine(fromBytes(ensureBytes('pointHex', hex)));
|
||||||
P.assertValidity();
|
P.assertValidity();
|
||||||
return P;
|
return P;
|
||||||
}
|
}
|
||||||
@ -563,7 +580,7 @@ export function weierstrassPoints<T>(opts: CurvePointsType<T>) {
|
|||||||
|
|
||||||
toRawBytes(isCompressed = true): Uint8Array {
|
toRawBytes(isCompressed = true): Uint8Array {
|
||||||
this.assertValidity();
|
this.assertValidity();
|
||||||
return CURVE.toBytes(Point, this, isCompressed);
|
return toBytes(Point, this, isCompressed);
|
||||||
}
|
}
|
||||||
|
|
||||||
toHex(isCompressed = true): string {
|
toHex(isCompressed = true): string {
|
||||||
@ -574,6 +591,7 @@ export function weierstrassPoints<T>(opts: CurvePointsType<T>) {
|
|||||||
const wnaf = wNAF(Point, CURVE.endo ? Math.ceil(_bits / 2) : _bits);
|
const wnaf = wNAF(Point, CURVE.endo ? Math.ceil(_bits / 2) : _bits);
|
||||||
|
|
||||||
return {
|
return {
|
||||||
|
CURVE,
|
||||||
ProjectivePoint: Point as ProjConstructor<T>,
|
ProjectivePoint: Point as ProjConstructor<T>,
|
||||||
normPrivateKeyToScalar,
|
normPrivateKeyToScalar,
|
||||||
weierstrassEquation,
|
weierstrassEquation,
|
||||||
@ -1055,7 +1073,6 @@ export function weierstrass(curveDef: CurveType): CurveFn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Implementation of the Shallue and van de Woestijne method for any Weierstrass curve
|
// Implementation of the Shallue and van de Woestijne method for any Weierstrass curve
|
||||||
|
|
||||||
// TODO: check if there is a way to merge this with uvRatio in Edwards && move to modular?
|
// TODO: check if there is a way to merge this with uvRatio in Edwards && move to modular?
|
||||||
// b = True and y = sqrt(u / v) if (u / v) is square in F, and
|
// b = True and y = sqrt(u / v) if (u / v) is square in F, and
|
||||||
// b = False and y = sqrt(Z * (u / v)) otherwise.
|
// b = False and y = sqrt(Z * (u / v)) otherwise.
|
||||||
|
Loading…
Reference in New Issue
Block a user