module RubySMB::Crypto::KDF
Public Class Methods
counter_mode(ki, label, context, length: 128)
click to toggle source
# File lib/ruby_smb/crypto.rb, line 4 def self.counter_mode(ki, label, context, length: 128) digest = OpenSSL::Digest.new('SHA256') r = 32 n = length / 256 n = 1 if n == 0 raise ArgumentError if n > 2**r - 1 result = "" n.times do |i| input = [i + 1].pack('L>') input << label input << "\x00" input << context input << [length].pack('L>') k = OpenSSL::HMAC.digest(digest, ki, input) result << k end return result[0...(length / 8)] rescue OpenSSL::OpenSSLError => e raise RubySMB::Error::EncryptionError, "Crypto::KDF.counter_mode OpenSSL error: #{e.message}" end