Skip to content
This repository has been archived by the owner on Oct 8, 2020. It is now read-only.

recv == 0 #21

Open
wumao opened this issue Feb 11, 2016 · 2 comments
Open

recv == 0 #21

wumao opened this issue Feb 11, 2016 · 2 comments

Comments

@wumao
Copy link

wumao commented Feb 11, 2016

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.

@wumao
Copy link
Author

wumao commented Feb 11, 2016

/**
* 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

@yesco
Copy link

yesco commented Mar 15, 2016

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!

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants