sign_verify.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import ctypes
  2. SIGN_LIB_NAME = 'libgmsign.so'
  3. VERIFY_LIB_NAME = 'libgmsign.so'
  4. def get_sign(raw_data: str) -> (str, str):
  5. """
  6. 获取签名值
  7. :param raw_data: 原文字符串
  8. :return: tuple(str,str):(签名值base64字符串,公钥base64字符串)
  9. """
  10. # 加载共享库
  11. lib = ctypes.CDLL(SIGN_LIB_NAME)
  12. # 定义函数的参数和返回类型
  13. # 签名函数签名如下:
  14. # int sign(char *key_value, char *hash_value, char *public_key)
  15. lib.sign.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
  16. lib.sign.restype = ctypes.c_int
  17. key_value = raw_data.replace(" ", "").encode('utf-8')
  18. hash_value = ctypes.create_string_buffer(256) # 设置签名值输出缓冲区大小为 256 字节
  19. public_key = ctypes.create_string_buffer(256) # 设置公钥输出缓冲区大小为 256 字节
  20. result = lib.sign(key_value, hash_value, public_key)
  21. if result == 0:
  22. return hash_value.value.decode(), public_key.value.decode()
  23. else:
  24. return None, None
  25. def verify_sign(raw_data: str, sign_data: str, public_key: str) -> bool:
  26. """
  27. 验证签名
  28. :param raw_data: 原文字符串
  29. :param sign_data: 签名值base64字符串
  30. :param public_key: 公钥base64字符串
  31. :return:
  32. """
  33. # 加载共享库
  34. lib = ctypes.CDLL(VERIFY_LIB_NAME)
  35. # 验签函数签名如下:
  36. # int sign_verify(char *content, char *sign_value, char *public_key)
  37. lib.sign_verify.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p]
  38. lib.sign_verify.restype = ctypes.c_int
  39. content = raw_data.replace(" ", "").encode('utf-8')
  40. sign_value = sign_data.encode('utf-8')
  41. public_key = public_key.encode('utf-8')
  42. verify_result = lib.sign_verify(content, sign_value, public_key)
  43. verify_result = True if verify_result == 1 else False
  44. return verify_result
  45. if __name__ == '__main__':
  46. raw_data = "hello world test sign"
  47. sign_data, public_key = get_sign(raw_data)
  48. print(f"sign_data: {sign_data}\npublic_key: {public_key}")
  49. verify_result = verify_sign(raw_data, sign_data, public_key)
  50. print(f"verify_result: {verify_result}")