@@ -460,3 +460,49 @@ def test_cose_message_counterverify_with_different_abbreviated_countersignature(
460460 COSEMessage .loads (countersigned ).counterverify (pub_key )
461461 pytest .fail ("counterverify() should not fail." )
462462 assert "Failed to verify." in str (err .value )
463+
464+ def test_cose_message_detach_and_attach (self ):
465+ """
466+ Detach the payload from a COSE message.
467+ For example, [an example message](https://github.com/cose-wg/Examples/blob/master/ecdsa-examples/ecdsa-sig-01.json)
468+ ```
469+ 18([
470+ / protected: / h'A201260300',
471+ / unprotected: / {4: h'3131'},
472+ / payload: / h'546869732069732074686520636F6E74656E742E',
473+ / signature: / h'6520BBAF2081D7E0ED0F95F76EB0733D667005F7467CEC4B87B9381A6BA1EDE8E00DF29F32A37230F39A842A54821FDD223092819D7728EFB9D3A0080B75380B'
474+ ])
475+ ```
476+ would be separated into
477+ ```
478+ 18([
479+ / protected: / h'A201260300',
480+ / unprotected: / {4: h'3131'},
481+ / payload: / null / detached /,
482+ / signature: / h'6520BBAF2081D7E0ED0F95F76EB0733D667005F7467CEC4B87B9381A6BA1EDE8E00DF29F32A37230F39A842A54821FDD223092819D7728EFB9D3A0080B75380B'
483+ ])
484+ ```
485+ and
486+ ```
487+ 546869732069732074686520636F6E74656E742E
488+ ```
489+
490+ """
491+ ecdsa_cose_sign1_example = COSEMessage .loads (
492+ bytes .fromhex (
493+ "D28445A201260300A10442313154546869732069732074686520636F6E74656E742E58406520BBAF2081D7E0ED0F95F76EB0733D667005F7467CEC4B87B9381A6BA1EDE8E00DF29F32A37230F39A842A54821FDD223092819D7728EFB9D3A0080B75380B"
494+ )
495+ )
496+ expected_detached_cose_message = COSEMessage .loads (
497+ bytes .fromhex (
498+ "D28445A201260300A104423131F658406520BBAF2081D7E0ED0F95F76EB0733D667005F7467CEC4B87B9381A6BA1EDE8E00DF29F32A37230F39A842A54821FDD223092819D7728EFB9D3A0080B75380B"
499+ )
500+ )
501+ expected_payload = bytes .fromhex ("546869732069732074686520636F6E74656E742E" )
502+
503+ detached_content_cose_message , detached_payload = ecdsa_cose_sign1_example .to_detached ()
504+ assert expected_detached_cose_message == detached_content_cose_message
505+ assert expected_payload == detached_payload
506+
507+ reverted_cose_message = detached_content_cose_message .from_detached (detached_payload )
508+ assert ecdsa_cose_sign1_example == reverted_cose_message
0 commit comments