UNPKG

5.26 kBJavaScriptView Raw
1'use strict';
2
3/* jshint maxstatements: 30 */
4
5var chai = require('chai');
6var should = chai.should();
7var expect = chai.expect;
8
9var bitcore = require('..');
10var Address = bitcore.Address;
11var Signature = bitcore.crypto.Signature;
12var Message = require('../lib/message');
13
14describe('Message', function() {
15
16 var address = 'n1ZCYg9YXtB5XCZazLxSmPDa8iwJRZHhGx';
17 var badAddress = 'mmRcrB5fTwgxaFJmVLNtaG8SV454y1E3kC';
18 var privateKey = bitcore.PrivateKey.fromWIF('cPBn5A4ikZvBTQ8D7NnvHZYCAxzDZ5Z2TSGW2LkyPiLxqYaJPBW4');
19 var text = 'hello, world';
20 var signatureString = 'H/DIn8uA1scAuKLlCx+/9LnAcJtwQQ0PmcPrJUq90aboLv3fH5fFvY+vmbfOSFEtGarznYli6ShPr9RXwY9UrIY=';
21
22 var badSignatureString = 'H69qZ4mbZCcvXk7CWjptD5ypnYVLvQ3eMXLM8+1gX21SLH/GaFnAjQrDn37+TDw79i9zHhbiMMwhtvTwnPigZ6k=';
23
24 var signature = Signature.fromCompact(Buffer.from(signatureString, 'base64'));
25 var badSignature = Signature.fromCompact(Buffer.from(badSignatureString, 'base64'));
26
27 var publicKey = privateKey.toPublicKey();
28
29 it('will error with incorrect message type', function() {
30 expect(function() {
31 return new Message(new Date());
32 }).to.throw('First argument should be a string');
33 });
34
35 it('will instantiate without "new"', function() {
36 var message = Message(text);
37 should.exist(message);
38 });
39
40 var signature2;
41 var signature3;
42
43 it('can sign a message', function() {
44 var message2 = new Message(text);
45 signature2 = message2._sign(privateKey);
46 signature3 = Message(text).sign(privateKey);
47 should.exist(signature2);
48 should.exist(signature3);
49 });
50
51 it('sign will error with incorrect private key argument', function() {
52 expect(function() {
53 var message3 = new Message(text);
54 return message3.sign('not a private key');
55 }).to.throw('First argument should be an instance of PrivateKey');
56 });
57
58 it('can verify a message with signature', function() {
59 var message4 = new Message(text);
60 var verified = message4._verify(publicKey, signature2);
61 verified.should.equal(true);
62 });
63
64 it('can verify a message with existing signature', function() {
65 var message5 = new Message(text);
66 var verified = message5._verify(publicKey, signature);
67 verified.should.equal(true);
68 });
69
70 it('verify will error with incorrect public key argument', function() {
71 expect(function() {
72 var message6 = new Message(text);
73 return message6._verify('not a public key', signature);
74 }).to.throw('First argument should be an instance of PublicKey');
75 });
76
77 it('verify will error with incorrect signature argument', function() {
78 expect(function() {
79 var message7 = new Message(text);
80 return message7._verify(publicKey, 'not a signature');
81 }).to.throw('Second argument should be an instance of Signature');
82 });
83
84 it('verify will correctly identify a bad signature', function() {
85 var message8 = new Message(text);
86 var verified = message8._verify(publicKey, badSignature);
87 should.exist(message8.error);
88 verified.should.equal(false);
89 });
90
91 it('can verify a message with address and generated signature string', function() {
92 var message9 = new Message(text);
93 var verified = message9.verify(address, signature3);
94 should.not.exist(message9.error);
95 verified.should.equal(true);
96 });
97
98 it('will not verify with address mismatch', function() {
99 var message10 = new Message(text);
100 var verified = message10.verify(badAddress, signatureString);
101 should.exist(message10.error);
102 verified.should.equal(false);
103 });
104
105 it('will verify with an uncompressed pubkey', function() {
106 var privateKey = new bitcore.PrivateKey('5KYZdUEo39z3FPrtuX2QbbwGnNP5zTd7yyr2SC1j299sBCnWjss');
107 var message = new Message('This is an example of a signed message.');
108 var signature = message.sign(privateKey);
109 var verified = message.verify(privateKey.toAddress(), signature);
110 verified.should.equal(true);
111 });
112
113 it('can chain methods', function() {
114 var verified = Message(text).verify(address, signatureString);
115 verified.should.equal(true);
116 });
117
118 describe('#json', function() {
119
120 it('roundtrip to-from-to', function() {
121 var json = new Message(text).toJSON();
122 var message = Message.fromJSON(json);
123 message.toString().should.equal(text);
124 });
125
126 it('checks that the string parameter is valid JSON', function() {
127 expect(function() {
128 return Message.fromJSON('¹');
129 }).to.throw();
130 });
131
132 });
133
134 describe('#toString', function() {
135
136 it('message string', function() {
137 var message = new Message(text);
138 message.toString().should.equal(text);
139 });
140
141 it('roundtrip to-from-to', function() {
142 var str = new Message(text).toString();
143 var message = Message.fromString(str);
144 message.toString().should.equal(text);
145 });
146
147 });
148
149 describe('#inspect', function() {
150
151 it('should output formatted output correctly', function() {
152 var message = new Message(text);
153 var output = '<Message: '+text+'>';
154 message.inspect().should.equal(output);
155 });
156
157 });
158
159
160 it('accepts Address for verification', function() {
161 var verified = Message(text)
162 .verify(new Address(address), signatureString);
163 verified.should.equal(true);
164 });
165
166});