Class: Net::SMTP::AuthCramMD5

Inherits:
Authenticator show all
Defined in:
lib/net/smtp/auth_cram_md5.rb

Constant Summary collapse

IMASK =
0x36
OMASK =
0x5c
CRAM_BUFSIZE =
64

Instance Attribute Summary

Attributes inherited from Authenticator

#smtp

Instance Method Summary collapse

Methods inherited from Authenticator

auth_class, auth_classes, auth_type, #base64_encode, check_args, #continue, #finish, #initialize

Constructor Details

This class inherits a constructor from Net::SMTP::Authenticator

Instance Method Details

#auth(user, secret) ⇒ Object



12
13
14
15
16
# File 'lib/net/smtp/auth_cram_md5.rb', line 12

def auth(user, secret)
  challenge = continue('AUTH CRAM-MD5')
  crammed = cram_md5_response(secret, challenge.unpack1('m'))
  finish(base64_encode("#{user} #{crammed}"))
end

#cram_md5_response(secret, challenge) ⇒ Object

CRAM-MD5: [RFC2195]



22
23
24
25
# File 'lib/net/smtp/auth_cram_md5.rb', line 22

def cram_md5_response(secret, challenge)
  tmp = digest_class::MD5.digest(cram_secret(secret, IMASK) + challenge)
  digest_class::MD5.hexdigest(cram_secret(secret, OMASK) + tmp)
end

#cram_secret(secret, mask) ⇒ Object



29
30
31
32
33
34
35
36
# File 'lib/net/smtp/auth_cram_md5.rb', line 29

def cram_secret(secret, mask)
  secret = digest_class::MD5.digest(secret) if secret.size > CRAM_BUFSIZE
  buf = secret.ljust(CRAM_BUFSIZE, "\0")
  0.upto(buf.size - 1) do |i|
    buf[i] = (buf[i].ord ^ mask).chr
  end
  buf
end

#digest_classObject



38
39
40
41
42
43
44
45
46
# File 'lib/net/smtp/auth_cram_md5.rb', line 38

def digest_class
  @digest_class ||= if defined?(OpenSSL::Digest)
                      OpenSSL::Digest
                    elsif defined?(::Digest)
                      ::Digest
                    else
                      raise '"openssl" or "digest" library is required'
                    end
end