MCPcopy Index your code
hub / github.com/Bitmessage/PyBitmessage / verify

Method verify

src/pyelliptic/ecc.py:374–437  ·  view source on GitHub ↗

Verify the signature with the input and the local public key. Returns a boolean

(self, sig, inputb, digest_alg=OpenSSL.digest_ecdsa_sha1)

Source from the content-addressed store, hash-verified

372 pass
373
374 def verify(self, sig, inputb, digest_alg=OpenSSL.digest_ecdsa_sha1):
375 """
376 Verify the signature with the input and the local public key.
377 Returns a boolean
378 """
379 try:
380 bsig = OpenSSL.malloc(sig, len(sig))
381 binputb = OpenSSL.malloc(inputb, len(inputb))
382 digest = OpenSSL.malloc(0, 64)
383 dgst_len = OpenSSL.pointer(OpenSSL.c_int(0))
384 if OpenSSL._hexversion > 0x10100000 and not OpenSSL._libreSSL:
385 md_ctx = OpenSSL.EVP_MD_CTX_new()
386 else:
387 md_ctx = OpenSSL.EVP_MD_CTX_create()
388 key = OpenSSL.EC_KEY_new_by_curve_name(self.curve)
389
390 if key == 0:
391 raise Exception("[OpenSSL] EC_KEY_new_by_curve_name FAIL ...")
392
393 pub_key_x = OpenSSL.BN_bin2bn(self.pubkey_x, len(self.pubkey_x), 0)
394 pub_key_y = OpenSSL.BN_bin2bn(self.pubkey_y, len(self.pubkey_y), 0)
395 group = OpenSSL.EC_KEY_get0_group(key)
396 pub_key = OpenSSL.EC_POINT_new(group)
397
398 if (OpenSSL.EC_POINT_set_affine_coordinates_GFp(group, pub_key,
399 pub_key_x,
400 pub_key_y,
401 0)) == 0:
402 raise Exception(
403 "[OpenSSL] EC_POINT_set_affine_coordinates_GFp FAIL ...")
404 if (OpenSSL.EC_KEY_set_public_key(key, pub_key)) == 0:
405 raise Exception("[OpenSSL] EC_KEY_set_public_key FAIL ...")
406 if (OpenSSL.EC_KEY_check_key(key)) == 0:
407 raise Exception("[OpenSSL] EC_KEY_check_key FAIL ...")
408 if OpenSSL._hexversion > 0x10100000 and not OpenSSL._libreSSL:
409 OpenSSL.EVP_MD_CTX_new(md_ctx)
410 else:
411 OpenSSL.EVP_MD_CTX_init(md_ctx)
412 OpenSSL.EVP_DigestInit_ex(md_ctx, digest_alg(), None)
413 if (OpenSSL.EVP_DigestUpdate(md_ctx, binputb, len(inputb))) == 0:
414 raise Exception("[OpenSSL] EVP_DigestUpdate FAIL ...")
415
416 OpenSSL.EVP_DigestFinal_ex(md_ctx, digest, dgst_len)
417 ret = OpenSSL.ECDSA_verify(
418 0, digest, dgst_len.contents, bsig, len(sig), key)
419
420 if ret == -1:
421 return False # Fail to Check
422 else:
423 if ret == 0:
424 return False # Bad signature !
425 else:
426 return True # Good
427 return False
428
429 finally:
430 OpenSSL.EC_KEY_free(key)
431 OpenSSL.BN_free(pub_key_x)

Callers 6

processpubkeyMethod · 0.80
processmsgMethod · 0.80
processbroadcastMethod · 0.80
verifyFunction · 0.80

Calls 1

mallocMethod · 0.80

Tested by

no test coverage detected