Initial commit: crypto.go and protocol.go implementation + unit tests
This commit is contained in:
47
protocol.go
Normal file
47
protocol.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package ownwire_sdk
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
||||
type SessionInit struct {
|
||||
SessionId string
|
||||
ServerPubKeyB64 string
|
||||
SaltB64 string
|
||||
SeqOut uint64
|
||||
SeqInMax uint64
|
||||
}
|
||||
|
||||
// ParseSessionInit parses:
|
||||
// "/session:<id>:<server_pubkey_b64>:<salt_b64>:<seq_out>:<seq_in_max>"
|
||||
func ParseSessionInit(line string) (SessionInit, error) {
|
||||
if !strings.HasPrefix(line, "/session:") {
|
||||
return SessionInit{}, fmt.Errorf("invalid session line prefix: %q", line)
|
||||
}
|
||||
|
||||
parts := strings.Split(line, ":")
|
||||
if len(parts) < 6 || parts[0] != "/session" {
|
||||
return SessionInit{}, fmt.Errorf("invalid session line: %q", line)
|
||||
}
|
||||
|
||||
seq_out, err := strconv.ParseUint(parts[4], 10, 64)
|
||||
if err != nil {
|
||||
return SessionInit{}, fmt.Errorf("invalid seq_out: %w", err)
|
||||
}
|
||||
|
||||
seq_in_max, err := strconv.ParseUint(parts[5], 10, 64)
|
||||
if err != nil {
|
||||
return SessionInit{}, fmt.Errorf("invalid seq_in_max: %w", err)
|
||||
}
|
||||
|
||||
out := SessionInit{
|
||||
SessionId: parts[1],
|
||||
ServerPubKeyB64: parts[2],
|
||||
SaltB64: parts[3],
|
||||
SeqOut: seq_out,
|
||||
SeqInMax: seq_in_max,
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
Reference in New Issue
Block a user