deattack.c revision 7c478bd95313f5f23a4c958a745db2134aa03244
/*
* Cryptographic attack detector for ssh - source code
*
* Copyright (c) 1998 CORE SDI S.A., Buenos Aires, Argentina.
*
* All rights reserved. Redistribution and use in source and binary
* forms, with or without modification, are permitted provided that
* this copyright notice is retained.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES ARE DISCLAIMED. IN NO EVENT SHALL CORE SDI S.A. BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY OR
* CONSEQUENTIAL DAMAGES RESULTING FROM THE USE OR MISUSE OF THIS
* SOFTWARE.
*
* Ariel Futoransky <futo@core-sdi.com>
*/
#include "includes.h"
RCSID("$OpenBSD: deattack.c,v 1.18 2002/03/04 17:27:39 stevesk Exp $");
#pragma ident "%Z%%M% %I% %E% SMI"
#include "deattack.h"
#include "log.h"
#include "crc32.h"
#include "getput.h"
#include "xmalloc.h"
#include "deattack.h"
/* SSH Constants */
#define SSH_BLOCKSIZE (8)
/* Hashing constants */
#define HASH_ENTRYSIZE (2)
#define HASH_UNUSEDCHAR (0xff)
#define HASH_UNUSED (0xffff)
#define HASH_IV (0xfffe)
/* Hash function (Input keys are cipher results) */
static void
{
b ^= *a;
}
/* detect if a block is used in a particular pattern */
static int
{
u_char *c;
crc = 0;
crc_update(&crc, 0);
}
if (!CMP(S, c)) {
crc_update(&crc, 0);
} else {
crc_update(&crc, 0);
crc_update(&crc, 0);
}
}
return (crc == 0);
}
/* Detect a crc32 compensation attack on a packet */
int
{
u_int32_t i, j;
u_int32_t l;
u_char *c;
u_char *d;
len % SSH_BLOCKSIZE != 0) {
}
;
if (h == NULL) {
debug("Installing crc compensation attack detector.");
n = l;
} else {
if (l > n) {
n = l;
}
}
if (len <= HASH_MINBLOCKS) {
return (DEATTACK_DETECTED);
else
break;
}
for (d = buf; d < c; d += SSH_BLOCKSIZE) {
if (!CMP(c, d)) {
return (DEATTACK_DETECTED);
else
break;
}
}
}
return (DEATTACK_OK);
}
if (IV)
i = (i + 1) & (n - 1)) {
if (h[i] == HASH_IV) {
return (DEATTACK_DETECTED);
else
break;
}
return (DEATTACK_DETECTED);
else
break;
}
}
h[i] = j;
}
return (DEATTACK_OK);
}