Module: RubySMB::Client::Encryption

Included in:
RubySMB::Client
Defined in:
lib/ruby_smb/client/encryption.rb

Overview

Contains the methods for handling encryption / decryption

Instance Method Summary collapse

Instance Method Details

#smb3_decrypt(th) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/ruby_smb/client/encryption.rb', line 34

def smb3_decrypt(th)
  unless @server_encryption_key
    case @dialect
    when '0x0300', '0x0302'
      @server_encryption_key = RubySMB::Crypto::KDF.counter_mode(
        @session_key,
        "SMB2AESCCM\x00",
        "ServerOut\x00"
      )
    when '0x0311'
      @server_encryption_key = RubySMB::Crypto::KDF.counter_mode(
        @session_key,
        "SMBS2CCipherKey\x00",
        @preauth_integrity_hash_value
      )
    else
      raise RubySMB::Error::EncryptionError.new('Dialect is incompatible with SMBv3 decryption')
    end
    ######
    # DEBUG
    #puts "Server encryption key = #{@server_encryption_key.each_byte.map {|e| '%02x' % e}.join}"
    ######
  end

  th.decrypt(@server_encryption_key, algorithm: @encryption_algorithm)
end

#smb3_encrypt(data) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/ruby_smb/client/encryption.rb', line 5

def smb3_encrypt(data)
  unless @client_encryption_key
    case @dialect
    when '0x0300', '0x0302'
      @client_encryption_key = RubySMB::Crypto::KDF.counter_mode(
        @session_key,
        "SMB2AESCCM\x00",
        "ServerIn \x00"
      )
    when '0x0311'
      @client_encryption_key = RubySMB::Crypto::KDF.counter_mode(
        @session_key,
        "SMBC2SCipherKey\x00",
        @preauth_integrity_hash_value
      )
    else
      raise RubySMB::Error::EncryptionError.new('Dialect is incompatible with SMBv3 encryption')
    end
    ######
    # DEBUG
    #puts "Client encryption key = #{@client_encryption_key.each_byte.map {|e| '%02x' % e}.join}"
    ######
  end

  th = RubySMB::SMB2::Packet::TransformHeader.new(flags: 1, session_id: @session_id)
  th.encrypt(data, @client_encryption_key, algorithm: @encryption_algorithm)
  th
end