def test_bytearray(self):

        data = b"\x00\x01\x02"
        h0 = Poly1305.new(key=self.key, data=data, cipher=AES)
        d_ref = h0.digest()

        # Data and key can be a bytearray (during initialization)
        key_ba = bytearray(self.key)
        data_ba = bytearray(data)

        h1 = Poly1305.new(key=self.key, data=data, cipher=AES, nonce=h0.nonce)
        h2 = Poly1305.new(key=key_ba, data=data_ba, cipher=AES, nonce=h0.nonce)
        key_ba[:1] = b'\xFF'
        data_ba[:1] = b'\xEE'

        self.assertEqual(h1.digest(), d_ref)
        self.assertEqual(h2.digest(), d_ref)

        # Data can be a bytearray (during operation)
        data_ba = bytearray(data)

        h1 = Poly1305.new(key=self.key, cipher=AES)
        h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce)
        h1.update(data)
        h2.update(data_ba)
        data_ba[:1] = b'\xFF'

        self.assertEqual(h1.digest(), h2.digest())
Beispiel #2
0
    def test_bytearray(self):

        data = b"\x00\x01\x02"
        h0 = Poly1305.new(key=self.key, data=data, cipher=AES)
        d_ref = h0.digest()

        # Data and key can be a bytearray (during initialization)
        key_ba = bytearray(self.key)
        data_ba = bytearray(data)

        h1 = Poly1305.new(key=self.key, data=data, cipher=AES, nonce=h0.nonce)
        h2 = Poly1305.new(key=key_ba, data=data_ba, cipher=AES, nonce=h0.nonce)
        key_ba[:1] = b'\xFF'
        data_ba[:1] = b'\xEE'

        self.assertEqual(h1.digest(), d_ref)
        self.assertEqual(h2.digest(), d_ref)

        # Data can be a bytearray (during operation)
        data_ba = bytearray(data)

        h1 = Poly1305.new(key=self.key, cipher=AES)
        h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce)
        h1.update(data)
        h2.update(data_ba)
        data_ba[:1] = b'\xFF'

        self.assertEqual(h1.digest(), h2.digest())
Beispiel #3
0
    def test_new_positive(self):
        data = b'r' * 100

        h1 = Poly1305.new(key=self.key, cipher=ChaCha20)
        self.assertEqual(h1.digest_size, 16)
        self.assertEqual(len(h1.nonce), 12)

        h2 = Poly1305.new(key=self.key, cipher=ChaCha20, nonce=b'8' * 8)
        self.assertEqual(len(h2.nonce), 8)
        self.assertEqual(h2.nonce, b'8' * 8)
    def test_update(self):
        pieces = [b"\x0A" * 200, b"\x14" * 300]
        h1 = Poly1305.new(key=self.key, cipher=AES)
        h1.update(pieces[0]).update(pieces[1])
        d1 = h1.digest()

        h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce)
        h2.update(pieces[0] + pieces[1])
        d2 = h2.digest()
        self.assertEqual(d1, d2)
    def test_new_positive(self):
        data = b'r' * 100

        h1 = Poly1305.new(key=self.key, cipher=ChaCha20)
        self.assertEqual(h1.digest_size, 16)
        self.assertEqual(len(h1.nonce), 12)
        
        h2 = Poly1305.new(key=self.key, cipher=ChaCha20, nonce = b'8' * 8)
        self.assertEqual(len(h2.nonce), 8)
        self.assertEqual(h2.nonce, b'8' * 8)
Beispiel #6
0
    def test_update(self):
        pieces = [b"\x0A" * 200, b"\x14" * 300]
        h1 = Poly1305.new(key=self.key, cipher=AES)
        h1.update(pieces[0]).update(pieces[1])
        d1 = h1.digest()

        h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce)
        h2.update(pieces[0] + pieces[1])
        d2 = h2.digest()
        self.assertEqual(d1, d2)
