PHP WebShell

Текущая директория: /opt/BitGoJS/modules/bitgo/test

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

/**
 * @prettier
 */
import 'should';
import { bip32 } from '@bitgo/utxo-lib';
import * as crypto from 'crypto';
import * as utxolib from '@bitgo/utxo-lib';

import { getSharedSecret, signMessageWithDerivedEcdhKey, verifyEcdhSignature } from '@bitgo/sdk-core';
import { TestBitGo } from '@bitgo/sdk-test';
import * as assert from 'assert';
import { BitGo } from '../src/bitgo';

describe('ECDH utils', () => {
  function getKey(seed: string) {
    return bip32.fromSeed(crypto.createHash('sha256').update(seed).digest());
  }

  it('should calculate a new ECDH sharing secret correctly', () => {
    for (let i = 0; i < 256; i++) {
      const eckey1 = getKey(`${i}.a`);
      const eckey2 = getKey(`${i}.b`);

      assert(eckey1.privateKey);
      [eckey1, utxolib.bitgo.keyutil.privateKeyBufferToECPair(eckey1.privateKey)].forEach((privateKey) => {
        const sharingKey1 = getSharedSecret(privateKey, eckey2).toString('hex');
        const sharingKey2 = getSharedSecret(eckey2, eckey1).toString('hex');
        sharingKey1.should.equal(sharingKey2);

        switch (i) {
          case 0:
            sharingKey1.should.eql('465ffe5745325998b83fb39631347148e24d4f21b3f3b54739c264d5c42db4b8');
            break;
          case 1:
            sharingKey1.should.eql('61ff44fc1af8061a433a314b7b8be8ae352c10f62aac5887047dbaa5643b818d');
            break;
        }
      });
    }
  });

  describe('signMessageWithDerivedEcdhKey and verifyEcdhSignature', function () {
    it('signMessageWithDerivedEcdhKey and verifyEcdhSignature are able to sign/verify the same message', function () {
      const bitgo = TestBitGo.decorate(BitGo, { env: 'mock' });
      const myEcdhKeychain = bitgo.keychains().create();
      const message = {
        ntilde: 'bla',
        h1: 'bla',
      };
      const derivationPath = 'm/0/1';
      const signedMessage = signMessageWithDerivedEcdhKey(JSON.stringify(message), myEcdhKeychain.xprv, derivationPath);
      const hexEncodedSignedMessage = signedMessage.toString('hex');
      const derivedPubKey = bip32.fromBase58(myEcdhKeychain.xpub).derivePath(derivationPath).publicKey;
      const isVerify = verifyEcdhSignature(JSON.stringify(message), hexEncodedSignedMessage, derivedPubKey);
      isVerify.should.be.true();
    });
  });

  it('verifyEcdhSignature fails if the message/signature or pub key is diff than the one used for signing', function () {
    const bitgo = TestBitGo.decorate(BitGo, { env: 'mock' });
    const myEcdhKeychain = bitgo.keychains().create();
    const message = {
      ntilde: 'bla',
      h1: 'bla',
    };
    const derivationPath = 'm/0/1';
    let signedMessage = signMessageWithDerivedEcdhKey(JSON.stringify(message), myEcdhKeychain.xprv, derivationPath);
    const hexEncodedSignedMessage = signedMessage.toString('hex');
    let derivedPubKey = bip32.fromBase58(myEcdhKeychain.xpub).derivePath(derivationPath).publicKey;

    // wrong message
    let isVerify = verifyEcdhSignature('fake message', hexEncodedSignedMessage, derivedPubKey);
    isVerify.should.be.false();

    // bad signature
    signedMessage = signMessageWithDerivedEcdhKey('fake message', myEcdhKeychain.xprv, derivationPath);
    isVerify = verifyEcdhSignature(JSON.stringify(message), signedMessage.toString('hex'), derivedPubKey);
    isVerify.should.be.false();

    // bad public key derived at a diff. path
    derivedPubKey = bip32.fromBase58(myEcdhKeychain.xpub).derivePath('m/0/0').publicKey;
    isVerify = verifyEcdhSignature(JSON.stringify(message), signedMessage.toString('hex'), derivedPubKey);
    isVerify.should.be.false();
  });
});

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


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