github.com/muhammedhassanm/blockchain@v0.0.0-20200120143007-697261defd4d/sawtooth-core-master/signing/tests/test_secp256k1_signer.py (about) 1 # Copyright 2016 Intel Corporation 2 # 3 # Licensed under the Apache License, Version 2.0 (the "License") 4 # you may not use this file except in compliance with the License. 5 # You may obtain a copy of the License at 6 # 7 # http:#www.apache.org/licenses/LICENSE-2.0 8 # 9 # Unless required by applicable law or agreed to in writing, software 10 # distributed under the License is distributed on an "AS IS" BASIS, 11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 # See the License for the specific language governing permissions and 13 # limitations under the License. 14 # ------------------------------------------------------------------------------ 15 16 import unittest 17 18 from sawtooth_signing import create_context 19 from sawtooth_signing import CryptoFactory 20 from sawtooth_signing import ParseError 21 from sawtooth_signing.secp256k1 import Secp256k1PrivateKey 22 from sawtooth_signing.secp256k1 import Secp256k1PublicKey 23 24 25 KEY1_PRIV_HEX = \ 26 "2f1e7b7a130d7ba9da0068b3bb0ba1d79e7e77110302c9f746c3c2a63fe40088" 27 KEY1_PUB_HEX = \ 28 "026a2c795a9776f75464aa3bda3534c3154a6e91b357b1181d3f515110f84b67c5" 29 30 KEY2_PRIV_HEX = \ 31 "51b845c2cdde22fe646148f0b51eaf5feec8c82ee921d5e0cbe7619f3bb9c62d" 32 KEY2_PUB_HEX = \ 33 "039c20a66b4ec7995391dbec1d8bb0e2c6e6fd63cd259ed5b877cb4ea98858cf6d" 34 35 MSG1 = "test" 36 MSG1_KEY1_SIG = ("5195115d9be2547b720ee74c23dd841842875db6eae1f5da8605b050a49e" 37 "702b4aa83be72ab7e3cb20f17c657011b49f4c8632be2745ba4de79e6aa0" 38 "5da57b35") 39 40 MSG2 = "test2" 41 MSG2_KEY2_SIG = ("d589c7b1fa5f8a4c5a389de80ae9582c2f7f2a5e21bab5450b670214e5b1" 42 "c1235e9eb8102fd0ca690a8b42e2c406a682bd57f6daf6e142e5fa4b2c26" 43 "ef40a490") 44 45 46 class Secp256k1SigningTest(unittest.TestCase): 47 def test_hex_key(self): 48 priv_key = Secp256k1PrivateKey.from_hex(KEY1_PRIV_HEX) 49 self.assertEqual(priv_key.get_algorithm_name(), "secp256k1") 50 self.assertEqual(priv_key.as_hex(), KEY1_PRIV_HEX) 51 52 pub_key = Secp256k1PublicKey.from_hex(KEY1_PUB_HEX) 53 self.assertEqual(pub_key.get_algorithm_name(), "secp256k1") 54 self.assertEqual(pub_key.as_hex(), KEY1_PUB_HEX) 55 56 def test_priv_to_public_key(self): 57 context = create_context("secp256k1") 58 self.assertEqual(context.get_algorithm_name(), "secp256k1") 59 60 priv_key1 = Secp256k1PrivateKey.from_hex(KEY1_PRIV_HEX) 61 self.assertEqual(priv_key1.get_algorithm_name(), "secp256k1") 62 self.assertEqual(priv_key1.as_hex(), KEY1_PRIV_HEX) 63 64 public_key1 = context.get_public_key(priv_key1) 65 self.assertEqual(public_key1.as_hex(), KEY1_PUB_HEX) 66 67 priv_key2 = Secp256k1PrivateKey.from_hex(KEY2_PRIV_HEX) 68 self.assertEqual(priv_key2.get_algorithm_name(), "secp256k1") 69 self.assertEqual(priv_key2.as_hex(), KEY2_PRIV_HEX) 70 71 public_key2 = context.get_public_key(priv_key2) 72 self.assertEqual(public_key2.as_hex(), KEY2_PUB_HEX) 73 74 def test_check_invalid_digit(self): 75 priv_chars = list(KEY1_PRIV_HEX) 76 priv_chars[3] = 'i' 77 with self.assertRaises(ParseError): 78 Secp256k1PrivateKey.from_hex(''.join(priv_chars)) 79 80 pub_chars = list(KEY1_PUB_HEX) 81 pub_chars[3] = 'i' 82 with self.assertRaises(ParseError): 83 Secp256k1PublicKey.from_hex(''.join(pub_chars)) 84 85 def test_single_key_signing(self): 86 context = create_context("secp256k1") 87 self.assertEqual(context.get_algorithm_name(), "secp256k1") 88 89 factory = CryptoFactory(context) 90 self.assertEqual(factory.context.get_algorithm_name(), 91 "secp256k1") 92 93 priv_key = Secp256k1PrivateKey.from_hex(KEY1_PRIV_HEX) 94 self.assertEqual(priv_key.get_algorithm_name(), "secp256k1") 95 self.assertEqual(priv_key.as_hex(), KEY1_PRIV_HEX) 96 97 signer = factory.new_signer(priv_key) 98 signature = signer.sign(MSG1.encode()) 99 self.assertEqual(signature, MSG1_KEY1_SIG) 100 101 def test_many_key_signing(self): 102 context = create_context("secp256k1") 103 self.assertEqual(context.get_algorithm_name(), "secp256k1") 104 105 priv_key1 = Secp256k1PrivateKey.from_hex(KEY1_PRIV_HEX) 106 self.assertEqual(priv_key1.get_algorithm_name(), "secp256k1") 107 self.assertEqual(priv_key1.as_hex(), KEY1_PRIV_HEX) 108 109 priv_key2 = Secp256k1PrivateKey.from_hex(KEY2_PRIV_HEX) 110 self.assertEqual(priv_key2.get_algorithm_name(), "secp256k1") 111 self.assertEqual(priv_key2.as_hex(), KEY2_PRIV_HEX) 112 113 signature = context.sign( 114 MSG1.encode(), 115 priv_key1) 116 self.assertEqual(signature, MSG1_KEY1_SIG) 117 118 signature = context.sign( 119 MSG2.encode(), 120 priv_key2) 121 self.assertEqual(signature, MSG2_KEY2_SIG) 122 123 def test_verification(self): 124 context = create_context("secp256k1") 125 self.assertEqual(context.get_algorithm_name(), "secp256k1") 126 127 pub_key1 = Secp256k1PublicKey.from_hex(KEY1_PUB_HEX) 128 self.assertEqual(pub_key1.get_algorithm_name(), "secp256k1") 129 self.assertEqual(pub_key1.as_hex(), KEY1_PUB_HEX) 130 131 result = context.verify(MSG1_KEY1_SIG, MSG1.encode(), pub_key1) 132 self.assertEqual(result, True) 133 134 def test_verification_error(self): 135 context = create_context("secp256k1") 136 self.assertEqual(context.get_algorithm_name(), "secp256k1") 137 138 pub_key1 = Secp256k1PublicKey.from_hex(KEY1_PUB_HEX) 139 self.assertEqual(pub_key1.get_algorithm_name(), "secp256k1") 140 self.assertEqual(pub_key1.as_hex(), KEY1_PUB_HEX) 141 142 # This signature doesn't match for MSG1/KEY1 143 result = context.verify(MSG2_KEY2_SIG, MSG1.encode(), pub_key1) 144 self.assertEqual(result, False)