X-Git-Url: https://asedeno.scripts.mit.edu/gitweb/?a=blobdiff_plain;f=sshdes.c;h=6ea32a14010c3ec6a0df340b50c65ed7825bf42c;hb=6b362191f1a2c6897e7b7bfa80beec1cd1f722fd;hp=fa8e53ce451b690364c1710ac0bf43bdeaf9b1c9;hpb=af6342ccf89429a72b58379ab2d4c0e37bfef94e;p=PuTTY.git diff --git a/sshdes.c b/sshdes.c index fa8e53ce..6ea32a14 100644 --- a/sshdes.c +++ b/sshdes.c @@ -746,24 +746,24 @@ static void des_cbc3_decrypt(unsigned char *dest, const unsigned char *src, static void *des3_make_context(void) { - return smalloc(3*sizeof(DESContext)); + return snewn(3, DESContext); } static void *des3_ssh1_make_context(void) { /* Need 3 keys for each direction, in SSH1 */ - return smalloc(6*sizeof(DESContext)); + return snewn(6, DESContext); } static void *des_make_context(void) { - return smalloc(sizeof(DESContext)); + return snew(DESContext); } static void *des_ssh1_make_context(void) { /* Need one key for each direction, in SSH1 */ - return smalloc(2*sizeof(DESContext)); + return snewn(2, DESContext); } static void des3_free_context(void *handle) /* used for both 3DES and DES */ @@ -897,6 +897,43 @@ void des3_encrypt_pubkey_ossh(unsigned char *key, unsigned char *iv, memset(ourkeys, 0, sizeof(ourkeys)); } +static void des_keysetup_xdmauth(unsigned char *keydata, DESContext *dc) +{ + unsigned char key[8]; + int i, nbits, j; + unsigned int bits; + + bits = 0; + nbits = 0; + j = 0; + for (i = 0; i < 8; i++) { + if (nbits < 7) { + bits = (bits << 8) | keydata[j]; + nbits += 8; + j++; + } + key[i] = (bits >> (nbits - 7)) << 1; + bits &= ~(0x7F << (nbits - 7)); + nbits -= 7; + } + + des_key_setup(GET_32BIT_MSB_FIRST(key), GET_32BIT_MSB_FIRST(key + 4), dc); +} + +void des_encrypt_xdmauth(unsigned char *keydata, unsigned char *blk, int len) +{ + DESContext dc; + des_keysetup_xdmauth(keydata, &dc); + des_cbc_encrypt(blk, blk, 24, &dc); +} + +void des_decrypt_xdmauth(unsigned char *keydata, unsigned char *blk, int len) +{ + DESContext dc; + des_keysetup_xdmauth(keydata, &dc); + des_cbc_decrypt(blk, blk, 24, &dc); +} + static const struct ssh2_cipher ssh_3des_ssh2 = { des3_make_context, des3_free_context, des3_iv, des3_key, des3_ssh2_encrypt_blk, des3_ssh2_decrypt_blk,