validation.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. from typing import (
  2. Any,
  3. )
  4. from eth_utils import (
  5. ValidationError,
  6. encode_hex,
  7. is_bytes,
  8. is_integer,
  9. )
  10. from eth_utils.toolz import (
  11. curry,
  12. )
  13. from eth_keys.constants import (
  14. SECPK1_N,
  15. )
  16. def validate_integer(value: Any) -> None:
  17. if not is_integer(value) or isinstance(value, bool):
  18. raise ValidationError(f"Value must be a an integer. Got: {type(value)}")
  19. def validate_bytes(value: Any) -> None:
  20. if not is_bytes(value):
  21. raise ValidationError(f"Value must be a byte string. Got: {type(value)}")
  22. @curry
  23. def validate_gte(value: Any, minimum: int) -> None:
  24. validate_integer(value)
  25. if value < minimum:
  26. raise ValidationError(
  27. f"Value {value} is not greater than or equal to {minimum}"
  28. )
  29. @curry
  30. def validate_lte(value: Any, maximum: int) -> None:
  31. validate_integer(value)
  32. if value > maximum:
  33. raise ValidationError(f"Value {value} is not less than or equal to {maximum}")
  34. validate_lt_secpk1n = validate_lte(maximum=SECPK1_N - 1)
  35. def validate_bytes_length(value: bytes, expected_length: int, name: str) -> None:
  36. actual_length = len(value)
  37. if actual_length != expected_length:
  38. raise ValidationError(
  39. f"Unexpected {name} length: Expected {expected_length}, but got "
  40. f"{actual_length} bytes"
  41. )
  42. def validate_message_hash(value: Any) -> None:
  43. validate_bytes(value)
  44. validate_bytes_length(value, 32, "message hash")
  45. def validate_uncompressed_public_key_bytes(value: Any) -> None:
  46. validate_bytes(value)
  47. validate_bytes_length(value, 64, "uncompressed public key")
  48. def validate_compressed_public_key_bytes(value: Any) -> None:
  49. validate_bytes(value)
  50. validate_bytes_length(value, 33, "compressed public key")
  51. first_byte = value[0:1]
  52. if first_byte not in (b"\x02", b"\x03"):
  53. raise ValidationError(
  54. "Unexpected compressed public key format: Must start with 0x02 or 0x03, "
  55. f"but starts with {encode_hex(first_byte)}"
  56. )
  57. def validate_private_key_bytes(value: Any) -> None:
  58. validate_bytes(value)
  59. validate_bytes_length(value, 32, "private key")
  60. def validate_recoverable_signature_bytes(value: Any) -> None:
  61. validate_bytes(value)
  62. validate_bytes_length(value, 65, "recoverable signature")
  63. def validate_non_recoverable_signature_bytes(value: Any) -> None:
  64. validate_bytes(value)
  65. validate_bytes_length(value, 64, "non recoverable signature")
  66. def validate_signature_v(value: int) -> None:
  67. validate_integer(value)
  68. validate_gte(value, minimum=0)
  69. validate_lte(value, maximum=1)
  70. def validate_signature_r_or_s(value: int) -> None:
  71. validate_integer(value)
  72. validate_gte(value, 0)
  73. validate_lt_secpk1n(value)