nigori-protocol-00.txt | nigori-protocol-01.txt | |||
---|---|---|---|---|
Draft B. Laurie | Draft B. Laurie | |||
Google Ltd. | Google Ltd. | |||
June 22, 2010 | September 5, 2010 | |||
Nigori: Storing Secrets in the Cloud | Nigori: Storing Secrets in the Cloud | |||
Nigori September 2010 | ||||
Abstract | Abstract | |||
Nigori is a protocol for storing secrets in the cloud such that the | Nigori is a protocol for storing secrets in the cloud such that the | |||
storage need not be trusted and only a single password is required to | storage need not be trusted and only a single password is required to | |||
access secrets. | access secrets. | |||
Table of Contents | Table of Contents | |||
1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | 1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . 3 | |||
skipping to change at page 3, line 4 | skipping to change at page 3, line 4 | |||
9. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 | 9. Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 | |||
10. Pre-calculated values for mod_inverse(x, p) . . . . . . . . . 16 | 10. Pre-calculated values for mod_inverse(x, p) . . . . . . . . . 16 | |||
11. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 24 | 11. Acknowledgements . . . . . . . . . . . . . . . . . . . . . . . 24 | |||
12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 25 | 12. IANA Considerations . . . . . . . . . . . . . . . . . . . . . 25 | |||
13. Security Considerations . . . . . . . . . . . . . . . . . . . 26 | 13. Security Considerations . . . . . . . . . . . . . . . . . . . 26 | |||
14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 27 | 14. References . . . . . . . . . . . . . . . . . . . . . . . . . . 27 | |||
14.1. Normative References . . . . . . . . . . . . . . . . . . . 27 | 14.1. Normative References . . . . . . . . . . . . . . . . . . . 27 | |||
14.2. Informative References . . . . . . . . . . . . . . . . . . 27 | 14.2. Informative References . . . . . . . . . . . . . . . . . . 27 | |||
Editorial Comments . . . . . . . . . . . . . . . . . . . . . . . . | Editorial Comments . . . . . . . . . . . . . . . . . . . . . . . . | |||
Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 29 | Author's Address . . . . . . . . . . . . . . . . . . . . . . . . . 29 | |||
Nigori September 2010 | ||||
1. Introduction | 1. Introduction | |||
1.1. Requirements Language | 1.1. Requirements Language | |||
The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", | |||
"SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this | |||
document are to be interpreted as described in RFC 2119 [RFC2119]. | document are to be interpreted as described in RFC 2119 [RFC2119]. | |||
1.2. Notation | 1.2. Notation | |||
skipping to change at page 4, line 5 | skipping to change at page 4, line 5 | |||
Enc[k1, k2](P) means the encryption of plaintext P using AES-256 in | Enc[k1, k2](P) means the encryption of plaintext P using AES-256 in | |||
CBC mode with a random IV, standard padding (i.e. n bytes of value n | CBC mode with a random IV, standard padding (i.e. n bytes of value n | |||
s.t. the plaintext is extended to a multiple of 16 bytes, n > 0) and | s.t. the plaintext is extended to a multiple of 16 bytes, n > 0) and | |||
key k1, giving ciphertext C, followed by HMAC(k2, C). | key k1, giving ciphertext C, followed by HMAC(k2, C). | |||
Permute[k1, k2](P) means the encryption of plaintext P using AES-256 | Permute[k1, k2](P) means the encryption of plaintext P using AES-256 | |||
in CBC mode with an all-zero IV, standard padding (i.e. n bytes of | in CBC mode with an all-zero IV, standard padding (i.e. n bytes of | |||
value n s.t. the plaintext is extended to a multiple of 16 bytes, n > | value n s.t. the plaintext is extended to a multiple of 16 bytes, n > | |||
0) and key k1, giving ciphertext C, followed by HMAC(k2, C). | 0) and key k1, giving ciphertext C, followed by HMAC(k2, C). | |||
Nigori September 2010 | ||||
1.3. Constants | 1.3. Constants | |||
+---------+--------+------------------------------------------------+ | +---------+--------+------------------------------------------------+ | |||
| Name | Value | Notes | | | Name | Value | Notes | | |||
+---------+--------+------------------------------------------------+ | +---------+--------+------------------------------------------------+ | |||
| Nsalt | 1000 | [1] | | | Nsalt | 1000 | [1] | | |||
| | | | | | | | | | |||
| Nuser | Nsalt | [1] | | | Nuser | Nsalt | [1] | | |||
| | + 1 | | | | | + 1 | | | |||
| | | | | | | | | | |||
skipping to change at page 5, line 4 | skipping to change at page 5, line 4 | |||
| Bmac | 16 | encryption MAC key size (Kmac) | | | Bmac | 16 | encryption MAC key size (Kmac) | | |||
| | | | | | | | | | |||
| Bmaster | 16 | size in bytes of Kmaster | | | Bmaster | 16 | size in bytes of Kmaster | | |||
+---------+--------+------------------------------------------------+ | +---------+--------+------------------------------------------------+ | |||
[1] should be at least 1000 and different from other N values - the | [1] should be at least 1000 and different from other N values - the | |||
properties of PBKDF2 then ensure that no key can be derived from any | properties of PBKDF2 then ensure that no key can be derived from any | |||
other key. | other key. | |||
Constants | Constants | |||
Nigori September 2010 | ||||
2. Key and Salt Derivation | 2. Key and Salt Derivation | |||
Three keys are required for the Nigori protocol | Three keys are required for the Nigori protocol | |||
Kuser: User Authentication Key - this is used to authenticate the | Kuser: User Authentication Key - this is used to authenticate the | |||
user to the Nigori server(s). Note that this is used in a way | user to the Nigori server(s). Note that this is used in a way | |||
which does not give an eavesdropper a dictionary attack against | which does not give an eavesdropper a dictionary attack against | |||
the master password from which it is derived. | the master password from which it is derived. | |||
skipping to change at page 6, line 4 | skipping to change at page 6, line 4 | |||
If the user forgets the password, there is no way to recover the | If the user forgets the password, there is no way to recover the | |||
various keys, unless either the password or the derived keys are | various keys, unless either the password or the derived keys are | |||
escrowed in some way. Such escrow is outside the scope of this | escrowed in some way. Such escrow is outside the scope of this | |||
protocol. | protocol. | |||
2.2. Assisted Password-based Key Derivation | 2.2. Assisted Password-based Key Derivation | |||
In this mode, the user has an account at some server which will | In this mode, the user has an account at some server which will | |||
supply a master encryption key, Kmaster, if the user successfully | supply a master encryption key, Kmaster, if the user successfully | |||
authenticates. How this is done is up to the server, but we | authenticates. How this is done is up to the server, but we | |||
Nigori September 2010 | ||||
recommend that the server derive it from a hash of the user's | recommend that the server derive it from a hash of the user's | |||
password at the server, Pserver, such as the one used to check the | password at the server, Pserver, such as the one used to check the | |||
password when the user logs in, as follows: | password when the user logs in, as follows: | |||
Kmaster = PBKDF2(H(Pserver), Sserver, Nmaster, Bmaster) | Kmaster = PBKDF2(H(Pserver), Sserver, Nmaster, Bmaster) | |||
where Sserver is a secret known only to the server. This prevents | where Sserver is a secret known only to the server. This prevents | |||
dictionary attacks to try to derive Pserver from Kmaster. If the | dictionary attacks to try to derive Pserver from Kmaster. If the | |||
user forgets his password, the server can still derive Kmaster from | user forgets his password, the server can still derive Kmaster from | |||
the old password hash once the user has recovered his account. | the old password hash once the user has recovered his account. | |||
skipping to change at page 7, line 4 | skipping to change at page 7, line 4 | |||
Kuser = PBKDF2(Pnigori, Suser, Nuser, Buser) | Kuser = PBKDF2(Pnigori, Suser, Nuser, Buser) | |||
Kenc = PBKDF2(Kmaster, Suser, Nenc, Benc) | Kenc = PBKDF2(Kmaster, Suser, Nenc, Benc) | |||
Kmac = PBKDF2(Kmaster, Suser, Nmac, Bmac) | Kmac = PBKDF2(Kmaster, Suser, Nmac, Bmac) | |||
If the user forgets Pnigori or Pserver there is now the possibility | If the user forgets Pnigori or Pserver there is now the possibility | |||
of account recovery using traditional recovery mechanisms. [Note: | of account recovery using traditional recovery mechanisms. [Note: | |||
the client should be able to cache Kmaster so it doesn't always have | the client should be able to cache Kmaster so it doesn't always have | |||
to contact the auth server] | to contact the auth server] | |||
Nigori September 2010 | ||||
3. Authentication | 3. Authentication | |||
When the user registers at a server, he presents his username (an | When the user registers at a server, he presents his username (an | |||
arbitrary octet string [TBD: max length?]) websafe base64 encoded, | arbitrary octet string [TBD: max length?]) websafe base64 encoded, | |||
and g ^ Kuser mod p. Then to authenticate to the server he presents | and g ^ Kuser mod p. Then to authenticate to the server he presents | |||
his username (u), the server name (ns), the time in seconds since Jan | his username (u), the server name (ns), the time in seconds since Jan | |||
1 1970 (nt) and random string (nr) and a DSA signature using Kuser | 1 1970 (nt) and random string (nr) and a DSA signature using Kuser | |||
over u || ns || nt || nr. At least one of these must be different | over u || ns || nt || nr. At least one of these must be different | |||
every time they are used, in order to defeat replay attacks. | every time they are used, in order to defeat replay attacks. | |||
The server checks that nt is recent (so it can drop old entries from | The server checks that nt is recent (so it can drop old entries from | |||
its replay database), checks that it has not seen u || ns || nt || nr | its replay database), checks that it has not seen u || ns || nt || nr | |||
before, looks up g ^ Kuser for the user u, and verifies the DSA | before, looks up g ^ Kuser for the user u, and verifies the DSA | |||
signature. If all these checks pass, the user is authenticated. | signature. If all these checks pass, the user is authenticated. | |||
Nigori September 2010 | ||||
4. Storage of Secrets | 4. Storage of Secrets | |||
Secrets are identified by a type and a name. The value of the name | Secrets are identified by a type and a name. The value of the name | |||
depends on the type, as does the value of the stored secret. | depends on the type, as does the value of the stored secret. | |||
Currently defined types are: | Currently defined types are: | |||
Type 1: a password. The name is the URL at which the password is | Type 1: a password. The name is the URL at which the password is | |||
to be presented [Note: simplistic, what should we really do?], the | to be presented [Note: simplistic, what should we really do?], the | |||
value is the password. [Switch this to JSON] | value is the password. [Switch this to JSON] | |||
skipping to change at page 9, line 5 | skipping to change at page 9, line 5 | |||
then we could also allow third parties access to single secrets via | then we could also allow third parties access to single secrets via | |||
protocols such as OAuth. The most general form of this would give an | protocols such as OAuth. The most general form of this would give an | |||
the service provider (SP) the per-secret key and an OAuth token to | the service provider (SP) the per-secret key and an OAuth token to | |||
retrieve the current value of that secret. A general purpose crypto | retrieve the current value of that secret. A general purpose crypto | |||
service could be used which performed encryption, signing etc. on | service could be used which performed encryption, signing etc. on | |||
behalf of less trusted services - in this case, the final SP would | behalf of less trusted services - in this case, the final SP would | |||
have OAuth access to the crypto SP, which in turn would have OAuth | have OAuth access to the crypto SP, which in turn would have OAuth | |||
access to the appropriate secret in Nigori. | access to the appropriate secret in Nigori. | |||
Nigori September 2010 | ||||
5. Secret Storage at a Single Server | 5. Secret Storage at a Single Server | |||
5.1. Storage | 5.1. Storage | |||
The client sends authentication information as specified above, plus | The client sends authentication information as specified above, plus | |||
the key and value. | the key and value. | |||
5.2. Retrieval | 5.2. Retrieval | |||
The client sends authentication information and the key. The server | The client sends authentication information and the key. The server | |||
returns the value. | returns the value. | |||
Nigori September 2010 | ||||
6. Secret Storage at Multiple Servers | 6. Secret Storage at Multiple Servers | |||
This looks exactly the same to each server as storage at a single | This looks exactly the same to each server as storage at a single | |||
server would. However, the client takes the value, V, it would store | server would. However, the client takes the value, V, it would store | |||
at a single server and splits it using a Shamir split, with the k | at a single server and splits it using a Shamir split, with the k | |||
value as determined by the user (n is obviously equal to the number | value as determined by the user (n is obviously equal to the number | |||
of servers). Each split is then stored at one of the servers as | of servers). Each split is then stored at one of the servers as | |||
Enc[Kenc,Kmac](i || Si). [anchor16] | Enc[Kenc,Kmac](i || Si). [anchor16] | |||
Nigori September 2010 | ||||
7. Protocol Details | 7. Protocol Details | |||
All octet strings are transmitted as websafe base64. | All octet strings are transmitted as websafe base64. | |||
[server] is the base URL for the server. All request MUST be | [server] is the base URL for the server. All request MUST be | |||
performed over HTTPS. The client MUST check the certificate (note: | performed over HTTPS. The client MUST check the certificate (note: | |||
"check" may mean "is the same certificate as seen when the user | "check" may mean "is the same certificate as seen when the user | |||
registered at or first visited the server"). | registered at or first visited the server"). | |||
skipping to change at page 12, line 4 | skipping to change at page 12, line 4 | |||
+-----------+---------------+ | +-----------+---------------+ | |||
The server adds the value to the list of values stored for that key. | The server adds the value to the list of values stored for that key. | |||
7.2. Retrieval | 7.2. Retrieval | |||
Retrieval is a GET request to [server]/get Suggest just using | Retrieval is a GET request to [server]/get Suggest just using | |||
"/store" here -- why multiply endpoints without necessity -- assuming | "/store" here -- why multiply endpoints without necessity -- assuming | |||
"store" could be a noun in this context. -John Panzer 3/1/10 1:03 PM | "store" could be a noun in this context. -John Panzer 3/1/10 1:03 PM | |||
with an empty body and parameters as follows | with an empty body and parameters as follows | |||
Nigori September 2010 | ||||
+-----------+---------------+ | +-----------+---------------+ | |||
| Parameter | Value | | | Parameter | Value | | |||
+-----------+---------------+ | +-----------+---------------+ | |||
| u | user name | | | u | user name | | |||
| | | | | | | | |||
| ns | server name | | | ns | server name | | |||
| | | | | | | | |||
| nt | time | | | nt | time | | |||
| | | | | | | | |||
| nr | random | | | nr | random | | |||
skipping to change at page 13, line 4 | skipping to change at page 13, line 4 | |||
7.3. Responses | 7.3. Responses | |||
200 OK | 200 OK | |||
401 Signature does not verify | 401 Signature does not verify | |||
401 This is a replay | 401 This is a replay | |||
403 Signature verifies but ACL doesn't | 403 Signature verifies but ACL doesn't | |||
Nigori September 2010 | ||||
8. Algorithms | 8. Algorithms | |||
I'll describe the algorithms in psuedocode here. There are also | I'll describe the algorithms in psuedocode here. There are also | |||
Python implementations available at http://code.google.com/p/nigori/ | Python implementations available at http://code.google.com/p/nigori/ | |||
8.1. Shamir Secret Split | 8.1. Shamir Secret Split | |||
A Shamir secret split takes some secret (a number less than the | A Shamir secret split takes some secret (a number less than the | |||
public parameter, p) and splits it into n components such that any k | public parameter, p) and splits it into n components such that any k | |||
components can be used to retrieve it. The public parameter is the | components can be used to retrieve it. The public parameter is the | |||
same for all implementations and is the 4096 bit verified prime: | same for all implementations and is the 4096 bit verified prime: | |||
Because the secret we want to split is in fact an arbitrary sequence | ||||
of bytes, we need to first encode it into a number. We do this by | ||||
prefixing the byte sequence with a single byte with the value 01 and | ||||
then interpreting the byte sequence as a bigendian number. When | ||||
recovering the secret from the split this 01 byte MUST be checked and | ||||
stripped. | ||||
p = | p = | |||
FFFFFFFFFFFFFFFF C90FDAA22168C234 C4C6628B80DC1CD1 29024E088A67CC74 | FFFFFFFFFFFFFFFF C90FDAA22168C234 C4C6628B80DC1CD1 29024E088A67CC74 | |||
020BBEA63B139B22 514A08798E3404DD EF9519B3CD3A431B 302B0A6DF25F1437 | 020BBEA63B139B22 514A08798E3404DD EF9519B3CD3A431B 302B0A6DF25F1437 | |||
4FE1356D6D51C245 E485B576625E7EC6 F44C42E9A637ED6B 0BFF5CB6F406B7ED | 4FE1356D6D51C245 E485B576625E7EC6 F44C42E9A637ED6B 0BFF5CB6F406B7ED | |||
EE386BFB5A899FA5 AE9F24117C4B1FE6 49286651ECE45B3D C2007CB8A163BF05 | EE386BFB5A899FA5 AE9F24117C4B1FE6 49286651ECE45B3D C2007CB8A163BF05 | |||
98DA48361C55D39A 69163FA8FD24CF5F 83655D23DCA3AD96 1C62F356208552BB | 98DA48361C55D39A 69163FA8FD24CF5F 83655D23DCA3AD96 1C62F356208552BB | |||
9ED529077096966D 670C354E4ABC9804 F1746C08CA18217C 32905E462E36CE3B | 9ED529077096966D 670C354E4ABC9804 F1746C08CA18217C 32905E462E36CE3B | |||
E39E772C180E8603 9B2783A2EC07A28F B5C55DF06F4C52C9 DE2BCBF695581718 | E39E772C180E8603 9B2783A2EC07A28F B5C55DF06F4C52C9 DE2BCBF695581718 | |||
3995497CEA956AE5 15D2261898FA0510 15728E5A8AAAC42D AD33170D04507A33 | 3995497CEA956AE5 15D2261898FA0510 15728E5A8AAAC42D AD33170D04507A33 | |||
A85521ABDF1CBA64 ECFB850458DBEF0A 8AEA71575D060C7D B3970F85A6E1E4C7 | A85521ABDF1CBA64 ECFB850458DBEF0A 8AEA71575D060C7D B3970F85A6E1E4C7 | |||
skipping to change at page 13, line 42 | skipping to change at page 13, line 50 | |||
233BA186515BE7ED 1F612970CEE2D7AF B81BDD762170481C D0069127D5B05AA9 | 233BA186515BE7ED 1F612970CEE2D7AF B81BDD762170481C D0069127D5B05AA9 | |||
93B4EA988D8FDDC1 86FFB7DC90A6C08F 4DF435C934063199 FFFFFFFFFFFFFFFF | 93B4EA988D8FDDC1 86FFB7DC90A6C08F 4DF435C934063199 FFFFFFFFFFFFFFFF | |||
To split: | To split: | |||
1. Create an array, a, of length k. | 1. Create an array, a, of length k. | |||
2. Set a[0] = secret. | 2. Set a[0] = secret. | |||
3. Set a[1] to a[k-1] to random integers in the range [0,p) (i.e. 0 | 3. Set a[1] to a[k-1] to random integers in the range [0,p) (i.e. 0 | |||
< a[i] < p). Use a cryptographic random number | <= a[i] < p). Use a cryptographic random number | |||
generator.[anchor23] | generator.[anchor23] | |||
Nigori September 2010 | ||||
4. For i in the range 1 to n inclusive, compute poly(a, i) (see | 4. For i in the range 1 to n inclusive, compute poly(a, i) (see | |||
below), the result is the i'th share. | below), the result is the i'th share. | |||
poly(a, i): | poly(a, i): | |||
1. Set t = 0. | 1. Set t = 0. | |||
2. for j in the range 0 to k-1 inclusive, compute t = (t + a[j] * | 2. for j in the range 0 to k-1 inclusive, compute t = (t + a[j] * | |||
i^j) mod p | i^j) mod p | |||
skipping to change at page 15, line 4 | skipping to change at page 15, line 4 | |||
mod_inverse(x, p) is the inverse of x in Zp - that is, x * | mod_inverse(x, p) is the inverse of x in Zp - that is, x * | |||
mod_inverse(x, p) mod p = 1. Note that many implementations require | mod_inverse(x, p) mod p = 1. Note that many implementations require | |||
x to be in the range [1,p) so it may be necessary to calculate | x to be in the range [1,p) so it may be necessary to calculate | |||
mod_inverse((j-i) mod p, p) to avoid an error (note that j-i mod p = | mod_inverse((j-i) mod p, p) to avoid an error (note that j-i mod p = | |||
j-i if j-i >= 0 and = j-i+p if j-i < 0). Also note that since i and | j-i if j-i >= 0 and = j-i+p if j-i < 0). Also note that since i and | |||
j are small and p is fixed, mod_inverse(j-i, p) could be pre- | j are small and p is fixed, mod_inverse(j-i, p) could be pre- | |||
calculated or cached (see below for pre-calculated values). | calculated or cached (see below for pre-calculated values). | |||
[anchor24] | [anchor24] | |||
Nigori September 2010 | ||||
9. Examples | 9. Examples | |||
Nigori September 2010 | ||||
10. Pre-calculated values for mod_inverse(x, p) | 10. Pre-calculated values for mod_inverse(x, p) | |||
mod_inverse(-10, p) = | mod_inverse(-10, p) = | |||
4ccccccccccccccc bc518e63d6d2a0a9 6e3b83f6a6a86f0b 8c4d7dcf5cb8bd56 | 4ccccccccccccccc bc518e63d6d2a0a9 6e3b83f6a6a86f0b 8c4d7dcf5cb8bd56 | |||
009d1f9844ec4823 e52fcf57aaa934a8 fb13214f8a5e4754 f4d9b6542f1c8610 | 009d1f9844ec4823 e52fcf57aaa934a8 fb13214f8a5e4754 f4d9b6542f1c8610 | |||
97f6c33a6d988714 f7c1b67050b5f2d5 494a1412e510c739 b6cc9bd07c686a60 | 97f6c33a6d988714 f7c1b67050b5f2d5 494a1412e510c739 b6cc9bd07c686a60 | |||
faaa86cb67f6164b 4dfc8ad20bb0232b 7c58eb7efa4481c5 ba33589dca0452e8 | faaa86cb67f6164b 4dfc8ad20bb0232b 7c58eb7efa4481c5 ba33589dca0452e8 | |||
14417c103bb35914 b920464c4bf17169 743802578efde746 a21daf66a35b326b | 14417c103bb35914 b920464c4bf17169 743802578efde746 a21daf66a35b326b | |||
7c7325e8a1c6c6ba 6bb6dccab00560ce 486fba02a3073d3e dbf81c4841107111 | 7c7325e8a1c6c6ba 6bb6dccab00560ce 486fba02a3073d3e dbf81c4841107111 | |||
skipping to change at page 17, line 4 | skipping to change at page 17, line 4 | |||
mod_inverse(-8, p) = | mod_inverse(-8, p) = | |||
dfffffffffffffff cfeddf4ddd3ba9ee 2c2d963a10c09937 03e20447791ad2e5 | dfffffffffffffff cfeddf4ddd3ba9ee 2c2d963a10c09937 03e20447791ad2e5 | |||
81ca46d173b127be 0720c76a5c6d8442 31a2767d5392fab7 ca25a920341331b0 | 81ca46d173b127be 0720c76a5c6d8442 31a2767d5392fab7 ca25a920341331b0 | |||
65e50ebfbfa789fd 27f4fec79612aeee 15c2ba8c7170efbd aa7f71201585e0f0 | 65e50ebfbfa789fd 27f4fec79612aeee 15c2ba8c7170efbd aa7f71201585e0f0 | |||
30715e7bef386bb0 f8cb3f8f4cc1bbe9 80035987af47cfd6 09c06d218d374724 | 30715e7bef386bb0 f8cb3f8f4cc1bbe9 80035987af47cfd6 09c06d218d374724 | |||
e5beff2f58cb1927 1bf377b3dd803573 92f8b17f610f37e3 58d694eb5c74a864 | e5beff2f58cb1927 1bf377b3dd803573 92f8b17f610f37e3 58d694eb5c74a864 | |||
2afa83e68283c39f ba2aaea481650504 5345de87b0d51d4c ac3e527d686ff474 | 2afa83e68283c39f ba2aaea481650504 5345de87b0d51d4c ac3e527d686ff474 | |||
672aa846950cb543 27c2932e8e86ae3d bf0cb2326162c870 a2665277c2ad1435 | 672aa846950cb543 27c2932e8e86ae3d bf0cb2326162c870 a2665277c2ad1435 | |||
3262a04d4d42bd88 7317e15585dac46e 12c43c8f39556ba7 f78cb42b63c66aed | 3262a04d4d42bd88 7317e15585dac46e 12c43c8f39556ba7 f78cb42b63c66aed | |||
334a7d7663392318 4f5c1463cdc07129 398d232c71654aed fd242d94f205a82e | 334a7d7663392318 4f5c1463cdc07129 398d232c71654aed fd242d94f205a82e | |||
Nigori September 2010 | ||||
b676f8bb3fa80d5c 3abb024440e0b56a 150757e15778909e 7309fac5fe58c758 | b676f8bb3fa80d5c 3abb024440e0b56a 150757e15778909e 7309fac5fe58c758 | |||
3d674224d6ef5d17 c7db45b5148bbc0b 2464f46c8b1531be e82857a8a37e1e05 | 3d674224d6ef5d17 c7db45b5148bbc0b 2464f46c8b1531be e82857a8a37e1e05 | |||
c7c605ac6648f5cb 1b5ff07d44dd6e7c 821276fc93fce700 f723f4905296e9fc | c7c605ac6648f5cb 1b5ff07d44dd6e7c 821276fc93fce700 f723f4905296e9fc | |||
976366cea6030fc1 c68ac2355d9645f4 9741db2e1f526a5e e0d36c90e579c34b | 976366cea6030fc1 c68ac2355d9645f4 9741db2e1f526a5e e0d36c90e579c34b | |||
c0444a7fa442bd1a 08bd1c919bc6f151 636cce1e649e4851 e67c4385ac7eab2d | c0444a7fa442bd1a 08bd1c919bc6f151 636cce1e649e4851 e67c4385ac7eab2d | |||
ded42d5587306aef 7b750442b5067cb9 c11861c75d423f19 3605bf02dafa4f54 | ded42d5587306aef 7b750442b5067cb9 c11861c75d423f19 3605bf02dafa4f54 | |||
613e4d457bdde209 561fc0e0fe91e87d 6435af100d856b66 bfffffffffffffff | 613e4d457bdde209 561fc0e0fe91e87d 6435af100d856b66 bfffffffffffffff | |||
mod_inverse(-7, p) = | mod_inverse(-7, p) = | |||
6db6db6db6db6db6 c3e23920e9bf2ea8 e69e2a3bc982e7c7 5ab7d84ccd9a330d | 6db6db6db6db6db6 c3e23920e9bf2ea8 e69e2a3bc982e7c7 5ab7d84ccd9a330d | |||
skipping to change at page 18, line 4 | skipping to change at page 18, line 4 | |||
b211ed05b6bf63fe 6336cca810d2e321 3eed039b379b86ab 9609dcba364695b3 | b211ed05b6bf63fe 6336cca810d2e321 3eed039b379b86ab 9609dcba364695b3 | |||
9c5eab0df370a14a d577f5e9ae76bc87 6b7bac2bed1189e0 7498982879064017 | 9c5eab0df370a14a d577f5e9ae76bc87 6b7bac2bed1189e0 7498982879064017 | |||
61c722612eb97724 fc21d210c51efe35 21bcf510c159caf8 aabf7d425b234db1 | 61c722612eb97724 fc21d210c51efe35 21bcf510c159caf8 aabf7d425b234db1 | |||
c807069a9921ebf0 44d0f7de01bd0912 6ec1e337c6883c18 02b023a13212f637 | c807069a9921ebf0 44d0f7de01bd0912 6ec1e337c6883c18 02b023a13212f637 | |||
fb16c37f20a28e21 45d51937cde04b22 164b8227ab5a7eaa ffffffffffffffff | fb16c37f20a28e21 45d51937cde04b22 164b8227ab5a7eaa ffffffffffffffff | |||
mod_inverse(-5, p) = | mod_inverse(-5, p) = | |||
9999999999999999 78a31cc7ada54152 dc7707ed4d50de17 189afb9eb9717aac | 9999999999999999 78a31cc7ada54152 dc7707ed4d50de17 189afb9eb9717aac | |||
013a3f3089d89047 ca5f9eaf55526951 f626429f14bc8ea9 e9b36ca85e390c21 | 013a3f3089d89047 ca5f9eaf55526951 f626429f14bc8ea9 e9b36ca85e390c21 | |||
2fed8674db310e29 ef836ce0a16be5aa 92942825ca218e73 6d9937a0f8d0d4c1 | 2fed8674db310e29 ef836ce0a16be5aa 92942825ca218e73 6d9937a0f8d0d4c1 | |||
Nigori September 2010 | ||||
f5550d96cfec2c96 9bf915a417604656 f8b1d6fdf489038b 7466b13b9408a5d0 | f5550d96cfec2c96 9bf915a417604656 f8b1d6fdf489038b 7466b13b9408a5d0 | |||
2882f8207766b229 72408c9897e2e2d2 e87004af1dfbce8d 443b5ecd46b664d6 | 2882f8207766b229 72408c9897e2e2d2 e87004af1dfbce8d 443b5ecd46b664d6 | |||
f8e64bd1438d8d74 d76db995600ac19c 90df7405460e7a7d b7f038908220e223 | f8e64bd1438d8d74 d76db995600ac19c 90df7405460e7a7d b7f038908220e223 | |||
eef8ade741a25068 904ae894f40494bc a043385d0f9431ac 521a472d8cce7441 | eef8ade741a25068 904ae894f40494bc a043385d0f9431ac 521a472d8cce7441 | |||
bc265f4af3267356 404ae3a85bc9363c d9ab223653334281 ce51daa168fd161e | bc265f4af3267356 404ae3a85bc9363c d9ab223653334281 ce51daa168fd161e | |||
fe997a9a52aad63c 8e3083029bb72906 535977346b03a118 388dd61cfdbabc77 | fe997a9a52aad63c 8e3083029bb72906 535977346b03a118 388dd61cfdbabc77 | |||
cd9368bae9d2524d df2126202c7cd42b 7c224ae3a9b1c240 c3e996041c1f9ea2 | cd9368bae9d2524d df2126202c7cd42b 7c224ae3a9b1c240 c3e996041c1f9ea2 | |||
e846ce4525ab7308 fe12b374dae379a1 3d870e01496d9e74 476c1eda09b590ee | e846ce4525ab7308 fe12b374dae379a1 3d870e01496d9e74 476c1eda09b590ee | |||
0554962d12f03383 f5839d97ba317055 6081b0ad324704cd 76448a7197b7f0e7 | 0554962d12f03383 f5839d97ba317055 6081b0ad324704cd 76448a7197b7f0e7 | |||
b844293d3ea3037d 8f7517750cf9548a 76590b52d3a63a4f b01bf2ac8018faf2 | b844293d3ea3037d 8f7517750cf9548a 76590b52d3a63a4f b01bf2ac8018faf2 | |||
skipping to change at page 19, line 4 | skipping to change at page 19, line 4 | |||
69e370afa0646448 ef5d78dedc7dbaad f64d9d5b31656ba8 21b5942ec979ded2 | 69e370afa0646448 ef5d78dedc7dbaad f64d9d5b31656ba8 21b5942ec979ded2 | |||
97befa1d655f0402 676fad174805170a 792e3ea04a32e1db e97287f9b8e564ba | 97befa1d655f0402 676fad174805170a 792e3ea04a32e1db e97287f9b8e564ba | |||
d10e30fdf1b8f1ee 0e8c1965bb5158b5 63a1b43c5c71d81e 737764b35835a6cd | d10e30fdf1b8f1ee 0e8c1965bb5158b5 63a1b43c5c71d81e 737764b35835a6cd | |||
1ae36bc7ea1326ed f35258ad90929f5c 5c9c4b8f93595da9 2264b503c4969885 | 1ae36bc7ea1326ed f35258ad90929f5c 5c9c4b8f93595da9 2264b503c4969885 | |||
1d4e745de75b77e4 bf086340316e4113 df428c196737499d 4b755159e65c0598 | 1d4e745de75b77e4 bf086340316e4113 df428c196737499d 4b755159e65c0598 | |||
904eac4cd4859c42 e16a1cbaba52155d d2960f8fa6eb939d a4b105d5d1e62f41 | 904eac4cd4859c42 e16a1cbaba52155d d2960f8fa6eb939d a4b105d5d1e62f41 | |||
5b418a6af8991ccb 82923d5340a8b5b4 32573615c6160556 11a17d61c505448f | 5b418a6af8991ccb 82923d5340a8b5b4 32573615c6160556 11a17d61c505448f | |||
b04bbc0b2926e76f 112cc4baf1f896d2 bc62f023240e07e6 c3ad4686c7383345 | b04bbc0b2926e76f 112cc4baf1f896d2 bc62f023240e07e6 c3ad4686c7383345 | |||
e7d281e758945f50 c9b4a80d6a7f31c4 1afd90da3447d593 bbcc643515b5d7c1 | e7d281e758945f50 c9b4a80d6a7f31c4 1afd90da3447d593 bbcc643515b5d7c1 | |||
6cd26baee0e7eff3 6a40c64b34973a75 2567e8f96ba03013 3559b61a8e7591c6 | 6cd26baee0e7eff3 6a40c64b34973a75 2567e8f96ba03013 3559b61a8e7591c6 | |||
Nigori September 2010 | ||||
62789c65b3b53e81 04aa7a930b19d5b4 dea2ce8622aecbbb ffffffffffffffff | 62789c65b3b53e81 04aa7a930b19d5b4 dea2ce8622aecbbb ffffffffffffffff | |||
mod_inverse(-2, p) = | mod_inverse(-2, p) = | |||
7fffffffffffffff e487ed5110b4611a 62633145c06e0e68 948127044533e63a | 7fffffffffffffff e487ed5110b4611a 62633145c06e0e68 948127044533e63a | |||
0105df531d89cd91 28a5043cc71a026e f7ca8cd9e69d218d 98158536f92f8a1b | 0105df531d89cd91 28a5043cc71a026e f7ca8cd9e69d218d 98158536f92f8a1b | |||
a7f09ab6b6a8e122 f242dabb312f3f63 7a262174d31bf6b5 85ffae5b7a035bf6 | a7f09ab6b6a8e122 f242dabb312f3f63 7a262174d31bf6b5 85ffae5b7a035bf6 | |||
f71c35fdad44cfd2 d74f9208be258ff3 24943328f6722d9e e1003e5c50b1df82 | f71c35fdad44cfd2 d74f9208be258ff3 24943328f6722d9e e1003e5c50b1df82 | |||
cc6d241b0e2ae9cd 348b1fd47e9267af c1b2ae91ee51d6cb 0e3179ab1042a95d | cc6d241b0e2ae9cd 348b1fd47e9267af c1b2ae91ee51d6cb 0e3179ab1042a95d | |||
cf6a9483b84b4b36 b3861aa7255e4c02 78ba3604650c10be 19482f23171b671d | cf6a9483b84b4b36 b3861aa7255e4c02 78ba3604650c10be 19482f23171b671d | |||
f1cf3b960c074301 cd93c1d17603d147 dae2aef837a62964 ef15e5fb4aac0b8c | f1cf3b960c074301 cd93c1d17603d147 dae2aef837a62964 ef15e5fb4aac0b8c | |||
skipping to change at page 20, line 4 | skipping to change at page 20, line 4 | |||
mod_inverse(1, p) = 1 | mod_inverse(1, p) = 1 | |||
mod_inverse(2, p) = | mod_inverse(2, p) = | |||
7fffffffffffffff e487ed5110b4611a 62633145c06e0e68 948127044533e63a | 7fffffffffffffff e487ed5110b4611a 62633145c06e0e68 948127044533e63a | |||
0105df531d89cd91 28a5043cc71a026e f7ca8cd9e69d218d 98158536f92f8a1b | 0105df531d89cd91 28a5043cc71a026e f7ca8cd9e69d218d 98158536f92f8a1b | |||
a7f09ab6b6a8e122 f242dabb312f3f63 7a262174d31bf6b5 85ffae5b7a035bf6 | a7f09ab6b6a8e122 f242dabb312f3f63 7a262174d31bf6b5 85ffae5b7a035bf6 | |||
f71c35fdad44cfd2 d74f9208be258ff3 24943328f6722d9e e1003e5c50b1df82 | f71c35fdad44cfd2 d74f9208be258ff3 24943328f6722d9e e1003e5c50b1df82 | |||
cc6d241b0e2ae9cd 348b1fd47e9267af c1b2ae91ee51d6cb 0e3179ab1042a95d | cc6d241b0e2ae9cd 348b1fd47e9267af c1b2ae91ee51d6cb 0e3179ab1042a95d | |||
cf6a9483b84b4b36 b3861aa7255e4c02 78ba3604650c10be 19482f23171b671d | cf6a9483b84b4b36 b3861aa7255e4c02 78ba3604650c10be 19482f23171b671d | |||
f1cf3b960c074301 cd93c1d17603d147 dae2aef837a62964 ef15e5fb4aac0b8c | f1cf3b960c074301 cd93c1d17603d147 dae2aef837a62964 ef15e5fb4aac0b8c | |||
Nigori September 2010 | ||||
1ccaa4be754ab572 8ae9130c4c7d0288 0ab9472d45556216 d6998b8682283d19 | 1ccaa4be754ab572 8ae9130c4c7d0288 0ab9472d45556216 d6998b8682283d19 | |||
d42a90d5ef8e5d32 767dc2822c6df785 457538abae83063e d9cb87c2d370f263 | d42a90d5ef8e5d32 767dc2822c6df785 457538abae83063e d9cb87c2d370f263 | |||
d5fad7466d8499eb 8f464a702512b0ce e771e9130d697735 f897fd036cc50432 | d5fad7466d8499eb 8f464a702512b0ce e771e9130d697735 f897fd036cc50432 | |||
6c3b01399f643532 290f958c0bbd9006 5df08babbd30aeb6 3b84c4605d6ca371 | 6c3b01399f643532 290f958c0bbd9006 5df08babbd30aeb6 3b84c4605d6ca371 | |||
047127d03a72d598 a1edadfe707e8847 25c1689054908400 8d391e0953c3f36b | 047127d03a72d598 a1edadfe707e8847 25c1689054908400 8d391e0953c3f36b | |||
c438cd085edd2d93 4ce1938c357a711e 0d4a341a5b0a85ed 12c1f4e5156a2674 | c438cd085edd2d93 4ce1938c357a711e 0d4a341a5b0a85ed 12c1f4e5156a2674 | |||
6ddde16d826f477c 97477e0a0fdf6553 143e2ca3a735e02e ccd94b27d04861d1 | 6ddde16d826f477c 97477e0a0fdf6553 143e2ca3a735e02e ccd94b27d04861d1 | |||
119dd0c328adf3f6 8fb094b867716bd7 dc0deebb10b8240e 68034893ead82d54 | 119dd0c328adf3f6 8fb094b867716bd7 dc0deebb10b8240e 68034893ead82d54 | |||
c9da754c46c7eee0 c37fdbee48536047 a6fa1ae49a0318cd 0000000000000000 | c9da754c46c7eee0 c37fdbee48536047 a6fa1ae49a0318cd 0000000000000000 | |||
skipping to change at page 21, line 4 | skipping to change at page 21, line 4 | |||
eafd6ba336c24cf5 c7a3253812895867 73b8f48986b4bb9a fc4bfe81b6628219 | eafd6ba336c24cf5 c7a3253812895867 73b8f48986b4bb9a fc4bfe81b6628219 | |||
361d809ccfb21a99 1487cac605dec803 2ef845d5de98575b 1dc262302eb651b8 | 361d809ccfb21a99 1487cac605dec803 2ef845d5de98575b 1dc262302eb651b8 | |||
823893e81d396acc 50f6d6ff383f4423 92e0b4482a484200 469c8f04a9e1f9b5 | 823893e81d396acc 50f6d6ff383f4423 92e0b4482a484200 469c8f04a9e1f9b5 | |||
e21c66842f6e96c9 a670c9c61abd388f 06a51a0d2d8542f6 8960fa728ab5133a | e21c66842f6e96c9 a670c9c61abd388f 06a51a0d2d8542f6 8960fa728ab5133a | |||
36eef0b6c137a3be 4ba3bf0507efb2a9 8a1f1651d39af017 666ca593e82430e8 | 36eef0b6c137a3be 4ba3bf0507efb2a9 8a1f1651d39af017 666ca593e82430e8 | |||
88cee8619456f9fb 47d84a5c33b8b5eb ee06f75d885c1207 3401a449f56c16aa | 88cee8619456f9fb 47d84a5c33b8b5eb ee06f75d885c1207 3401a449f56c16aa | |||
64ed3aa62363f770 61bfedf72429b023 d37d0d724d018c66 8000000000000000 | 64ed3aa62363f770 61bfedf72429b023 d37d0d724d018c66 8000000000000000 | |||
mod_inverse(5, p) = | mod_inverse(5, p) = | |||
6666666666666666 506cbdda73c380e1 e84f5a9e338b3eba 10675269d0f651c8 | 6666666666666666 506cbdda73c380e1 e84f5a9e338b3eba 10675269d0f651c8 | |||
Nigori September 2010 | ||||
00d17f75b13b0ada 86ea69ca38e19b8b f96ed714b87db471 46779dc594260816 | 00d17f75b13b0ada 86ea69ca38e19b8b f96ed714b87db471 46779dc594260816 | |||
1ff3aef89220b41b f5024895c0f2991c 61b81ac3dc165ef7 9e662515fb35e32b | 1ff3aef89220b41b f5024895c0f2991c 61b81ac3dc165ef7 9e662515fb35e32b | |||
f8e35e648a9d730f 12a60e6d64ead98f 50768f53f85b57b2 4d99cb7d0d5b1935 | f8e35e648a9d730f 12a60e6d64ead98f 50768f53f85b57b2 4d99cb7d0d5b1935 | |||
70575015a4ef2170 f6d5b3106541ec8c 9af55874bea7df08 d8279488d9ceede4 | 70575015a4ef2170 f6d5b3106541ec8c 9af55874bea7df08 d8279488d9ceede4 | |||
a5eedd362d0908f8 8f9e7bb8eab1d668 6094f8038409a6fe 7aa025b5ac15ec17 | a5eedd362d0908f8 8f9e7bb8eab1d668 6094f8038409a6fe 7aa025b5ac15ec17 | |||
f4a5c944d66c359b 0adc9b0df8030dd3 158225935fb8211d 8c1184c90889a2d6 | f4a5c944d66c359b 0adc9b0df8030dd3 158225935fb8211d 8c1184c90889a2d6 | |||
7d6eea31f76ef78e d58742703d30ced3 3bc76c24377781ab dee13c6b9b536414 | 7d6eea31f76ef78e d58742703d30ced3 3bc76c24377781ab dee13c6b9b536414 | |||
a9bba7118c71e428 5ecb0201bd24c604 3790fa22f2026b65 7b093968a927284f | a9bba7118c71e428 5ecb0201bd24c604 3790fa22f2026b65 7b093968a927284f | |||
de6245d1f136e189 3f6b6ec01da88d72 52c1874271212c2b 2d466402bd6a69c1 | de6245d1f136e189 3f6b6ec01da88d72 52c1874271212c2b 2d466402bd6a69c1 | |||
f02f342e191cf75b 540c77a33c97a66b 7e5a095630f3bef8 2f9d69e6b123b5f4 | f02f342e191cf75b 540c77a33c97a66b 7e5a095630f3bef8 2f9d69e6b123b5f4 | |||
skipping to change at page 22, line 4 | skipping to change at page 22, line 4 | |||
acb286d8c6057fcc 63c8a6e56b98a483 9784ccc119a70f91 0124d98e13146d27 | acb286d8c6057fcc 63c8a6e56b98a483 9784ccc119a70f91 0124d98e13146d27 | |||
c50f04b134c35458 3c0cb6a9b5399b12 01f0c78234efd0e8 10388b0ca4de786b | c50f04b134c35458 3c0cb6a9b5399b12 01f0c78234efd0e8 10388b0ca4de786b | |||
3630a9bb1bc3c3ac 3ae2679a73d97b70 89f9624e2a56ee90 1ce4c8281a6875d9 | 3630a9bb1bc3c3ac 3ae2679a73d97b70 89f9624e2a56ee90 1ce4c8281a6875d9 | |||
145a8d3dc49a95b8 eaf20213f496a608 fa27a364d1e27873 5a622b685556e8a0 | 145a8d3dc49a95b8 eaf20213f496a608 fa27a364d1e27873 5a622b685556e8a0 | |||
20e797b5185561a7 7a2ef132a08ede52 55660833bcf3ddd0 f541c407702dfcaf | 20e797b5185561a7 7a2ef132a08ede52 55660833bcf3ddd0 f541c407702dfcaf | |||
cde780f47f7e215e 3e4695270e348898 4f6165567e4c996c 669f769583eecbdf | cde780f47f7e215e 3e4695270e348898 4f6165567e4c996c 669f769583eecbdf | |||
cffa1a99a1bc1d9f 7f2bc2c94ef0ca11 08822ef133e63f19 1c1b6a4d0e9804cb | cffa1a99a1bc1d9f 7f2bc2c94ef0ca11 08822ef133e63f19 1c1b6a4d0e9804cb | |||
e96801666d04cf14 c13661c49fb41250 6b5c0d568f1310d0 440572b7463303ee | e96801666d04cf14 c13661c49fb41250 6b5c0d568f1310d0 440572b7463303ee | |||
e08152128bf0f41c 26c67db512d9c051 4fb8778060a52925 33aefdc1844da87b | e08152128bf0f41c 26c67db512d9c051 4fb8778060a52925 33aefdc1844da87b | |||
29657c9bda2158a8 57dd3ae961b08146 ea9df2674379bda1 3a023c7386302bf2 | 29657c9bda2158a8 57dd3ae961b08146 ea9df2674379bda1 3a023c7386302bf2 | |||
Nigori September 2010 | ||||
c6b46f5895117645 3f2d2254a46d0615 cdfde9df9a86b710 ea1ce82d8052b8ee | c6b46f5895117645 3f2d2254a46d0615 cdfde9df9a86b710 ea1ce82d8052b8ee | |||
ef8fca039c348487 7fa53c4076387b3f d6eb59fa5c402935 092852f230f70f3c | ef8fca039c348487 7fa53c4076387b3f d6eb59fa5c402935 092852f230f70f3c | |||
5467617bbe9b5a25 71b6b234e4f1929b 07f9434e66def7c5 b6db6db6db6db6db | 5467617bbe9b5a25 71b6b234e4f1929b 07f9434e66def7c5 b6db6db6db6db6db | |||
mod_inverse(8, p) = | mod_inverse(8, p) = | |||
1fffffffffffffff f921fb54442d1846 9898cc51701b839a 252049c1114cf98e | 1fffffffffffffff f921fb54442d1846 9898cc51701b839a 252049c1114cf98e | |||
804177d4c7627364 4a29410f31c6809b bdf2a33679a74863 6605614dbe4be286 | 804177d4c7627364 4a29410f31c6809b bdf2a33679a74863 6605614dbe4be286 | |||
e9fc26adadaa3848 bc90b6aecc4bcfd8 de89885d34c6fdad 617feb96de80d6fd | e9fc26adadaa3848 bc90b6aecc4bcfd8 de89885d34c6fdad 617feb96de80d6fd | |||
bdc70d7f6b5133f4 b5d3e4822f8963fc c9250cca3d9c8b67 b8400f97142c77e0 | bdc70d7f6b5133f4 b5d3e4822f8963fc c9250cca3d9c8b67 b8400f97142c77e0 | |||
b31b4906c38aba73 4d22c7f51fa499eb f06caba47b9475b2 c38c5e6ac410aa57 | b31b4906c38aba73 4d22c7f51fa499eb f06caba47b9475b2 c38c5e6ac410aa57 | |||
skipping to change at page 23, line 4 | skipping to change at page 23, line 4 | |||
c837612151a8c8eb dac6e456379e23fd ae689b9c7dcbedb0 aaaaaaaaaaaaaaaa | c837612151a8c8eb dac6e456379e23fd ae689b9c7dcbedb0 aaaaaaaaaaaaaaaa | |||
mod_inverse(10, p) = | mod_inverse(10, p) = | |||
b333333333333333 0cbe4c3e4a96218b 568ade94da33adc5 9cb4d0392daf0f1e | b333333333333333 0cbe4c3e4a96218b 568ade94da33adc5 9cb4d0392daf0f1e | |||
016e9f0df62752fe 6c1a3921e38ad034 f481f86442dbfbc6 3b515419c3428e26 | 016e9f0df62752fe 6c1a3921e38ad034 f481f86442dbfbc6 3b515419c3428e26 | |||
b7ea7232ffb93b30 ecc3ff0611a88bf1 ab022ed6c1272631 5532c0e6779e4d8c | b7ea7232ffb93b30 ecc3ff0611a88bf1 ab022ed6c1272631 5532c0e6779e4d8c | |||
f38de52ff293895a 60a2993f709afcba cccf7ad2f29fd978 07cd241ad75f6c1d | f38de52ff293895a 60a2993f709afcba cccf7ad2f29fd978 07cd241ad75f6c1d | |||
8498cc25e0a27a85 aff5f95cb1335df6 0f2d5acc4da5c64f 7a4543ef7d2a2050 | 8498cc25e0a27a85 aff5f95cb1335df6 0f2d5acc4da5c64f 7a4543ef7d2a2050 | |||
2262031ececfcfb2 fb5558839ab73736 a904b2062710e43d 569841fded265d29 | 2262031ececfcfb2 fb5558839ab73736 a904b2062710e43d 569841fded265d29 | |||
ec222038773d5dcf 53020f5872055831 65a3c1c1e78239f3 b51ea85fcef0dcf7 | ec222038773d5dcf 53020f5872055831 65a3c1c1e78239f3 b51ea85fcef0dcf7 | |||
Nigori September 2010 | ||||
5b8219d771023139 f5acb4446b1569f1 a89cfd3f611122ec c60a29bc4fd1ef24 | 5b8219d771023139 f5acb4446b1569f1 a89cfd3f611122ec c60a29bc4fd1ef24 | |||
2908645eb5c74f46 a5e343830b005a87 613db5bd27843bf1 975024772804868b | 2908645eb5c74f46 a5e343830b005a87 613db5bd27843bf1 975024772804868b | |||
c52bfa2f66200ab0 2efc01d033e6f788 10d2acb445fa0d4b 8f3b2f04cb7a3913 | c52bfa2f66200ab0 2efc01d033e6f788 10d2acb445fa0d4b 8f3b2f04cb7a3913 | |||
64529b50abf2b0df d315d15daa09633c 1d1d9056d5aa8e32 53537953b5fe7e6b | 64529b50abf2b0df d315d15daa09633c 1d1d9056d5aa8e32 53537953b5fe7e6b | |||
06380489eb6d916f 49198d3103e45863 9b41f8ca0ffd859a 5f4ff6d9dbabee63 | 06380489eb6d916f 49198d3103e45863 9b41f8ca0ffd859a 5f4ff6d9dbabee63 | |||
ac4f85721e68d967 d2089b5de47837f6 df67e28b4c41eeb2 4d75f073eac7cf6f | ac4f85721e68d967 d2089b5de47837f6 df67e28b4c41eeb2 4d75f073eac7cf6f | |||
cd036ecc83689748 06fdb0747c9f2774 4f8a3e7eb6e506a7 eb969c6af06555be | cd036ecc83689748 06fdb0747c9f2774 4f8a3e7eb6e506a7 eb969c6af06555be | |||
4bdcf11138f388bf 95f7369bc4053094 9a79e7d2b101cc14 2b37cc0248c83f76 | 4bdcf11138f388bf 95f7369bc4053094 9a79e7d2b101cc14 2b37cc0248c83f76 | |||
b431d76ac97e4e6d de7fcd80cba7ed31 1cf7bf400ad122b8 9999999999999999 | b431d76ac97e4e6d de7fcd80cba7ed31 1cf7bf400ad122b8 9999999999999999 | |||
Nigori September 2010 | ||||
11. Acknowledgements | 11. Acknowledgements | |||
Thanks to Wan-Teh Chang, Adam Langley and Ian Goldberg (and others | Thanks to Wan-Teh Chang, Adam Langley and Ian Goldberg (and others | |||
who should remind me who they are) for feedback on earlier versions. | who should remind me who they are) for feedback on earlier versions. | |||
Nigori September 2010 | ||||
12. IANA Considerations | 12. IANA Considerations | |||
This memo includes no request to IANA. | This memo includes no request to IANA. | |||
Nigori September 2010 | ||||
13. Security Considerations | 13. Security Considerations | |||
The role of the user's password is critical and must therefore be | The role of the user's password is critical and must therefore be | |||
strongly protected. Obvious risks to the password are phishing and | strongly protected. Obvious risks to the password are phishing and | |||
malware. | malware. | |||
If Nigori can achieve its aim of providing storage for all a user's | If Nigori can achieve its aim of providing storage for all a user's | |||
credentials, it is hoped that users can be protected from phishing, | credentials, it is hoped that users can be protected from phishing, | |||
since they should only ever have to use a single password in a single | since they should only ever have to use a single password in a single | |||
context. | context. | |||
skipping to change at page 27, line 5 | skipping to change at page 27, line 5 | |||
Although Nigori only specifies password-based security for the stored | Although Nigori only specifies password-based security for the stored | |||
secrets, this is anticipated to be the base level of security. Some | secrets, this is anticipated to be the base level of security. Some | |||
users and stores may choose to layer other mechanisms on top of, or | users and stores may choose to layer other mechanisms on top of, or | |||
instead of, passwords, such as one-time passwords or keying material | instead of, passwords, such as one-time passwords or keying material | |||
on a hardware devices and so forth. | on a hardware devices and so forth. | |||
Protection against malware is beyond Nigori's scope, but it is worth | Protection against malware is beyond Nigori's scope, but it is worth | |||
noting that a user with malware on his machine is already completely | noting that a user with malware on his machine is already completely | |||
exposed anyway. | exposed anyway. | |||
Nigori September 2010 | ||||
14. References | 14. References | |||
14.1. Normative References | 14.1. Normative References | |||
[RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate | |||
Requirement Levels", BCP 14, RFC 2119, March 1997. | Requirement Levels", BCP 14, RFC 2119, March 1997. | |||
14.2. Informative References | 14.2. Informative References | |||
Nigori September 2010 | ||||
Editorial Comments | Editorial Comments | |||
[anchor4] (Security note: although we'd prefer SHA-256, SHA-1 is | [anchor4] (Security note: although we'd prefer SHA-256, SHA-1 is | |||
not actually broken for this use case, and PBKDF2 does | not actually broken for this use case, and PBKDF2 does | |||
not currently allow any other hash) [PBKDF2 test vectors, | not currently allow any other hash) [PBKDF2 test vectors, | |||
courtesy of wtc: http://www.ietf.org/id/ | courtesy of wtc: http://www.ietf.org/id/ | |||
draft-josefsson-pbkdf2-test-vectors-00.txt | draft-josefsson-pbkdf2-test-vectors-00.txt | |||
http://www.rfc-editor.org/rfc/rfc3962.txt | http://www.rfc-editor.org/rfc/rfc3962.txt | |||
http://www.cryptosys.net/manapi/api_PBE_Kdf2.html] | http://www.cryptosys.net/manapi/api_PBE_Kdf2.html] | |||
skipping to change at page 29, line 4 | skipping to change at page 29, line 4 | |||
exercise for the reader) | exercise for the reader) | |||
[anchor24] [Daniel Bleichenbacher points out: to compute expressions | [anchor24] [Daniel Bleichenbacher points out: to compute expressions | |||
of the form a*b^{-1} mod p, where b is a small integer. | of the form a*b^{-1} mod p, where b is a small integer. | |||
An efficient method to do this is to compute k = | An efficient method to do this is to compute k = | |||
-a*p^{-1} mod b. Then the integer a + kp is divisible by | -a*p^{-1} mod b. Then the integer a + kp is divisible by | |||
b and hence a*b^{-1} == (a+kp)/b (mod p). I.e. this | b and hence a*b^{-1} == (a+kp)/b (mod p). I.e. this | |||
method takes O(log(p)log(b)), rather than O(log(p)^2) for | method takes O(log(p)log(b)), rather than O(log(p)^2) for | |||
the current method. (I have my doubts because of the | the current method. (I have my doubts because of the | |||
cache, but I should test it) ] | cache, but I should test it) ] | |||
Nigori September 2010 | ||||
Author's Address | Author's Address | |||
Ben Laurie | Ben Laurie | |||
Google Ltd. | Google Ltd. | |||
London, | London, | |||
UK | UK | |||
Email: benl@google.com | Email: benl@google.com | |||
End of changes. 31 change blocks. | ||||
2 lines changed or deleted | 53 lines changed or added | |||
This html diff was produced by rfcdiff 1.33. The latest version is available from http://tools.ietf.org/tools/rfcdiff/ |