Beispiel #7
0
    def test_new_positive(self):

        data = b'r' * 100

        h1 = Poly1305.new(key=self.key, cipher=AES)
        self.assertEqual(h1.digest_size, 16)
        self.assertEqual(len(h1.nonce), 16)
        d1 = h1.update(data).digest()
        self.assertEqual(len(d1), 16)

        h2 = Poly1305.new(key=self.key, nonce=h1.nonce, data=data, cipher=AES)
        d2 = h2.digest()
        self.assertEqual(h1.nonce, h2.nonce)
        self.assertEqual(d1, d2)
    def test_new_positive(self):

        data = b'r' * 100

        h1 = Poly1305.new(key=self.key, cipher=AES)
        self.assertEqual(h1.digest_size, 16)
        self.assertEqual(len(h1.nonce), 16)
        d1 = h1.update(data).digest()
        self.assertEqual(len(d1), 16)

        h2 = Poly1305.new(key=self.key, nonce=h1.nonce, data=data, cipher=AES)
        d2 = h2.digest()
        self.assertEqual(h1.nonce, h2.nonce)
        self.assertEqual(d1, d2)
    def test_update_after_digest(self):
        msg=b"rrrrttt"

        # Normally, update() cannot be done after digest()
        h = Poly1305.new(key=self.key, data=msg[:4], cipher=AES)
        h.digest()
        self.assertRaises(TypeError, h.update, msg[4:])
Beispiel #10
0
    def test_update_after_digest(self):
        msg = b"rrrrttt"

        # Normally, update() cannot be done after digest()
        h = Poly1305.new(key=self.key, data=msg[:4], cipher=AES)
        h.digest()
        self.assertRaises(TypeError, h.update, msg[4:])
Beispiel #11
0
def chat_send(room_socket, my_text, member_info, text_list):
    m = my_text.get()
    if len(m) == 0:
        return
    # mac = Poly1305.new(key=key, cipher=AES, nonce=nonce)
    for member in member_info:
        destination = member.encode('ASCII')
        to_msg = encrypt_message(member_info[member], client_id + ": " + m)
        mac = Poly1305.new(key=key, cipher=AES, nonce=nonce)
        mac.update(to_msg)
        mac_hex_digest = mac.hexdigest().encode('ASCII')  # mac
        ready = select.select([room_socket], [room_socket], [])
        if not ready[0] and ready[1]:
            room_socket.sendall(destination)
        ready = select.select([room_socket], [room_socket], [])
        if not ready[0] and ready[1]:
            room_socket.sendall(to_msg)
        #     inicio mac
        ready = select.select([room_socket], [room_socket], [])
        if not ready[0] and ready[1]:
            room_socket.sendall(mac_hex_digest)
        #         final mac
    text_list.insert(tkinter.END, client_id + ": " + m)
    # # Instead of just writing to the list, recv the msg as confirmation
    # destination = encrypt_message(server_key, client_id)
    # to_msg = encrypt_message(public_key, client_id + ": " + m)
    # ready = select.select([room_socket], [room_socket], [])
    # if not ready[0] and ready[1]:
    #     room_socket.sendall(destination)
    # ready = select.select([room_socket], [room_socket], [])
    # if not ready[0] and ready[1]:
    #     room_socket.sendall(to_msg)
    my_text.set("")
Beispiel #12
0
def verify_Poly1305_mac(data, key, nonce, mac_digest):
    mac_verify = Poly1305.new(data=data, key=key, nonce=nonce,                         
                         cipher=AES)
    try:
        mac_verify.hexverify(mac_digest)
        print('Message Authentication Success')
    except:
        print('Message Authentication Failed')
Beispiel #13
0
    def test_digest(self):
        h = Poly1305.new(key=self.key, cipher=AES)
        digest = h.digest()

        # hexdigest does not change the state
        self.assertEqual(h.digest(), digest)
        # digest returns a byte string
        self.failUnless(isinstance(digest, type(b"digest")))
Beispiel #14
0
    def test_digest(self):
        h = Poly1305.new(key=self.key, cipher=AES)
        digest = h.digest()

        # hexdigest does not change the state
        self.assertEqual(h.digest(), digest)
        # digest returns a byte string
        self.failUnless(isinstance(digest, type(b"digest")))
