class Net::SMTP::AuthCramMD5 - net-smtp: Ruby Standard Library Documentation

# class Net::SMTP::AuthCramMD5

### Constants

CRAM_BUFSIZE
IMASK
OMASK

### Public Instance Methods

auth(user, secret) click to toggle source

    # File net-smtp-0.5.0/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) click to toggle source

CRAM-MD5: [RFC2195]

    # File net-smtp-0.5.0/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) click to toggle source

    # File net-smtp-0.5.0/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() click to toggle source

    # File net-smtp-0.5.0/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