go for the paranoid network programmer

202
go for the paranoid network programmer @feyeleanor 1 go for the would-be network programmer http://slides.games-with-brains.net/

Upload: eleanor-mchugh

Post on 02-Jul-2015

5.013 views

Category:

Software


0 download

DESCRIPTION

An enhanced version of the #codemesh2014 talk on network programming in Go. It covers HTTP, HTTPS, TCP/IP, TCP/IP over TLS, UDP and basic cryptographic functions with AES-CBC and RSA.

TRANSCRIPT

Page 1: Go for the paranoid network programmer

gofor the paranoid network programmer

@feyeleanor

1go for the would-be network programmer http://slides.games-with-brains.net/

Page 2: Go for the paranoid network programmer

twitter://@feyeleanor

go for the would-be network programmer http://slides.games-with-brains.net/

Page 3: Go for the paranoid network programmer

high voltagenetworking concurrency cryptography

go for the would-be network programmer http://slides.games-with-brains.net/

Page 4: Go for the paranoid network programmer

http

4go for the would-be network programmer http://slides.games-with-brains.net/

Page 5: Go for the paranoid network programmer

package mainimport ( . "fmt" "net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { http.HandleFunc("/hello", Hello) if e := http.ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/5

Page 6: Go for the paranoid network programmer

package mainimport ( . "fmt" "net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { http.HandleFunc("/hello", Hello) if e := http.ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/6

Page 7: Go for the paranoid network programmer

package mainimport ( . "fmt" "net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { http.HandleFunc("/hello", Hello) if e := http.ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/7

Page 8: Go for the paranoid network programmer

package mainimport ( . "fmt" . "net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", Hello) if e := ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/8

Page 9: Go for the paranoid network programmer

package mainimport ( . "fmt" . ”net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", Hello) if e := ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/9

Page 10: Go for the paranoid network programmer

package mainimport ( . "fmt" . ”net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", Hello) if e := ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/10

Page 11: Go for the paranoid network programmer

package mainimport ( . "fmt" . ”net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", Hello) if e := ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/11

Page 12: Go for the paranoid network programmer

package mainimport ( . "fmt" . ”net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", Hello) if e := ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/12

Page 13: Go for the paranoid network programmer

package mainimport ( . "fmt" . ”net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", Hello) if e := ListenAndServe(ADDRESS, nil); e != nil { Println(e) }}

func Hello(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE)}

go for the would-be network programmer http://slides.games-with-brains.net/13

Page 14: Go for the paranoid network programmer

package mainimport ( . "fmt" . "net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE) }) ListenAndServe(ADDRESS, nil)}

go for the would-be network programmer http://slides.games-with-brains.net/14

Page 15: Go for the paranoid network programmer

package mainimport ( . "fmt" . "net/http")

const MESSAGE = "hello world"const ADDRESS = ":1024"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, MESSAGE) }) ListenAndServe(ADDRESS, nil)}

go for the would-be network programmer http://slides.games-with-brains.net/15

Page 16: Go for the paranoid network programmer

https

16go for the would-be network programmer http://slides.games-with-brains.net/

Page 17: Go for the paranoid network programmer

package mainimport ( . "fmt" . "net/http")

const ADDRESS = ":1025"

func main() { message := "hello world" HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, message) }) ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)}

go for the would-be network programmer http://slides.games-with-brains.net/17

Page 18: Go for the paranoid network programmer

package mainimport ( . "fmt" . "net/http")

const ADDRESS = ":1025"

func main() { message := "hello world" HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, message) }) ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)}

go for the would-be network programmer http://slides.games-with-brains.net/18

Page 19: Go for the paranoid network programmer

package mainimport ( . "fmt" . "net/http")

const ADDRESS = ":1025"

func main() { message := "hello world" HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, message) }) ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)}

go for the would-be network programmer http://slides.games-with-brains.net/19

Page 20: Go for the paranoid network programmer

