-
Notifications
You must be signed in to change notification settings - Fork 1
/
tls.go
84 lines (68 loc) · 1.4 KB
/
tls.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
74
75
76
77
78
79
80
81
82
83
84
// A self-contained mutually-authenticated TLS client and server
package main
import (
"log"
"time"
)
const (
SAddr = "127.0.0.1"
CAddr = "127.0.0.2"
SSocket = SAddr + ":0"
CSocket = CAddr + ":0"
)
var (
// gen, secParam = genRSA, "8192"
// gen, secParam = genRSA, "4096"
// gen, secParam = genRSA, "2048"
// gen, secParam = genEC, "P512"
gen, secParam = genEC, "P256"
vault = map[string]Envelope{
"server": genCert("server", "myorg", time.Second*60, SAddr),
"client": genCert("client", "myorg", time.Second*60, CAddr),
}
)
type Envelope struct {
cert, key []byte
}
func main() {
n := 2
errc := make(chan error, n) // client and server send final errors on this
term := make(chan bool)
kill := make(chan bool)
first := make(chan bool, 1)
first <- true
teardown := func() {
if <-first {
close(term)
close(first)
log.Println("starting teardown")
}
}
listening := make(chan string)
go server(listening, term, errc)
go client(listening, term, errc)
go func() {
deadline := time.NewTimer(time.Second * 10)
select {
case <-deadline.C:
teardown()
case <-term:
}
log.Println("sigterm to goroutines; hard shut down in 5s")
time.Sleep(time.Second * 5)
close(kill)
}()
for n != 0 {
select {
case <-kill:
log.Fatalln("you have been terminated")
case err := <-errc:
if err != nil {
log.Println(err)
}
teardown()
n--
}
}
log.Printf("fin")
}