PHP WebShell

Текущая директория: /opt/BitGoJS/modules/sdk-coin-hbar/test/unit

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

import assert from 'assert';
import * as should from 'should';
import * as nacl from 'tweetnacl';
import { KeyPair } from '../../src';
import * as testData from '../resources/hbar';
import { convertFromStellarPub, toUint8Array } from '../../src/lib/utils';

const pub = testData.ACCOUNT_1.pubKeyWithPrefix;
const prv = testData.ACCOUNT_1.prvKeyWithPrefix;

describe('Hedera Key Pair', () => {
  describe('should create a valid KeyPair', () => {
    it('from an empty value', () => {
      const keyPair = new KeyPair();
      should.exists(keyPair.getKeys().prv);
      should.exists(keyPair.getKeys().pub);
      should.equal(keyPair.getKeys(true).prv!.length, 64);
      should.equal(keyPair.getKeys(true).pub.length, 64);
      should.equal(keyPair.getKeys().prv!.slice(0, 32), testData.ed25519PrivKeyPrefix);
      should.equal(keyPair.getKeys().pub.slice(0, 24), testData.ed25519PubKeyPrefix);
    });

    it('from a seed', () => {
      const keyPair = new KeyPair({ seed: Buffer.from(toUint8Array(testData.ACCOUNT_1.prvKeyWithPrefix.slice(32))) });
      should.equal(keyPair.getKeys().prv!, testData.ACCOUNT_1.prvKeyWithPrefix);
      should.equal(keyPair.getKeys().pub, testData.ACCOUNT_1.pubKeyWithPrefix);
    });

    it('from a public key', () => {
      const keyPair = new KeyPair({ pub: pub });
      should.equal(keyPair.getKeys().pub, pub);
    });

    it('from a public key with prefix', () => {
      const stellarPubs = [
        'GBVEZT27ZUCMJABF76XIPPO7M3KUABVR4GZNPBAD3YTPXUSDA57ANRLD',
        'GDMQYYBRX3ZD34VHU4IJNSLASAQY6VZ7B6UJD5OFKSOW7XFJI5MZMETW',
        'GAD2SVW5EZLCH6HDC3VK7UE4DZK7KCIUHVCY2PO7ZEUERSWU6QQ6QIHB',
      ];

      stellarPubs.forEach((stellarPub) => {
        const edPub = convertFromStellarPub(stellarPub);
        const keyPair = new KeyPair({ pub: edPub });

        should.exist(keyPair.getKeys().pub);
        should.not.exist(keyPair.getKeys().prv);
      });
    });

    it('from a private key', () => {
      const keyPair = new KeyPair({ prv: prv });
      should.equal(keyPair.getKeys().prv!, prv);
      should.equal(keyPair.getKeys().pub, pub);
    });

    it('from a private key with prefix', () => {
      const keyPair = new KeyPair({ prv: testData.ACCOUNT_1.prvKeyWithPrefix });
      should.equal(keyPair.getKeys().prv!, prv);
      should.equal(keyPair.getKeys().pub, pub);
    });

    it('from seed', () => {
      const seed = nacl.randomBytes(32);
      const keyPair = new KeyPair({ seed: Buffer.from(seed) });
      keyPair.getKeys().should.have.property('pub');
      keyPair.getKeys().should.have.property('prv');
    });

    it('without source', () => {
      const keyPair = new KeyPair();
      keyPair.getKeys().should.have.property('pub');
      keyPair.getKeys().should.have.property('prv');
    });

    it('from a byte array private key', () => {
      const keyPair = new KeyPair({ prv: Buffer.from(testData.ACCOUNT_1.privateKeyBytes).toString('hex') });
      should.equal(keyPair.getKeys().prv!, prv);
    });

    it('from a byte array public key', () => {
      const keyPair = new KeyPair({ pub: Buffer.from(testData.ACCOUNT_1.publicKeyBytes).toString('hex') });
      should.equal(keyPair.getKeys().pub, pub);
    });
  });

  describe('should fail to create a KeyPair', () => {
    it('from an invalid public key', () => {
      const source = { pub: '01D63D' };
      assert.throws(
        () => new KeyPair(source),
        (e: any) => e.message.includes(testData.errorMessageInvalidPublicKey)
      );
    });

    it('from an invalid private key', () => {
      const shorterPrv = { prv: '82A34E' };
      const longerPrv = { prv: prv + '12' };
      const prvWithPrefix = { prv: testData.ed25519PrivKeyPrefix + prv + '12' };
      const prvWithOddNumber = { prv: testData.ed25519PrivKeyPrefix + prv + '1' };
      const prvWithNonHex = { prv: testData.ed25519PrivKeyPrefix + prv + 'GG' };
      assert.throws(
        () => new KeyPair(shorterPrv),
        (e: any) => e.message === testData.errorMessageInvalidPrivateKey
      );
      assert.throws(
        () => new KeyPair(longerPrv),
        (e: any) => e.message === testData.errorMessageInvalidPrivateKey
      );
      assert.throws(
        () => new KeyPair(prvWithPrefix),
        (e: any) => e.message === testData.errorMessageInvalidPrivateKey
      );
      assert.throws(
        () => new KeyPair({ prv: prv + pub }),
        (e: any) => e.message === testData.errorMessageInvalidPrivateKey
      );
      assert.throws(
        () => new KeyPair(prvWithOddNumber),
        (e: any) => e.message === testData.errorMessageOddLengthOrNonHexPrivateKey
      );
      assert.throws(
        () => new KeyPair(prvWithNonHex),
        (e: any) => e.message === testData.errorMessageOddLengthOrNonHexPrivateKey
      );
    });
  });

  describe('should fail to get address ', () => {
    it('from a private key', () => {
      const keyPair = new KeyPair({ prv: prv });
      assert.throws(
        () => keyPair.getAddress(),
        (e: any) => e.message === testData.errorMessageNotPossibleToDeriveAddress
      );
    });

    it('from a public key', () => {
      const keyPair = new KeyPair({ pub: pub });
      assert.throws(
        () => keyPair.getAddress(),
        (e: any) => e.message === testData.errorMessageNotPossibleToDeriveAddress
      );
    });
  });

  describe('should succeed to sign and verify ', () => {
    it('a random message', () => {
      const message = 'Hello World!';
      const keyPair = new KeyPair({ prv: prv });
      const signature = keyPair.signMessage(message);
      const isValid = keyPair.verifySignature(message, signature);
      isValid.should.be.true();
    });

    it('a public key in hex format', () => {
      const keyPair = new KeyPair({ prv: prv });
      const message = keyPair.getKeys().pub;
      const signature = keyPair.signMessage(message);
      const isValid = keyPair.verifySignature(message, signature);
      isValid.should.be.true();
    });

    it('a message in hex format', () => {
      const userPub = '302a300506032b657003210012558e304e09d468d3ab07edf6f7e634adc4788cee76d6a9eb2aff9385698077';
      const message = '302a300506032b6570032100aa3de24a1df3ce6fb61c8397358985f1df517853ef01523daee5b19dc82f40d5';
      const signature = Buffer.from(
        '76ca6556fbfcc5a8b43c12ba6425c5a6c90f5033180628410b5c29f651719f58ef4c1e' +
          '78dddd5fd794c555ec38c9b9c02ea76d3eef4d8422ae7ea8363cab920c',
        'hex'
      );

      const keyPair = new KeyPair({ pub: userPub });
      const isValid = keyPair.verifySignature(message, new Uint8Array(signature));
      isValid.should.be.true();
    });

    it('an empty message', () => {
      const message = '';
      const keyPair = new KeyPair({ prv: prv });
      const signature = keyPair.signMessage(message);
      const isValid = keyPair.verifySignature(message, signature);
      isValid.should.be.true();
    });
  });

  describe('should fail sign ', () => {
    it('a message without a private key', () => {
      const message = 'Hello World!';
      const keyPair = new KeyPair({ pub: pub });
      assert.throws(
        () => keyPair.signMessage(message),
        (e: any) => e.message === testData.errorMessageMissingPrivateKey
      );
    });
  });
});

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


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