package mainimport ( . "fmt" . "net/http")

const ADDRESS = ":1025"

func main() { message := "hello world" HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, message) }) ListenAndServeTLS(ADDRESS, "cert.pem", "key.pem", nil)}

go for the would-be network programmer http://slides.games-with-brains.net/20

Page 21: Go for the paranoid network programmer

multiple http servers

21go for the would-be network programmer http://slides.games-with-brains.net/

Page 22: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/22

Page 23: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/23

Page 24: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/24

Page 25: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/25

Page 26: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/26

Page 27: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/27

Page 28: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/28

Page 29: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/29

Page 30: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

done := make(chan bool) go func() { ListenAndServe(":1024", nil) done <- true }()

ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) <- done}

go for the would-be network programmer http://slides.games-with-brains.net/30

Page 31: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

Spawn( func() { ListenAndServe(":1024", nil) }, func() { ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }, )}

go for the would-be network programmer http://slides.games-with-brains.net/31

Page 32: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

Spawn(func() { ListenAndServe(":1024", nil) }) Spawn(func() { ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) })}

go for the would-be network programmer http://slides.games-with-brains.net/32

Page 33: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { done := make(chan bool) for _, s := range f { go func(server func()) { server() done <- true }(s) }

for l := len(f); l > 0; l-- { <- done }}

go for the would-be network programmer http://slides.games-with-brains.net/33

Page 34: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { done := make(chan bool) for _, s := range f { go func(server func()) { server() done <- true }(s) }

for l := len(f); l > 0; l-- { <- done }}

go for the would-be network programmer http://slides.games-with-brains.net/34

Page 35: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { done := make(chan bool) for _, s := range f { go func(server func()) { server() done <- true }(s) }

for l := len(f); l > 0; l-- { <- done }}

go for the would-be network programmer http://slides.games-with-brains.net/35

Page 36: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { done := make(chan bool) for _, s := range f { go func(server func()) { server() done <- true }(s) }

for l := len(f); l > 0; l-- { <- done }}

go for the would-be network programmer http://slides.games-with-brains.net/36

Page 37: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { done := make(chan bool) for _, s := range f { go func(server func()) { server() done <- true }(s) }

for l := len(f); l > 0; l-- { <- done }}

go for the would-be network programmer http://slides.games-with-brains.net/37

Page 38: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { done := make(chan bool) for _, s := range f { go func(server func()) { server() done <- true }(s) }

for l := len(f); l > 0; l-- { <- done }}

go for the would-be network programmer http://slides.games-with-brains.net/38

Page 39: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { done := make(chan bool) for _, s := range f { go func(server func()) { server() done <- true }(s) }

for l := len(f); l > 0; l-- { <- done }}

go for the would-be network programmer http://slides.games-with-brains.net/39

Page 40: Go for the paranoid network programmer

waitgroups

40go for the would-be network programmer http://slides.games-with-brains.net/

Page 41: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the would-be network programmer http://slides.games-with-brains.net/41

Page 42: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the would-be network programmer http://slides.games-with-brains.net/42

Page 43: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the would-be network programmer http://slides.games-with-brains.net/43

Page 44: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the would-be network programmer http://slides.games-with-brains.net/44

Page 45: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"import "sync"

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) {})

var servers sync.WaitGroup servers.Add(1) go func() { defer servers.Done() ListenAndServe(":1024", nil) }()

servers.Add(1) go func() { defer servers.Done() ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }() servers.Wait()}

go for the would-be network programmer http://slides.games-with-brains.net/45

Page 46: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"import "sync"

var servers sync.WaitGroup

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

Spawn(func() { ListenAndServe(":1024", nil) }) Spawn(func() { ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }) servers.Wait()}

go for the would-be network programmer http://slides.games-with-brains.net/46

Page 47: Go for the paranoid network programmer

package mainimport . "fmt"import . "net/http"import "sync"

var servers sync.WaitGroup

