docs: async def auth_crammd5(
          self, username: str, password: str, timeout: DefaultNumType = _default
      ) -> SMTPResponse:
          """
          CRAM-MD5 auth uses the password as a shared secret to MD5 the server's
          response.
  
          Example::
  
              250 AUTH CRAM-MD5
              auth cram-md5
              334 PDI0NjA5LjEwNDc5MTQwNDZAcG9wbWFpbC5TcGFjZS5OZXQ+
              dGltIGI5MTNhNjAyYzdlZGE3YTQ5NWI0ZTZlNzMzNGQzODkw
  
          """
          async with self._command_lock:
              initial_response = await self.execute_command(
                  b"AUTH", b"CRAM-MD5", timeout=timeout
              )
  
              if initial_response.code != SMTPStatus.auth_continue:
                  raise SMTPAuthenticationError(
                      initial_response.code, initial_response.message
                  )
  
              password_bytes = password.encode("ascii")
              username_bytes = username.encode("ascii")
              response_bytes = initial_response.message.encode("ascii")
  
              verification_bytes = crammd5_verify(
                  username_bytes, password_bytes, response_bytes
              )
  
              response = await self.execute_command(verification_bytes)
  
          if response.code != SMTPStatus.auth_successful:
              raise SMTPAuthenticationError(response.code, response.message)
  
          return response