module Net::IMAP::SASL::ScramAlgorithm

For method descriptions, see RFC5802 §2.2 and RFC5802 §3.

Public Instance Methods

H(str) click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 24
def H(str) digest.digest str end
HMAC(key, data) click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 26
def HMAC(key, data) OpenSSL::HMAC.digest(digest, key, data) end
Hi(str, salt, iterations) click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 13
def Hi(str, salt, iterations)
  length = digest.digest_length
  OpenSSL::KDF.pbkdf2_hmac(
    str,
    salt:       salt,
    iterations: iterations,
    length: length,
    hash: digest,
  )
end
Normalize(str) click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 11
def Normalize(str) SASL.saslprep(str) end
XOR(str1, str2) click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 28
def XOR(str1, str2)
  str1.unpack("C*")
    .zip(str2.unpack("C*"))
    .map {|a, b| a ^ b }
    .pack("C*")
end
auth_message click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 35
def auth_message
  [
    client_first_message_bare,
    server_first_message,
    client_final_message_without_proof,
  ]
    .join(",")
end
client_key click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 48
def client_key;       HMAC(salted_password, "Client Key") end
client_proof click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 53
def client_proof;     XOR(client_key, client_signature)   end
client_signature click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 51
def client_signature; HMAC(stored_key, auth_message)      end
salted_password click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 44
def salted_password
  Hi(Normalize(password), salt, iterations)
end
server_key click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 49
def server_key;       HMAC(salted_password, "Server Key") end
server_signature click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 52
def server_signature; HMAC(server_key, auth_message)      end
stored_key click to toggle source
# File lib/net/imap/sasl/scram_algorithm.rb, line 50
def stored_key;       H(client_key)                       end