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)