You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: bip-0340.mediawiki
+53-3
Original file line number
Diff line number
Diff line change
@@ -138,7 +138,7 @@ As an alternative to generating keys randomly, it is also possible and safe to r
138
138
139
139
Input:
140
140
* The secret key ''sk'': a 32-byte array
141
-
* The message ''m'': a 32-byte array
141
+
* The message ''m'': a byte array
142
142
* Auxiliary random data ''a'': a 32-byte array
143
143
144
144
The algorithm ''Sign(sk, m)'' is defined as:
@@ -174,7 +174,7 @@ It should be noted that various alternative signing algorithms can be used to pr
174
174
175
175
Input:
176
176
* The public key ''pk'': a 32-byte array
177
-
* The message ''m'': a 32-byte array
177
+
* The message ''m'': a byte array
178
178
* A signature ''sig'': a 64-byte array
179
179
180
180
The algorithm ''Verify(pk, m, sig)'' is defined as:
@@ -197,7 +197,7 @@ Note that the correctness of verification relies on the fact that ''lift_x'' alw
197
197
Input:
198
198
* The number ''u'' of signatures
199
199
* The public keys ''pk<sub>1..u</sub>'': ''u'' 32-byte arrays
200
-
* The messages ''m<sub>1..u</sub>'': ''u''32-byte arrays
200
+
* The messages ''m<sub>1..u</sub>'': ''u'' byte arrays
201
201
* The signatures ''sig<sub>1..u</sub>'': ''u'' 64-byte arrays
202
202
203
203
The algorithm ''BatchVerify(pk<sub>1..u</sub>, m<sub>1..u</sub>, sig<sub>1..u</sub>)'' is defined as:
@@ -213,6 +213,50 @@ The algorithm ''BatchVerify(pk<sub>1..u</sub>, m<sub>1..u</sub>, sig<sub>1..u</s
213
213
214
214
If all individual signatures are valid (i.e., ''Verify'' would return success for them), ''BatchVerify'' will always return success. If at least one signature is invalid, ''BatchVerify'' will return success with at most a negligible probability.
215
215
216
+
=== Usage Considerations ===
217
+
218
+
==== Messages of Arbitrary Size ====
219
+
220
+
The signature scheme specified in this BIP accepts byte strings of arbitrary size as input messages.<ref>In theory, the message size is restricted due to the fact that SHA256 accepts byte strings only up to size of 2^61-1 bytes.</ref>
221
+
It is understood that implementations may reject messages which are too large in their environment or application context,
222
+
e.g., messages which exceed predefined buffers or would otherwise cause resource exhaustion.
223
+
224
+
Earlier revisions of this BIP required messages to be exactly 32 bytes.
225
+
This restriction puts a burden on callers
226
+
who typically need to perform pre-hashing of the actual input message by feeding it through SHA256 (or another collision-resistant cryptographic hash function)
227
+
to create a 32-byte digest which can be passed to signing or verification
228
+
(as for example done in [[bip-0341.mediawiki|BIP341]].)
229
+
230
+
Since pre-hashing may not always be desirable,
231
+
e.g., when actual messages are shorter than 32 bytes,<ref>Another reason to omit pre-hashing is to protect against certain types of cryptanalytic advances against the hash function used for pre-hashing: If pre-hashing is used, an attacker that can find collisions in the pre-hashing function can necessarily forge signatures under chosen-message attacks. If pre-hashing is not used, an attacker that can find collisions in SHA256 (as used inside the signature scheme) may not be able to forge signatures. However, this seeming advantage is mostly irrelevant in the context of Bitcoin, which already relies on collision resistance of SHA256 in other places, e.g., for transaction hashes.</ref>
232
+
the restriction to 32-byte messages has been lifted.
233
+
We note that pre-hashing is recommended for performance reasons in applications that deal with large messages.
234
+
If large messages are not pre-hashed,
235
+
the algorithms of the signature scheme will perform more hashing internally.
236
+
In particular, the signing algorithm needs two sequential hashing passes over the message,
237
+
which means that the full message must necessarily be kept in memory during signing,
238
+
and large messages entail a runtime penalty.<ref>Typically, messages of 56 bytes or longer enjoy a performance benefit from pre-hashing, assuming the speed of SHA256 inside the signing algorithm matches that of the pre-hashing done by the calling application.</ref>
239
+
240
+
==== Domain Separation ====
241
+
242
+
It is good cryptographic practice to use a key pair only for a single purpose.
243
+
Nevertheless, there may be situations in which it may be desirable to use the same key pair in multiple contexts,
244
+
i.e., to sign different types of messages within the same application
245
+
or even messages in entirely different applications
246
+
(e.g., a secret key may be used to sign Bitcoin transactions as well plain text messages).
247
+
248
+
As a consequence, applications should ensure that a signed application message intended for one context is never deemed valid in a different context
249
+
(e.g., a signed plain text message should never be misinterpreted as a signed Bitcoin transaction, because this could cause unintended loss of funds).
250
+
This is called "domain separation" and it is typically realized by partitioning the message space.
251
+
Even if key pairs are intended to be used only within a single context,
252
+
domain separation is a good idea because it makes it easy to add more contexts later.
253
+
254
+
As a best practice, we recommend applications to use exactly one of the following methods to pre-process application messages before passing it to the signature scheme:
255
+
* Either, pre-hash the application message using ''hash<sub>name</sub>'', where ''name'' identifies the context uniquely (e.g., "foo-app/signed-bar"),
256
+
* or prefix the actual message with a 33-byte string that identifies the context uniquely (e.g., the UTF-8 encoding of "foo-app/signed-bar", padded with null bytes to 33 bytes).
257
+
258
+
As the two pre-processing methods yield different message sizes (32 bytes vs. at least 33 bytes), there is no risk of collision between them.
259
+
216
260
== Applications ==
217
261
218
262
There are several interesting applications beyond simple signatures.
@@ -243,6 +287,12 @@ Blind Schnorr signatures could for example be used in [https://github.com/Elemen
243
287
For development and testing purposes, we provide a [[bip-0340/test-vectors.csv|collection of test vectors in CSV format]] and a naive, highly inefficient, and non-constant time [[bip-0340/reference.py|pure Python 3.7 reference implementation of the signing and verification algorithm]].
244
288
The reference implementation is for demonstration purposes only and not to be used in production environments.
245
289
290
+
== Changelog ==
291
+
292
+
To help implementors understand updates to this BIP, we keep a list of substantial changes.
12,,DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659,,243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F69E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B,FALSE,sig[0:32] is equal to field size
15
15
13,,DFF1D77F2A671C5F36183726DB2341BE58FEAE1DA2DECED843240F7B502BA659,,243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89,6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E177769FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141,FALSE,sig[32:64] is equal to curve order
16
16
14,,FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC30,,243F6A8885A308D313198A2E03707344A4093822299F31D0082EFA98EC4E6C89,6CFF5C3BA86C69EA4B7376F31A9BCB4F74C1976089B2D9963DA2E5543E17776969E89B4C5564D00349106B8497785DD7D1D713A8AE82B32FA79D5F7FC407D39B,FALSE,public key is not a valid X coordinate because it exceeds the field size
17
+
15,0340034003400340034003400340034003400340034003400340034003400340,778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117,0000000000000000000000000000000000000000000000000000000000000000,,71535DB165ECD9FBBC046E5FFAEA61186BB6AD436732FCCC25291A55895464CF6069CE26BF03466228F19A3A62DB8A649F2D560FAC652827D1AF0574E427AB63,TRUE,message of size 0 (added 2022-12)
18
+
16,0340034003400340034003400340034003400340034003400340034003400340,778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117,0000000000000000000000000000000000000000000000000000000000000000,11,08A20A0AFEF64124649232E0693C583AB1B9934AE63B4C3511F3AE1134C6A303EA3173BFEA6683BD101FA5AA5DBC1996FE7CACFC5A577D33EC14564CEC2BACBF,TRUE,message of size 1 (added 2022-12)
19
+
17,0340034003400340034003400340034003400340034003400340034003400340,778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117,0000000000000000000000000000000000000000000000000000000000000000,0102030405060708090A0B0C0D0E0F1011,5130F39A4059B43BC7CAC09A19ECE52B5D8699D1A71E3C52DA9AFDB6B50AC370C4A482B77BF960F8681540E25B6771ECE1E5A37FD80E5A51897C5566A97EA5A5,TRUE,message of size 17 (added 2022-12)
20
+
18,0340034003400340034003400340034003400340034003400340034003400340,778CAA53B4393AC467774D09497A87224BF9FAB6F6E68B23086497324D6FD117,0000000000000000000000000000000000000000000000000000000000000000,99999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,403B12B0D8555A344175EA7EC746566303321E5DBFA8BE6F091635163ECA79A8585ED3E3170807E7C03B720FC54C7B23897FCBA0E9D0B4A06894CFD249F22367,TRUE,message of size 100 (added 2022-12)
0 commit comments