govpn.MTU = *mtu
- id := govpn.IDDecode(*IDRaw)
- if id == nil {
- panic("ID is not specified")
+ id, err := govpn.IDDecode(*IDRaw)
+ if err != nil {
+ log.Fatalln(err)
}
pub, priv := govpn.NewVerifier(id, govpn.StringFromFile(*keyPath))
bind, err := net.ResolveUDPAddr("udp", "0.0.0.0:0")
if err != nil {
- panic(err)
+ log.Fatalln("Can not resolve address:", err)
}
conn, err := net.ListenUDP("udp", bind)
if err != nil {
- panic(err)
+ log.Fatalln("Can not listen on UDP:", err)
}
remote, err := net.ResolveUDPAddr("udp", *remoteAddr)
if err != nil {
- panic(err)
+ log.Fatalln("Can not resolve remote address:", err)
}
tap, ethSink, ethReady, _, err := govpn.TAPListen(
*cpr,
)
if err != nil {
- panic(err)
+ log.Fatalln("Can not listen on TAP interface:", err)
}
udpSink, udpBuf, udpReady := govpn.ConnListen(conn)
log.Println("Stats are going to listen on", *stats)
statsPort, err := net.Listen("tcp", *stats)
if err != nil {
- panic(err)
+ log.Fatalln("Can not listen on stats port:", err)
}
go govpn.StatsProcessor(statsPort, &knownPeers)
}
bind, err := net.ResolveUDPAddr("udp", *bindAddr)
if err != nil {
- panic(err)
+ log.Fatalln("Can not resolve bind address:", err)
}
conn, err := net.ListenUDP("udp", bind)
if err != nil {
- panic(err)
+ log.Fatalln("Can listen on UDP:", err)
}
udpSink, udpBuf, udpReady := govpn.ConnListen(conn)
log.Println("Stats are going to listen on", *stats)
statsPort, err := net.Listen("tcp", *stats)
if err != nil {
- panic(err)
+ log.Fatalln("Can not listen on stats port:", err)
}
go govpn.StatsProcessor(statsPort, &knownPeers)
}
"encoding/hex"
"flag"
"fmt"
+ "log"
"govpn"
)
func main() {
flag.Parse()
- id := govpn.IDDecode(*IDRaw)
- if id == nil {
- panic("ID is not specified")
+ id, err := govpn.IDDecode(*IDRaw)
+ if err != nil {
+ log.Fatalln(err)
}
pub, _ := govpn.NewVerifier(id, govpn.StringFromFile(*keyPath))
if *verifierPath == "" {
} else {
verifier, err := hex.DecodeString(govpn.StringFromFile(*verifierPath))
if err != nil {
- panic("Can not decode verifier")
+ log.Fatalln("Can not decode verifier:", err)
}
fmt.Println(subtle.ConstantTimeCompare(verifier[:], pub[:]) == 1)
}
reprFound := false
for !reprFound {
if _, err := rand.Read(priv[:]); err != nil {
- panic("Can not read random for DH private key")
+ log.Fatalln("Error reading random for DH private key:", err)
}
reprFound = extra25519.ScalarBaseMult(pub, repr, priv)
}
state.rNonce = new([RSize]byte)
if _, err := rand.Read(state.rNonce[:]); err != nil {
- panic("Can not read random for handshake nonce")
+ log.Fatalln("Error reading random for nonce:", err)
}
enc := make([]byte, 32)
salsa20.XORKeyStream(enc, dhPubRepr[:], state.rNonce[:], state.dsaPubH)
// Generate R* and encrypt them
h.rServer = new([RSize]byte)
if _, err := rand.Read(h.rServer[:]); err != nil {
- panic("Can not read random for handshake random key")
+ log.Fatalln("Error reading random for R:", err)
}
h.sServer = new([SSize]byte)
if _, err := rand.Read(h.sServer[:]); err != nil {
- panic("Can not read random for handshake shared key")
+ log.Fatalln("Error reading random for S:", err)
}
encRs := make([]byte, RSize+SSize)
salsa20.XORKeyStream(encRs, append(h.rServer[:], h.sServer[:]...), h.rNonce[:], h.key)
// Generate R* and signature and encrypt them
h.rClient = new([RSize]byte)
if _, err := rand.Read(h.rClient[:]); err != nil {
- panic("Can not read random for handshake random key")
+ log.Fatalln("Error reading random for R:", err)
}
h.sClient = new([SSize]byte)
if _, err := rand.Read(h.sClient[:]); err != nil {
- panic("Can not read random for handshake shared key")
+ log.Fatalln("Error reading random for S:", err)
}
sign := ed25519.Sign(h.Conf.DSAPriv, h.key[:])
import (
"crypto/subtle"
"encoding/hex"
+ "errors"
"io/ioutil"
"log"
"os"
}
available := make(map[PeerId]bool)
for _, peerId := range peerIds {
- id := IDDecode(peerId)
- if id == nil {
+ id, err := IDDecode(peerId)
+ if err != nil {
continue
}
available[*id] = true
// Decode identification string.
// It must be 32 hexadecimal characters long.
-// If it is not the valid one, then return nil.
-func IDDecode(raw string) *PeerId {
+func IDDecode(raw string) (*PeerId, error) {
if len(raw) != IDSize*2 {
- return nil
+ return nil, errors.New("ID must be 32 characters long")
}
idDecoded, err := hex.DecodeString(raw)
if err != nil {
- return nil
+ return nil, errors.New("ID must contain hexadecimal characters only")
}
idP := new([IDSize]byte)
copy(idP[:], idDecoded)
id := PeerId(*idP)
- return &id
+ return &id, nil
}
<-tap.ready
n, err = tap.dev.Read(tap.buf)
if err != nil {
- panic(err)
+ panic("Reading TAP:" + err.Error())
}
tap.sink <- tap.buf[:n]
}
func init() {
MTU = 1500
addr, _ = net.ResolveUDPAddr("udp", "[::1]:1")
- peerId = IDDecode("ffffffffffffffffffffffffffffffff")
+ peerId, _ = IDDecode("ffffffffffffffffffffffffffffffff")
conf = &PeerConf{
Id: peerId,
Timeout: time.Second * time.Duration(TimeoutDefault),
"bytes"
"crypto/sha512"
"io/ioutil"
+ "log"
"strings"
"github.com/agl/ed25519"
src := bytes.NewBuffer(r)
pub, priv, err := ed25519.GenerateKey(src)
if err != nil {
- panic("Unable to generate Ed25519 keypair" + err.Error())
+ log.Fatalln("Unable to generate Ed25519 keypair", err)
}
return pub, priv
}
-// Read string from the file, trimming newline. Panics if error occured.
+// Read string from the file, trimming newline.
func StringFromFile(path string) string {
s, err := ioutil.ReadFile(path)
if err != nil {
- panic("Can not read string from" + path)
+ log.Fatalln("Can not read string from", path, err)
}
return strings.TrimRight(string(s), "\n")
}