mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-10-24 04:09:07 +03:00
wolfSSL_dtls_export()/wolfSSL_dtls_import() only ever carried a DTLS 1.2 session. A DTLS 1.3 connection additionally keeps a table of epochs, each with its own traffic secret, record and record number keys, sequence numbers and replay window, and none of that was serialized. Export version 7 adds two trailing sections to the blob, the DTLS 1.3 record layer state and the Connection ID, both length prefixed so a reader that does not know a section can step over it and a version 6 blob still imports. - dtls13: serialize the send epoch, the peer epoch and, when there is one, the previous peer epoch: epoch numbers, sequence numbers, replay window, traffic secrets and key material. Import re-derives the record keys through Tls13DeriveRecordKeys(), the same expansion the handshake runs - dtls: carry a tx Connection ID of any length. The peer picks it and RFC 9146 bounds it only by its one byte length field, so DTLS_CID_MAX_SIZE may not refuse it. The rx id keeps that bound: it is the one we hand the peer and it has to fit the record layer buffers. Clear the target's CID when the blob carries none Refusals, so a blob never describes a connection that cannot be restored: - refuse to export a half sent fragmented handshake message, or while a write dup still has work parked - refuse a state only import into a DTLS 1.3 session, and keep stamping the state only blob with export version 6 - require the imported epochs to be the ones the blob names, reset the epoch table on import and commit a slot only once every field of it has been read Bounds checking on the import path: - keep every exported section inside the buffer the caller sized, and step over the import sections by their declared length - check the imported epoch key lengths against the negotiated suite and the traffic secret length against the hash - size the exported key state from the build's own cipher sizes - scrub the session export scratch buffer before freeing it - use IsAtLeastTLSv1_3() for the imported version check CI: build the session export job with Connection ID support.