derp: add an unexported key.Public zero value variable to be less verbose

This commit is contained in:
Brad Fitzpatrick 2020-06-04 11:28:00 -07:00
parent b663ab4685
commit b33c86b542

View File

@ -548,60 +548,63 @@ func (s *Server) sendServerInfo(bw *bufio.Writer, clientKey key.Public) error {
func (s *Server) recvClientKey(br *bufio.Reader) (clientKey key.Public, info *clientInfo, err error) { func (s *Server) recvClientKey(br *bufio.Reader) (clientKey key.Public, info *clientInfo, err error) {
fl, err := readFrameTypeHeader(br, frameClientInfo) fl, err := readFrameTypeHeader(br, frameClientInfo)
if err != nil { if err != nil {
return key.Public{}, nil, err return zpub, nil, err
} }
const minLen = keyLen + nonceLen const minLen = keyLen + nonceLen
if fl < minLen { if fl < minLen {
return key.Public{}, nil, errors.New("short client info") return zpub, nil, errors.New("short client info")
} }
// We don't trust the client at all yet, so limit its input size to limit // We don't trust the client at all yet, so limit its input size to limit
// things like JSON resource exhausting (http://github.com/golang/go/issues/31789). // things like JSON resource exhausting (http://github.com/golang/go/issues/31789).
if fl > 256<<10 { if fl > 256<<10 {
return key.Public{}, nil, errors.New("long client info") return zpub, nil, errors.New("long client info")
} }
if _, err := io.ReadFull(br, clientKey[:]); err != nil { if _, err := io.ReadFull(br, clientKey[:]); err != nil {
return key.Public{}, nil, err return zpub, nil, err
} }
var nonce [24]byte var nonce [24]byte
if _, err := io.ReadFull(br, nonce[:]); err != nil { if _, err := io.ReadFull(br, nonce[:]); err != nil {
return key.Public{}, nil, fmt.Errorf("nonce: %v", err) return zpub, nil, fmt.Errorf("nonce: %v", err)
} }
msgLen := int(fl - minLen) msgLen := int(fl - minLen)
msgbox := make([]byte, msgLen) msgbox := make([]byte, msgLen)
if _, err := io.ReadFull(br, msgbox); err != nil { if _, err := io.ReadFull(br, msgbox); err != nil {
return key.Public{}, nil, fmt.Errorf("msgbox: %v", err) return zpub, nil, fmt.Errorf("msgbox: %v", err)
} }
msg, ok := box.Open(nil, msgbox, &nonce, (*[32]byte)(&clientKey), s.privateKey.B32()) msg, ok := box.Open(nil, msgbox, &nonce, (*[32]byte)(&clientKey), s.privateKey.B32())
if !ok { if !ok {
return key.Public{}, nil, fmt.Errorf("msgbox: cannot open len=%d with client key %x", msgLen, clientKey[:]) return zpub, nil, fmt.Errorf("msgbox: cannot open len=%d with client key %x", msgLen, clientKey[:])
} }
info = new(clientInfo) info = new(clientInfo)
if err := json.Unmarshal(msg, info); err != nil { if err := json.Unmarshal(msg, info); err != nil {
return key.Public{}, nil, fmt.Errorf("msg: %v", err) return zpub, nil, fmt.Errorf("msg: %v", err)
} }
return clientKey, info, nil return clientKey, info, nil
} }
func (s *Server) recvPacket(br *bufio.Reader, frameLen uint32) (dstKey key.Public, contents []byte, err error) { func (s *Server) recvPacket(br *bufio.Reader, frameLen uint32) (dstKey key.Public, contents []byte, err error) {
if frameLen < keyLen { if frameLen < keyLen {
return key.Public{}, nil, errors.New("short send packet frame") return zpub, nil, errors.New("short send packet frame")
} }
if _, err := io.ReadFull(br, dstKey[:]); err != nil { if _, err := io.ReadFull(br, dstKey[:]); err != nil {
return key.Public{}, nil, err return zpub, nil, err
} }
packetLen := frameLen - keyLen packetLen := frameLen - keyLen
if packetLen > MaxPacketSize { if packetLen > MaxPacketSize {
return key.Public{}, nil, fmt.Errorf("data packet longer (%d) than max of %v", packetLen, MaxPacketSize) return zpub, nil, fmt.Errorf("data packet longer (%d) than max of %v", packetLen, MaxPacketSize)
} }
contents = make([]byte, packetLen) contents = make([]byte, packetLen)
if _, err := io.ReadFull(br, contents); err != nil { if _, err := io.ReadFull(br, contents); err != nil {
return key.Public{}, nil, err return zpub, nil, err
} }
s.packetsRecv.Add(1) s.packetsRecv.Add(1)
s.bytesRecv.Add(int64(len(contents))) s.bytesRecv.Add(int64(len(contents)))
return dstKey, contents, nil return dstKey, contents, nil
} }
// zpub is the key.Public zero value.
var zpub key.Public
// sclient is a client connection to the server. // sclient is a client connection to the server.
// //
// (The "s" prefix is to more explicitly distinguish it from Client in derp_client.go) // (The "s" prefix is to more explicitly distinguish it from Client in derp_client.go)