Sha256: 9deab46ec95bf70d5b75b60ad7c027f13e9d6b6ef80472965cf1f9f755c49bc7

Contents?: true

Size: 1.21 KB

Versions: 13

Compression:

Stored size: 1.21 KB

Contents

# frozen_string_literal: true

module Noise
  module State
    # A CipherState can encrypt and decrypt data based on its k and n variables:
    #
    # - k: A cipher key of 32 bytes (which may be empty). Empty is a special value which indicates k has not yet been
    # initialized.
    # - n: An 8-byte (64-bit) unsigned integer nonce.
    #
    class CipherState
      MAX_NONCE = 2**64 - 1

      attr_reader :k, :n

      def initialize(cipher: AesGcm.new)
        @cipher = cipher
      end

      def initialize_key(key)
        @k = key
        @n = 0
      end

      def key?
        !@k.nil?
      end

      def nonce=(nonce)
        @n = nonce
      end

      def encrypt_with_ad(ad, plaintext)
        return plaintext unless key?
        raise Noise::Exceptions::MaxNonceError if @n == MAX_NONCE
        ciphertext = @cipher.encrypt(@k, @n, ad, plaintext)
        @n += 1
        ciphertext
      end

      def decrypt_with_ad(ad, ciphertext)
        return ciphertext unless key?
        raise Noise::Exceptions::MaxNonceError if @n == MAX_NONCE
        plaintext = @cipher.decrypt(@k, @n, ad, ciphertext)
        @n += 1
        plaintext
      end

      def rekey
        @k = @cipher.rekey(@k)
      end
    end
  end
end

Version data entries

13 entries across 13 versions & 1 rubygems

Version Path
noise-ruby-0.7.1 lib/noise/state/cipher_state.rb
noise-ruby-0.7.0 lib/noise/state/cipher_state.rb
noise-ruby-0.6.3 lib/noise/state/cipher_state.rb
noise-ruby-0.6.2 lib/noise/state/cipher_state.rb
noise-ruby-0.6.1 lib/noise/state/cipher_state.rb
noise-ruby-0.6.0 lib/noise/state/cipher_state.rb
noise-ruby-0.5.3 lib/noise/state/cipher_state.rb
noise-ruby-0.5.2 lib/noise/state/cipher_state.rb
noise-ruby-0.5.1 lib/noise/state/cipher_state.rb
noise-ruby-0.5.0 lib/noise/state/cipher_state.rb
noise-ruby-0.3.0 lib/noise/state/cipher_state.rb
noise-ruby-0.2.0 lib/noise/state/cipher_state.rb
noise-ruby-0.1.0 lib/noise/state/cipher_state.rb