Open wumao opened 8 years ago
/* * characters used for Base64 encoding / static const char *BASE64_CHARS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
/**
* encode three bytes using base64 (RFC 3548)
*
* @param triple three bytes that should be encoded
* @param result buffer of four characters where the result is stored
*/
static void _base64_encode_triple(unsigned char triple[3], char result[4])
{
int tripleValue, i;
tripleValue = triple[0];
tripleValue *= 256;
tripleValue += triple[1];
tripleValue *= 256;
tripleValue += triple[2];
for (i = 0; i<4; i++)
{
result[3 - i] = BASE64_CHARS[tripleValue % 64];
tripleValue /= 64;
}
}
/**
* encode an array of bytes using Base64 (RFC 3548)
*
* @param source the source buffer
* @param sourcelen the length of the source buffer
* @param target the target buffer
* @param targetlen the length of the target buffer
* @return 1 on success, 0 otherwise
*/
static int base64_encode(char *target, size_t targetlen, unsigned char *source, size_t sourcelen)
{
/* check if the result will fit in the target buffer */
if ((sourcelen + 2) / 3 * 4 > targetlen - 1)
return 0;
/* encode all full triples */
while (sourcelen >= 3)
{
_base64_encode_triple(source, target);
sourcelen -= 3;
source += 3;
target += 4;
}
/* encode the last one or two characters */
if (sourcelen > 0)
{
unsigned char temp[3];
memset(temp, 0, sizeof(temp));
memcpy(temp, source, sourcelen);
_base64_encode_triple(temp, target);
target[3] = '=';
if (sourcelen == 1)
target[2] = '=';
target += 4;
}
/* terminate the string */
target[0] = 0;
return 1;
}
use this base64_encode. from https://github.com/payden/libwebsock/blob/master/src/base64.c
Notice the call parameters are different order and return value:
base64_encode(shaHash, 20, responseKey, length);
size_t base64Length = base64len(20);
then it seems to work fine!
ssize_t readed = recv(clientSocket, gBuffer+readedLength, BUF_LEN-readedLength, 0);
I compile this lib use mipsel-openwrt-linux-gcc. run on router.
maybe void wsGetHandshakeAnswer(const struct handshake hs, uint8_t outFrame, *outLength) have a bad responseKey on x86 it is ok.