[Cryptography-dev] Low level API for Symmetric Encryption

Alex Gaynor alex.gaynor at gmail.com
Thu Aug 8 00:21:29 CEST 2013


A few thoughts:

a) I don't like each call to update() returning data, it seems like it
should all be buffered in the cipher and then returned at the end.

b) I assume it raises an error if you try to do anything after finalization?

c) I think params like a MAC should just be added to __init__ for ciphers
which need them

d) I don't have any ideas about specifying encrypt vs. decrypt.

Alex


On Wed, Aug 7, 2013 at 3:16 PM, Donald Stufft <donald at stufft.io> wrote:

> So to kick things off I'd like to get AES-GCM exposed and figured it could
> be a good way to start the ball rolling for figuring out how we want to
> expose symmetric ciphers at the low level API.
>
> I'm thinking cryptography.primitives.aes which has classes named like
> AES128GCM, AES256CBC, etc. The obvious naming scheme being
> AlgorithmKeysizeMode.
>
> classes look something like
>
> class AES128GCM:
>
>     # Information about the Cipher
>     authenticated = True
>     block_size = 128
>
>     def __init__(self, key, iv, …)
>
>     def update(self, plaintext)  # Updates an internal buffer as well as
> returns the encrypted chunk of data
>
>     def finalize(self)  # Updates the internal buffer witth finalized data
> and returns the same finalized data
>
>
> Some open questions:
>
> A lot of these are going to be block ciphers, do we want to do padding for
> people or expect them to hand us chunks of the correct block size?
>
> How do we decrypt vs encrypt. I think that:
>
>     cipher = AES128GCM(key, iv)
>     enciphered = cipher.update(plaintext) + cipher.finalize()
>
>     cipher = AES128GCM(key, iv)
>     plaintext = cipher.update(enciphered) + cipher.finalize()
>
> Makes a decent API here, but we need a way to make a decryption vs
> encryption cipher. Possibly something like encrypt=True, or decrypt=True
> (specifying both being an error)?
>
> Some ciphers (AES-GCM included) are authenticated and thus return (and
> require giving) a MAC in order to authenticate it, some authenticated
> ciphers also support the ability to pass along unencrypted but still
> authenticated data as well. I can't think of a decent way of doing this
> besides just adding functions (or __init__ args) to pass this data in, does
> anyone else have any ideas?
>
> Any other thoughts? I'm just spitballing here so let's see what we can
> come up with!
>
>
> -----------------
> Donald Stufft
> PGP: 0x6E3CBCE93372DCFA // 7C6B 7C5D 5E2B 6356 A926 F04F 6E3C BCE9 3372
> DCFA
>
>
> _______________________________________________
> Cryptography-dev mailing list
> Cryptography-dev at python.org
> http://mail.python.org/mailman/listinfo/cryptography-dev
>
>


-- 
"I disapprove of what you say, but I will defend to the death your right to
say it." -- Evelyn Beatrice Hall (summarizing Voltaire)
"The people's good is the highest law." -- Cicero
GPG Key fingerprint: 125F 5C67 DFE9 4084
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/cryptography-dev/attachments/20130807/d53c6289/attachment.html>


More information about the Cryptography-dev mailing list