diff --git a/lib/modules/Crypto/des3.pike b/lib/modules/Crypto/des3.pike index a62481ea10ae9281f67dc8bc3b49c80b20e640b3..e1d72af22792d0bb15df46c037fedc54d218285c 100644 --- a/lib/modules/Crypto/des3.pike +++ b/lib/modules/Crypto/des3.pike @@ -16,21 +16,31 @@ int query_key_size() { return 16; } int query_block_size() { return 8; } +private array(string) split_key(string key) +{ + string k1 = key[..7]; + string k2 = key[8..15]; + string k3 = (strlen(key) > 16) ? key[16..] : k1; + return ({ k1, k2, k3 }); +} + /* An exception will be raised if key is weak */ object set_encrypt_key(string key) { - pipe :: set_encrypt_key(key[..7], key[8..], key[..7]); + array(string) keys = split_key(key); + pipe :: set_encrypt_key( @ keys); /* Switch mode of middle crypto */ - d[1]->set_decrypt_key(key[8..]); + d[1]->set_decrypt_key(keys[1]); return this_object(); } /* An exception will be raised if key is weak */ object set_decrypt_key(string key) { - pipe :: set_decrypt_key(key[..7], key[8..], key[..7]); + array(string) keys = split_key(key); + pipe :: set_decrypt_key( @ keys); /* Switch mode of middle crypto */ - d[1]->set_encrypt_key(key[8..]); + d[1]->set_encrypt_key(keys[1]); return this_object(); }