SASC
DVBSoftCAM

i_cbc.c File Reference

#include "idea.h"
#include "idea_lcl.h"

Go to the source code of this file.

Functions

void idea_cbc_encrypt (const unsigned char *in, unsigned char *out, long length, IDEA_KEY_SCHEDULE *ks, unsigned char *iv, int encrypt)
void idea_encrypt (unsigned long *d, IDEA_KEY_SCHEDULE *key)

Function Documentation

void idea_cbc_encrypt ( const unsigned char *  in,
unsigned char *  out,
long  length,
IDEA_KEY_SCHEDULE *  ks,
unsigned char *  iv,
int  encrypt 
)

Definition at line 62 of file i_cbc.c.

References idea_encrypt(), l2n, l2nn, n2l, and n2ln.

        {
        register unsigned long tin0,tin1;
        register unsigned long tout0,tout1,xor0,xor1;
        register long l=length;
        unsigned long tin[2];

        if (encrypt)
                {
                n2l(iv,tout0);
                n2l(iv,tout1);
                iv-=8;
                for (l-=8; l>=0; l-=8)
                        {
                        n2l(in,tin0);
                        n2l(in,tin1);
                        tin0^=tout0;
                        tin1^=tout1;
                        tin[0]=tin0;
                        tin[1]=tin1;
                        idea_encrypt(tin,ks);
                        tout0=tin[0]; l2n(tout0,out);
                        tout1=tin[1]; l2n(tout1,out);
                        }
                if (l != -8)
                        {
                        n2ln(in,tin0,tin1,l+8);
                        tin0^=tout0;
                        tin1^=tout1;
                        tin[0]=tin0;
                        tin[1]=tin1;
                        idea_encrypt(tin,ks);
                        tout0=tin[0]; l2n(tout0,out);
                        tout1=tin[1]; l2n(tout1,out);
                        }
                l2n(tout0,iv);
                l2n(tout1,iv);
                }
        else
                {
                n2l(iv,xor0);
                n2l(iv,xor1);
                iv-=8;
                for (l-=8; l>=0; l-=8)
                        {
                        n2l(in,tin0); tin[0]=tin0;
                        n2l(in,tin1); tin[1]=tin1;
                        idea_encrypt(tin,ks);
                        tout0=tin[0]^xor0;
                        tout1=tin[1]^xor1;
                        l2n(tout0,out);
                        l2n(tout1,out);
                        xor0=tin0;
                        xor1=tin1;
                        }
                if (l != -8)
                        {
                        n2l(in,tin0); tin[0]=tin0;
                        n2l(in,tin1); tin[1]=tin1;
                        idea_encrypt(tin,ks);
                        tout0=tin[0]^xor0;
                        tout1=tin[1]^xor1;
                        l2nn(tout0,tout1,out,l+8);
                        xor0=tin0;
                        xor1=tin1;
                        }
                l2n(xor0,iv);
                l2n(xor1,iv);
                }
        tin0=tin1=tout0=tout1=xor0=xor1=0;
        tin[0]=tin[1]=0;
        }
void idea_encrypt ( unsigned long *  d,
IDEA_KEY_SCHEDULE *  key 
)

Definition at line 136 of file i_cbc.c.

References idea_key_st::data, E_IDEA, IDEA_INT, and idea_mul.

        {
        register IDEA_INT *p;
        register unsigned long x1,x2,x3,x4,t0,t1,ul;

        x2=d[0];
        x1=(x2>>16);
        x4=d[1];
        x3=(x4>>16);

        p= &(key->data[0][0]);

        E_IDEA(0);
        E_IDEA(1);
        E_IDEA(2);
        E_IDEA(3);
        E_IDEA(4);
        E_IDEA(5);
        E_IDEA(6);
        E_IDEA(7);

        x1&=0xffff;
        idea_mul(x1,x1,*p,ul); p++;

        t0= x3+ *(p++);
        t1= x2+ *(p++);

        x4&=0xffff;
        idea_mul(x4,x4,*p,ul);

        d[0]=(t0&0xffff)|((x1&0xffff)<<16);
        d[1]=(x4&0xffff)|((t1&0xffff)<<16);
        }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines