mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 09:27:59 +00:00
54 lines
1.3 KiB
C
54 lines
1.3 KiB
C
|
/*
|
||
|
* Convenience functions to encrypt and decrypt the cookies used in
|
||
|
* XDM-AUTHORIZATION-1.
|
||
|
*/
|
||
|
|
||
|
#include "ssh.h"
|
||
|
|
||
|
static ssh_cipher *des_xdmauth_cipher(const void *vkeydata)
|
||
|
{
|
||
|
/*
|
||
|
* XDM-AUTHORIZATION-1 uses single-DES, but packs the key into 7
|
||
|
* bytes, so here we have to repack it manually into the canonical
|
||
|
* form where it occupies 8 bytes each with the low bit unused.
|
||
|
*/
|
||
|
const unsigned char *keydata = (const unsigned char *)vkeydata;
|
||
|
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;
|
||
|
}
|
||
|
|
||
|
ssh_cipher *c = ssh_cipher_new(&ssh_des);
|
||
|
ssh_cipher_setkey(c, key);
|
||
|
smemclr(key, sizeof(key));
|
||
|
ssh_cipher_setiv(c, key);
|
||
|
return c;
|
||
|
}
|
||
|
|
||
|
void des_encrypt_xdmauth(const void *keydata, void *blk, int len)
|
||
|
{
|
||
|
ssh_cipher *c = des_xdmauth_cipher(keydata);
|
||
|
ssh_cipher_encrypt(c, blk, len);
|
||
|
ssh_cipher_free(c);
|
||
|
}
|
||
|
|
||
|
void des_decrypt_xdmauth(const void *keydata, void *blk, int len)
|
||
|
{
|
||
|
ssh_cipher *c = des_xdmauth_cipher(keydata);
|
||
|
ssh_cipher_decrypt(c, blk, len);
|
||
|
ssh_cipher_free(c);
|
||
|
}
|