Giter Site home page Giter Site logo

Comments (6)

tarcieri avatar tarcieri commented on June 12, 2024

It consumes self. The mut is an implementation detail of the local binding after self is consumed.

from block-ciphers.

keepsimple1 avatar keepsimple1 commented on June 12, 2024

I didn't know Rust allow that. That said, why consumes self? why not using a reference?

The types that implement this trait might not be Copy. with the current method, it could cause problems when cipher is part of a struct, when the struct itself is not moved.

And looking more closely, encrypt_vec actually calls encrypt_blocks which takes &mut self , not consuming self:

fn encrypt_blocks(&mut self, blocks: &mut [Block<C>]);

from block-ciphers.

tarcieri avatar tarcieri commented on June 12, 2024

Because CBC mode requires padding for security. The one-shot API prevents misuse.

it could cause problems when cipher is part of a struct

Clone the cipher type before instantiating it.

from block-ciphers.

newpavlov avatar newpavlov commented on June 12, 2024

Note that creation of block modes from ciphers is a really cheap operation and cloning a cipher instance is not too costly either.

But nevertheless, I wonder if we can add impl<T: BlockCipher> BlockCipher for &T, this could make it possible to instantiate a block mode using block cipher reference (although we would have to slightly change BlockCipher definition to accommodate for that).

from block-ciphers.

keepsimple1 avatar keepsimple1 commented on June 12, 2024

Because CBC mode requires padding for security. The one-shot API prevents misuse.

I don't understand. It seems padding is done using the buf / block, not self:

// prepare space for padding
let block: Block<C> = Default::default();
buf.extend_from_slice(&block[..n - pos]);
let n = P::pad(&mut buf, pos, bs)
.expect("enough space for padding is allocated")
.len();
buf.truncate(n);
self.encrypt_blocks(to_blocks(&mut buf));

Maybe I'm missing something?

from block-ciphers.

tarcieri avatar tarcieri commented on June 12, 2024

For security reasons:

  • IVs cannot be reused.
  • the last block encrypted must be padded.

The encryptor is stateful, and for e.g. CBC mode begins with an IV and then uses the previous (encrypted) block as the IV of the next.

There's no further secure operations possible after completing CBC mode encryption. If we were to reset the instance, it would let you reuse an IV. You can't add any more blocks, because padding is used to signal the end of the message.

If you want to encrypt a new message, you must start over with a new IV.

from block-ciphers.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.