Rainer Weikusat
2016-12-28 22:22:37 UTC
Das vergleicht untentschluesselte aber als gueltig bekannte
ISAKMP-Nachrichten. Ausser in 'seltenen Faellen' ist deren Laenge ohne
Rest durch 8 teilbar. 64-bit-Alignment ist seitens des
Speicherallokationscodes sichergestellt.
Ist das wenigstens einigermassen verstaendlich?
-----------
static int is_this_msg(vchar_t *msg, struct isakmp_seen *seen)
{
uint8_t *p_msg, *p_seen;
unsigned cur, last, x;
last = msg->l;
if (last != seen->msg->l) return 0;
p_msg = (void *)msg->v;
p_seen = (void *)seen->msg->v;
/* no point comparing the cookies (=> RFC2408, 3.1) */
cur = 16;
do {
if (*(uint64_t *)(p_msg + cur) != *(uint64_t *)(p_seen + cur))
return 0;
cur += 8;
} while (cur < last);
switch (x = last % 8) {
case 7:
case 6:
case 5:
case 4:
if (*(uint32_t *)(p_msg + cur) != *(uint32_t *)(p_seen + cur))
return 0;
if (x == 4) return 1;
cur += 4;
if (x == 5) goto cmp_last;
case 3:
case 2:
if (*(uint16_t *)(p_msg + cur) != *(uint16_t *)(p_seen + cur))
return 0;
if (!(x & 1)) return 1;
cur += 2;
case 1:
cmp_last:
if (p_msg[cur] != p_seen[cur]) return 0;
}
return 1;
}
ISAKMP-Nachrichten. Ausser in 'seltenen Faellen' ist deren Laenge ohne
Rest durch 8 teilbar. 64-bit-Alignment ist seitens des
Speicherallokationscodes sichergestellt.
Ist das wenigstens einigermassen verstaendlich?
-----------
static int is_this_msg(vchar_t *msg, struct isakmp_seen *seen)
{
uint8_t *p_msg, *p_seen;
unsigned cur, last, x;
last = msg->l;
if (last != seen->msg->l) return 0;
p_msg = (void *)msg->v;
p_seen = (void *)seen->msg->v;
/* no point comparing the cookies (=> RFC2408, 3.1) */
cur = 16;
do {
if (*(uint64_t *)(p_msg + cur) != *(uint64_t *)(p_seen + cur))
return 0;
cur += 8;
} while (cur < last);
switch (x = last % 8) {
case 7:
case 6:
case 5:
case 4:
if (*(uint32_t *)(p_msg + cur) != *(uint32_t *)(p_seen + cur))
return 0;
if (x == 4) return 1;
cur += 4;
if (x == 5) goto cmp_last;
case 3:
case 2:
if (*(uint16_t *)(p_msg + cur) != *(uint16_t *)(p_seen + cur))
return 0;
if (!(x & 1)) return 1;
cur += 2;
case 1:
cmp_last:
if (p_msg[cur] != p_seen[cur]) return 0;
}
return 1;
}