Skip to content

Instantly share code, notes, and snippets.

@W4RH4WK
Created November 20, 2014 10:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save W4RH4WK/8e7bdc1645d9998fae31 to your computer and use it in GitHub Desktop.
Save W4RH4WK/8e7bdc1645d9998fae31 to your computer and use it in GitHub Desktop.
Challenge Response in Go
package main
import (
"bufio"
"crypto/hmac"
"crypto/sha256"
"encoding/base64"
"log"
"net"
"strings"
)
const secret = "wambo"
func main() {
conn, err := net.Dial("tcp", "localhost:1337")
if err != nil {
log.Fatalln("Error: could not connect to server")
}
connbuf := bufio.NewReader(conn)
// send username
conn.Write([]byte("Alex\n"))
// receive random string
randstr, err := connbuf.ReadString('\n')
if err != nil {
log.Fatalln("Error: could not receive random string")
}
log.Println("random string:", randstr)
randstr = strings.TrimSpace(randstr)
randbytes, err := base64.StdEncoding.DecodeString(randstr)
if err != nil {
log.Fatalln("Error: could not decode random string")
}
// send HMAC
mac := hmac.New(sha256.New, []byte(secret))
mac.Write(randbytes)
resultmac := mac.Sum(nil)
conn.Write([]byte(base64.StdEncoding.EncodeToString(resultmac) + "\n"))
conn.Close()
}
package main
import (
"bufio"
"crypto/hmac"
"crypto/rand"
"crypto/sha256"
"encoding/base64"
"log"
"net"
"strings"
)
const secret = "wambo"
func handleClient(conn net.Conn) {
defer func() {
conn.Close()
log.Println("closing connection")
}()
log.Println("client connected")
connbuf := bufio.NewReader(conn)
// get username
username, err := connbuf.ReadString('\n')
if err != nil {
log.Println("Error: could not receive username")
return
}
username = strings.TrimSpace(username)
log.Println("Client is", username)
// send random string
randbytes := make([]byte, 32)
rand.Read(randbytes)
conn.Write([]byte(base64.StdEncoding.EncodeToString(randbytes) + "\n"))
// calc HMAC
mac := hmac.New(sha256.New, []byte(secret))
mac.Write(randbytes)
expectedmac := mac.Sum(nil)
// get HMAC
clientmacstr, err := connbuf.ReadString('\n')
if err != nil {
log.Println("Error: could not receive response")
return
}
clientmacstr = strings.TrimSpace(clientmacstr)
clientmac, err := base64.StdEncoding.DecodeString(clientmacstr)
if err != nil {
log.Println("Error: response format incorrect")
return
}
// compare
if hmac.Equal(clientmac, expectedmac) {
log.Println(username, "is valid")
} else {
log.Println(username, "is not valid")
}
}
func main() {
l, err := net.Listen("tcp", "localhost:1337")
if err != nil {
log.Fatalln("Error:", err.Error())
}
log.Println("server listening")
defer l.Close()
for {
conn, err := l.Accept()
if err != nil {
log.Println("Error:", err.Error())
continue;
}
go handleClient(conn)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment