Exemple #1
0
    def derive(self, key_material):
        utils._check_byteslike("key_material", key_material)
        if self._used:
            raise AlreadyFinalized

        self._used = True
        return self._expand(key_material)
Exemple #2
0
    def derive(self, key_material):
        if self._used:
            raise AlreadyFinalized

        utils._check_byteslike("key_material", key_material)
        self._used = True

        # inverse floor division (equivalent to ceiling)
        rounds = -(-self._length // self._algorithm.digest_size)

        output = [b""]

        # For counter mode, the number of iterations shall not be
        # larger than 2^r-1, where r <= 32 is the binary length of the counter
        # This ensures that the counter values used as an input to the
        # PRF will not repeat during a particular call to the KDF function.
        r_bin = utils.int_to_bytes(1, self._rlen)
        if rounds > pow(2, len(r_bin) * 8) - 1:
            raise ValueError("There are too many iterations.")

        for i in range(1, rounds + 1):
            h = hmac.HMAC(key_material, self._algorithm, backend=self._backend)

            counter = utils.int_to_bytes(i, self._rlen)
            if self._location == CounterLocation.BeforeFixed:
                h.update(counter)

            h.update(self._generate_fixed_input())

            if self._location == CounterLocation.AfterFixed:
                h.update(counter)

            output.append(h.finalize())

        return b"".join(output)[:self._length]
Exemple #3
0
    def __init__(self, tweak):
        utils._check_byteslike("tweak", tweak)

        if len(tweak) != 16:
            raise ValueError("tweak must be 128-bits (16 bytes)")

        self._tweak = tweak
Exemple #4
0
    def __init__(self, key, nonce):
        self.key = _verify_key_size(self, key)
        utils._check_byteslike("nonce", nonce)

        if len(nonce) != 16:
            raise ValueError("nonce must be 128-bits (16 bytes)")

        self._nonce = nonce
Exemple #5
0
def _verify_key_size(algorithm, key):
    # Verify that the key is instance of bytes
    utils._check_byteslike("key", key)

    # Verify that the key size matches the expected key size
    if len(key) * 8 not in algorithm.key_sizes:
        raise ValueError("Invalid key size ({}) for {}.".format(
            len(key) * 8, algorithm.name))
    return key
Exemple #6
0
    def derive(self, key_material):
        if self._used:
            raise AlreadyFinalized("Scrypt instances can only be used once.")
        self._used = True

        utils._check_byteslike("key_material", key_material)
        return self._backend.derive_scrypt(key_material, self._salt,
                                           self._length, self._n, self._r,
                                           self._p)
Exemple #7
0
    def __init__(self, key):
        if not backend.aead_cipher_supported(self):
            raise exceptions.UnsupportedAlgorithm(
                "ChaCha20Poly1305 is not supported by this version of OpenSSL",
                exceptions._Reasons.UNSUPPORTED_CIPHER,
            )
        utils._check_byteslike("key", key)

        if len(key) != 32:
            raise ValueError("ChaCha20Poly1305 key must be 32 bytes.")

        self._key = key
Exemple #8
0
    def __init__(self, key, tag_length=16):
        utils._check_byteslike("key", key)
        if len(key) not in (16, 24, 32):
            raise ValueError("AESCCM key must be 128, 192, or 256 bits.")

        self._key = key
        if not isinstance(tag_length, int):
            raise TypeError("tag_length must be an integer")

        if tag_length not in (4, 6, 8, 10, 12, 14, 16):
            raise ValueError("Invalid tag_length")

        self._tag_length = tag_length
Exemple #9
0
    def derive(self, key_material):
        if self._used:
            raise AlreadyFinalized("PBKDF2 instances can only be used once.")
        self._used = True

        utils._check_byteslike("key_material", key_material)
        return self._backend.derive_pbkdf2_hmac(
            self._algorithm,
            self._length,
            self._salt,
            self._iterations,
            key_material,
        )
Exemple #10
0
def _byte_unpadding_update(buffer_, data, block_size):
    if buffer_ is None:
        raise AlreadyFinalized("Context was already finalized.")

    utils._check_byteslike("data", data)

    buffer_ += bytes(data)

    finished_blocks = max(len(buffer_) // (block_size // 8) - 1, 0)

    result = buffer_[:finished_blocks * (block_size // 8)]
    buffer_ = buffer_[finished_blocks * (block_size // 8):]

    return buffer_, result
Exemple #11
0
def _concatkdf_derive(key_material, length, auxfn, otherinfo):
    utils._check_byteslike("key_material", key_material)
    output = [b""]
    outlen = 0
    counter = 1

    while length > outlen:
        h = auxfn()
        h.update(_int_to_u32be(counter))
        h.update(key_material)
        h.update(otherinfo)
        output.append(h.finalize())
        outlen += len(output[-1])
        counter += 1

    return b"".join(output)[:length]
Exemple #12
0
 def __init__(self, initialization_vector, tag=None, min_tag_length=16):
     # len(initialization_vector) must in [1, 2 ** 64), but it's impossible
     # to actually construct a bytes object that large, so we don't check
     # for it
     utils._check_byteslike("initialization_vector", initialization_vector)
     if len(initialization_vector) == 0:
         raise ValueError("initialization_vector must be at least 1 byte")
     self._initialization_vector = initialization_vector
     if tag is not None:
         utils._check_bytes("tag", tag)
         if min_tag_length < 4:
             raise ValueError("min_tag_length must be >= 4")
         if len(tag) < min_tag_length:
             raise ValueError(
                 "Authentication tag must be {} bytes or longer.".format(
                     min_tag_length))
     self._tag = tag
     self._min_tag_length = min_tag_length
Exemple #13
0
    def derive(self, key_material):
        if self._used:
            raise AlreadyFinalized
        self._used = True
        utils._check_byteslike("key_material", key_material)
        output = [b""]
        outlen = 0
        counter = 1

        while self._length > outlen:
            h = hashes.Hash(self._algorithm, self._backend)
            h.update(key_material)
            h.update(_int_to_u32be(counter))
            if self._sharedinfo is not None:
                h.update(self._sharedinfo)
            output.append(h.finalize())
            outlen += len(output[-1])
            counter += 1

        return b"".join(output)[:self._length]
Exemple #14
0
    def __init__(self, key):
        utils._check_byteslike("key", key)
        if len(key) not in (16, 24, 32):
            raise ValueError("AESGCM key must be 128, 192, or 256 bits.")

        self._key = key
Exemple #15
0
 def _check_params(self, nonce, data, associated_data):
     utils._check_byteslike("nonce", nonce)
     utils._check_bytes("data", data)
     utils._check_bytes("associated_data", associated_data)
     if not 7 <= len(nonce) <= 13:
         raise ValueError("Nonce must be between 7 and 13 bytes")
Exemple #16
0
 def derive(self, key_material):
     utils._check_byteslike("key_material", key_material)
     return self._hkdf_expand.derive(self._extract(key_material))
Exemple #17
0
 def __init__(self, nonce):
     utils._check_byteslike("nonce", nonce)
     self._nonce = nonce
Exemple #18
0
 def _check_params(self, nonce, data, associated_data):
     utils._check_byteslike("nonce", nonce)
     utils._check_bytes("data", data)
     utils._check_bytes("associated_data", associated_data)
     if len(nonce) != 12:
         raise ValueError("Nonce must be 12 bytes")
Exemple #19
0
 def __init__(self, initialization_vector):
     utils._check_byteslike("initialization_vector", initialization_vector)
     self._initialization_vector = initialization_vector
Exemple #20
0
 def update(self, data):
     if self._ctx is None:
         raise AlreadyFinalized("Context was already finalized.")
     utils._check_byteslike("data", data)
     self._ctx.update(data)
Exemple #21
0
    def set_data(self, data):
        _check_byteslike("data", data)
        if self._data is not None:
            raise ValueError("data may only be set once")

        return PKCS7SignatureBuilder(data, self._signers)