fork download
  1. import base64, string
  2. import unittest, binascii
  3.  
  4. srp_base64_table = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz./"
  5. base64_table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  6.  
  7. def srpb64decode(s):
  8. ret = '0' * (4 - len(s) % 4) + s
  9. ret = string.translate(ret, string.maketrans(srp_base64_table, base64_table))
  10. ret = base64.b64decode(ret)
  11. return ret.lstrip('\0')
  12.  
  13. def srpb64encode(s):
  14. ret = '\0' * (3 - len(s) % 3) + s
  15. ret = base64.b64encode(ret)
  16. ret = string.translate(ret, string.maketrans(base64_table, srp_base64_table))
  17. return ret.lstrip('0')
  18.  
  19.  
  20. class SRPBase64Test(unittest.TestCase):
  21. srp_group_1024_prime_hex = "EEAF0AB9ADB38DD69C33F80AFA8FC5E86072618775FF3C0B9EA2314C9C256576D674DF7496EA81D3383B4813D692C6E0E0D5D8E250B98BE48E495C1D6089DAD15DC7D7B46154D6B6CE8EF4AD69B15D4982559B297BCF1885C529F566660E57EC68EDBC3C05726CC02FD4CBF4976EAA9AFD5138FE8376435B9FC61D2FC0EB06E3"
  22. srp_group_1024_prime_srpb64 = "Ewl2hcjiutMd3Fu2lgFnUXWSc67TVyy2vwYCKoS9MLsrdJVT9RgWTCuEqWJrfB6uE3LsE9GkOlaZabS7M29sj5TnzUqOLJMjiwEzArfiLr9WbMRANlF68N5AVLcPWvNx6Zjl3m5Scp0BzJBz9TkgfhzKJZ.WtP3Mv/67I/0wmRZ"
  23. srp_group_2048_prime_hex = "AC6BDB41324A9A9BF166DE5E1389582FAF72B6651987EE07FC3192943DB56050A37329CBB4A099ED8193E0757767A13DD52312AB4B03310DCD7F48A9DA04FD50E8083969EDB767B0CF6095179A163AB3661A05FBD5FAAAE82918A9962F0B93B855F97993EC975EEAA80D740ADBF4FF747359D041D5C33EA71D281E446B14773BCA97B43A23FB801676BD207A436C6481F1D2B9078717461A5B9D32E688F87748544523B524B0D57D5EA77A2775D2ECFA032CFBDBF52FB3786160279004E57AE6AF874E7303CE53299CCC041C7BC308D82A5698F3A8D0C38271AE35F8E9DBFBB694B5C803D89F7AE435DE236D525F54759B65E372FCD68EF20FA7111F9E4AFF73"
  24. srp_group_2048_prime_srpb64 = "2iQzj1CagQc/5ctbuJYLWlhtAsPHc7xWVyCPAKFRLWKADpASkqe9djWPFWTNTdeJtL8nAhImCn3Sr/IAdQ1FrGw0WvQUstPx3FO9KNcXOwisOQ1VlL.gheAHYfbYyBaxXL.NcJx9TUwgWDT0hRzFzqSrdGGTN3FgSTA1v4QnHtEygNj3eZ.u0MThqWUaDiP87nqha7XnT66bkTCkQ8.7T8L4KZjIImrNrUftedTTBi.WCi.zlrBxDuOM0da0JbUkQlXqvp0yvJAPpC11nxmmZOAbQOywZGmu9nhZNuwTlxjfIro0FOdthaDTuZRL9VL7MRPUDo/DQEyW.d4H.UIlzp"
  25.  
  26. equivs = (
  27. (srp_group_1024_prime_srpb64, srp_group_1024_prime_hex),
  28. (srp_group_2048_prime_srpb64, srp_group_2048_prime_hex),
  29. )
  30.  
  31. def test_encode(self):
  32. for srpb64, hexstr in self.equivs:
  33. self.assertEquals(srpb64,
  34. srpb64encode(binascii.unhexlify(hexstr)))
  35.  
  36. def test_decode(self):
  37. for srpb64, hexstr in self.equivs:
  38. self.assertEquals(hexstr.lower(),
  39. binascii.hexlify(srpb64decode(srpb64)))
  40.  
  41. def test_inverse(self):
  42. s = '\xd38;H\x13\xd6\x92\xc6\xe0\xe0\xd5\xd8\xe2P\xb9\x8b\xe4\x8eI\\\x1d`\x89\xda\xd1]\xc7\xd7\xb4aT\xd6\xb6\xce\x8e\xf4\xadi\xb1]I\x82U\x9b){\xcf\x18\x85\xc5)\xf5ff\x0eW\xech\xed\xbc<\x05rl\xc0/\xd4\xcb\xf4\x97n\xaa\x9a\xfdQ8\xfe\x83vC[\x9f'
  43. for i in range(len(s)):
  44. self.assertEquals(s[:i], srpb64decode(srpb64encode(s[:i])))
  45.  
  46. if __name__ == '__main__':
  47. unittest.main()
Success #stdin #stdout #stderr 0.09s 9592KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
...
----------------------------------------------------------------------
Ran 3 tests in 0.001s

OK