void cast5_ecb_encrypt(const unsigned char *pt, unsigned char *ct, symmetric_key *key) { ulong32 R, L; _ARGCHK(pt != NULL); _ARGCHK(ct != NULL); _ARGCHK(key != NULL); LOAD32H(L,&pt[0]); LOAD32H(R,&pt[4]); L ^= FI(R, key->cast5.K[0], key->cast5.K[16]); R ^= FII(L, key->cast5.K[1], key->cast5.K[17]); L ^= FIII(R, key->cast5.K[2], key->cast5.K[18]); R ^= FI(L, key->cast5.K[3], key->cast5.K[19]); L ^= FII(R, key->cast5.K[4], key->cast5.K[20]); R ^= FIII(L, key->cast5.K[5], key->cast5.K[21]); L ^= FI(R, key->cast5.K[6], key->cast5.K[22]); R ^= FII(L, key->cast5.K[7], key->cast5.K[23]); L ^= FIII(R, key->cast5.K[8], key->cast5.K[24]); R ^= FI(L, key->cast5.K[9], key->cast5.K[25]); L ^= FII(R, key->cast5.K[10], key->cast5.K[26]); R ^= FIII(L, key->cast5.K[11], key->cast5.K[27]); if (key->cast5.keylen > 10) { L ^= FI(R, key->cast5.K[12], key->cast5.K[28]); R ^= FII(L, key->cast5.K[13], key->cast5.K[29]); L ^= FIII(R, key->cast5.K[14], key->cast5.K[30]); R ^= FI(L, key->cast5.K[15], key->cast5.K[31]); } STORE32H(R,&ct[0]); STORE32H(L,&ct[4]); }
int cast5_ecb_decrypt(const unsigned char *ct, unsigned char *pt, symmetric_key *skey) #endif { ulong32 R, L; LTC_ARGCHK(pt != NULL); LTC_ARGCHK(ct != NULL); LTC_ARGCHK(skey != NULL); LOAD32H(R,&ct[0]); LOAD32H(L,&ct[4]); if (skey->cast5.keylen > 10) { R ^= FI(L, skey->cast5.K[15], skey->cast5.K[31]); L ^= FIII(R, skey->cast5.K[14], skey->cast5.K[30]); R ^= FII(L, skey->cast5.K[13], skey->cast5.K[29]); L ^= FI(R, skey->cast5.K[12], skey->cast5.K[28]); } R ^= FIII(L, skey->cast5.K[11], skey->cast5.K[27]); L ^= FII(R, skey->cast5.K[10], skey->cast5.K[26]); R ^= FI(L, skey->cast5.K[9], skey->cast5.K[25]); L ^= FIII(R, skey->cast5.K[8], skey->cast5.K[24]); R ^= FII(L, skey->cast5.K[7], skey->cast5.K[23]); L ^= FI(R, skey->cast5.K[6], skey->cast5.K[22]); R ^= FIII(L, skey->cast5.K[5], skey->cast5.K[21]); L ^= FII(R, skey->cast5.K[4], skey->cast5.K[20]); R ^= FI(L, skey->cast5.K[3], skey->cast5.K[19]); L ^= FIII(R, skey->cast5.K[2], skey->cast5.K[18]); R ^= FII(L, skey->cast5.K[1], skey->cast5.K[17]); L ^= FI(R, skey->cast5.K[0], skey->cast5.K[16]); STORE32H(L,&pt[0]); STORE32H(R,&pt[4]); return CRYPT_OK; }
int cast5_decrypt(cast5_key *skey, const SilcUInt32 ct[2], SilcUInt32 pt[2]) { SilcUInt32 R, L; R = ct[0]; L = ct[1]; if (skey->keylen > 10) { R ^= FI(L, skey->K[15], skey->K[31]); L ^= FIII(R, skey->K[14], skey->K[30]); R ^= FII(L, skey->K[13], skey->K[29]); L ^= FI(R, skey->K[12], skey->K[28]); } R ^= FIII(L, skey->K[11], skey->K[27]); L ^= FII(R, skey->K[10], skey->K[26]); R ^= FI(L, skey->K[9], skey->K[25]); L ^= FIII(R, skey->K[8], skey->K[24]); R ^= FII(L, skey->K[7], skey->K[23]); L ^= FI(R, skey->K[6], skey->K[22]); R ^= FIII(L, skey->K[5], skey->K[21]); L ^= FII(R, skey->K[4], skey->K[20]); R ^= FI(L, skey->K[3], skey->K[19]); L ^= FIII(R, skey->K[2], skey->K[18]); R ^= FII(L, skey->K[1], skey->K[17]); L ^= FI(R, skey->K[0], skey->K[16]); pt[0] = L; pt[1] = R; return TRUE; }