Class: Net::SMTP::AuthCramMD5
- Inherits:
-
Authenticator
- Object
- Authenticator
- Net::SMTP::AuthCramMD5
- 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
Instance Method Summary collapse
- #auth(user, secret) ⇒ Object
-
#cram_md5_response(secret, challenge) ⇒ Object
CRAM-MD5: [RFC2195].
- #cram_secret(secret, mask) ⇒ Object
- #digest_class ⇒ Object
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_class ⇒ Object
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 |