From 3774b6e900a25cd10803aadaa1ddfda60d2a5421 Mon Sep 17 00:00:00 2001 From: Pierre Krieger Date: Tue, 14 Nov 2017 15:56:11 +0100 Subject: [PATCH] Apparently this is truly the fastest way --- libp2p-secio/src/codec/encode.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/libp2p-secio/src/codec/encode.rs b/libp2p-secio/src/codec/encode.rs index 32d427c6..e5e7d8d7 100644 --- a/libp2p-secio/src/codec/encode.rs +++ b/libp2p-secio/src/codec/encode.rs @@ -21,7 +21,6 @@ //! Individual messages encoding. use bytes::BytesMut; -use bytes::buf::BufMut; use crypto::symmetriccipher::SynchronousStreamCipher; use futures::Poll; use futures::StartSend; @@ -65,16 +64,17 @@ impl Sink for EncoderMiddleware fn start_send(&mut self, item: Self::SinkItem) -> StartSend { let capacity = item.len() + self.hmac_key.digest_algorithm().output_len; - let mut out_buffer = BytesMut::with_capacity(capacity); - // Note: Alternatively to `extend`, we could also call `advance_mut()`, which will add - // uninitialized bytes to the buffer. But that's unsafe. - out_buffer.extend_from_slice(&vec![0; item.len()]); - self.cipher_state.process(&item, &mut out_buffer); + // Apparently this is the fastest way of doing. + // See https://gist.github.com/kirushik/e0d93759b0cd102f814408595c20a9d0 + let mut out_buffer = BytesMut::from(vec![0; capacity]); - let signature = hmac::sign(&self.hmac_key, &out_buffer); - out_buffer.put_slice(signature.as_ref()); + { + let (out_data, out_sign) = out_buffer.split_at_mut(item.len()); + self.cipher_state.process(&item, out_data); - debug_assert_eq!(out_buffer.len(), capacity); + let signature = hmac::sign(&self.hmac_key, out_data); + out_sign.copy_from_slice(signature.as_ref()); + } self.raw_sink.start_send(out_buffer) }