8. Suite per l'hashing
Questa sezione elenca le suite raccomandate per l'hash verso curve ellittiche standard.
Una suite di hash-to-curve specifica completamente la procedura per l'hash di stringhe di byte in punti su un gruppo di curva ellittica specifico. La Sezione 8.1 descrive come implementare una suite. Le applicazioni che richiedono l'hash verso una curva ellittica dovrebbero utilizzare o una suite esistente o una nuova suite specificata come descritto nella Sezione 8.9.
Tutte le applicazioni che utilizzano una suite di hash-to-curve DEVONO scegliere un tag di separazione dei domini (DST) conformemente alle linee guida della Sezione 3.1. Inoltre, le applicazioni la cui sicurezza richiede un random oracle che restituisca punti uniformemente casuali sulla curva target DEVONO utilizzare una suite il cui tipo di codifica è hash_to_curve; si veda la Sezione 3 e quanto immediatamente sotto per maggiori informazioni.
Una suite di hash-to-curve comprende i seguenti parametri:
-
Suite ID, un nome breve usato per riferirsi a una data suite. La Sezione 8.10 discute le convenzioni di denominazione per i Suite ID.
-
tipo di codifica, sia uniforme (hash_to_curve) sia non uniforme (encode_to_curve). Si veda la Sezione 3 per le definizioni di questi tipi di codifica.
-
E, la curva ellittica target su un campo F.
-
p, la caratteristica del campo F.
-
m, il grado di estensione del campo F. Se m > 1, la suite DEVE specificare anche la base polinomiale utilizzata per rappresentare gli elementi del campo di estensione.
-
k, il livello di sicurezza target della suite in bit. (Si veda la Sezione 10.8 per la discussione.)
-
L, il parametro di lunghezza per hash_to_field (Sezione 5).
-
expand_message, una delle varianti specificate nella Sezione 5.3 più eventuali parametri richiesti per la variante specificata (ad esempio, H, la funzione di hash sottostante).
-
f, una funzione di mapping dalla Sezione 6.
-
h_eff, il parametro scalare per clear_cofactor (Sezione 7).
Oltre ai parametri sopra, il mapping f può richiedere parametri aggiuntivi Z, M, rational_map, E' o iso_map. Quando applicabile, questi DEVONO essere specificati.
La tabella seguente elenca le suite RACCOMANDATE per alcune curve ellittiche. I parametri corrispondenti sono dati nelle sottosezioni seguenti. Le applicazioni che istanziano protocolli crittografici la cui analisi di sicurezza fa affidamento su un random oracle che emette punti con distribuzione uniforme NON DEVONO utilizzare una codifica non uniforme. Inoltre, le applicazioni che utilizzano una codifica non uniforme DOVREBBERO analizzare con attenzione le implicazioni di sicurezza della non uniformità. Quando la codifica richiesta non è chiara, le applicazioni DOVREBBERO utilizzare per sicurezza una codifica uniforme.
| E | Suite | Sezione |
|---|---|---|
| NIST P-256 | P256_XMD:SHA-256_SSWU_RO_ | 8.2 |
| P256_XMD:SHA-256_SSWU_NU_ | ||
| NIST P-384 | P384_XMD:SHA-384_SSWU_RO_ | 8.3 |
| P384_XMD:SHA-384_SSWU_NU_ | ||
| NIST P-521 | P521_XMD:SHA-512_SSWU_RO_ | 8.4 |
| P521_XMD:SHA-512_SSWU_NU_ | ||
| curve25519 | curve25519_XMD:SHA-512_ELL2_RO_ | 8.5 |
| curve25519_XMD:SHA-512_ELL2_NU_ | ||
| edwards25519 | edwards25519_XMD:SHA-512_ELL2_RO_ | 8.5 |
| edwards25519_XMD:SHA-512_ELL2_NU_ | ||
| curve448 | curve448_XOF:SHAKE256_ELL2_RO_ | 8.6 |
| curve448_XOF:SHAKE256_ELL2_NU_ | ||
| edwards448 | edwards448_XOF:SHAKE256_ELL2_RO_ | 8.6 |
| edwards448_XOF:SHAKE256_ELL2_NU_ | ||
| secp256k1 | secp256k1_XMD:SHA-256_SSWU_RO_ | 8.7 |
| secp256k1_XMD:SHA-256_SSWU_NU_ | ||
| BLS12-381 G1 | BLS12381G1_XMD:SHA-256_SSWU_RO_ | 8.8 |
| BLS12381G1_XMD:SHA-256_SSWU_NU_ | ||
| BLS12-381 G2 | BLS12381G2_XMD:SHA-256_SSWU_RO_ | 8.8 |
| BLS12381G2_XMD:SHA-256_SSWU_NU_ |
Tabella 2: Suite per l'hashing verso curve ellittiche.
8.1. Implementazione di una suite di hash-to-curve
Una suite di hash-to-curve richiede le seguenti funzioni. Si noti che alcune di esse richiedono funzioni di utilità dalla Sezione 4.
-
Operazioni aritmetiche del campo base per la curva ellittica target, ad esempio addizione, moltiplicazione e radice quadrata.
-
Operazioni sui punti di curva ellittica per la curva target, ad esempio addizione di punti e moltiplicazione scalare.
-
La funzione hash_to_field; si veda la Sezione 5. Ciò include la variante expand_message (Sezione 5.3) e qualsiasi funzione di hash o XOF costituente.
-
La funzione di mapping specificata dalla suite; si veda la sottosezione corrispondente della Sezione 6.
-
Una funzione di azzeramento del cofattore; si veda la Sezione 7. Può essere implementata come moltiplicazione scalare per h_eff o come un metodo equivalente più rapido.
-
La funzione di codifica desiderata; si veda la Sezione 3. È o hash_to_curve o encode_to_curve.
8.2. Suite per NIST P-256
Questa sezione definisce le ciphersuite per la curva ellittica NIST P-256 [FIPS186-4].
P256_XMD:SHA-256_SSWU_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: y^2 = x^3 + A * x + B, dove A = -3 e B = 0x5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b
- p: 2^256 - 2^224 + 2^192 + 2^96 - 1
- m: 1
- k: 128
- expand_message: expand_message_xmd (Sezione 5.3.1)
- H: SHA-256
- L: 48
- f: metodo Simplified SWU (Sezione 6.6.2)
- Z: -10
- h_eff: 1
P256_XMD:SHA-256_SSWU_NU_ è identica a P256_XMD:SHA-256_SSWU_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Un esempio di implementazione ottimizzata del mapping Simplified SWU verso P-256 è fornito nell'Appendice F.2.
8.3. Suite per NIST P-384
Questa sezione definisce le ciphersuite per la curva ellittica NIST P-384 [FIPS186-4].
P384_XMD:SHA-384_SSWU_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: y^2 = x^3 + A * x + B, dove A = -3 e B = 0xb3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef
- p: 2^384 - 2^128 - 2^96 + 2^32 - 1
- m: 1
- k: 192
- expand_message: expand_message_xmd (Sezione 5.3.1)
- H: SHA-384
- L: 72
- f: metodo Simplified SWU (Sezione 6.6.2)
- Z: -12
- h_eff: 1
P384_XMD:SHA-384_SSWU_NU_ è identica a P384_XMD:SHA-384_SSWU_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Un esempio di implementazione ottimizzata del mapping Simplified SWU verso P-384 è fornito nell'Appendice F.2.
8.4. Suite per NIST P-521
Questa sezione definisce le ciphersuite per la curva ellittica NIST P-521 [FIPS186-4].
P521_XMD:SHA-512_SSWU_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: y^2 = x^3 + A * x + B, dove A = -3 e B = 0x51953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00
- p: 2^521 - 1
- m: 1
- k: 256
- expand_message: expand_message_xmd (Sezione 5.3.1)
- H: SHA-512
- L: 98
- f: metodo Simplified SWU (Sezione 6.6.2)
- Z: -4
- h_eff: 1
P521_XMD:SHA-512_SSWU_NU_ è identica a P521_XMD:SHA-512_SSWU_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Un esempio di implementazione ottimizzata del mapping Simplified SWU verso P-521 è fornito nell'Appendice F.2.
8.5. Suite per curve25519 ed edwards25519
Questa sezione definisce le ciphersuite per curve25519 ed edwards25519 [RFC7748]. Si noti che queste ciphersuite NON DEVONO essere utilizzate quando si esegue l'hash verso ristretto255 [ristretto255-decaf448]. Si veda l'Appendice B per informazioni su come eseguire l'hash verso quel gruppo.
curve25519_XMD:SHA-512_ELL2_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: K * t^2 = s^3 + J * s^2 + s, dove J = 486662 e K = 1
- p: 2^255 - 19
- m: 1
- k: 128
- expand_message: expand_message_xmd (Sezione 5.3.1)
- H: SHA-512
- L: 48
- f: metodo Elligator 2 (Sezione 6.7.1)
- Z: 2
- h_eff: 8
edwards25519_XMD:SHA-512_ELL2_RO_ è identica a curve25519_XMD:SHA-512_ELL2_RO_, eccetto per i seguenti parametri:
- E: a * v^2 + w^2 = 1 + d * v^2 * w^2, dove a = -1 e d = 0x52036cee2b6ffe738cc740797779e89800700a4d4141d8ab75eb4dca135978a3
- f: metodo Twisted Edwards Elligator 2 (Sezione 6.8.2)
- M: curve25519, definita in [RFC7748], Sezione 4.1
- rational_map: le mappe birazionali definite in [RFC7748], Sezione 4.1
curve25519_XMD:SHA-512_ELL2_NU_ è identica a curve25519_XMD:SHA-512_ELL2_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
edwards25519_XMD:SHA-512_ELL2_NU_ è identica a edwards25519_XMD:SHA-512_ELL2_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Implementazioni di esempio ottimizzate dei mapping sopra sono fornite nelle Appendici G.2.1 e G.2.2.
8.6. Suite per curve448 ed edwards448
Questa sezione definisce le ciphersuite per curve448 ed edwards448 [RFC7748]. Si noti che queste ciphersuite NON DEVONO essere utilizzate quando si esegue l'hash verso decaf448 [ristretto255-decaf448]. Si veda l'Appendice C per informazioni su come eseguire l'hash verso quel gruppo.
curve448_XOF:SHAKE256_ELL2_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: K * t^2 = s^3 + J * s^2 + s, dove J = 156326 e K = 1
- p: 2^448 - 2^224 - 1
- m: 1
- k: 224
- expand_message: expand_message_xof (Sezione 5.3.2)
- H: SHAKE256
- L: 84
- f: metodo Elligator 2 (Sezione 6.7.1)
- Z: -1
- h_eff: 4
edwards448_XOF:SHAKE256_ELL2_RO_ è identica a curve448_XOF:SHAKE256_ELL2_RO_, eccetto per i seguenti parametri:
- E: a * v^2 + w^2 = 1 + d * v^2 * w^2, dove a = 1 e d = -39081
- f: metodo Twisted Edwards Elligator 2 (Sezione 6.8.2)
- M: curve448, definita in [RFC7748], Sezione 4.2
- rational_map: la mappa di 4-isogenia definita in [RFC7748], Sezione 4.2
curve448_XOF:SHAKE256_ELL2_NU_ è identica a curve448_XOF:SHAKE256_ELL2_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
edwards448_XOF:SHAKE256_ELL2_NU_ è identica a edwards448_XOF:SHAKE256_ELL2_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Implementazioni di esempio ottimizzate dei mapping sopra sono fornite nelle Appendici G.2.3 e G.2.4.
8.7. Suite per secp256k1
Questa sezione definisce le ciphersuite per la curva ellittica secp256k1 [SEC2].
secp256k1_XMD:SHA-256_SSWU_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: y^2 = x^3 + 7
- p: 2^256 - 2^32 - 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1
- m: 1
- k: 128
- expand_message: expand_message_xmd (Sezione 5.3.1)
- H: SHA-256
- L: 48
- f: Simplified SWU per AB == 0 (Sezione 6.6.3)
- Z: -11
- E': y'^2 = x'^3 + A' * x' + B', dove A' = 0x3f8731abdd661adca08a5558f0f5d272e953d363cb6f0e5d405447c01a444533 e B' = 1771
- iso_map: la mappa di 3-isogenia da E' a E data nell'Appendice E.1
- h_eff: 1
secp256k1_XMD:SHA-256_SSWU_NU_ è identica a secp256k1_XMD:SHA-256_SSWU_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Un esempio di implementazione ottimizzata del mapping Simplified SWU verso la curva E' isogena a secp256k1 è fornito nell'Appendice F.2.
8.8. Suite per BLS12-381
Questa sezione definisce le ciphersuite per i gruppi G1 e G2 della curva ellittica BLS12-381 [BLS12-381].
8.8.1. BLS12-381 G1
BLS12381G1_XMD:SHA-256_SSWU_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: y^2 = x^3 + 4
- p: 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab
- m: 1
- k: 128
- expand_message: expand_message_xmd (Sezione 5.3.1)
- H: SHA-256
- L: 64
- f: Simplified SWU per AB == 0 (Sezione 6.6.3)
- Z: 11
- E': y'^2 = x'^3 + A' * x' + B', dove A' = 0x144698a3b8e9433d693a02c96d4982b0ea985383ee66a8d8e8981aefd881ac98936f8da0e0f97f5cf428082d584c1d e B' = 0x12e2908d11688030018b12e8753eee3b2016c1f0f24f4070a0b9c14fcef35ef55a23215a316ceaa5d1cc48e98e172be0
- iso_map: la mappa di 11-isogenia da E' a E data nell'Appendice E.2
- h_eff: 0xd201000000010001
BLS12381G1_XMD:SHA-256_SSWU_NU_ è identica a BLS12381G1_XMD:SHA-256_SSWU_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Si noti che i valori h_eff per queste suite sono scelti per compatibilità con il metodo rapido di azzeramento del cofattore descritto da Scott ([WB19], Sezione 5).
Un esempio di implementazione ottimizzata del mapping Simplified SWU verso la curva E' isogena a BLS12-381 G1 è fornito nell'Appendice F.2.
8.8.2. BLS12-381 G2
BLS12381G2_XMD:SHA-256_SSWU_RO_ è definita come segue:
- tipo di codifica: hash_to_curve (Sezione 3)
- E: y^2 = x^3 + 4 * (1 + I)
- il campo base F è GF(p^m), dove p: 0x1a0111ea397fe69a4b1ba7b6434bacd764774b84f38512bf6730d2a0f6b0f6241eabfffeb153ffffb9feffffffffaaab, m: 2, e (1, I) è la base per F, dove I^2 + 1 == 0 in F
- k: 128
- expand_message: expand_message_xmd (Sezione 5.3.1)
- H: SHA-256
- L: 64
- f: Simplified SWU per AB == 0 (Sezione 6.6.3)
- Z: -(2 + I)
- E': y'^2 = x'^3 + A' * x' + B', dove A' = 240 * I e B' = 1012 * (1 + I)
- iso_map: la mappa di isogenia da E' a E data nell'Appendice E.3
- h_eff: 0xbc69f08f2ee75b3584c6a0ea91b352888e2a8e9145ad7689986ff031508ffe1329c2f178731db956d82bf015d1212b02ec0ec69d7477c1ae954cbc06689f6a359894c0adebbf6b4e8020005aaa95551
BLS12381G2_XMD:SHA-256_SSWU_NU_ è identica a BLS12381G2_XMD:SHA-256_SSWU_RO_, eccetto che il tipo di codifica è encode_to_curve (Sezione 3).
Si noti che i valori h_eff per queste suite sono scelti per compatibilità con il metodo rapido di azzeramento del cofattore descritto da Budroni e Pintore ([BP17], Sezione 4.1) e sono riassunti nell'Appendice G.3.
Un esempio di implementazione ottimizzata del mapping Simplified SWU verso la curva E' isogena a BLS12-381 G2 è fornito nell'Appendice F.2.
8.9. Definizione di una nuova suite di hash-to-curve
Per le curve ellittiche non elencate altrove nella Sezione 8, una nuova suite di hash-to-curve può essere definita nel modo seguente:
- E, F, p e m sono determinati dalla curva ellittica e dal suo campo base.
- k è un limite superiore al livello di sicurezza target della suite (Sezione 10.8). Una scelta ragionevole di k è ceil(log2(r) / 2), dove r è l'ordine del sottogruppo G della curva E (Sezione 2.1).
- Scegliere il tipo di codifica, o hash_to_curve o encode_to_curve (Sezione 3).
- Calcolare L come descritto nella Sezione 5.
- Scegliere una variante expand_message dalla Sezione 5.3 più eventuali primitive crittografiche sottostanti (ad esempio, una funzione di hash H).
- Scegliere un mapping seguendo le linee guida della Sezione 6.1 e selezionare i parametri richiesti per quel mapping.
- Scegliere h_eff come il cofattore di E o, se deve essere utilizzato un metodo rapido di azzeramento del cofattore, un valore appropriato a quel metodo come discusso nella Sezione 7.
- Costruire un Suite ID seguendo le linee guida della Sezione 8.10.
8.10. Convenzioni di denominazione dei Suite ID
I Suite ID DEVONO essere costruiti come segue:
CURVE_ID || "_" || HASH_ID || "_" || MAP_ID || "_" || ENC_VAR || "_"
I campi CURVE_ID, HASH_ID, MAP_ID ed ENC_VAR sono stringhe codificate in ASCII di al massimo 64 caratteri ciascuna. I campi DEVONO contenere solo caratteri ASCII compresi tra 0x21 e 0x7E (inclusi), eccetto che il carattere di sottolineatura (cioè, 0x5F) non è ammesso.
Come indicato sopra, ciascun campo (incluso l'ultimo) è seguito da un carattere di sottolineatura ("_", ASCII 0x5F). Ciò aiuta a garantire che i Suite ID siano privi di prefissi. I Suite ID DEVONO includere il trattino basso finale e NON DEVONO includere alcun carattere dopo il trattino basso finale.
I campi del Suite ID DEVONO essere scelti come segue:
-
CURVE_ID: una rappresentazione leggibile della curva ellittica target.
-
HASH_ID: una rappresentazione leggibile della funzione expand_message e di eventuali primitive di hash sottostanti utilizzate in hash_to_field (Sezione 5). Questo campo DEVE essere costruito come segue:
EXP_TAG || ":" || HASH_NAMEEXP_TAG indica la variante expand_message:
- "XMD" per expand_message_xmd (Sezione 5.3.1).
- "XOF" per expand_message_xof (Sezione 5.3.2).
HASH_NAME è un nome leggibile per la primitiva di hash sottostante. Ad esempio:
- Per expand_message_xof (Sezione 5.3.2) con SHAKE128, HASH_ID è "XOF:SHAKE128".
- Per expand_message_xmd (Sezione 5.3.1) con SHA3-256, HASH_ID è "XMD:SHA3-256".
Le suite che utilizzano una funzione hash_to_field alternativa che soddisfa i requisiti della Sezione 5.1 DEVONO indicarlo aggiungendo al campo HASH_ID un tag che identifica quella funzione, separato da due punti (":", ASCII 0x3A).
-
MAP_ID: una rappresentazione leggibile della funzione map_to_curve definita nella Sezione 6. Sono definite come segue:
- "SVDW" per Shallue e van de Woestijne (Sezione 6.6.1).
- "SSWU" per Simplified SWU (Sezioni 6.6.2 e 6.6.3).
- "ELL2" per Elligator 2 (Sezioni 6.7.1 e 6.8.2).
-
ENC_VAR: una stringa che indica il tipo di codifica e altre informazioni. I primi due caratteri di questa stringa indicano se la suite rappresenta un'operazione hash_to_curve o encode_to_curve (Sezione 3), come segue:
- Se ENC_VAR inizia con "RO", la suite utilizza hash_to_curve.
- Se ENC_VAR inizia con "NU", la suite utilizza encode_to_curve.
- ENC_VAR NON DEVE iniziare con alcun'altra stringa.
ENC_VAR PUÒ anche essere utilizzato per codificare altre informazioni usate per identificare varianti, ad esempio un numero di versione. Il modo RACCOMANDATO per farlo è aggiungere uno o più sottocampi separati da due punti. Ad esempio, "RO:V02" è un valore ENC_VAR appropriato per la seconda versione di una suite di codifica uniforme, mentre "RO:V02:FOO01:BAR17" potrebbe essere usato per indicare una variante di tale suite.