PHP WebShell

Текущая директория: /opt/BitGoJS/node_modules/tweetnacl-ts/src

Просмотр файла: scalarmult.ts

import { ByteArray, NumArray } from './array';
import { gf, _9, _121665, A, Z, M, S } from './core';
import { sel25519, inv25519, pack25519, unpack25519 } from './curve25519';
import { checkArrayTypes } from './check';

export const enum ScalarLength {
    Scalar = 32, // scalar bytes
    GroupElement = 32, // bytes
}

export function scalarMult(n: ByteArray, p: ByteArray) {
    checkArrayTypes(n, p);

    if (n.length !== ScalarLength.Scalar) throw new Error('bad n size');
    if (p.length !== ScalarLength.GroupElement) throw new Error('bad p size');

    const q = ByteArray(ScalarLength.GroupElement);

    _scalarMult(q, n, p);

    return q;
}

export function scalarMult_base(n: ByteArray) {
    checkArrayTypes(n);

    if (n.length !== ScalarLength.Scalar) throw new Error('bad n size');

    const q = ByteArray(ScalarLength.GroupElement);

    _scalarMult_base(q, n);

    return q;
}

// low level

export function _scalarMult(q: ByteArray, n: ByteArray, p: ByteArray): 0 {
    const z: ByteArray = ByteArray(32);
    const x: NumArray = NumArray(80);
    const a: NumArray = gf();
    const b: NumArray = gf();
    const c: NumArray = gf();
    const d: NumArray = gf();
    const e: NumArray = gf();
    const f: NumArray = gf();

    let r, i;

    for (i = 0; i < 31; i++) z[i] = n[i];

    z[31] = (n[31] & 127) | 64;
    z[0] &= 248;

    unpack25519(x, p);

    for (i = 0; i < 16; i++) {
        b[i] = x[i];
        d[i] = a[i] = c[i] = 0;
    }

    a[0] = d[0] = 1;

    for (i = 254; i >= 0; --i) {
        r = (z[i >>> 3] >>> (i & 7)) & 1;
        sel25519(a, b, r);
        sel25519(c, d, r);
        A(e, a, c);
        Z(a, a, c);
        A(c, b, d);
        Z(b, b, d);
        S(d, e);
        S(f, a);
        M(a, c, a);
        M(c, b, e);
        A(e, a, c);
        Z(a, a, c);
        S(b, a);
        Z(c, d, f);
        M(a, c, _121665);
        A(a, a, d);
        M(c, c, a);
        M(a, d, f);
        M(d, b, x);
        S(b, e);
        sel25519(a, b, r);
        sel25519(c, d, r);
    }

    for (i = 0; i < 16; i++) {
        x[i + 16] = a[i];
        x[i + 32] = c[i];
        x[i + 48] = b[i];
        x[i + 64] = d[i];
    }

    const x32 = x.subarray(32);
    const x16 = x.subarray(16);

    inv25519(x32, x32);
    M(x16, x16, x32);
    pack25519(q, x16);

    return 0;
}

export function _scalarMult_base(q: ByteArray, n: ByteArray): 0 {
    return _scalarMult(q, n, _9);
}

Выполнить команду


Для локальной разработки. Не используйте в интернете!