mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-01-09 09:27:59 +00:00
5b30e6f7a6
Similarly to 'utils', I've moved all the stuff in the crypto build-time library into a source directory of its own, and while I'm at it, split up the monolithic sshauxcrypt.c into its various unrelated parts. This is also an opportunity to remove the annoying 'ssh' prefix from the front of the file names, and give several of them less cryptic names.
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);
|
|
}
|