7713c2 | 2016-06-16 | Henrik Grubbström (Grubba) | |
protected string(8bit) UNICODE(string s)
{
return Charset.encoder("utf16le")->feed(s)->drain();
}
protected string(8bit) DESL(string(8bit) key, string(8bit) data)
{
if (sizeof(key) != 16)
error("Unexpected key length: %O (%d)\n", key, sizeof(key));
if (sizeof(data) != 8)
error("Unexpected key length: %O (%d)\n", data, sizeof(data));
return .DES()->set_encrypt_key(.DES.fix_parity(key[..6]), 1)->crypt(data) +
.DES()->set_encrypt_key(.DES.fix_parity(key[7..13]), 1)->crypt(data) +
.DES()->set_encrypt_key(.DES.fix_parity(key[14..15] + ("\0" * 5)), 1)->
crypt(data);
}
constant LM_MAGIC = "KGS!@#$%";
string(8bit) LMOWFv1(string Passwd, string User, string UserDom)
{
Passwd = upper_case(Passwd) + ("\0"*14);
return .DES()->set_encrypt_key(.DES.fix_parity(Passwd[..6]), 1)->
crypt(LM_MAGIC) +
.DES()->set_encrypt_key(.DES.fix_parity(Passwd[7..13]), 1)->
crypt(LM_MAGIC);
}
string(8bit) NTOWFv1(string Passwd, string User, string UserDom)
{
return .MD4.hash(UNICODE(Passwd));
}
string(8bit) SBKv1(string Passwd, string User, string UserDom)
{
return .MD4.hash(NTOWFv1(Passwd, User, UserDom));
}
string(8bit) NTOWFv2(string Passwd, string User, string UserDom)
{
return .MD5.HMAC(.MD4.hash(UNICODE(Passwd)))->
update(UNICODE(upper_case(User) + UserDom))->digest();
}
string(8bit) LMOWFv2(string Passwd, string User, string UserDom)
{
return NTOWFv2(Passwd, User, UserDom);
}
|