@@ -103,6 +103,31 @@ To verify:
103103Either standard or URL-safe base64 encodings are allowed. Signers may use
104104either, and verifiers **MUST** accept either.
105105
106+ ## Multi-signature Verification
107+
108+ Multi-signature enhances the security by allowing multiple signers to sign the
109+ same payload. The resulting signatures are encoded and transmitted, preferably
110+ using the recommended [JSON envelope](envelope.md).
111+
112+ A `(t, n)`-ENVELOPE is valid if the enclosed signatures pass the verification
113+ against at least `t` of `n` unique trusted public keys where `t` is
114+ application-specific.
115+
116+ To verify a `(t, n)`-ENVELOPE:
117+
118+ - Receive and decode SERIALIZED_BODY, PAYLOAD_TYPE, SIGNATURES from ENVELOPE.
119+ Reject if decoding fails.
120+ - For each (SIGNATURE, KEYID) in SIGNATURES,
121+ - Optionally, filter acceptable public keys by KEYID.
122+ - Verify SIGNATURE against PAE(UTF8(PAYLOAD_TYPE), SERIALIZED_BODY). Skip
123+ over if the verification fails.
124+ - Add the accepted public key to the set ACCEPTED_KEYS.
125+ - Break if the cardinality of ACCEPTED_KEYS is greater or equal to `t`.
126+ - Reject if the cardinality of ACCEPTED_KEYS is less than `t`.
127+ - Reject if PAYLOAD_TYPE is not a supported type.
128+ - Parse SERIALIZED_BODY according to PAYLOAD_TYPE. Reject if the parsing
129+ fails.
130+
106131## Test Vectors
107132
108133See [reference implementation](implementation/signing_spec.py). Here is an
0 commit comments