Beispiel #15
0
def chat_recv(room_socket, text_list, member_info, w):
    while len(member_info) > 0:
        try:
            if not w.winfo_exists():
                break
            ready = select.select([room_socket], [], [], 1)
            if ready[0]:
                enc_msg = room_socket.recv(BUFSIZ)
                if len(enc_msg) == 0:
                    raise ConnectionError
                # inicio mac
                ready = select.select([room_socket], [], [])
                if ready[0]:
                    mac_hex_digest = room_socket.recv(BUFSIZ).decode('ASCII')
                #     final mac
                recv_msg = (decrypt_message(private_key, enc_msg))
                if "/*-*/s_l/*+*/" in recv_msg:
                    m_name = recv_msg.replace("/*-*/s_l/*+*/", "")
                    del member_info[m_name]
                    text_list.insert(tkinter.END, m_name + ' left the room')
                    continue
                if "/*file-sent*/" in recv_msg:
                    f_name = recv_msg.replace("/*file-sent*/", "", 1)
                    text_list.insert(tkinter.END, f_name)
                    f_name = f_name[f_name.find(" |") + 2:len(f_name)]
                    get_file(w, client_socket, f_name)
                    continue
                mac_verify = Poly1305.new(key=key,
                                          nonce=nonce,
                                          cipher=AES,
                                          data=enc_msg)
                mac_verify.hexverify(mac_hex_digest)
                text_list.insert(tkinter.END, recv_msg)
        except ConnectionError:
            # traceback.print_exc()
            print("Closed from server?")
            break
        except OSError:
            # traceback.print_exc()
            print("Closed from client")
            break
        except RuntimeError:
            print("App ended, closing all windows")
            break
        except ValueError:
            text_list.insert(
                tkinter.END, "2-end Authentication FAILED! Closing connection")
            traceback.print_exc()
            print("MAC check failed")
            break
        except:
            traceback.print_exc()
    if len(member_info) == 0:
        text_list.insert(
            tkinter.END, 'Everyone else left the chat room. Closing chat room')
    room_socket.close()
Beispiel #16
0
    def test_hex_digest(self):
        mac = Poly1305.new(key=self.key, cipher=AES)
        digest = mac.digest()
        hexdigest = mac.hexdigest()

        # hexdigest is equivalent to digest
        self.assertEqual(hexlify(digest), tobytes(hexdigest))
        # hexdigest does not change the state
        self.assertEqual(mac.hexdigest(), hexdigest)
        # hexdigest returns a string
        self.failUnless(isinstance(hexdigest, type("digest")))
Beispiel #17
0
    def test_hex_digest(self):
        mac = Poly1305.new(key=self.key, cipher=AES)
        digest = mac.digest()
        hexdigest = mac.hexdigest()

        # hexdigest is equivalent to digest
        self.assertEqual(hexlify(digest), tobytes(hexdigest))
        # hexdigest does not change the state
        self.assertEqual(mac.hexdigest(), hexdigest)
        # hexdigest returns a string
        self.failUnless(isinstance(hexdigest, type("digest")))
Beispiel #18
0
    def test_memoryview(self):

        data = b"\x00\x01\x02"

        def get_mv_ro(data):
            return memoryview(data)

        def get_mv_rw(data):
            return memoryview(bytearray(data))

        for get_mv in (get_mv_ro, get_mv_rw):

            # Data and key can be a memoryview (during initialization)
            key_mv = get_mv(self.key)
            data_mv = get_mv(data)

            h1 = Poly1305.new(key=self.key, data=data, cipher=AES)
            h2 = Poly1305.new(key=key_mv,
                              data=data_mv,
                              cipher=AES,
                              nonce=h1.nonce)
            if not data_mv.readonly:
                data_mv[:1] = b'\xFF'
                key_mv[:1] = b'\xFF'

            self.assertEqual(h1.digest(), h2.digest())

            # Data can be a memoryview (during operation)
            data_mv = get_mv(data)

            h1 = Poly1305.new(key=self.key, cipher=AES)
            h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce)
            h1.update(data)
            h2.update(data_mv)
            if not data_mv.readonly:
                data_mv[:1] = b'\xFF'

            self.assertEqual(h1.digest(), h2.digest())
