def test_sm2(self): rng = botan2.RandomNumberGenerator() hash_fn = 'EMSA1(SM3)' group = 'sm2p256v1' msg = 'test message' priv = botan2.PrivateKey.create('SM2', group, rng) pub = priv.get_public_key() self.assertEqual(pub.get_field('public_x'), priv.get_field('public_x')) self.assertEqual(pub.get_field('public_y'), priv.get_field('public_y')) signer = botan2.PKSign(priv, hash_fn) signer.update(msg) signature = signer.finish(rng) verifier = botan2.PKVerify(pub, hash_fn) verifier.update(msg) self.assertTrue(verifier.check_signature(signature)) pub_x = pub.get_field('public_x') pub_y = priv.get_field('public_y') pub2 = botan2.PublicKey.load_sm2(group, pub_x, pub_y) verifier = botan2.PKVerify(pub2, hash_fn) verifier.update(msg) self.assertTrue(verifier.check_signature(signature)) priv2 = botan2.PrivateKey.load_sm2(group, priv.get_field('x')) signer = botan2.PKSign(priv2, hash_fn) # sign empty message signature = signer.finish(rng) # verify empty message self.assertTrue(verifier.check_signature(signature))
def test_ecdsa(self): rng = botan2.RandomNumberGenerator() hash_fn = 'EMSA1(SHA-256)' group = 'secp256r1' msg = 'test message' priv = botan2.PrivateKey.create('ECDSA', group, rng) pub = priv.get_public_key() self.assertEqual(pub.get_field('public_x'), priv.get_field('public_x')) self.assertEqual(pub.get_field('public_y'), priv.get_field('public_y')) signer = botan2.PKSign(priv, hash_fn, True) signer.update(msg) signature = signer.finish(rng) verifier = botan2.PKVerify(pub, hash_fn) verifier.update(msg) #fails because DER/not-DER mismatch self.assertFalse(verifier.check_signature(signature)) verifier = botan2.PKVerify(pub, hash_fn, True) verifier.update(msg) self.assertTrue(verifier.check_signature(signature)) pub_x = pub.get_field('public_x') pub_y = priv.get_field('public_y') pub2 = botan2.PublicKey.load_ecdsa(group, pub_x, pub_y) verifier = botan2.PKVerify(pub2, hash_fn, True) verifier.update(msg) self.assertTrue(verifier.check_signature(signature)) priv2 = botan2.PrivateKey.load_ecdsa(group, priv.get_field('x')) signer = botan2.PKSign(priv2, hash_fn, True) # sign empty message signature = signer.finish(rng) # verify empty message self.assertTrue(verifier.check_signature(signature))
def test_rsa(self): # pylint: disable=too-many-locals rng = botan2.RandomNumberGenerator() rsapriv = botan2.PrivateKey.create('RSA', '1024', rng) self.assertEqual(rsapriv.algo_name(), 'RSA') priv_pem = rsapriv.to_pem() priv_der = rsapriv.to_der() self.assertEqual(priv_pem[0:28], "-----BEGIN PRIVATE KEY-----\n") self.assertGreater(len(priv_pem), len(priv_der)) rsapub = rsapriv.get_public_key() self.assertEqual(rsapub.algo_name(), 'RSA') self.assertEqual(rsapub.estimated_strength(), 80) pub_pem = rsapub.to_pem() pub_der = rsapub.to_der() self.assertEqual(pub_pem[0:27], "-----BEGIN PUBLIC KEY-----\n") self.assertGreater(len(pub_pem), len(pub_der)) enc = botan2.PKEncrypt(rsapub, "OAEP(SHA-256)") dec = botan2.PKDecrypt(rsapriv, "OAEP(SHA-256)") symkey = rng.get(32) ctext = enc.encrypt(symkey, rng) ptext = dec.decrypt(ctext) self.assertEqual(ptext, symkey) signer = botan2.PKSign(rsapriv, 'EMSA4(SHA-384)') signer.update('messa') signer.update('ge') sig = signer.finish(botan2.RandomNumberGenerator()) verify = botan2.PKVerify(rsapub, 'EMSA4(SHA-384)') verify.update('mess') verify.update('age') self.assertTrue(verify.check_signature(sig)) verify.update('mess of things') verify.update('age') self.assertFalse(verify.check_signature(sig)) verify.update('message') self.assertTrue(verify.check_signature(sig))