-
Notifications
You must be signed in to change notification settings - Fork 0
/
message.go
73 lines (66 loc) · 1.74 KB
/
message.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
67
68
69
70
71
72
73
package oracle
import (
"crypto/ed25519"
"io"
)
type Message interface {
Digest() ([]byte, error)
Sign(io.Reader, ed25519.PrivateKey)
Verify(ed25519.PublicKey) bool
Encrypt(io.Reader, ed25519.PublicKey) (*CipherText, error)
Decrypt(ed25519.PrivateKey) (*PlainText, error)
PlainText() ([]byte, error)
CipherText() ([]byte, error)
}
// compose a message intended for a peer
func (o *Oracle) Compose(subject string, body []byte) *PlainText {
hdr := map[string]string{
"subject": subject,
}
pt := PlainText{
Type: "ORACLE MESSAGE",
Headers: hdr,
PlainTextData: body,
}
return &pt
}
// encrypt PlaintText, returning CipherText
func (o *Oracle) Encrypt(pt *PlainText, recipient Peer) (*CipherText, error) {
pt.recipient = recipient.EncryptionKey()
//pt.Headers["to"] = fmt.Sprintf("%s/%x", recipient.Nickname(), recipient.EncryptionKey().Bytes())
pt.Headers["from"] = o.Nickname()
pt.Headers["to"] = recipient.Nickname()
err := pt.ensureSharedSecret(o.randomness)
if err != nil {
return nil, err
}
return pt.encrypt(o.randomness)
}
// decrypt CipherText, returning PlainText
func (o *Oracle) Decrypt(ct *CipherText) (*PlainText, error) {
ct.recipient = o.encryptionPrivateKey
err := ct.extractSharedSecret()
if err != nil {
return nil, err
}
return ct.decrypt()
}
func (o *Oracle) Sign(pt *PlainText) error {
//pt.generateSharedSecret(o.randomness)
pt.generateNonce(o.randomness)
digest, err := pt.Digest()
if err != nil {
return err
}
sig := ed25519.Sign(o.signingPrivateKey, digest)
pt.Signature = sig
return nil
}
func (o *Oracle) Verify(pt *PlainText, sender Peer) bool {
digest, err := pt.Digest()
if err != nil {
return false
}
sig := pt.Signature
return ed25519.Verify(sender.SigningKey(), digest, sig)
}