Beispiel #19
0
    def runTest(self):
        tag = unhexlify(b"fb447350c4e868c52ac3275cf9d4327e")

        msg = b''
        for msg_len in range(5000 + 1):
            key = tag + strxor_c(tag, 0xFF)
            nonce = tag[::-1]
            if msg_len > 0:
                msg = msg + tobytes(tag[0])
            auth = Poly1305.new(key=key, nonce=nonce, cipher=AES, data=msg)
            tag = auth.digest()

        # Compare against output of original DJB's poly1305aes-20050218
        self.assertEqual("CDFA436DDD629C7DC20E1128530BAED2", auth.hexdigest().upper())
    def runTest(self):
        tag = unhexlify(b"fb447350c4e868c52ac3275cf9d4327e")

        msg = b''
        for msg_len in range(5000 + 1):
            key = tag + strxor_c(tag, 0xFF)
            nonce = tag[::-1]
            if msg_len > 0:
                msg = msg + tobytes(tag[0])
            auth = Poly1305.new(key=key, nonce=nonce, cipher=AES, data=msg)
            tag = auth.digest()

        # Compare against output of original DJB's poly1305aes-20050218
        self.assertEqual("CDFA436DDD629C7DC20E1128530BAED2", auth.hexdigest().upper())
Beispiel #21
0
    def test_memoryview(self):

        data = b"\x00\x01\x02"

        def get_mv_ro(data):
            return memoryview(data)

        def get_mv_rw(data):
            return memoryview(bytearray(data))

        for get_mv in (get_mv_ro, get_mv_rw):

            # Data and key can be a memoryview (during initialization)
            key_mv = get_mv(self.key)
            data_mv = get_mv(data)

            h1 = Poly1305.new(key=self.key, data=data, cipher=AES)
            h2 = Poly1305.new(key=key_mv, data=data_mv, cipher=AES,
                              nonce=h1.nonce)
            if not data_mv.readonly:
                data_mv[:1] = b'\xFF'
                key_mv[:1] = b'\xFF'

            self.assertEqual(h1.digest(), h2.digest())

            # Data can be a memoryview (during operation)
            data_mv = get_mv(data)

            h1 = Poly1305.new(key=self.key, cipher=AES)
            h2 = Poly1305.new(key=self.key, cipher=AES, nonce=h1.nonce)
            h1.update(data)
            h2.update(data_mv)
            if not data_mv.readonly:
                data_mv[:1] = b'\xFF'

            self.assertEqual(h1.digest(), h2.digest())
    def __init__(self, key, nonce):
        """Initialize a ChaCha20-Poly1305 AEAD cipher object

        See also `new()` at the module level."""

        self.nonce = _copy_bytes(None, None, nonce)

        self._next = (self.update, self.encrypt, self.decrypt, self.digest,
                      self.verify)

        self._authenticator = Poly1305.new(key=key, nonce=nonce, cipher=ChaCha20)

        self._cipher = ChaCha20.new(key=key, nonce=nonce)
        self._cipher.seek(64)  # Block counter starts at 1

        self._len_aad = 0
        self._len_ct = 0
        self._mac_tag = None
        self._status = _CipherStatus.PROCESSING_AUTH_DATA
    def __init__(self, key, nonce):
        """Initialize a ChaCha20-Poly1305 AEAD cipher object

        See also `new()` at the module level."""

        self.nonce = _copy_bytes(None, None, nonce)

        self._next = (self.update, self.encrypt, self.decrypt, self.digest,
                      self.verify)

        self._authenticator = Poly1305.new(key=key, nonce=nonce, cipher=ChaCha20)
        
        self._cipher = ChaCha20.new(key=key, nonce=nonce)
        self._cipher.seek(64)   # Block counter starts at 1

        self._len_aad = 0
        self._len_ct = 0
        self._mac_tag = None
        self._status = _CipherStatus.PROCESSING_AUTH_DATA
Beispiel #24
0
def EaM(ptxt, key1, key2, nonce):
    counter = 0
    temp2 = 0
    NonceCount = nonce ^ counter
    ctxt = 0
    E = SimonCipher(key1)  #encryption block default 128 bit
    mac = Poly1305.new(key=key2.encode(), cipher=AES)  #Mac block
    block = breakup(ptxt, 16)
    T = mac.update(ptxt.encode()).hexdigest()
    for i in range(len(block)):
        NonceCount = nonce ^ counter
        counter = counter + 1
        temp = E.encrypt(NonceCount)
        for a in block[
                i]:  #shift temp2 by 1 byte each time and or it with a new byte
            temp2 = (temp2 << 8) | ord(a)
        #print(temp2)
        #print(temp)
        ctxt = (ctxt << 128) | (temp ^ temp2)  # accumulate onto the ctxt
    print("CTXT: ")
    print(hex(ctxt))
    print("T: ")
    print(T)
