예제 #1
0
파일: decode.c 프로젝트: AleksMx/qfs
/* Recover data blocks x and y using syndromes Q & R. */
static void
rs_decode2qr(int n, int blocksize, int x, int y, v16 **data)
{
    int i;
    v16 qq, rr;
    const uint8_t* const c = rs_r2QR[rs_r2map[x][y]];
#ifndef KFS_QCRS_DONT_INLINE
    v16** pd = data + n - 1;
#endif

    memset(data[x], 0, blocksize);
    memset(data[y], 0, blocksize);
    for (i = 0; i < blocksize/sizeof(v16); i++) {
#ifndef KFS_QCRS_DONT_INLINE
        qq = (*pd)[i];
        rr = qq;
        while (data <= --pd) {
            const v16 d = (*pd)[i];
            qq = mul2(qq) ^ d;
            rr = mul2(mul2(rr)) ^ d;
        }
        pd = data + n + 2;
        rr ^= (*pd--)[i];
        qq ^= (*pd--)[i];
        pd--;
#else
        qq = Q(data, n, i) ^ data[n+1][i];
        rr = R(data, n, i) ^ data[n+2][i];
#endif
        data[x][i] = mulby(c[0], qq) ^ mulby(c[1], rr);
        data[y][i] = mulby(c[2], qq) ^ mulby(c[3], rr);
    }
}
예제 #2
0
파일: decode.c 프로젝트: AleksMx/qfs
/* Recover data blocks x and y using syndromes P & Q. */
static void
rs_decode2pq(int n, int blocksize, int x, int y, v16 **data)
{
    int i;
    v16 pp, qq;
    const uint8_t* const c = rs_r2PQ[rs_r2map[x][y]];
#ifndef KFS_QCRS_DONT_INLINE
    v16** pd = data + n - 1;
#endif

    memset(data[x], 0, blocksize);
    memset(data[y], 0, blocksize);
    for (i = 0; i < blocksize/sizeof(v16); i++) {
#ifndef KFS_QCRS_DONT_INLINE
        pp = (*pd)[i];
        qq = pp;
        while (data <= --pd) {
            const v16 d = (*pd)[i];
            pp ^= d;
            qq = mul2(qq) ^ d;
        }
        pd = data + n + 1;
        qq ^= (*pd--)[i];
        pp ^= (*pd--)[i];
#else
        pp = P(data, n, i) ^ data[n][i];
        qq = Q(data, n, i) ^ data[n+1][i];
#endif
        data[x][i] = mulby(c[0], pp) ^ mulby(c[1], qq);
        data[y][i] = mulby(c[2], pp) ^ mulby(c[3], qq);
    }
}
예제 #3
0
파일: decode.c 프로젝트: Abioy/qfs
/* Recover data blocks x and y using syndromes Q & R. */
static void
rs_decode2qr(int n, int blocksize, int x, int y, v16 **data)
{
    int i;
    v16 qq, rr;
    const uint8_t* const c = rs_r2QR[rs_r2map[x][y]];

    memset(data[x], 0, blocksize);
    memset(data[y], 0, blocksize);
    for (i = 0; i < blocksize/sizeof(v16); i++) {
        qq = Q(data, n, i) ^ data[n+1][i];
        rr = R(data, n, i) ^ data[n+2][i];
        data[x][i] = mulby(c[0], qq) ^ mulby(c[1], rr);
        data[y][i] = mulby(c[2], qq) ^ mulby(c[3], rr);
    }
}
예제 #4
0
파일: decode.c 프로젝트: Abioy/qfs
/* Recover data blocks x and y using syndromes P & Q. */
static void
rs_decode2pq(int n, int blocksize, int x, int y, v16 **data)
{
    int i;
    v16 pp, qq;
    const uint8_t* const c = rs_r2PQ[rs_r2map[x][y]];

    memset(data[x], 0, blocksize);
    memset(data[y], 0, blocksize);
    for (i = 0; i < blocksize/sizeof(v16); i++) {
        pp = P(data, n, i) ^ data[n][i];
        qq = Q(data, n, i) ^ data[n+1][i];
        data[x][i] = mulby(c[0], pp) ^ mulby(c[1], qq);
        data[y][i] = mulby(c[2], pp) ^ mulby(c[3], qq);
    }
}
예제 #5
0
파일: decode.c 프로젝트: AleksMx/qfs
/* Recover data block x using R syndrome. */
static void
rs_decode1r(int n, int blocksize, int x, v16 **data)
{
    int i;

    memset(data[x], 0, blocksize);
    for (i = 0; i < blocksize/sizeof(v16); i++)
        data[x][i] = mulby(rs_r1R[x], R(data, n, i) ^ data[n+2][i]);
}
예제 #6
0
파일: decode.c 프로젝트: Abioy/qfs
/* Recover data blocks x, y, & z using syndromes P, Q & R. */
static void
rs_decode3pqr(int n, int blocksize, int x, int y, int z, v16 **data)
{
    int i;
    v16 pp, qq, rr;
    const uint8_t* const c = rs_r3[rs_r3map[x][y][z]];

    memset(data[x], 0, blocksize);
    memset(data[y], 0, blocksize);
    memset(data[z], 0, blocksize);
    for (i = 0; i < blocksize/sizeof(v16); i++) {
        pp = P(data, n, i) ^ data[n][i];
        qq = Q(data, n, i) ^ data[n+1][i];
        rr = R(data, n, i) ^ data[n+2][i];
        data[x][i] = mulby(c[0], pp) ^ mulby(c[1], qq) ^ mulby(c[2], rr);
        data[y][i] = mulby(c[3], pp) ^ mulby(c[4], qq) ^ mulby(c[5], rr);
        data[z][i] = mulby(c[6], pp) ^ mulby(c[7], qq) ^ mulby(c[8], rr);
    }
}
예제 #7
0
파일: decode.c 프로젝트: AleksMx/qfs
/* Recover data blocks x, y, & z using syndromes P, Q & R. */
static void
rs_decode3pqr(int n, int blocksize, int x, int y, int z, v16 **data)
{
    int i;
    v16 pp, qq, rr;
    const uint8_t* const c = rs_r3[rs_r3map[x][y][z]];
#ifndef KFS_QCRS_DONT_INLINE
    v16** pd = data + n - 1;
#endif

    memset(data[x], 0, blocksize);
    memset(data[y], 0, blocksize);
    memset(data[z], 0, blocksize);
    for (i = 0; i < blocksize/sizeof(v16); i++) {
#ifndef KFS_QCRS_DONT_INLINE
        pp = (*pd)[i];
        qq = pp;
        rr = pp;
        while (data <= --pd) {
            const v16 d = (*pd)[i];
            pp ^= d;
            qq = mul2(qq) ^ d;
            rr = mul2(mul2(rr)) ^ d;
        }
        pd = data + n + 2;
        rr ^= (*pd--)[i];
        qq ^= (*pd--)[i];
        pp ^= (*pd--)[i];
#else
        pp = P(data, n, i) ^ data[n][i];
        qq = Q(data, n, i) ^ data[n+1][i];
        rr = R(data, n, i) ^ data[n+2][i];
#endif
        data[x][i] = mulby(c[0], pp) ^ mulby(c[1], qq) ^ mulby(c[2], rr);
        data[y][i] = mulby(c[3], pp) ^ mulby(c[4], qq) ^ mulby(c[5], rr);
        data[z][i] = mulby(c[6], pp) ^ mulby(c[7], qq) ^ mulby(c[8], rr);
    }
}