Skip to content

v2.0.0-Beta17

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 04 Sep 19:47
· 2 commits to main since this release
ae302dc

Adds spec-conformant dynamic pairing code support, built on a CPace PAKE. The feature is off by default and there is no released server that can use it yet, so for existing setups this build behaves exactly like Beta16.

Nothing changes unless you turn it on

With the new setting off, the client/hello this build sends is byte-identical to Beta16. Pairing continues to use the Pairing PSK token exactly as before, and Music Assistant is unaffected.

Dynamic pairing code (opt-in, Settings > Pairing)

Instead of copying a 107-character token, the player shows a six-digit code that you type into the server. The code is derived per session from the Noise handshake and both sides' random contributions, so neither peer alone chooses it, and it is authenticated by a CPACE-X25519-SHA512 PAKE with mutual key confirmation. A wrong code fails cleanly rather than leaking whether it was close.

Do not enable this against Music Assistant. MA ships an older library whose parser rejects the new pairing method outright, which drops the connection at the first message rather than merely failing to pair. The setting says so, and it defaults to off for that reason.

Enable it only against a server that implements the current pairing revision of the SendSpin spec. At the time of this release no released server does: the reference implementation exists only on its development branch.

What was verified

Every cryptographic construction is pinned to published test vectors from draft-irtf-cfrg-cpace-21 - the generator, the secret point, the intermediate session key, and all twelve low-order rejection points. The mutual-confirmation tags, which the draft publishes no vector for, are pinned against the same reference library the server side uses.

Pairing was then completed end to end against a real server: the code was read off the tablet, entered on the server, and the connection was promoted from the Sentinel key to a long-term paired key without dropping the socket.

Fixed

  • Track changes no longer mis-anchor audio. Chunks decoded against a previous stream can no longer be played against the new one, so skipping a track settles in milliseconds instead of tens of seconds.
  • server/state deltas are merged rather than replacing the whole state, so a partial update no longer wipes existing metadata.
  • Diagnostics report the current network rather than whatever it was when the service started.

Removed

pin_length handling is gone from server activations. It was a leftover of an earlier protocol revision in which the server chose the code length; the current spec derives a fixed six-digit code from the handshake, and a server-supplied length is exactly what that derivation exists to prevent.

Known issues

  • #253 - stream/end is ignored when a server sends unversioned role names
  • #254 - transport controls can freeze after backgrounding with Back and returning
  • #255 - server volume pushes move the slider without changing device volume
  • The pairing window's five-minute expiry is not implemented: an attempt gated behind the on-device confirmation waits indefinitely rather than timing out.