_pkcs1_oaep_decode.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. from Crypto.Util._raw_api import (load_pycryptodome_raw_lib, c_size_t,
  2. c_uint8_ptr)
  3. _raw_pkcs1_decode = load_pycryptodome_raw_lib("Crypto.Cipher._pkcs1_decode",
  4. """
  5. int pkcs1_decode(const uint8_t *em, size_t len_em,
  6. const uint8_t *sentinel, size_t len_sentinel,
  7. size_t expected_pt_len,
  8. uint8_t *output);
  9. int oaep_decode(const uint8_t *em,
  10. size_t em_len,
  11. const uint8_t *lHash,
  12. size_t hLen,
  13. const uint8_t *db,
  14. size_t db_len);
  15. """)
  16. def pkcs1_decode(em, sentinel, expected_pt_len, output):
  17. if len(em) != len(output):
  18. raise ValueError("Incorrect output length")
  19. ret = _raw_pkcs1_decode.pkcs1_decode(c_uint8_ptr(em),
  20. c_size_t(len(em)),
  21. c_uint8_ptr(sentinel),
  22. c_size_t(len(sentinel)),
  23. c_size_t(expected_pt_len),
  24. c_uint8_ptr(output))
  25. return ret
  26. def oaep_decode(em, lHash, db):
  27. ret = _raw_pkcs1_decode.oaep_decode(c_uint8_ptr(em),
  28. c_size_t(len(em)),
  29. c_uint8_ptr(lHash),
  30. c_size_t(len(lHash)),
  31. c_uint8_ptr(db),
  32. c_size_t(len(db)))
  33. return ret