Skip to content

Commit ec1a5f4

Browse files
Update draft-lundberg-cose-two-party-signing-algs.md
Added suggestions and comments
1 parent 1c5143b commit ec1a5f4

File tree

1 file changed

+11
-2
lines changed

1 file changed

+11
-2
lines changed

draft-lundberg-cose-two-party-signing-algs.md

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ PKCS #11 [PKCS11-Spec-v3.1], and PIV [FIPS-201].
170170
Since different signature algorithms digest the message in different ways
171171
and at different stages of the algorithm,
172172
it is not possible for a cryptographic API to specify that, for example, "the hash digest is computed by the caller"
173-
generically for all algorithms.
173+
generically for all algorithms. Moreover, different algorithms can have different security considerations when split in this way.
174174
Instead, the algorithm identifiers defined in this specification
175175
enable the parties of that cryptographic API to signal precisely, for each signature algorithm individually,
176176
which steps of the algorithm are performed by which party.
@@ -191,7 +191,7 @@ However, if such a signature algorithm defines a "pre-hashed" variant,
191191
such as Ed25519ph [RFC8032],
192192
that "pre-hashed" algorithm can be assigned a split signing algorithm identifier,
193193
enabling the pre-hashing step to be performed by the _digester_
194-
and the remaining steps by the _signer_.
194+
and the remaining steps by the _signer_. Note however that Ed25519ph is not compatible with PureEd25519 for the verifier, so requires a different algorithm identifier.
195195

196196
## Requirements Notation and Conventions
197197

@@ -298,6 +298,7 @@ COSE_Sign_Args = {
298298
}
299299
~~~
300300

301+
COMMENT(sschmieg): For ML-DSA, we have external-µ, which is again a different API in the sense that the digester needs to be aware of the public key. We also have a context argument, but the signer does not need to learn it.
301302

302303
## COSE Signing Arguments Common Parameters {#cose-sign-args-common}
303304

@@ -375,6 +376,14 @@ since the _digester_ still needs to find a preimage of _e_ for the relevant hash
375376
Definitions of other algorithms need to ensure that similar chosen-input attacks
376377
do not enable extracting secrets or forging protocol-level messages.
377378

379+
COMMENT(sschmieg): Forgeries are *probably* okay: There is a relatively trivial forgery attack against prehashed RSA and we all seem to be fine with it.
380+
In particular, if the digester wants to forge a signature for m, they compute h(m) (including padding), find to integers a, b such that a * b = h(m) mod n, and have the signer sign both a and b, i.e.
381+
compute a^d and b^d. Since exponentiation is multiplicative, the digester can now compute h(m)^d, a valid signature of m, without ever having asked the signer to sign h(m).
382+
The reason we are usually okay with that issue is that the digester already can ask the signer for any signature they want.
383+
Key compromise attacks on the other hand have to be avoided. A naively prehashed version of Falcon would allow such a key compromise: A Falcon signature is a value s such that both s and s * h - hash(r || m) are short.
384+
(h is the public key and r a randomizer). If the digester gets to query the signer for signatures of arbitrary stand-ins for hash(r || m), they can extract the private key by for example asking for repeated signatures of 0.
385+
The basic construction of Falcon and RSA is the same (they are both hash-then-sign algorithms), but where leaving the hash to an external party only gives forgery attacks in RSA, it can give key compromise attacks.
386+
Essentially, a split algorithm needs to be reviewed and potentially have its security proofs adjusted.
378387

379388
# IANA Considerations {#IANA}
380389

0 commit comments

Comments
 (0)