Beispiel #25
0
def on_closing_filesender(wind, s, room_socket, member_info, text_list, fname):
    s.close()
    wind.destroy()
    try:
        for member in member_info:
            destination = member.encode('ASCII')
            to_msg = encrypt_message(
                member_info[member],
                "/*file-sent*/" + client_id + " sent a file: |" + fname)
            mac = Poly1305.new(key=key, cipher=AES, nonce=nonce)
            mac.update(to_msg)
            mac_hex_digest = mac.hexdigest().encode('ASCII')  # mac
            ready = select.select([room_socket], [room_socket], [])
            if not ready[0] and ready[1]:
                room_socket.sendall(destination)
            ready = select.select([room_socket], [room_socket], [])
            if not ready[0] and ready[1]:
                room_socket.sendall(to_msg)
            ready = select.select([room_socket], [room_socket], [])
            if not ready[0] and ready[1]:
                room_socket.sendall(mac_hex_digest)
        text_list.insert(tkinter.END, "You sent a file: |" + fname)
    except:
        traceback.print_exc()
Beispiel #26
0
def generate_Poly1305_mac(data, key):
    mac = Poly1305.new(key=key, cipher=AES, data=data)
    return (mac.hexdigest(), mac.nonce)
Beispiel #27
0
 def new(key, *data, **kwds):
     _kwds = dict(kwds)
     if len(data) == 1:
         _kwds['data'] = data[0]
     _kwds['key'] = key
     return Poly1305.new(**_kwds)
Beispiel #28
0
def encrypt(plaintext, mode):
    key = get_random_bytes(32)
    ret = None
    if mode == "AES_CBC":
        iv = os.urandom(16)
        cipher = AES.new(key, AES.MODE_CBC, iv)
        start_time = time.time()
        ret = cipher.encrypt(pad(plaintext, AES.block_size))
    elif mode == "AES_OCB":
        cipher = AES.new(key, AES.MODE_OCB)
        start_time = time.time()
        #ret, _ = cipher.encrypt_and_digest(pad(plaintext, AES.block_size))
        ret, _ = cipher.encrypt_and_digest(plaintext)
    elif mode == "AES_GCM":
        cipher = AES.new(key, AES.MODE_GCM)
        start_time = time.time()
        ret, _ = cipher.encrypt_and_digest(plaintext)
    elif mode == "AES_CCM":
        cipher = AES.new(key, AES.MODE_CCM)
        start_time = time.time()
        #ret, _ = cipher.encrypt_and_digest(pad(plaintext, AES.block_size))
        ret, _ = cipher.encrypt_and_digest(plaintext)
    elif mode == "RSA1024":
        # generate private key
        key = RSA.generate(1024)
        encrypted_key = key.export_key()
        file_out = open("rsa_key.bin", "wb")
        file_out.write(encrypted_key)
        file_out.close()

        encoded_key = open("rsa_key.bin", "rb").read()
        key = RSA.import_key(encoded_key)

        cipher = PKCS1_OAEP.new(key)
        # max block size of RSA 1024 is 86 Bytes
        blk_size = 86
        start_time = time.time()
        for i in range(0, len(plaintext), blk_size):
            blk_plain = plaintext[i:i+blk_size]
            ret = cipher.encrypt(blk_plain)
    elif mode == "RSA2048":
        # generate private key
        key = RSA.generate(2048)
        encrypted_key = key.export_key()
        file_out = open("rsa_key.bin", "wb")
        file_out.write(encrypted_key)
        file_out.close()

        encoded_key = open("rsa_key.bin", "rb").read()
        key = RSA.import_key(encoded_key)

        cipher = PKCS1_OAEP.new(key)
        # max block size of RSA 1024 is 214 Bytes
        blk_size = 214
        start_time = time.time()
        for i in range(0, len(plaintext), blk_size):
            blk_plain = plaintext[i:i+blk_size]
            ret = cipher.encrypt(blk_plain)
    elif mode == "SHA":
        # SHA256 provided by Crypto.Hash is slow.
        # hash_obj = SHA256.new()
        # start_time = time.time()
        # hash_obj.update(plaintext)
        # ret = hash_obj.hexdigest()
        m = hashlib.sha256()
        start_time = time.time()
        m.update(plaintext)
        ret = m.digest()

    elif mode == "CC20":
        cipher = ChaCha20.new(key=key)
        start_time = time.time()
        ret = cipher.encrypt(plaintext)
    elif mode == "POLY":
        mac = Poly1305.new(key=key, cipher=AES)
        start_time = time.time()
        mac.update(plaintext)
        ret = mac.hexdigest()
    elif mode == "CCP":
        cipher = ChaCha20_Poly1305.new(key=key)
        start_time = time.time()
        ret, _ = cipher.encrypt_and_digest(plaintext)
    elif mode == "HMAC":
        h = HMAC.new(key, digestmod=SHA256)
        start_time = time.time()
        h.update(plaintext)
        ret = h.hexdigest()
    elif mode == "CMAC":
        cobj = CMAC.new(key, ciphermod=AES)
        start_time = time.time()
        cobj.update(plaintext)
        ret = cobj.hexdigest()
    else:
        print("Mode not supported.")
        exit(1)

    end_time = time.time()
    cost_time = end_time - start_time
    return ret, cost_time
