rfc9474v2.txt | rfc9474.txt | |||
---|---|---|---|---|
Internet Research Task Force (IRTF) F. Denis | Internet Research Task Force (IRTF) F. Denis | |||
Request for Comments: 9474 Fastly Inc. | Request for Comments: 9474 Fastly Inc. | |||
Category: Informational F. Jacobs | Category: Informational F. Jacobs | |||
ISSN: 2070-1721 Apple Inc. | ISSN: 2070-1721 Apple Inc. | |||
C. A. Wood | C. A. Wood | |||
Cloudflare | Cloudflare | |||
September 2023 | October 2023 | |||
RSA Blind Signatures | RSA Blind Signatures | |||
Abstract | Abstract | |||
This document specifies an RSA-based blind signature protocol. RSA | This document specifies an RSA-based blind signature protocol. RSA | |||
blind signatures were first introduced by Chaum for untraceable | blind signatures were first introduced by Chaum for untraceable | |||
payments. A signature that is output from this protocol can be | payments. A signature that is output from this protocol can be | |||
verified as an RSA-PSS signature. | verified as an RSA-PSS signature. | |||
skipping to change at line 137 ¶ | skipping to change at line 137 ¶ | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and | |||
"OPTIONAL" in this document are to be interpreted as described in | "OPTIONAL" in this document are to be interpreted as described in | |||
BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all | |||
capitals, as shown here. | capitals, as shown here. | |||
3. Notation | 3. Notation | |||
The following terms, which describe different protocol operations, | The following terms, which describe different protocol operations, | |||
are used throughout this document: | are used throughout this document: | |||
bytes_to_int and int_to_bytes: Convert a byte string to and from a | bytes_to_int and int_to_bytes: | |||
non-negative integer. bytes_to_int and int_to_bytes are | Convert a byte string to and from a non-negative | |||
implemented as OS2IP and I2OSP -- as described in [RFC8017] -- | integer. bytes_to_int and int_to_bytes are implemented as OS2IP | |||
respectively. Note that these functions operate on byte strings | and I2OSP -- as described in [RFC8017] -- respectively. Note that | |||
in big-endian byte order. | these functions operate on byte strings in big-endian byte order. | |||
random_integer_uniform(M, N): Generate a random, uniformly | random_integer_uniform(M, N): | |||
distributed integer R between M inclusive and N exclusive, i.e., M | Generate a random, uniformly distributed integer R between M | |||
<= R < N. | inclusive and N exclusive, i.e., M <= R < N. | |||
bit_len(n): Compute the minimum number of bits needed to represent | bit_len(n): | |||
the positive integer n. | Compute the minimum number of bits needed to represent the | |||
positive integer n. | ||||
inverse_mod(x, n): Compute the multiplicative inverse of x mod n or | inverse_mod(x, n): | |||
fail if x and n are not co-prime. | Compute the multiplicative inverse of x mod n or fail if x and n | |||
are not co-prime. | ||||
is_coprime(x, n): Return true if x and n are co-prime, and false | is_coprime(x, n): Return true if x and n are co-prime, and false | |||
otherwise. | otherwise. | |||
len(s): The length of a byte string, in bytes. | len(s): The length of a byte string, in bytes. | |||
random(n): Generate n random bytes using a cryptographically secure | random(n): | |||
random number generator. | Generate n random bytes using a cryptographically secure random | |||
number generator. | ||||
concat(x0, ..., xN): Concatenation of byte strings. For example, | concat(x0, ..., xN): | |||
concat(0x01, 0x0203, 0x040506) = 0x010203040506. | Concatenation of byte strings. For example, concat(0x01, 0x0203, | |||
0x040506) = 0x010203040506. | ||||
slice(x, i, j): Return bytes in the byte string x starting from | slice(x, i, j): Return bytes in the byte string x starting from | |||
offset i and ending at offset j, inclusive. For example, | offset i and ending at offset j, inclusive. For example, | |||
slice(0x010203040506, 1, 5) = 0x0203040506. | slice(0x010203040506, 1, 5) = 0x0203040506. | |||
4. Blind Signature Protocol | 4. Blind Signature Protocol | |||
The RSA Blind Signature Protocol is a two-party protocol between a | The RSA Blind Signature Protocol is a two-party protocol between a | |||
client and server where they interact to compute sig = Sign(sk, | client and server where they interact to compute sig = Sign(sk, | |||
input_msg), where input_msg = Prepare(msg) is a prepared version of | input_msg), where input_msg = Prepare(msg) is a prepared version of | |||
skipping to change at line 427 ¶ | skipping to change at line 431 ¶ | |||
5. RSABSSA Variants | 5. RSABSSA Variants | |||
In this section, we define different named variants of RSABSSA. Each | In this section, we define different named variants of RSABSSA. Each | |||
variant specifies EMSA-PSS options Hash, MGF, and sLen as defined in | variant specifies EMSA-PSS options Hash, MGF, and sLen as defined in | |||
Section 9.1.1 of [RFC8017], as well as the type of message | Section 9.1.1 of [RFC8017], as well as the type of message | |||
preparation function applied (as described in Section 4.1). Each | preparation function applied (as described in Section 4.1). Each | |||
variant uses the mask generation function 1 (MGF1) defined in | variant uses the mask generation function 1 (MGF1) defined in | |||
Appendix B.2.1. of [RFC8017]. Future specifications can introduce | Appendix B.2.1. of [RFC8017]. Future specifications can introduce | |||
other variants as desired. The named variants are as follows: | other variants as desired. The named variants are as follows: | |||
RSABSSA-SHA384-PSS-Randomized: This named variant uses SHA-384 as | RSABSSA-SHA384-PSS-Randomized: | |||
the EMSA-PSS Hash option, MGF1 with SHA-384 as the EMSA-PSS MGF | This named variant uses SHA-384 as the EMSA-PSS Hash option, MGF1 | |||
option, and 48 as the sLen option (salt length); it also uses the | with SHA-384 as the EMSA-PSS MGF option, and 48 as the EMSA-PSS | |||
randomized preparation function (PrepareRandomize). | sLen option (48-byte salt length); it also uses the randomized | |||
preparation function (PrepareRandomize). | ||||
RSABSSA-SHA384-PSSZERO-Randomized: This named variant uses SHA-384 | RSABSSA-SHA384-PSSZERO-Randomized: | |||
as the EMSA-PSS Hash option, MGF1 with SHA-384 as the EMSA-PSS MGF | This named variant uses SHA-384 as the EMSA-PSS Hash option, MGF1 | |||
option, and an empty PSS salt; it also uses the randomized | with SHA-384 as the EMSA-PSS MGF option, and 0 as the EMSA-PSS | |||
sLen option (0-byte salt length); it also uses the randomized | ||||
preparation function (PrepareRandomize). | preparation function (PrepareRandomize). | |||
RSABSSA-SHA384-PSS-Deterministic: This named variant uses SHA-384 as | RSABSSA-SHA384-PSS-Deterministic: | |||
the EMSA-PSS Hash option, MGF1 with SHA-384 as the EMSA-PSS MGF | This named variant uses SHA-384 as the EMSA-PSS Hash option, MGF1 | |||
option, and 48 as the sLen option (salt length); it also uses the | with SHA-384 as the EMSA-PSS MGF option, and 48 as the EMSA-PSS | |||
identity preparation function (PrepareIdentity). | sLen option (48-byte salt length); it also uses the identity | |||
preparation function (PrepareIdentity). | ||||
RSABSSA-SHA384-PSSZERO-Deterministic: This named variant uses | RSABSSA-SHA384-PSSZERO-Deterministic: | |||
SHA-384 as the EMSA-PSS Hash option, MGF1 with SHA-384 as the | This named variant uses SHA-384 as the EMSA-PSS Hash option, MGF1 | |||
EMSA-PSS MGF option, and an empty PSS salt; it also uses the | with SHA-384 as the EMSA-PSS MGF option, and 0 as the EMSA-PSS | |||
identity preparation function (PrepareIdentity). This is the only | sLen option (0-byte salt length); it also uses the identity | |||
variant that produces deterministic signatures over the client's | preparation function (PrepareIdentity). This is the only variant | |||
input message msg. | that produces deterministic signatures over the client's input | |||
message msg. | ||||
The RECOMMENDED variants are RSABSSA-SHA384-PSS-Randomized or | The RECOMMENDED variants are RSABSSA-SHA384-PSS-Randomized or | |||
RSABSSA-SHA384-PSSZERO-Randomized. | RSABSSA-SHA384-PSSZERO-Randomized. | |||
Not all named variants can be used interchangeably. In particular, | Not all named variants can be used interchangeably. In particular, | |||
applications that provide high-entropy input messages can safely use | applications that provide high-entropy input messages can safely use | |||
named variants without randomized message preparation, as the | named variants without randomized message preparation, as the | |||
additional message randomization does not offer security advantages. | additional message randomization does not offer security advantages. | |||
See [Lys22] and Section 7.3 for more information. For all other | See [Lys22] and Section 7.3 for more information. For all other | |||
applications, the variants that use the randomized preparation | applications, the variants that use the randomized preparation | |||
skipping to change at line 703 ¶ | skipping to change at line 711 ¶ | |||
9.2. Informative References | 9.2. Informative References | |||
[ApplePrivateRelay] | [ApplePrivateRelay] | |||
"iCloud Private Relay Overview", December 2021, | "iCloud Private Relay Overview", December 2021, | |||
<https://www.apple.com/icloud/docs/ | <https://www.apple.com/icloud/docs/ | |||
iCloud_Private_Relay_Overview_Dec2021.pdf>. | iCloud_Private_Relay_Overview_Dec2021.pdf>. | |||
[Chaum83] Chaum, D., "Blind Signatures for Untraceable Payments", | [Chaum83] Chaum, D., "Blind Signatures for Untraceable Payments", | |||
Springer-Verlag, 1998, | Springer-Verlag, 1998, | |||
<http://sceweb.sce.uhcl.edu/yang/teaching/ | <https://sceweb.sce.uhcl.edu/yang/teaching/ | |||
csci5234WebSecurityFall2011/Chaum-blind-signatures.PDF>. | csci5234WebSecurityFall2011/Chaum-blind-signatures.PDF>. | |||
[DSS] "Digital Signature Standard (DSS)", National Institute of | [DSS] "Digital Signature Standard (DSS)", National Institute of | |||
Standards and Technology report, | Standards and Technology report, | |||
DOI 10.6028/nist.fips.186-5, February 2023, | DOI 10.6028/nist.fips.186-5, February 2023, | |||
<https://doi.org/10.6028/NIST.FIPS.186-5>. | <https://doi.org/10.6028/NIST.FIPS.186-5>. | |||
[FAULTS] Boneh, D., DeMillo, R. A., and R. J. Lipton, "On the | [FAULTS] Boneh, D., DeMillo, R. A., and R. J. Lipton, "On the | |||
Importance of Checking Cryptographic Protocols for | Importance of Checking Cryptographic Protocols for | |||
Faults", Advances in Cryptology - EUROCRYPT '97, pp. | Faults", Advances in Cryptology - EUROCRYPT '97, pp. | |||
skipping to change at line 754 ¶ | skipping to change at line 762 ¶ | |||
[PrettyGoodPhonePrivacy] | [PrettyGoodPhonePrivacy] | |||
Schmitt, P. and B. Raghavan, "Pretty Good Phone Privacy", | Schmitt, P. and B. Raghavan, "Pretty Good Phone Privacy", | |||
Proceedings of the 30th USENIX Security Symposium, August | Proceedings of the 30th USENIX Security Symposium, August | |||
2021, <https://www.usenix.org/conference/usenixsecurity21/ | 2021, <https://www.usenix.org/conference/usenixsecurity21/ | |||
presentation/schmitt>. | presentation/schmitt>. | |||
[PRIVACY-PASS] | [PRIVACY-PASS] | |||
Celi, S., Davidson, A., Valdez, S., and C. A. Wood, | Celi, S., Davidson, A., Valdez, S., and C. A. Wood, | |||
"Privacy Pass Issuance Protocol", Work in Progress, | "Privacy Pass Issuance Protocol", Work in Progress, | |||
Internet-Draft, draft-ietf-privacypass-protocol-15, 25 | Internet-Draft, draft-ietf-privacypass-protocol-16, 3 | |||
September 2023, <https://datatracker.ietf.org/doc/html/ | October 2023, <https://datatracker.ietf.org/doc/html/ | |||
draft-ietf-privacypass-protocol-15>. | draft-ietf-privacypass-protocol-16>. | |||
[RemoteTimingAttacks] | [RemoteTimingAttacks] | |||
Brumley, D. and D. Boneh, "Remote Timing Attacks are | Brumley, D. and D. Boneh, "Remote Timing Attacks are | |||
Practical", Proceedings of the 12th USENIX Security | Practical", Proceedings of the 12th USENIX Security | |||
Symposium, August 2003, | Symposium, August 2003, | |||
<https://www.usenix.org/legacy/events/sec03/tech/brumley/ | <https://www.usenix.org/legacy/events/sec03/tech/brumley/ | |||
brumley.pdf>. | brumley.pdf>. | |||
[RFC4055] Schaad, J., Kaliski, B., and R. Housley, "Additional | [RFC4055] Schaad, J., Kaliski, B., and R. Housley, "Additional | |||
Algorithms and Identifiers for RSA Cryptography for use in | Algorithms and Identifiers for RSA Cryptography for use in | |||
skipping to change at line 821 ¶ | skipping to change at line 829 ¶ | |||
1999, pp. 154-170, DOI 10.1007/3-540-49162-7_12, October | 1999, pp. 154-170, DOI 10.1007/3-540-49162-7_12, October | |||
1999, <https://link.springer.com/ | 1999, <https://link.springer.com/ | |||
chapter/10.1007/3-540-49162-7_12>. | chapter/10.1007/3-540-49162-7_12>. | |||
Appendix A. Test Vectors | Appendix A. Test Vectors | |||
This section includes test vectors for the blind signature protocol | This section includes test vectors for the blind signature protocol | |||
defined in Section 4. The following parameters are specified for | defined in Section 4. The following parameters are specified for | |||
each test vector: | each test vector: | |||
p, q, n, e, d: RSA private and public key (sk and pk) parameters, | p, q, n, e, d: | |||
each encoded as a hexadecimal string. | RSA private and public key (sk and pk) parameters, each encoded as | |||
a hexadecimal string. | ||||
msg: Input message being signed, encoded as a hexadecimal string. | msg: | |||
The hash is computed using SHA-384. | Input message being signed, encoded as a hexadecimal string. The | |||
hash is computed using SHA-384. | ||||
msg_prefix: Message randomizer prefix, encoded as a hexadecimal | msg_prefix: | |||
string. This is only present for variants that use the | Message randomizer prefix, encoded as a hexadecimal string. This | |||
randomization preparation function. | is only present for variants that use the randomization | |||
preparation function. | ||||
prepared_msg: The message actually signed. If the variant does not | prepared_msg: | |||
use the randomization preparation function, this is equal to msg. | The message actually signed. If the variant does not use the | |||
randomization preparation function, this is equal to msg. | ||||
salt: Randomly generated salt used when computing the signature. | salt: | |||
The length is either 48 or 0 bytes. | Randomly generated salt used when computing the signature. The | |||
length is either 48 or 0 bytes. | ||||
encoded_msg: EMSA-PSS encoded message. The mask generation function | encoded_msg: | |||
is MGF1 with SHA-384. | EMSA-PSS encoded message. The mask generation function is MGF1 | |||
with SHA-384. | ||||
inv: The message blinding inverse, encoded as a hexadecimal string. | inv: The message blinding inverse, encoded as a hexadecimal string. | |||
blinded_msg, blind_sig: The protocol values exchanged during the | blinded_msg, blind_sig: | |||
computation, encoded as hexadecimal strings. | The protocol values exchanged during the computation, encoded as | |||
hexadecimal strings. | ||||
sig: The output message signature. | sig: The output message signature. | |||
A.1. RSABSSA-SHA384-PSS-Randomized Test Vector | A.1. RSABSSA-SHA384-PSS-Randomized Test Vector | |||
p = e1f4d7a34802e27c7392a3cea32a262a34dc3691bd87f3f310dc756734889305 | p = e1f4d7a34802e27c7392a3cea32a262a34dc3691bd87f3f310dc756734889305 | |||
59c120fd0410194fb8a0da55bd0b81227e843fdca6692ae80e5a5d414116d4803fca | 59c120fd0410194fb8a0da55bd0b81227e843fdca6692ae80e5a5d414116d4803fca | |||
7d8c30eaaae57e44a1816ebb5c5b0606c536246c7f11985d731684150b63c9a3ad9e | 7d8c30eaaae57e44a1816ebb5c5b0606c536246c7f11985d731684150b63c9a3ad9e | |||
41b04c0b5b27cb188a692c84696b742a80d3cd00ab891f2457443dadfeba6d6daf10 | 41b04c0b5b27cb188a692c84696b742a80d3cd00ab891f2457443dadfeba6d6daf10 | |||
8602be26d7071803c67105a5426838e6889d77e8474b29244cefaf418e381b312048 | 8602be26d7071803c67105a5426838e6889d77e8474b29244cefaf418e381b312048 | |||
End of changes. 20 change blocks. | ||||
53 lines changed or deleted | 68 lines changed or added | |||
This html diff was produced by rfcdiff 1.48. |