go for the paranoid network programmer
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
gofor the paranoid network programmer
@feyeleanor
1go for the would-be network programmer http://slides.games-with-brains.net/
twitter://@feyeleanor
go for the would-be network programmer http://slides.games-with-brains.net/
high voltagenetworking concurrency cryptography
go for the would-be network programmer http://slides.games-with-brains.net/
http
4go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
https
16go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
multiple http servers
21go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
waitgroups
40go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
tcp server
50go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
tcp client
60go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
tcp/tls server
72go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
tcp/tls client
87go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
udp serve
96go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
udp request
111go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
aes encrypt
121go for the would-be network programmer http://slides.games-with-brains.net/
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) } })}
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
aes decrypt
147go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
rsa encrypt
163go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
rsa decrypt
178go for the would-be network programmer http://slides.games-with-brains.net/
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
http://golang.org/
go for the would-be network programmer http://slides.games-with-brains.net/201
twitter://#golang
go for the would-be network programmer http://slides.games-with-brains.net/202