Created
November 20, 2014 10:44
-
-
Save W4RH4WK/8e7bdc1645d9998fae31 to your computer and use it in GitHub Desktop.
Challenge Response in Go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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() | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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