/
util.go
66 lines (55 loc) · 1.38 KB
/
util.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package server
import (
"crypto/sha256"
"crypto/tls"
"encoding/hex"
"encoding/json"
"errors"
"fmt"
"github.com/companyzero/bisonrelay/rpc"
)
var errUnknownRPCCommand = errors.New("unknown rpc command")
func payloadForCmd(cmd string) (interface{}, error) {
var p interface{}
switch cmd {
case rpc.TaggedCmdPing:
p = new(rpc.Ping)
case rpc.TaggedCmdPong:
p = new(rpc.Pong)
case rpc.TaggedCmdAcknowledge:
p = new(rpc.Acknowledge)
case rpc.TaggedCmdRouteMessage:
p = new(rpc.RouteMessage)
case rpc.TaggedCmdRouteMessageReply:
p = new(rpc.RouteMessageReply)
case rpc.TaggedCmdSubscribeRoutedMessagesReply:
p = new(rpc.SubscribeRoutedMessagesReply)
case rpc.TaggedCmdPushRoutedMessage:
p = new(rpc.PushRoutedMessage)
case rpc.TaggedCmdGetInvoiceReply:
p = new(rpc.GetInvoiceReply)
default:
return nil, errUnknownRPCCommand
}
return p, nil
}
func decodeRPCPayload(message *rpc.Message, dec *json.Decoder) (interface{}, error) {
p, err := payloadForCmd(message.Command)
if err != nil {
return nil, err
}
err = dec.Decode(&p)
if err != nil {
return nil, fmt.Errorf("unable to unmarshal %q: %v", message.Command, err)
}
return p, err
}
func fingerprintDER(c tls.Certificate) string {
if len(c.Certificate) != 1 {
return "unexpected chained certificate"
}
d := sha256.New()
d.Write(c.Certificate[0])
digest := d.Sum(nil)
return hex.EncodeToString(digest)
}