1
1
'use strict'
2
2
3
+ const PeerId = require ( 'peer-id' )
3
4
const { Message } = require ( './index' )
4
5
const SignPrefix = Buffer . from ( 'libp2p-pubsub:' )
5
6
6
- module . exports . SignPrefix = SignPrefix
7
-
8
7
/**
9
8
* Signs the provided message with the given `peerId`
10
9
*
@@ -13,7 +12,7 @@ module.exports.SignPrefix = SignPrefix
13
12
* @param {function(Error, Message) } callback
14
13
* @returns {void }
15
14
*/
16
- module . exports . signMessage = function ( peerId , message , callback ) {
15
+ function signMessage ( peerId , message , callback ) {
17
16
// Get the message in bytes, and prepend with the pubsub prefix
18
17
const bytes = Buffer . concat ( [
19
18
SignPrefix ,
@@ -31,3 +30,57 @@ module.exports.signMessage = function (peerId, message, callback) {
31
30
} )
32
31
} )
33
32
}
33
+
34
+ /**
35
+ * Verifies the signature of the given message
36
+ * @param {rpc.RPC.Message } message
37
+ * @param {function(Error, Boolean) } callback
38
+ */
39
+ function verifySignature ( message , callback ) {
40
+ // Get message sans the signature
41
+ let baseMessage = { ...message }
42
+ delete baseMessage . signature
43
+ delete baseMessage . key
44
+ const bytes = Buffer . concat ( [
45
+ SignPrefix ,
46
+ Message . encode ( baseMessage )
47
+ ] )
48
+
49
+ // Get the public key
50
+ messagePublicKey ( message , ( err , pubKey ) => {
51
+ if ( err ) return callback ( err , false )
52
+ // Verify the base message
53
+ pubKey . verify ( bytes , message . signature , callback )
54
+ } )
55
+ }
56
+
57
+ /**
58
+ * Returns the PublicKey associated with the given message.
59
+ * If no, valid PublicKey can be retrieved an error will be returned.
60
+ *
61
+ * @param {Message } message
62
+ * @param {function(Error, PublicKey) } callback
63
+ * @returns {void }
64
+ */
65
+ function messagePublicKey ( message , callback ) {
66
+ if ( message . key ) {
67
+ PeerId . createFromPubKey ( message . key , ( err , peerId ) => {
68
+ if ( err ) return callback ( err , null )
69
+ // the key belongs to the sender, return the key
70
+ if ( peerId . isEqual ( message . from ) ) return callback ( null , peerId . pubKey )
71
+ // We couldn't validate pubkey is from the originator, error
72
+ callback ( new Error ( 'Public Key does not match the originator' ) )
73
+ } )
74
+ return
75
+ }
76
+ // TODO: Once js libp2p supports inlining public keys with the peer id
77
+ // attempt to unmarshal the public key here.
78
+ callback ( new Error ( 'Could not get the public key from the originator id' ) )
79
+ }
80
+
81
+ module . exports = {
82
+ messagePublicKey,
83
+ signMessage,
84
+ SignPrefix,
85
+ verifySignature
86
+ }
0 commit comments