📄 xts_encrypt.c
字号:
/* LibTomCrypt, modular cryptographic library -- Tom St Denis * * LibTomCrypt is a library that provides various cryptographic * algorithms in a highly modular and flexible manner. * * The library is free for all purposes without any express * guarantee it works. * * Tom St Denis, tomstdenis@gmail.com, http://libtom.org */#include "tomcrypt.h"/** Source donated by Elliptic Semiconductor Inc (www.ellipticsemi.com) to the LibTom Projects*/#ifdef LTC_XTS_MODEstatic int tweak_crypt(const unsigned char *P, unsigned char *C, unsigned char *T, symmetric_xts *xts){ unsigned long x; int err; /* tweak encrypt block i */#ifdef LTC_FAST for (x = 0; x < 16; x += sizeof(LTC_FAST_TYPE)) { *((LTC_FAST_TYPE*)&C[x]) = *((LTC_FAST_TYPE*)&P[x]) ^ *((LTC_FAST_TYPE*)&T[x]); }#else for (x = 0; x < 16; x++) { C[x] = P[x] ^ T[x]; }#endif if ((err = cipher_descriptor[xts->cipher].ecb_encrypt(C, C, &xts->key1)) != CRYPT_OK) { return err; }#ifdef LTC_FAST for (x = 0; x < 16; x += sizeof(LTC_FAST_TYPE)) { *((LTC_FAST_TYPE*)&C[x]) ^= *((LTC_FAST_TYPE*)&T[x]); }#else for (x = 0; x < 16; x++) { C[x] = C[x] ^ T[x]; }#endif /* LFSR the tweak */ xts_mult_x(T); return CRYPT_OK;} /** XTS Encryption @param pt [in] Plaintext @param ptlen Length of plaintext (and ciphertext) @param ct [out] Ciphertext @param tweak [in] The 128--bit encryption tweak (e.g. sector number) @param xts The XTS structure Returns CRYPT_OK upon success*/int xts_encrypt( const unsigned char *pt, unsigned long ptlen, unsigned char *ct, const unsigned char *tweak, symmetric_xts *xts){ unsigned char PP[16], CC[16], T[16]; unsigned long i, m, mo, lim; int err; /* check inputs */ LTC_ARGCHK(pt != NULL); LTC_ARGCHK(ct != NULL); LTC_ARGCHK(tweak != NULL); LTC_ARGCHK(xts != NULL); /* check if valid */ if ((err = cipher_is_valid(xts->cipher)) != CRYPT_OK) { return err; } /* get number of blocks */ m = ptlen >> 4; mo = ptlen & 15; /* must have at least one full block */ if (m == 0) { return CRYPT_INVALID_ARG; } /* encrypt the tweak */ if ((err = cipher_descriptor[xts->cipher].ecb_encrypt(tweak, T, &xts->key2)) != CRYPT_OK) { return err; } /* for i = 0 to m-2 do */ if (mo == 0) { lim = m; } else { lim = m - 1; } for (i = 0; i < lim; i++) { err = tweak_crypt(pt, ct, T, xts); ct += 16; pt += 16; } /* if ptlen not divide 16 then */ if (mo > 0) { /* CC = tweak encrypt block m-1 */ if ((err = tweak_crypt(pt, CC, T, xts)) != CRYPT_OK) { return err; } /* Cm = first ptlen % 16 bytes of CC */ for (i = 0; i < mo; i++) { PP[i] = pt[16+i]; ct[16+i] = CC[i]; } for (; i < 16; i++) { PP[i] = CC[i]; } /* Cm-1 = Tweak encrypt PP */ if ((err = tweak_crypt(PP, ct, T, xts)) != CRYPT_OK) { return err; } } return err;}#endif/* $Source: /cvs/libtom/libtomcrypt/src/modes/xts/xts_encrypt.c,v $ *//* $Revision: 1.5 $ *//* $Date: 2007/05/12 14:05:56 $ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -