In the context of making things go fast/clean, do I need a reset? If so, why? My straw man is that setup has 3 stages: 1: get storage and whatever for the cipher 2: setup tables and such for a key 3: init internal data In the same key case, the basic operation is Init (does step 3) Update Final I think setup steps 1 and 2 can be done with something like Setup(ctx, cipher, key+length) A NULL cipher means keep using the current one - no allocs. With something like that, I'd be happy to have a ctx per cipher. Setup and Init can be merged into one function if a NULL key means keep using the old one. I think it's slightly cleaner (and faster) to leave them split. -- These are my opinions. I hate spam.