summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_ctsrp.py51
-rw-r--r--_pysrp.py51
-rw-r--r--_srp.c50
-rw-r--r--doc/srp.rst42
-rw-r--r--srp.py4
-rw-r--r--test_srp.py7
6 files changed, 167 insertions, 38 deletions
diff --git a/_ctsrp.py b/_ctsrp.py
index 42dbfdd..6754e83 100644
--- a/_ctsrp.py
+++ b/_ctsrp.py
@@ -31,7 +31,8 @@ SHA512 = 4
NG_1024 = 0
NG_2048 = 1
NG_4096 = 2
-NG_CUSTOM = 3
+NG_8192 = 3
+NG_CUSTOM = 4
_hash_map = { SHA1 : hashlib.sha1,
SHA224 : hashlib.sha224,
@@ -79,7 +80,47 @@ E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26\
233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127\
D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199\
FFFFFFFFFFFFFFFF''',
-"5")
+"5"),
+# 8192
+('''\
+FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\
+8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\
+302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\
+A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6\
+49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8\
+FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D\
+670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C\
+180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718\
+3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D\
+04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D\
+B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226\
+1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C\
+BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC\
+E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26\
+99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB\
+04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2\
+233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127\
+D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492\
+36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406\
+AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918\
+DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151\
+2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03\
+F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F\
+BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA\
+CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B\
+B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632\
+387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E\
+6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA\
+3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C\
+5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9\
+22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886\
+2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6\
+6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5\
+0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268\
+359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6\
+FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71\
+60C980DD98EDD3DFFFFFFFFFFFFFFFFF''',
+'13')
)
@@ -280,7 +321,7 @@ def get_ngk( hash_class, ng_type, n_hex, g_hex ):
-def create_salted_verification_key( username, password, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None ):
+def create_salted_verification_key( username, password, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None ):
if ng_type == NG_CUSTOM and (n_hex is None or g_hex is None):
raise ValueError("Both n_hex and g_hex are required when ng_type = NG_CUSTOM")
s = BN_new()
@@ -313,7 +354,7 @@ def create_salted_verification_key( username, password, hash_alg=SHA1, ng_type=N
class Verifier (object):
- def __init__(self, username, bytes_s, bytes_v, bytes_A, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None):
+ def __init__(self, username, bytes_s, bytes_v, bytes_A, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None):
if ng_type == NG_CUSTOM and (n_hex is None or g_hex is None):
raise ValueError("Both n_hex and g_hex are required when ng_type = NG_CUSTOM")
self.A = BN_new()
@@ -419,7 +460,7 @@ class Verifier (object):
class User (object):
- def __init__(self, username, password, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None):
+ def __init__(self, username, password, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None):
if ng_type == NG_CUSTOM and (n_hex is None or g_hex is None):
raise ValueError("Both n_hex and g_hex are required when ng_type = NG_CUSTOM")
self.username = username
diff --git a/_pysrp.py b/_pysrp.py
index edd1ee3..ff907ea 100644
--- a/_pysrp.py
+++ b/_pysrp.py
@@ -26,7 +26,8 @@ SHA512 = 4
NG_1024 = 0
NG_2048 = 1
NG_4096 = 2
-NG_CUSTOM = 3
+NG_8192 = 3
+NG_CUSTOM = 4
_hash_map = { SHA1 : hashlib.sha1,
SHA224 : hashlib.sha224,
@@ -74,7 +75,47 @@ E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26\
233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127\
D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199\
FFFFFFFFFFFFFFFF''',
-"5")
+"5"),
+# 8192
+('''\
+FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\
+8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\
+302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\
+A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6\
+49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8\
+FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D\
+670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C\
+180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718\
+3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D\
+04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D\
+B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226\
+1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C\
+BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC\
+E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26\
+99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB\
+04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2\
+233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127\
+D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492\
+36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406\
+AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918\
+DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151\
+2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03\
+F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F\
+BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA\
+CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B\
+B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632\
+387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E\
+6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA\
+3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C\
+5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9\
+22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886\
+2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6\
+6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5\
+0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268\
+359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6\
+FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71\
+60C980DD98EDD3DFFFFFFFFFFFFFFFFF''',
+'0x13')
)
def get_ng( ng_type, n_hex, g_hex ):
@@ -147,7 +188,7 @@ def gen_x( hash_class, salt, username, password ):
-def create_salted_verification_key( username, password, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None ):
+def create_salted_verification_key( username, password, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None ):
if ng_type == NG_CUSTOM and (n_hex is None or g_hex is None):
raise ValueError("Both n_hex and g_hex are required when ng_type = NG_CUSTOM")
hash_class = _hash_map[ hash_alg ]
@@ -182,7 +223,7 @@ def calculate_H_AMK( hash_class, A, M, K ):
class Verifier (object):
- def __init__(self, username, bytes_s, bytes_v, bytes_A, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None):
+ def __init__(self, username, bytes_s, bytes_v, bytes_A, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None):
if ng_type == NG_CUSTOM and (n_hex is None or g_hex is None):
raise ValueError("Both n_hex and g_hex are required when ng_type = NG_CUSTOM")
self.s = bytes_to_long(bytes_s)
@@ -244,7 +285,7 @@ class Verifier (object):
class User (object):
- def __init__(self, username, password, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None):
+ def __init__(self, username, password, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None):
if ng_type == NG_CUSTOM and (n_hex is None or g_hex is None):
raise ValueError("Both n_hex and g_hex are required when ng_type = NG_CUSTOM")
N,g = get_ng( ng_type, n_hex, g_hex )
diff --git a/_srp.c b/_srp.c
index e78c74c..a268e25 100644
--- a/_srp.c
+++ b/_srp.c
@@ -20,6 +20,7 @@ typedef enum
SRP_NG_1024,
SRP_NG_2048,
SRP_NG_4096,
+ SRP_NG_8192,
SRP_NG_CUSTOM
} SRP_NGType;
@@ -198,6 +199,46 @@ static struct NGHex global_Ng_constants[] = {
"FFFFFFFFFFFFFFFF",
"5"
},
+ { /* 8192 */
+ "FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08"
+ "8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B"
+ "302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9"
+ "A637ED6B0BFF5CB6F406B7EDEE386BFB5A899FA5AE9F24117C4B1FE6"
+ "49286651ECE45B3DC2007CB8A163BF0598DA48361C55D39A69163FA8"
+ "FD24CF5F83655D23DCA3AD961C62F356208552BB9ED529077096966D"
+ "670C354E4ABC9804F1746C08CA18217C32905E462E36CE3BE39E772C"
+ "180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718"
+ "3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D"
+ "04507A33A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7D"
+ "B3970F85A6E1E4C7ABF5AE8CDB0933D71E8C94E04A25619DCEE3D226"
+ "1AD2EE6BF12FFA06D98A0864D87602733EC86A64521F2B18177B200C"
+ "BBE117577A615D6C770988C0BAD946E208E24FA074E5AB3143DB5BFC"
+ "E0FD108E4B82D120A92108011A723C12A787E6D788719A10BDBA5B26"
+ "99C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8DBBBC2DB"
+ "04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2"
+ "233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127"
+ "D5B05AA993B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934028492"
+ "36C3FAB4D27C7026C1D4DCB2602646DEC9751E763DBA37BDF8FF9406"
+ "AD9E530EE5DB382F413001AEB06A53ED9027D831179727B0865A8918"
+ "DA3EDBEBCF9B14ED44CE6CBACED4BB1BDB7F1447E6CC254B33205151"
+ "2BD7AF426FB8F401378CD2BF5983CA01C64B92ECF032EA15D1721D03"
+ "F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E59E7C97F"
+ "BEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA"
+ "CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58B"
+ "B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632"
+ "387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E"
+ "6DBE115974A3926F12FEE5E438777CB6A932DF8CD8BEC4D073B931BA"
+ "3BC832B68D9DD300741FA7BF8AFC47ED2576F6936BA424663AAB639C"
+ "5AE4F5683423B4742BF1C978238F16CBE39D652DE3FDB8BEFC848AD9"
+ "22222E04A4037C0713EB57A81A23F0C73473FC646CEA306B4BCBC886"
+ "2F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6"
+ "6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC5"
+ "0846851DF9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268"
+ "359046F4EB879F924009438B481C6CD7889A002ED5EE382BC9190DA6"
+ "FC026E479558E4475677E9AA9E3050E2765694DFC81F56E880B96E71"
+ "60C980DD98EDD3DFFFFFFFFFFFFFFFFF",
+ "13"
+ },
{0,0} /* null sentinel */
};
@@ -903,7 +944,7 @@ static int ver_init( PyVerifier *self, PyObject *args, PyObject *kwds )
const unsigned char *bytes_s, *bytes_v, *bytes_A;
int len_s, len_v, len_A;
int hash_alg = SRP_SHA1;
- int ng_type = SRP_NG_1024;
+ int ng_type = SRP_NG_2048;
const char *n_hex = 0;
const char *g_hex = 0;
static char * kwnames[] = { "username", "bytes_s", "bytes_v", "bytes_A",
@@ -983,7 +1024,7 @@ static int usr_init( PyUser *self, PyObject *args, PyObject *kwds )
const unsigned char *bytes_password = 0;
int len_password = 0;
int hash_alg = SRP_SHA1;
- int ng_type = SRP_NG_1024;
+ int ng_type = SRP_NG_2048;
const char *n_hex = 0;
const char *g_hex = 0;
static char * kwnames[] = { "username", "password", "hash_alg",
@@ -1247,7 +1288,7 @@ static PyObject * py_create_salted_verification_key( PyObject *self, PyObject *a
const unsigned char *bytes_password, *bytes_s, *bytes_v;
int len_password, len_s, len_v;
int hash_alg = SRP_SHA1;
- int ng_type = SRP_NG_1024;
+ int ng_type = SRP_NG_2048;
const char *n_hex = 0;
const char *g_hex = 0;
static char * kwnames[] = { "username", "password", "hash_alg",
@@ -1515,6 +1556,7 @@ init_srp(void)
PyModule_AddIntConstant(m, "NG_1024", SRP_NG_1024);
PyModule_AddIntConstant(m, "NG_2048", SRP_NG_2048);
PyModule_AddIntConstant(m, "NG_4096", SRP_NG_4096);
+ PyModule_AddIntConstant(m, "NG_8192", SRP_NG_8192);
PyModule_AddIntConstant(m, "NG_CUSTOM", SRP_NG_CUSTOM);
@@ -1524,4 +1566,4 @@ init_srp(void)
PyModule_AddIntConstant(m, "SHA384", SRP_SHA384);
PyModule_AddIntConstant(m, "SHA512", SRP_SHA512);
-} \ No newline at end of file
+}
diff --git a/doc/srp.rst b/doc/srp.rst
index 5900e4c..805793a 100644
--- a/doc/srp.rst
+++ b/doc/srp.rst
@@ -9,13 +9,15 @@
.. sectionauthor:: Tom Cocagne <tom.cocagne@gmail.com>
-The Secure Remote Password Protocol (SRP) is a simple and secure protocol for
-password-based, mutual authentication over an insecure network
-connection. Successful SRP authentication proves that both sides of the
-connection have knowledge of the user's password. The client side must know the
-raw user's password and the server side must have a verification key that is
-derived from the user's password. Additionally, successful SRP authentication
-results in a cryptographically strong shared key that can be used to protect
+The Secure Remote Password Protocol (SRP) is a simple and secure
+protocol for password-based, mutual authentication over an insecure
+network connection. Successful SRP authentication can occur only if
+both sides of the connection have knowledge of the user's
+password. The client side of the connection must have the raw user's
+password and the server side must have a verification key that is
+derived from the user's password. An advantageous side-effect of
+successful SRP authentication is that it results in a
+cryptographically strong shared key that can be used to protect
network traffic via symmetric key encryption.
An advantage of SRP over other authentication protocols such as Kerberos and
@@ -24,15 +26,16 @@ applications store small, salted verification keys that are derived from each
user's password. These keys are then used during the authentication process to
verify the correctness of the remote user's password.
-A favorable aspect of the SRP protocol is that even if the verification keys
-are compromized, they are of little value to a potential attacker. Possesion of
-a verification key does not allow an attacker to impersonate the user and
-cannot be used to obtain the users password except by way of a computationally
-infeasible dictionary attack. A compromized key would, however, allow an
-attacker to impersonate the server side of an SRP authenticated
-connection. Consequently, care should be taken to prevent unauthorized access
-to verification keys for applications in which the client side requires
-assurance of the server's identity.
+A favorable aspect of the SRP protocol is that even if the
+verification keys are compromized, they are of little value to a
+potential attacker. Possesion of a verification key does not allow an
+attacker to impersonate the user and cannot be used to obtain the
+users password except by way of a computationally infeasible
+dictionary attack. A compromized key would, however, allow an attacker
+to impersonate the server side of an SRP authenticated
+connection. Consequently, care should be taken to prevent unauthorized
+access to verification keys for applications in which the client side
+relies on the server being genuine.
@@ -88,6 +91,7 @@ Constants
NG_1024 1024
NG_2048 2048
NG_4096 4096
+ NG_8192 8192
NG_CUSTOM User Supplied
================= ==============
@@ -102,7 +106,7 @@ Constants
Functions
---------
-.. function:: create_salted_verification_key ( username, password[, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None] )
+.. function:: create_salted_verification_key ( username, password[, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None] )
*username* Name of the user
@@ -125,7 +129,7 @@ user.
The standard SRP 6 protocol allows only one password attempt per
connection.
-.. class:: Verifier( username, bytes_s, bytes_v, bytes_A[, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None] )
+.. class:: Verifier( username, bytes_s, bytes_v, bytes_A[, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None] )
*username* Name of the remote user being authenticated.
@@ -172,7 +176,7 @@ A :class:`User` object is used to prove a user's identity to a remote :class:`Ve
verifiy that the remote :class:`Verifier` knows the verification key associated with
the user's password.
-.. class:: User( username, password[, hash_alg=SHA1, ng_type=NG_1024, n_hex=None, g_hex=None] )
+.. class:: User( username, password[, hash_alg=SHA1, ng_type=NG_2048, n_hex=None, g_hex=None] )
*username* Name of the user being authenticated.
diff --git a/srp.py b/srp.py
index 785e721..45a367f 100644
--- a/srp.py
+++ b/srp.py
@@ -18,7 +18,6 @@ if not _mod:
import _pysrp
_mod = _pysrp
-
User = _mod.User
Verifier = _mod.Verifier
create_salted_verification_key = _mod.create_salted_verification_key
@@ -32,6 +31,7 @@ SHA512 = _mod.SHA512
NG_1024 = _mod.NG_1024
NG_2048 = _mod.NG_2048
NG_4096 = _mod.NG_4096
+NG_8192 = _mod.NG_8192
NG_CUSTOM = _mod.NG_CUSTOM
@@ -41,4 +41,4 @@ NG_CUSTOM = _mod.NG_CUSTOM
- \ No newline at end of file
+
diff --git a/test_srp.py b/test_srp.py
index be28c4c..8ad1de9 100644
--- a/test_srp.py
+++ b/test_srp.py
@@ -14,12 +14,12 @@ g_mod = _pysrp
import _ctsrp
u_mod = _ctsrp
v_mod = _ctsrp
-#g_mod = _ctsrp
+g_mod = _ctsrp
try:
import _srp
u_mod = _srp
-# v_mod = _srp
+ v_mod = _srp
g_mod = _srp
except:
print 'C-module not available'
@@ -32,7 +32,8 @@ Verifier = v_mod.Verifier
create_salted_verification_key = g_mod.create_salted_verification_key
HASH = srp.SHA256
-NG = srp.NG_CUSTOM
+#NG = srp.NG_CUSTOM
+NG = srp.NG_8192
username = 'testuser'