Exemple #1
0
vector< vector<u32> > kmeans_pp(const vector< vector<f64> >& points, u32 k,
                                algo::iLCG& lcg,
                                      vector< vector<f64> >& centers)
{
    if (points.size() == 0)
        throw eInvalidArgument("There must be points to cluster!");
    if (points[0].size() == 0)
        throw eInvalidArgument("There must be at least one dimension!");
    for (size_t i = 1; i < points.size(); i++)
        if (points[i].size() != points[0].size())
            throw eInvalidArgument("All data points must have the same dimensionality.");
    if (k == 0)
        throw eInvalidArgument("Clustering into zero clusters makes no sense.");

    centers.resize(k);
    centers[0] = points[lcg.next() % points.size()];
    for (u32 i = 1; i < k; i++)
    {
        vector<f64> cumDists(points.size());
        for (size_t d = 0; d < cumDists.size(); d++)
        {
            f64 mind = s_distanceSquared(points[d], centers[0]);
            for (u32 j = 1; j < i; j++)
                mind = std::min(mind, s_distanceSquared(points[d], centers[j]));
            cumDists[d] = (d == 0) ? (mind) : (cumDists[d-1]+mind);
        }

        f64 ran = ((f64)lcg.next()) / ((f64)lcg.randMax()) * cumDists.back();
        size_t d;
        for (d = 0; ran > cumDists[d]; d++) { }
        centers[i] = points[d];
    }

    return kmeans(points, k, centers);
}
Exemple #2
0
static
nKeyLengthAES s_toKeyLen(size_t vectsize)
{
    switch (vectsize)
    {
        case 128/8: return k128bit;
        case 192/8: return k192bit;
        case 256/8: return k256bit;
        default: throw eInvalidArgument("Invalid aes key length!");
    }
}
Exemple #3
0
vector< vector<u32> > kmeans(const vector< vector<f64> >& points, u32 k,
                             f64 rmin, f64 rmax, algo::iLCG& lcg,
                                   vector< vector<f64> >& centers)
{
    if (points.size() == 0)
        throw eInvalidArgument("There must be points to cluster!");
    if (points[0].size() == 0)
        throw eInvalidArgument("There must be at least one dimension!");
    for (size_t i = 1; i < points.size(); i++)
        if (points[i].size() != points[0].size())
            throw eInvalidArgument("All data points must have the same dimensionality.");
    if (k == 0)
        throw eInvalidArgument("Clustering into zero clusters makes no sense.");
    if (rmin >= rmax)
        throw eInvalidArgument("rmin >= rmax makes no sense.");

    centers.resize(k);
    for (u32 i = 0; i < k; i++)
        centers[i] = s_randPoint(lcg, rmin, rmax, (u32)points[0].size());

    return kmeans(points, k, centers);
}
Exemple #4
0
tSecureStream::tSecureStream(iReadable* internalReadable,
                             iWritable* internalWritable,
                             const tRSA& rsa,
                             string appGreeting)
    : m_internal_readable(internalReadable),
      m_internal_writable(internalWritable)
{
    if (internalReadable == NULL || internalWritable == NULL)
        throw eInvalidArgument("The internal streams may not be null.");
    if (rsa.hasPrivateKey())
        m_setupServer(rsa, appGreeting);
    else
        m_setupClient(rsa, appGreeting);
}
Exemple #5
0
vector< vector<u32> > kmeans(const vector< vector<f64> >& points, u32 k,
                             vector< vector<f64> >& centers)
{
    if (points.size() == 0)
        throw eInvalidArgument("There must be points to cluster!");
    if (points[0].size() == 0)
        throw eInvalidArgument("There must be at least one dimension!");
    for (size_t i = 1; i < points.size(); i++)
        if (points[i].size() != points[0].size())
            throw eInvalidArgument("All data points must have the same dimensionality.");
    if (k == 0)
        throw eInvalidArgument("Clustering into zero clusters makes no sense.");
    if ((u32)centers.size() != k)
        throw eInvalidArgument("You must supply k initial centers to this version of kmeans().");
    for (u32 i = 0; i < k; i++)
        if (centers[i].size() != points[0].size())
            throw eInvalidArgument("All initial centers must have the same dimensionality as the data points.");

    vector< vector<u32> > clusters(k);

    while (true)
    {
        vector< vector<u32> > newClusters(k);

        for (size_t i = 0; i < points.size(); i++)
        {
            f64 dist = s_distanceSquared(points[i], centers[0]);
            u32 closest = 0;
            for (u32 c = 1; c < k; c++)
            {
                f64 distHere = s_distanceSquared(points[i], centers[c]);
                if (distHere < dist)
                {
                    closest = c;
                    dist = distHere;
                }
            }
            newClusters[closest].push_back((u32)i);
        }

        for (u32 i = 0; i < k; i++)
            if (newClusters[i].size() > 0)
                centers[i] = s_calcCenter(points, newClusters[i]);
            // Else, what should I do? Leave it? Randomize a new center?

        if (clusters == newClusters)
            break;

        clusters = newClusters;
    }

    return clusters;
}
Exemple #6
0
tAddr tSocket::receive(u8* buf, i32 maxSize, i32& bufSize, u16& port)
{
    if (maxSize <= 0)
        throw eInvalidArgument("maxSize must be positive");

    struct sockaddr_in6 sockAddr;
    socklen_t sockAddrLen = sizeof(sockAddr);
    socklen_t returnedLen = sockAddrLen;

    #if __linux__ || __APPLE__ || __CYGWIN__
    int flags = MSG_TRUNC;
    #elif __MINGW32__
    int flags = 0;
    #else
    #error What platform are you on!?
    #endif

    ssize_t ret = ::recvfrom(m_fd, (char*)buf, (size_t)maxSize, flags,
                             (struct sockaddr*)&sockAddr,
                             &returnedLen);

    if (ret == -1)
    {
        throw eRuntimeError(
                std::string("Cannot recvfrom udp socket. Error: ") +
                strerror(errno));
    }

    if (returnedLen > sockAddrLen)
    {
        throw eLogicError("Something is crazy wrong (2).");
    }

    bufSize = (i32) ret;

    tAddr addr((struct sockaddr*)&sockAddr, (int)returnedLen);
    port = addr.getUpperProtoPort();
    return addr;
}
Exemple #7
0
void tSocket::send(const u8* buf, i32 bufSize, tAddr dest, u16 port)
{
    if (dest.getVersion() == kIPv4)
    {
        tAddrGroup addrGroup(std::string("::ffff:") + dest.toString());
        dest = addrGroup[0];
    }

    if (bufSize <= 0)
        throw eInvalidArgument("bufSize must be positive");
    dest.setUpperProtoPort(port);
    int flags = 0;
    ssize_t ret = ::sendto(m_fd, (const char*)buf, (size_t)bufSize, flags,
                           (struct sockaddr*)(dest.m_sockaddr),
                           dest.m_sockaddrlen);
    if (ret == -1)
    {
        throw eRuntimeError(
                std::string("Cannot sendto udp socket. Error: ") +
                strerror(errno));
    }
}
void tImageAsyncReadable::takeInput(const u8* buffer, i32 length)
{
    if (length <= 0)
        throw eInvalidArgument("Stream read/write length must be >0");

    while (length > 0)
    {
        switch (m_stage)
        {
            case kStageBufUsed:
            {
                while (m_bufPos < 4 && length > 0)
                {
                    m_buf[m_bufPos++] = *buffer++;
                    --length;
                }
                if (m_bufPos == 4)
                {
                    m_bufPos = 0;
                    m_stage = kStageBufData;
                    m_image.setBufUsed(s_toU32(m_buf));
                    if (m_image.bufSize() < m_image.bufUsed())
                        m_image.setBufSize(m_image.bufUsed());
                }
                break;
            }

            case kStageBufData:
            {
                u32 bufUsed = m_image.bufUsed();
                u8* imagebuf = m_image.buf();
                while (m_bufPos < bufUsed && length > 0)
                {
                    imagebuf[m_bufPos++] = *buffer++;
                    --length;
                }
                if (m_bufPos == bufUsed)
                {
                    m_bufPos = 0;
                    m_stage = kStageWidth;
                }
                break;
            }

            case kStageWidth:
            {
                while (m_bufPos < 4 && length > 0)
                {
                    m_buf[m_bufPos++] = *buffer++;
                    --length;
                }
                if (m_bufPos == 4)
                {
                    m_bufPos = 0;
                    m_stage = kStageHeight;
                    m_image.setWidth(s_toU32(m_buf));
                }
                break;
            }

            case kStageHeight:
            {
                while (m_bufPos < 4 && length > 0)
                {
                    m_buf[m_bufPos++] = *buffer++;
                    --length;
                }
                if (m_bufPos == 4)
                {
                    m_bufPos = 0;
                    m_stage = kStageFormat;
                    m_image.setHeight(s_toU32(m_buf));
                }
                break;
            }

            case kStageFormat:
            {
                while (m_bufPos < 4 && length > 0)
                {
                    m_buf[m_bufPos++] = *buffer++;
                    --length;
                }
                if (m_bufPos == 4)
                {
                    m_bufPos = 0;
                    m_stage = kStageBufUsed;
                    m_image.setFormat((nImageFormat)(s_toU32(m_buf)));
                    try {
                        m_observer->gotImage(m_image);
                    } catch (...) { }
                }
                break;
            }

            default:
            {
                throw eRuntimeError("Unknown state. How did this happen!?");
            }
        }
    }
}
Exemple #9
0
void tDecAES::dec(u8* ctbuf, u8* ptbuf, u32 numblocks, u8* iv)
{
    // Fast ASM impl:
    if (m_useASM)
    {
        sAesData data;
        data.in_block = ctbuf;
        data.out_block = ptbuf;
        data.expanded_key = m_expandedKey;
        data.iv = iv;
        data.num_blocks = numblocks;
        if (m_opmode == kOpModeCBC && iv)
        {
            switch (m_keylen)
            {
                case k128bit: iDec128_CBC(&data); break;
                case k192bit: iDec192_CBC(&data); break;
                case k256bit: iDec256_CBC(&data); break;
                default: throw eInvalidArgument("The keylen parameter is not valid!");
            }
        }
        else
        {
            switch (m_keylen)
            {
                case k128bit: iDec128(&data); break;
                case k192bit: iDec192(&data); break;
                case k256bit: iDec256(&data); break;
                default: throw eInvalidArgument("The keylen parameter is not valid!");
            }
        }
    }

    // Fallback impl:
    else
    {
        u32* rk = m_rk;
        int Nr = m_Nr;
        if (m_opmode == kOpModeCBC && iv)
        {
            u8 ct[AES_BLOCK_SIZE];
            for (u32 i = 0; numblocks > 0; i+=AES_BLOCK_SIZE, --numblocks)
            {
                for (u32 j = 0; j < AES_BLOCK_SIZE; j++)
                    ct[j] = ctbuf[i+j];
                rijndaelDecrypt(rk, Nr, ct, ptbuf+i);
                for (u32 j = 0; j < AES_BLOCK_SIZE; j++)
                {
                    ptbuf[i+j] ^= iv[j];
                    iv[j] = ct[j];
                }
            }
        }
        else
        {
            for (u32 i = 0; numblocks > 0; i+=AES_BLOCK_SIZE, --numblocks)
            {
                rijndaelDecrypt(rk, Nr, ctbuf+i, ptbuf+i);
            }
        }
    }
}
Exemple #10
0
void tDecAES::m_init(nOperationModeAES opmode, const u8 key[], nKeyLengthAES keylen,
                     bool useFastASM)
{
    // Set fields.
    m_opmode = opmode;
    m_keylen = keylen;
    m_useASM = useFastASM;
    m_expandedKey = NULL;

    // Check the opmode.
    switch (opmode)
    {
        case kOpModeECB: break;
        case kOpModeCBC: break;
        default: throw eInvalidArgument("The opmode parameter is not valid!");
    }

    // Check the keylen.
    switch (keylen)
    {
        case k128bit: break;
        case k192bit: break;
        case k256bit: break;
        default: throw eInvalidArgument("The keylen parameter is not valid!");
    }

    // Fast ASM setup:
    if (m_useASM)
    {
        m_expandedKey = s_aligned_malloc(256, 16);
        switch (keylen)
        {
            case k128bit:
            {
                u8* key_copy = new u8[16];
                memcpy(key_copy, key, 16);
                iDecExpandKey128(key_copy, m_expandedKey);
                delete [] key_copy;
                break;
            }
            case k192bit:
            {
                u8* key_copy = new u8[24];
                memcpy(key_copy, key, 24);
                iDecExpandKey192(key_copy, m_expandedKey);
                delete [] key_copy;
                break;
            }
            case k256bit:
            {
                u8* key_copy = new u8[32];
                memcpy(key_copy, key, 32);
                iDecExpandKey256(key_copy, m_expandedKey);
                delete [] key_copy;
                break;
            }
            default: throw eInvalidArgument("The keylen parameter is not valid!");
        }
    }

    // Fallback setup:
    else
    {
        int keybits;
        int expectedNr;
        switch (keylen)
        {
            case k128bit: keybits = 128; expectedNr = 10; break;
            case k192bit: keybits = 192; expectedNr = 12; break;
            case k256bit: keybits = 256; expectedNr = 14; break;
            default: throw eInvalidArgument("The keylen parameter is not valid!");
        }
        m_Nr = rijndaelKeySetupDec(m_rk, key, keybits);
        if (m_Nr != expectedNr)
            throw eImpossiblePath();
    }
}