Java の CRAM-MD5 を使用した SMTP で指定されたガイドラインに従って、入力として nonce が与えられたときの応答を計算する小さなプログラムを Python で作成しました。
import hashlib
from base64 import b64encode, b64decode
import sys
from decimal import *
#MD5(('secret' XOR opad), MD5(('secret' XOR ipad), challenge))
#opad - 0x5C, ipad - 0x36.
def main(nonce):
pwd = bytearray("password")
for i in range(len(pwd)):
pwd[i] = pwd[i] ^ 0x36
m1 = hashlib.md5()
m1.update(pwd.decode())
m1.update(b64decode(nonce))
m2 = hashlib.md5()
pwd = bytearray("password")
for i in range(len(pwd)):
pwd[i] = pwd[i] ^ 0x5C
m2.update(pwd.decode())
m2.update(m1.hexdigest())
print b64encode("username " + m2.hexdigest())
if __name__ == "__main__":
if (len(sys.argv) != 2):
print("ERROR usage: smtp-cram-md5 <nonce>")
else:
main(sys.argv[1])
しかし、SMTP サーバーは、このプログラムによって生成された応答を拒否します。誰かが私が間違っていることを指摘できますか?