All Downloads are FREE. Search and download functionalities are using the official Maven repository.

native.intel.packet.ctr_pc.ctr_pc.c Maven / Gradle / Ivy

Go to download

The Long Term Stable (LTS) Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. This jar contains the JCA/JCE provider and low-level API for the BC LTS version 2.73.4 for Java 8 and later.

There is a newer version: 2.73.6
Show newest version

#include "ctr_pc.h"

packet_err *
ctr_pc_process_packet(bool encryption, uint8_t *key, size_t keysize, uint8_t *iv, size_t ivLen, uint8_t *p_in,
                      size_t inLen, uint8_t *p_out, size_t *outputLen) {
    __m128i roundKeys[15];
    uint64_t ctr;
    uint64_t initialCTR;
    __m128i IV_le;
    uint32_t buf_pos = 0;
    __m128i partialBlock = _mm_setzero_si128();
    int num_rounds = generate_key(true, key, roundKeys, keysize);
    uint64_t ctrMask;
    bool ctrAtEnd = false;
    switch (ivLen) {
        case 16:
        case 8:
            ctrMask = 0xFFFFFFFFFFFFFFFF;
            break;
        case 15:
            ctrMask = 0xFF;
            break;
        case 14:
            ctrMask = 0xFFFF;
            break;
        case 13:
            ctrMask = 0xFFFFFF;
            break;
        case 12:
            ctrMask = 0xFFFFFFFF;
            break;
        case 11:
            ctrMask = 0xFFFFFFFFFF;
            break;
        case 10:
            ctrMask = 0xFFFFFFFFFFFF;
            break;
        case 9:
            ctrMask = 0xFFFFFFFFFFFFFF;
            break;
        default:
            assert(0);
    }
    if (ivLen < 16) {
        IV_le = _mm_setzero_si128();
        for (int t = 0; t < ivLen; t++) {
            ((uint8_t *) &IV_le)[15 - t] = iv[t]; // endian
        }
        initialCTR = 0;
    } else {
        //
        // Users know what they are getting into.
        //
        IV_le = _mm_loadu_si128((__m128i *) iv);
        IV_le = _mm_shuffle_epi8(IV_le, *SWAP_ENDIAN_128);

        ctr = (uint64_t) _mm_extract_epi64(IV_le, 0);
        initialCTR = ctr;
        IV_le = _mm_and_si128(IV_le, _mm_set_epi64x(-1, 0));
    }
    ctr = initialCTR;
    size_t written = 0;
    ctr_pc_process_bytes(p_in, inLen, p_out, &written, &buf_pos, &ctr, initialCTR, ctrMask, &ctrAtEnd, &IV_le,
                         roundKeys, num_rounds, &partialBlock);
    *outputLen = inLen;
    return NULL;
}






© 2015 - 2024 Weber Informatics LLC | Privacy Policy