1
0
Fork 0
mirror of https://github.com/warmcat/libwebsockets.git synced 2025-03-09 00:00:04 +01:00

fix-md5-problem.patch

Signed-off-by: Andy Green <andy@warmcat.com>
This commit is contained in:
Andy Green 2010-11-15 22:08:00 +00:00
parent 24cc0aea16
commit f2f54d5d26
4 changed files with 50 additions and 64 deletions

View file

@ -22,12 +22,13 @@
#include "private-libwebsockets.h"
static int interpret_key(const char *key, unsigned int *result)
static int interpret_key(const char *key, unsigned long *result)
{
char digits[20];
int digit_pos = 0;
const char *p = key;
int spaces = 0;
unsigned int spaces = 0;
unsigned long long acc;
while (*p) {
if (isdigit(*p)) {
@ -50,7 +51,12 @@ static int interpret_key(const char *key, unsigned int *result)
if (!spaces)
return -3;
*result = atol(digits) / spaces;
/*
* long long is absolutely needed since "digits" can be a multiple
* of a 32-bit range number
*/
acc = atoll(digits);
*result = acc / spaces;
return 0;
}
@ -67,7 +73,7 @@ libwebsocket_read(struct libwebsocket *wsi, unsigned char * buf, size_t len)
{
size_t n;
char *p;
unsigned int key1, key2;
unsigned long key1, key2;
unsigned char sum[16];
char *response;

View file

@ -168,7 +168,7 @@ int libwebsocket_create_server(int port,
int opt = 1;
#ifdef LWS_OPENSSL_SUPPORT
const SSL_METHOD *method;
SSL_METHOD *method;
char ssl_err_buf[512];
use_ssl = ssl_cert_filepath != NULL && ssl_private_key_filepath != NULL;

View file

@ -1,57 +1,39 @@
/*
* Loosely based from GPL2+later Polarssl MD5 available here in its
* original form:
*
* Modified from Polarssl here
* http://polarssl.org/show_source?file=md5
* under GPL2 or later
*/
#include <string.h>
#include <stdio.h>
#include <endian.h>
#ifdef htobe16
#else
/* Conversion interfaces. */
# include <byteswap.h>
# if __BYTE_ORDER == __LITTLE_ENDIAN
# define htobe16(x) __bswap_16 (x)
# define htole16(x) (x)
# define be16toh(x) __bswap_16 (x)
# define le16toh(x) (x)
# define htobe32(x) __bswap_32 (x)
# define htole32(x) (x)
# define be32toh(x) __bswap_32 (x)
# define le32toh(x) (x)
# define htobe64(x) __bswap_64 (x)
# define htole64(x) (x)
# define be64toh(x) __bswap_64 (x)
# define le64toh(x) (x)
# else
# define htobe16(x) (x)
# define htole16(x) __bswap_16 (x)
# define be16toh(x) (x)
# define le16toh(x) __bswap_16 (x)
# define htobe32(x) (x)
# define htole32(x) __bswap_32 (x)
# define be32toh(x) (x)
# define le32toh(x) __bswap_32 (x)
# define htobe64(x) (x)
# define htole64(x) __bswap_64 (x)
# define be64toh(x) (x)
# define le64toh(x) __bswap_64 (x)
# endif
#endif
#define GET_ULONG_LE(n, b, i) \
{ \
(n) = ((unsigned long)(b)[i]) \
| ((unsigned long)(b)[(i) + 1] << 8) \
| ((unsigned long)(b)[(i) + 2] << 16) \
| ((unsigned long)(b)[(i) + 3] << 24); \
}
#define PUT_ULONG_LE(n, b, i) \
{ \
(b)[i] = (unsigned char)(n); \
(b)[(i) + 1] = (unsigned char)((n) >> 8); \
(b)[(i) + 2] = (unsigned char)((n) >> 16); \
(b)[(i) + 3] = (unsigned char)((n) >> 24); \
}
static const unsigned char md5_padding[64] = {
0x80
0x80, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
};
static const unsigned long state_init[] = {
@ -61,11 +43,11 @@ static const unsigned long state_init[] = {
static void
md5_process(unsigned long *state, const unsigned char *data)
{
unsigned long X[16], A, B, C, D;
int n;
for (n = 0; n < 16; n++)
X[n] = htole32(*(unsigned long *)(&data[n << 2]));
unsigned long X[16], A, B, C, D;
int v;
for (v = 0; v < 16; v++)
GET_ULONG_LE(X[v], data, v << 2);
#define S(x, n) ((x << n) | ((x & 0xFFFFFFFF) >> (32 - n)))
@ -186,7 +168,7 @@ void md5_update(unsigned long * state, unsigned char * buffer,
state[1]++;
if (left && ilen >= fill) {
memcpy((void *)(buffer + left), (void *)input, fill);
memcpy(buffer + left, input, fill);
md5_process(&state[2], buffer);
input += fill;
ilen -= fill;
@ -200,7 +182,7 @@ void md5_update(unsigned long * state, unsigned char * buffer,
}
if (ilen > 0)
memcpy((void *)(buffer + left), (void *) input, ilen);
memcpy(buffer + left, input, ilen);
}
void
@ -211,7 +193,6 @@ libwebsockets_md5(const unsigned char *input, int ilen, unsigned char *output)
unsigned char msglen[8];
unsigned long state[6];
unsigned char buffer[64];
unsigned long *p = (unsigned long *)&msglen[0];
memcpy(&state[0], &state_init[0], sizeof(state_init));
@ -220,8 +201,8 @@ libwebsockets_md5(const unsigned char *input, int ilen, unsigned char *output)
high = (state[0] >> 29) | (state[1] << 3);
low = state[0] << 3;
*p++ = le32toh(low);
*p = le32toh(high);
PUT_ULONG_LE(low, msglen, 0);
PUT_ULONG_LE(high, msglen, 4);
last = state[0] & 0x3F;
padn = (last < 56) ? (56 - last) : (120 - last);
@ -229,11 +210,10 @@ libwebsockets_md5(const unsigned char *input, int ilen, unsigned char *output)
md5_update(state, buffer, md5_padding, padn);
md5_update(state, buffer, msglen, 8);
p = (unsigned long *)&output[0];
*p++ = le32toh(state[2]);
*p++ = le32toh(state[3]);
*p++ = le32toh(state[4]);
*p++ = le32toh(state[5]);
PUT_ULONG_LE(state[2], output, 0);
PUT_ULONG_LE(state[3], output, 4);
PUT_ULONG_LE(state[4], output, 8);
PUT_ULONG_LE(state[5], output, 12);
}

View file

@ -1,6 +1,6 @@
Name: libwebsockets
Version: 0.1
Release: 17.gmaster_523a3971%{?dist}
Release: 26.gmaster_6d972248%{?dist}
Summary: Websocket Server Library
Group: System