Beispiel #29
0
def poly1305(k, p):
    #secret = b'Thirtytwo very very secret bytes'
    mac = Poly1305.new(key=k, cipher=AES)
    mac.update(p)
    tag = mac.nonce.hex()
    return tag
Beispiel #30
0
fh = open('/Users/kris/TopSecret.txt', 'rb')
dataSHA = fh.read()
hash_object = SHA256.new(data=dataSHA)
print(hash_object.hexdigest())




# Poly1305: 

from Crypto.Hash import Poly1305
from Crypto.Cipher import AES
fh = open('/Users/kris/TopSecret.txt', 'rb')
dataPoly = fh.read()
secret = b'\xa4\x84\x85\xe6\xf1\xc8\xfe\x81\xb8\r~\x13\x94\xc7\xc4\x7f\xab\xbf5%\xdc\x00\xd8\xffS\x80\xccO\xc6J\xb1\x83'
mac = Poly1305.new(key=secret, cipher=AES)
mac.update(dataPoly)
print("Nonce: ", mac.nonce.hex())
print("MAC: ", mac.hexdigest())

hex_tag = Poly1305.new(key=secret, cipher=AES, data=dataPoly).hexdigest()





# Encryption w/ AES CBC Mode:

import json
from base64 import b64encode
from Crypto.Cipher import AES
Beispiel #31
0
 def test_hexverify(self):
     h = Poly1305.new(key=self.key, cipher=AES)
     mac = h.hexdigest()
     h.hexverify(mac)
     self.assertRaises(ValueError, h.hexverify, "4556")
Beispiel #32
0
 def test_verify(self):
     h = Poly1305.new(key=self.key, cipher=AES)
     mac = h.digest()
     h.verify(mac)
     wrong_mac = strxor_c(mac, 255)
     self.assertRaises(ValueError, h.verify, wrong_mac)
Beispiel #33
0
 def test_update_negative(self):
     h = Poly1305.new(key=self.key, cipher=AES)
     self.assertRaises(TypeError, h.update, u"string")
Beispiel #34
0
 def test_verify(self):
     h = Poly1305.new(key=self.key, cipher=AES)
     mac = h.digest()
     h.verify(mac)
     wrong_mac = strxor_c(mac, 255)
     self.assertRaises(ValueError, h.verify, wrong_mac)
Beispiel #35
0
 def test_update_negative(self):
     h = Poly1305.new(key=self.key, cipher=AES)
     self.assertRaises(TypeError, h.update, u"string")
Beispiel #36
0
 def test_hexverify(self):
     h = Poly1305.new(key=self.key, cipher=AES)
     mac = h.hexdigest()
     h.hexverify(mac)
     self.assertRaises(ValueError, h.hexverify, "4556")
Beispiel #37
0
 def new(key, *data, **kwds):
     _kwds = dict(kwds)
     if len(data) == 1:
         _kwds['data'] = data[0]
     _kwds['key'] = key
     return Poly1305.new(**_kwds)