/
57_corrupt_key.go
66 lines (59 loc) · 1.58 KB
/
57_corrupt_key.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 main
import (
"bytes"
"crypto/rand"
"crypto/rsa"
"crypto/sha1"
"crypto/x509"
"encoding/gob"
"encoding/pem"
"io/ioutil"
. "fmt"
. "net"
)
var RSA_LABEL = []byte("served")
func main() {
Connect(":1025", func(server *UDPConn, private_key *rsa.PrivateKey) {
cipher_text := MakeBuffer()
if n, e := server.Read(cipher_text); e == nil {
if plain_text, e := rsa.DecryptOAEP(sha1.New(), rand.Reader, private_key, cipher_text[:n], RSA_LABEL); e == nil {
Println((string)(plain_text))
}
}
})
}
func Connect(address string, f func(*UDPConn, *rsa.PrivateKey)) {
LoadPrivateKey("client.key.pem", func(private_key *rsa.PrivateKey) {
if address, e := ResolveUDPAddr("udp", ":1025"); e == nil {
if server, e := DialUDP("udp", nil, address); e == nil {
defer server.Close()
SendKey(server, private_key.PublicKey, func() {
f(server, private_key)
})
}
}
})
}
func LoadPrivateKey(file string, f func(*rsa.PrivateKey)) {
if file, e := ioutil.ReadFile(file); e == nil {
if block, _ := pem.Decode(file); block != nil {
if block.Type == "RSA PRIVATE KEY" {
if key, _ := x509.ParsePKCS1PrivateKey(block.Bytes); key != nil {
f(key)
}
}
}
}
return
}
func SendKey(server *UDPConn, public_key rsa.PublicKey, f func()) {
var encoded_key bytes.Buffer
if e := gob.NewEncoder(&encoded_key).Encode(public_key); e == nil {
if _, e = server.Write(encoded_key.Bytes()[1:]); e == nil {
f()
}
}
}
func MakeBuffer() (r []byte) {
return make([]byte, 1024)
}