Add OpRegister: cert-only registration without PoW

New flow: register -> OpRegister(pubKey) -> OpIdentity(number+cert). Reconnect: OpGetChallenge -> OpAuthCert(cert+sig). PoW eliminated from client flow.
This commit is contained in:
Niko Marmeladkov 2026-07-01 15:02:58 +03:00
parent 12f38ecb68
commit 07814e5014
2 changed files with 42 additions and 0 deletions

View file

@ -217,6 +217,8 @@ func (s *Server) handleStream(ctx context.Context, stream *quic.Stream, sess *Se
s.handleReroll(sess)
case types.OpAuthCert:
s.handleAuthCert(sess, frame.Payload)
case types.OpRegister:
s.handleRegister(sess, frame.Payload)
case types.OpDial:
if !sess.IsAuthenticated() {
sendOpError(st, types.ErrInvalidRequest, "not authenticated")
@ -367,6 +369,45 @@ func (s *Server) handleAuthCert(sess *Session, payload []byte) {
zap.String("number", ident.Number))
}
func (s *Server) handleRegister(sess *Session, payload []byte) {
if len(payload) < 32 {
sendOpError(sess.Stream(), types.ErrInvalidRequest, "invalid pubkey")
return
}
var pubKey [32]byte
copy(pubKey[:], payload[:32])
if _, err := s.identMgr.GetByPubKey(pubKey); err == nil {
sendOpError(sess.Stream(), types.ErrInvalidRequest, "already registered")
return
}
ident, err := s.identMgr.Allocate(pubKey)
if err != nil {
sendOpError(sess.Stream(), types.ErrInternal, err.Error())
return
}
certDER, err := s.ca.IssueCert(ident.Number, ed25519.PublicKey(pubKey[:]), s.cfg.CA.Validity)
if err != nil {
sendOpError(sess.Stream(), types.ErrInternal, "cert issuance failed")
return
}
ident.CertDER = certDER
sess.Authenticate(ident.Number, pubKey, certDER)
s.Register(sess, ident.Number)
payload = marshalIdentityResponse(ident.Number, certDER, s.ca.CACertPEM())
if st := sess.Stream(); st != nil {
st.WriteFrame(byte(types.OpIdentity), payload)
}
s.logger.Info("Client registered",
zap.String("number", ident.Number))
}
func (s *Server) handleReroll(sess *Session) {
if !sess.IsAuthenticated() {
sendOpError(sess.Stream(), types.ErrInvalidRequest, "not authenticated")

View file

@ -9,6 +9,7 @@ const (
OpIdentity OpCode = 0x04
OpReroll OpCode = 0x05
OpAuthCert OpCode = 0x06
OpRegister OpCode = 0x07
OpDial OpCode = 0x10
OpRing OpCode = 0x11