<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 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