func main() { HandleFunc("/hello", func(w ResponseWriter, r *Request) { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "hello world") })

Spawn(func() { ListenAndServe(":1024", nil) }) Spawn(func() { ListenAndServeTLS(":1025", "cert.pem", "key.pem", nil) }) servers.Wait()}

go for the would-be network programmer http://slides.games-with-brains.net/47

Page 48: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { for _, s := range f { servers.Add(1) go func(server func()) { defer servers.Done() server() }(s) }}

go for the would-be network programmer http://slides.games-with-brains.net/48

Page 49: Go for the paranoid network programmer

package main

func Spawn(f ...func()) { for _, s := range f { servers.Add(1) go func(server func()) { defer servers.Done() server() }(s) }}

go for the would-be network programmer http://slides.games-with-brains.net/49

Page 50: Go for the paranoid network programmer

tcp server

50go for the would-be network programmer http://slides.games-with-brains.net/

Page 51: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { if listener, e := net.Listen("tcp", ":1024"); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") }(connection) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/51

Page 52: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { if listener, e := net.Listen("tcp", ":1024"); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") }(connection) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/52

Page 53: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { if listener, e := net.Listen("tcp", ":1024"); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") }(connection) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/53

Page 54: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { if listener, e := net.Listen("tcp", ":1024"); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") }(connection) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/54

Page 55: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { if listener, e := net.Listen("tcp", ":1024"); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") }(connection) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/55

Page 56: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { Listen("tcp", ":1024", func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") })}

func Listen(p, a string, f func(net.Conn)) (e error) { var listener net.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/56

Page 57: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { Listen("tcp", ":1024", func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") })}

func Listen(p, a string, f func(net.Conn)) (e error) { var listener net.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/57

Page 58: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { Listen("tcp", ":1024", func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") })}

func Listen(p, a string, f func(net.Conn)) (e error) { var listener net.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/58

Page 59: Go for the paranoid network programmer

package mainimport . "fmt"import "net"

func main() { Listen("tcp", ":1024", func(c net.Conn) { defer c.Close() Fprintln(c, "hello world") })}

func Listen(p, a string, f func(net.Conn)) (e error) { var listener net.Listener if listener, e = net.Listen(p, a); e == nil { for { if connection, e := listener.Accept(); e == nil { go f(connection) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/59

Page 60: Go for the paranoid network programmer

tcp client

60go for the would-be network programmer http://slides.games-with-brains.net/

Page 61: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { if c, e := net.Dial("tcp", ":1024"); e == nil { defer c.Close() if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } }}

go for the would-be network programmer http://slides.games-with-brains.net/61

Page 62: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { if c, e := net.Dial("tcp", ":1024"); e == nil { defer c.Close() if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } }}

go for the would-be network programmer http://slides.games-with-brains.net/62

Page 63: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { if c, e := net.Dial("tcp", ":1024"); e == nil { defer c.Close() if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } }}

go for the would-be network programmer http://slides.games-with-brains.net/63

Page 64: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { if c, e := net.Dial("tcp", ":1024"); e == nil { defer c.Close() if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } }}

go for the would-be network programmer http://slides.games-with-brains.net/64

Page 65: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { if c, e := net.Dial("tcp", ":1024"); e == nil { defer c.Close() if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } }}

go for the would-be network programmer http://slides.games-with-brains.net/65

Page 66: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { if c, e := net.Dial("tcp", ":1024"); e == nil { defer c.Close() if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } }}

go for the would-be network programmer http://slides.games-with-brains.net/66

Page 67: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial("tcp", ":1024", func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

go for the would-be network programmer http://slides.games-with-brains.net/67

Page 68: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial("tcp", ":1024", func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

func Dial(p, a string, f func(net.Conn)) (e error) { var c net.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/68

Page 69: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial("tcp", ":1024", func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

func Dial(p, a string, f func(net.Conn)) (e error) { var c net.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/69

Page 70: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial("tcp", ":1024", func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

func Dial(p, a string, f func(net.Conn)) (e error) { var c net.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/70

Page 71: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial("tcp", ":1024", func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

func Dial(p, a string, f func(net.Conn)) (e error) { var c net.Conn if c, e = net.Dial(p, a); e == nil { defer c.Close() f(c) } return}

go for the would-be network programmer http://slides.games-with-brains.net/71

Page 72: Go for the paranoid network programmer

tcp/tls server

72go for the would-be network programmer http://slides.games-with-brains.net/

Page 73: Go for the paranoid network programmer

package mainimport "crypto/tls"import . "fmt"

func main() { Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) { Fprintln(c, "hello world") })}

go for the would-be network programmer http://slides.games-with-brains.net/73

Page 74: Go for the paranoid network programmer

package mainimport "crypto/tls"import . "fmt"

func main() { Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) { Fprintln(c, "hello world") })}

go for the would-be network programmer http://slides.games-with-brains.net/74

Page 75: Go for the paranoid network programmer

package mainimport "crypto/tls"import . "fmt"

func main() { Listen(":1025", ConfigTLS("scert", "skey"), func(c *tls.Conn) { Fprintln(c, "hello world") })}

go for the would-be network programmer http://slides.games-with-brains.net/75

Page 76: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, Rand: rand.Reader, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/76

Page 77: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, Rand: rand.Reader, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/77

Page 78: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, Rand: rand.Reader, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/78

Page 79: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, Rand: rand.Reader, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/79

Page 80: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, Rand: rand.Reader, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/80

Page 81: Go for the paranoid network programmer

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) { if listener, e := tls.Listen("tcp", a, conf); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c *tls.Conn) { defer c.Close() f(c) }(connection.(*tls.Conn)) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/81

Page 82: Go for the paranoid network programmer

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) { if listener, e := tls.Listen("tcp", a, conf); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c *tls.Conn) { defer c.Close() f(c) }(connection.(*tls.Conn)) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/82

Page 83: Go for the paranoid network programmer

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) { if listener, e := tls.Listen("tcp", a, conf); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c *tls.Conn) { defer c.Close() f(c) }(connection.(*tls.Conn)) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/83

Page 84: Go for the paranoid network programmer

package mainimport "crypto/tls"

func Listen(a string, conf *tls.Config, f func(*tls.Conn)) { if listener, e := tls.Listen("tcp", a, conf); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c *tls.Conn) { defer c.Close() f(c) }(connection.(*tls.Conn)) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/84

Page 85: Go for the paranoid network programmer

package mainimport “crypto/tls"import "net"

func Listen(a string, conf *tls.Config, f func(net.Conn)) { if listener, e := tls.Listen("tcp", a, conf); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c net.Conn) { defer c.Close() f(c) }(connection) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/85

Page 86: Go for the paranoid network programmer

package mainimport "crypto/tls"import "net"

func Listen(a string, conf *tls.Config, f func(net.Conn)) { if listener, e := tls.Listen("tcp", a, conf); e == nil { for { if connection, e := listener.Accept(); e == nil { go func(c net.Conn) { defer c.Close() f(c) }(connection) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/86

Page 87: Go for the paranoid network programmer

tcp/tls client

87go for the would-be network programmer http://slides.games-with-brains.net/

Page 88: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net" func main() { Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

go for the would-be network programmer http://slides.games-with-brains.net/88

Page 89: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net" func main() { Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

go for the would-be network programmer http://slides.games-with-brains.net/89

Page 90: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net" func main() { Dial(":1025", ConfigTLS("ccert", "ckey"), func(c net.Conn) { if m, e := bufio.NewReader(c).ReadString('\n'); e == nil { Printf(m) } })}

go for the would-be network programmer http://slides.games-with-brains.net/90

Page 91: Go for the paranoid network programmer

package mainimport "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, InsecureSkipVerify: true, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/91

Page 92: Go for the paranoid network programmer

package mainimport "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, InsecureSkipVerify: true, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/92

Page 93: Go for the paranoid network programmer

package mainimport "crypto/tls"

func ConfigTLS(c, k string) (r *tls.Config) { if cert, e := tls.LoadX509KeyPair(c, k); e == nil { r = &tls.Config{ Certificates: []tls.Certificate{ cert }, InsecureSkipVerify: true, } } return}

go for the would-be network programmer http://slides.games-with-brains.net/93

Page 94: Go for the paranoid network programmer

package mainimport “crypto/tls"import "net"

func Dial(a string, conf *tls.Config, f func(net.Conn)) { if c, e := tls.Dial("tcp", a, conf); e == nil { defer c.Close() f(c) }}

go for the would-be network programmer http://slides.games-with-brains.net/94

Page 95: Go for the paranoid network programmer

package mainimport “crypto/tls"import "net"

func Dial(a string, conf *tls.Config, f func(net.Conn)) { if c, e := tls.Dial("tcp", a, conf); e == nil { defer c.Close() f(c) }}

go for the would-be network programmer http://slides.games-with-brains.net/95

Page 96: Go for the paranoid network programmer

udp serve

96go for the would-be network programmer http://slides.games-with-brains.net/

Page 97: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/97

Page 98: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n”) Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/98

Page 99: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/99

Page 100: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/100

Page 101: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/101

Page 102: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/102

Page 103: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/103

Page 104: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/104

Page 105: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/105

Page 106: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/106

Page 107: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/107

Page 108: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/108

Page 109: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/109

Page 110: Go for the paranoid network programmer

package mainimport "net"

func main() { HELLO_WORLD := []byte("Hello World\n") Listen(":1024", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { c.WriteToUDP(HELLO_WORLD, a) })}

func Listen(a string, f func(*net.UDPConn, *net.UDPAddr, []byte)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.ListenUDP("udp", address); e == nil { for b := make([]byte, 1024); ; b = make([]byte, 1024) { if n, client, e := conn.ReadFromUDP(b); e == nil { go f(conn, client, b[:n]) } } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/110

Page 111: Go for the paranoid network programmer

udp request

111go for the would-be network programmer http://slides.games-with-brains.net/

Page 112: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/112

Page 113: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/113

Page 114: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/114

Page 115: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/115

Page 116: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/116

Page 117: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/117

Page 118: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/118

Page 119: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/119

Page 120: Go for the paranoid network programmer

package mainimport "bufio"import . "fmt"import "net"

func main() { Dial(":1024", func(conn net.Conn) { if _, e := conn.Write([]byte("\n")); e == nil { if m, e := bufio.NewReader(conn).ReadString('\n'); e == nil { Printf("%v", m) } } })}

func Dial(a string, f func(net.Conn)) { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() f(conn) } }}

go for the would-be network programmer http://slides.games-with-brains.net/120

Page 121: Go for the paranoid network programmer

aes encrypt

121go for the would-be network programmer http://slides.games-with-brains.net/

Page 122: Go for the paranoid network programmer

go for the would-be network programmer http://slides.games-with-brains.net/122

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

const AES_KEY = "0123456789012345"

func main() { Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { if m, e := Encrypt("Hello World", AES_KEY); e == nil { c.WriteToUDP(m, a) } })}

Page 123: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

const AES_KEY = "0123456789012345"

func main() { Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { if m, e := Encrypt("Hello World", AES_KEY); e == nil { c.WriteToUDP(m, a) } return })}

go for the would-be network programmer http://slides.games-with-brains.net/123

Page 124: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

const AES_KEY = "0123456789012345"

func main() { Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { if m, e := Encrypt("Hello World", AES_KEY); e == nil { c.WriteToUDP(m, a) } return })}

go for the would-be network programmer http://slides.games-with-brains.net/124

Page 125: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

const AES_KEY = "0123456789012345"

func main() { Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { if m, e := Encrypt("Hello World", AES_KEY); e == nil { c.WriteToUDP(m, a) } return })}

go for the would-be network programmer http://slides.games-with-brains.net/125

Page 126: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

const AES_KEY = "0123456789012345"

func main() { Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { if m, e := Encrypt("Hello World", AES_KEY); e == nil { c.WriteToUDP(m, a) } return })}

go for the would-be network programmer http://slides.games-with-brains.net/126

Page 127: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise([]byte(m)); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/127

Page 128: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise([]byte(m)); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/128

Page 129: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/129

Page 130: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/130

Page 131: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/131

Page 132: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/132

Page 133: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/133

Page 134: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/134

Page 135: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/135

Page 136: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/136

Page 137: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Quantise(m string) (b []byte, e error) { b = append(b, m...) if p := len(b) % aes.BlockSize; p != 0 { p = aes.BlockSize - p // this is insecure and inflexible as we're padding with NUL! b = append(b, make([]byte, p)...) } return}

go for the would-be network programmer http://slides.games-with-brains.net/137

Page 138: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/138

Page 139: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/139

Page 140: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/140

Page 141: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/141

Page 142: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func IV() (b []byte, e error) { b = make([]byte, aes.BlockSize) _, e = rand.Read(b) return}

go for the would-be network programmer http://slides.games-with-brains.net/142

Page 143: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func IV() (b []byte, e error) { b = make([]byte, aes.BlockSize) _, e = rand.Read(b) return}

go for the would-be network programmer http://slides.games-with-brains.net/143

Page 144: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/144

Page 145: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/145

Page 146: Go for the paranoid network programmer

package mainimport "crypto/aes"import "crypto/cipher"import "crypto/rand"import "net"

func Encrypt(m, k string) (o []byte, e error) { if o, e = Quantise(m); e == nil { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte if iv, e = IV(); e == nil { c := cipher.NewCBCEncrypter(b, iv) c.CryptBlocks(o, o) o = append(iv, o...) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/146

Page 147: Go for the paranoid network programmer

aes decrypt

147go for the would-be network programmer http://slides.games-with-brains.net/

Page 148: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

const AES_KEY = "0123456789012345"

func main() { Dial(":1025", func(c *net.UDPConn) { c.Write(make([]byte, 1)) if m, e := ReadStream(c); e == nil { if m, e := Decrypt(m, AES_KEY); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/148

Page 149: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

const AES_KEY = "0123456789012345"

func main() { Dial(":1025", func(c *net.UDPConn) { c.Write(make([]byte, 1)) if m, e := ReadStream(c); e == nil { if m, e := Decrypt(m, AES_KEY); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/149

Page 150: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

const AES_KEY = "0123456789012345"

func main() { Dial(":1025", func(c *net.UDPConn) { c.Write(make([]byte, 1)) if m, e := ReadStream(c); e == nil { if m, e := Decrypt(m, AES_KEY); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/150

Page 151: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Decrypt(m []byte, k string) (r string, e error) { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte iv, m = Unpack(m) c := cipher.NewCBCDecrypter(b, iv) c.CryptBlocks(m, m) r = Dequantise(m) } return}

go for the would-be network programmer http://slides.games-with-brains.net/151

Page 152: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Decrypt(m []byte, k string) (r string, e error) { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte iv, m = Unpack(m) c := cipher.NewCBCDecrypter(b, iv) c.CryptBlocks(m, m) r = Dequantise(m) } return}

go for the would-be network programmer http://slides.games-with-brains.net/152

Page 153: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Decrypt(m []byte, k string) (r string, e error) { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte iv, m = Unpack(m) c := cipher.NewCBCDecrypter(b, iv) c.CryptBlocks(m, m) r = Dequantise(m) } return}

go for the would-be network programmer http://slides.games-with-brains.net/153

Page 154: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Unpack(m []byte) (iv, r []byte) { return m[:aes.BlockSize], m[aes.BlockSize:]}

go for the would-be network programmer http://slides.games-with-brains.net/154

Page 155: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Unpack(m []byte) (iv, r []byte) { return m[:aes.BlockSize], m[aes.BlockSize:]}

go for the would-be network programmer http://slides.games-with-brains.net/155

Page 156: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Unpack(m []byte) (iv, r []byte) { return m[:aes.BlockSize], m[aes.BlockSize:]}

go for the would-be network programmer http://slides.games-with-brains.net/156

Page 157: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Decrypt(m []byte, k string) (r string, e error) { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte iv, m = Unpack(m) c := cipher.NewCBCDecrypter(b, iv) c.CryptBlocks(m, m) r = Dequantise(m) } return}

go for the would-be network programmer http://slides.games-with-brains.net/157

Page 158: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Decrypt(m []byte, k string) (r string, e error) { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte iv, m = Unpack(m) c := cipher.NewCBCDecrypter(b, iv) c.CryptBlocks(m, m) r = Dequantise(m) } return}

go for the would-be network programmer http://slides.games-with-brains.net/158

Page 159: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Decrypt(m []byte, k string) (r string, e error) { var b cipher.Block if b, e = aes.NewCipher([]byte(k)); e == nil { var iv []byte iv, m = Unpack(m) c := cipher.NewCBCDecrypter(b, iv) c.CryptBlocks(m, m) r = Dequantise(m) } return}

go for the would-be network programmer http://slides.games-with-brains.net/159

Page 160: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Dequantise(m []byte) string { var i int for i = len(m) - 1; i > 0 && m[i] == 0; i-- {} return string(m[:i + 1])}

go for the would-be network programmer http://slides.games-with-brains.net/160

Page 161: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Dequantise(m []byte) string { var i int for i = len(m) - 1; i > 0 && m[i] == 0; i-- {} return string(m[:i + 1])}

go for the would-be network programmer http://slides.games-with-brains.net/161

Page 162: Go for the paranoid network programmer

package mainimport "crypto/cipher"import "crypto/aes"import . "fmt"import "net"

func Dequantise(m []byte) string { var i int for i = len(m) - 1; i > 0 && m[i] == 0; i-- {} return string(m[:i + 1])}

go for the would-be network programmer http://slides.games-with-brains.net/162

Page 163: Go for the paranoid network programmer

rsa encrypt

163go for the would-be network programmer http://slides.games-with-brains.net/

Page 164: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/164

Page 165: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/165

Page 166: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/166

Page 167: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/167

Page 168: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/168

Page 169: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/169

Page 170: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/170

Page 171: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/171

Page 172: Go for the paranoid network programmer

package mainimport . "bytes"import "crypto/rsa"import "encoding/gob"import "net"

func main() { HELLO_WORLD := []byte("Hello World") RSA_LABEL := []byte("served") Listen(":1025", func(c *net.UDPConn, a *net.UDPAddr, b []byte) { var key rsa.PublicKey if e := gob.NewDecoder(NewBuffer(b)).Decode(&key); e == nil { if m, e := Encrypt(&key, HELLO_WORLD, RSA_LABEL); e == nil { c.WriteToUDP(m, a) } } return })}

go for the would-be network programmer http://slides.games-with-brains.net/172

Page 173: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the would-be network programmer http://slides.games-with-brains.net/173

Page 174: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the would-be network programmer http://slides.games-with-brains.net/174

Page 175: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the would-be network programmer http://slides.games-with-brains.net/175

Page 176: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the would-be network programmer http://slides.games-with-brains.net/176

Page 177: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Encrypt(key *rsa.PublicKey, m, l []byte) ([]byte, error) { return rsa.EncryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the would-be network programmer http://slides.games-with-brains.net/177

Page 178: Go for the paranoid network programmer

rsa decrypt

178go for the would-be network programmer http://slides.games-with-brains.net/

Page 179: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/179

Page 180: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/180

Page 181: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/181

Page 182: Go for the paranoid network programmer

package mainimport "crypto/rand"import "crypto/rsa"import "crypto/sha1"

func Decrypt(key *rsa.PrivateKey, m, l []byte) ([]byte, error) { return rsa.DecryptOAEP(sha1.New(), rand.Reader, key, m, l)}

go for the would-be network programmer http://slides.games-with-brains.net/182

Page 183: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/183

Page 184: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func main() { Dial(":1025", "ckey", func(c *net.UDPConn, k *rsa.PrivateKey) { if m, e := ReadStream(c); e == nil { if m, e := Decrypt(k, m, []byte("served")); e == nil { Println(string(m)) } } })}

go for the would-be network programmer http://slides.games-with-brains.net/184

Page 185: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/185

Page 186: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/186

Page 187: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/187

Page 188: Go for the paranoid network programmer

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/188

Page 189: Go for the paranoid network programmer

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/189

Page 190: Go for the paranoid network programmer

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/190

Page 191: Go for the paranoid network programmer

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/191

Page 192: Go for the paranoid network programmer

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/192

Page 193: Go for the paranoid network programmer

package mainimport "crypto/rsa"import "crypto/x509"import "encoding/pem"import "io/ioutil"

func LoadPrivateKey(file string) (r *rsa.PrivateKey, e error) { if file, e := ioutil.ReadFile(file); e == nil { if block, _ := pem.Decode(file); block != nil { if block.Type == "RSA PRIVATE KEY" { r, e = x509.ParsePKCS1PrivateKey(block.Bytes) } } } return}

go for the would-be network programmer http://slides.games-with-brains.net/193

Page 194: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/194

Page 195: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/195

Page 196: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/196

Page 197: Go for the paranoid network programmer

package mainimport "bytes"import “crypto/rsa"import "encoding/gob"import "net"

func SendKey(c *net.UDPConn, k rsa.PublicKey, f func()) { var b bytes.Buffer if e := gob.NewEncoder(&b).Encode(k); e == nil { if _, e = c.Write(b.Bytes()); e == nil { f() } }}

go for the would-be network programmer http://slides.games-with-brains.net/197

Page 198: Go for the paranoid network programmer

package mainimport "bytes"import “crypto/rsa"import "encoding/gob"import "net"

func SendKey(c *net.UDPConn, k rsa.PublicKey, f func()) { var b bytes.Buffer if e := gob.NewEncoder(&b).Encode(k); e == nil { if _, e = c.Write(b.Bytes()); e == nil { f() } }}

go for the would-be network programmer http://slides.games-with-brains.net/198

Page 199: Go for the paranoid network programmer

package mainimport "bytes"import “crypto/rsa"import "encoding/gob"import "net"

func SendKey(c *net.UDPConn, k rsa.PublicKey, f func()) { var b bytes.Buffer if e := gob.NewEncoder(&b).Encode(k); e == nil { if _, e = c.Write(b.Bytes()); e == nil { f() } }}

go for the would-be network programmer http://slides.games-with-brains.net/199

Page 200: Go for the paranoid network programmer

package mainimport "crypto/rsa"import . "fmt"import "net"

func Dial(a, file string, f func(*net.UDPConn, *rsa.PrivateKey)) { if k, e := LoadPrivateKey(file); e == nil { if address, e := net.ResolveUDPAddr("udp", a); e == nil { if conn, e := net.DialUDP("udp", nil, address); e == nil { defer conn.Close() SendKey(conn, k.PublicKey, func() { f(conn, k) }) } } }}

go for the would-be network programmer http://slides.games-with-brains.net/200

Page 201: Go for the paranoid network programmer

http://golang.org/

go for the would-be network programmer http://slides.games-with-brains.net/201

Page 202: Go for the paranoid network programmer

twitter://#golang

go for the would-be network programmer http://slides.games-with-brains.net/202