Mixes for Privacy and Anonymity in the Internet
Public Member Functions | Static Public Member Functions | Protected Attributes | Private Attributes
CASymCipher Class Reference

This class could be used for encryption/decryption of data (streams) with AES using 128bit OFB mode. More...

Inheritance diagram for CASymCipher:
CALockAble

List of all members.

Public Member Functions

 CASymCipher ()
 ~CASymCipher ()
bool isKeyValid ()
SINT32 setKey (const UINT8 *key)
 Sets the keys for crypt1() and crypt2() to the same key.
SINT32 setKeys (const UINT8 *key, UINT32 keysize)
 Sets the keys for crypt1() and crypt2() either to the same key (if keysize==KEY_SIZE) or to different values, if keysize==2* KEY_SIZE.
SINT32 setKey (const UINT8 *key, bool bEncrypt)
 Sets the key1 and key2 used for encryption/decryption to the same value of key.
SINT32 setIVs (const UINT8 *p_iv)
 Sets iv1 and iv2 to p_iv.
SINT32 setIV2 (const UINT8 *p_iv)
 Sets iv2 to p_iv.
SINT32 crypt1 (const UINT8 *in, UINT8 *out, UINT32 len)
 Encryptes/Decrpytes in to out using iv1 and key1.
SINT32 crypt2 (const UINT8 *in, UINT8 *out, UINT32 len)
 Decryptes in to out using iv2 and key2.
SINT32 decrypt1CBCwithPKCS7 (const UINT8 *in, UINT8 *out, UINT32 *len)
 En-/Decryptes in to out using iv1 and key1.
SINT32 encrypt1CBCwithPKCS7 (const UINT8 *in, UINT32 inlen, UINT8 *out, UINT32 *len)
 En-/Decryptes in to out using IV1 and key1.
void setGCMKeys (UINT8 *keyRecv, UINT8 *keySend)
SINT32 encryptMessage (const UINT8 *in, UINT32 inlen, UINT8 *out)
SINT32 decryptMessage (const UINT8 *in, UINT32 inlen, UINT8 *out, bool integrityCheck)

Static Public Member Functions

static SINT32 testSpeed ()

Protected Attributes

AES_KEY * m_keyAES1
AES_KEY * m_keyAES2
UINT8m_iv1
UINT8m_iv2
bool m_bKeySet

Private Attributes

CAMutexm_pcsEnc
CAMutexm_pcsDec
gcm_ctx_64k * m_pGCMCtxEnc
gcm_ctx_64k * m_pGCMCtxDec
UINT32 m_nEncMsgCounter
UINT32m_pEncMsgIV
UINT32 m_nDecMsgCounter
UINT32m_pDecMsgIV

Detailed Description

This class could be used for encryption/decryption of data (streams) with AES using 128bit OFB mode.

Because of the OFB mode technical encryption and decrpytion are the same (depending on the kind of input). Therefore there is only a general crypt() function. This class has a 2-in-1 feature: Two independent IVs are available. Therefore we have crypt1() and crypt2() depending on the used IV.


Constructor & Destructor Documentation


Member Function Documentation

SINT32 CASymCipher::crypt1 ( const UINT8 in,
UINT8 out,
UINT32  len 
)

Encryptes/Decrpytes in to out using iv1 and key1.

AES is used for encryption and the encryption is done with a special 128bit-OFB mode: In the case that (len mod 16 !=0) the unused cipher output bits are discarded and NOT used next time encryptAES() is called. That means that every time encrpytAES() is called at first new cipher output is created by calling AES-encrypt(iv).

Parameters:
ininput (plain text) bytes
outoutput (encrpyted) bytes
lenlen of input. because the cipher preserves the size, len of output=len of input
Return values:
E_SUCCESS

References E_SUCCESS, KEY_SIZE, len, m_iv1, and m_keyAES1.

Referenced by CALastMixA::loop(), CAFirstMixB::loop(), CAFirstMixA::loop(), CALastMixB::loop(), CALocalProxy::loop(), mm_loopReadFromMixBefore(), CAMuxSocket::prepareForSend(), CAMuxSocket::receive(), CAMuxSocket::send(), and testSpeed().

SINT32 CASymCipher::crypt2 ( const UINT8 in,
UINT8 out,
UINT32  len 
)

Decryptes in to out using iv2 and key2.

Parameters:
ininput (encrypted) bytes
outoutput (decrpyted) bytes
lenlen of input. because the cipher preserves the size, len of output=len of input
Return values:
E_SUCCESS

References E_SUCCESS, KEY_SIZE, len, m_iv1, m_iv2, and m_keyAES2.

Referenced by CALastMixA::loop(), CAFirstMixB::loop(), CAFirstMixA::loop(), CALocalProxy::loop(), mm_loopReadFromMixAfter(), and CAChain::processDownstream().

SINT32 CASymCipher::decrypt1CBCwithPKCS7 ( const UINT8 in,
UINT8 out,
UINT32 len 
)

En-/Decryptes in to out using iv1 and key1.

AES is used for en-/dcryption and the cryption is done with CBC mode and PKCS7 padding.

Parameters:
ininput (plain or ciphertext) bytes
outoutput (plain or ciphertext) bytes
lenlen of input. on return the output len, which is always <= len of input
Return values:
E_SUCCESS
E_UNKNOWN,iferror

References E_SUCCESS, E_UNKNOWN, m_iv1, and m_keyAES1.

Referenced by decryptXMLElement().

SINT32 CASymCipher::decryptMessage ( const UINT8 in,
UINT32  inlen,
UINT8 out,
bool  integrityCheck 
)
SINT32 CASymCipher::encrypt1CBCwithPKCS7 ( const UINT8 in,
UINT32  inlen,
UINT8 out,
UINT32 len 
)

En-/Decryptes in to out using IV1 and key1.

AES is used for en-/decryption and the cryption is done with CBC mode and PKCS7 padding.

Parameters:
ininput (plain or ciphertext) bytes
inlensize of the input buffer
outoutput (plain or ciphertext) bytes
lenon call len of output buffer; on return size of output buffer used, which is always > len of input
Return values:
E_SUCCESS

References E_SPACE, E_SUCCESS, m_iv1, and m_keyAES1.

Referenced by encryptXMLElement().

SINT32 CASymCipher::encryptMessage ( const UINT8 in,
UINT32  inlen,
UINT8 out 
)

References m_bKeySet.

Referenced by CALocalProxy::loop().

void CASymCipher::setGCMKeys ( UINT8 keyRecv,
UINT8 keySend 
)
SINT32 CASymCipher::setIV2 ( const UINT8 p_iv)

Sets iv2 to p_iv.

Parameters:
p_iv16 random bytes used for new iv2.
Return values:
E_SUCCESS

References E_SUCCESS, and m_iv2.

Referenced by CAFirstMixB::loop(), CAFirstMixA::loop(), and CALocalProxy::loop().

SINT32 CASymCipher::setIVs ( const UINT8 p_iv)

Sets iv1 and iv2 to p_iv.

Parameters:
p_iv16 random bytes used for new iv1 and iv2.
Return values:
E_SUCCESS

References E_SUCCESS, m_iv1, and m_iv2.

Referenced by decryptXMLElement(), CAFirstMix::doUserLogin_internal(), encryptXMLElement(), CALocalProxy::processKeyExchange(), CAMuxSocket::setReceiveKey(), and CAMuxSocket::setSendKey().

SINT32 CASymCipher::setKey ( const UINT8 key)

Sets the keys for crypt1() and crypt2() to the same key.

Sets the key1 and key2 used for encryption/decryption.

Also resets the IVs to zero!

Parameters:
key16 random bytes used as key
Return values:
E_SUCCESS

Referenced by decryptXMLElement(), CAFirstMix::doUserLogin_internal(), encryptXMLElement(), CAFirstMixB::loop(), CALastMixB::loop(), CALocalProxy::processKeyExchange(), CAMuxSocket::setKey(), setKeys(), CAMuxSocket::setReceiveKey(), CAMuxSocket::setSendKey(), and testSpeed().

SINT32 CASymCipher::setKey ( const UINT8 key,
bool  bEncrypt 
)

Sets the key1 and key2 used for encryption/decryption to the same value of key.

Also resets the IVs to zero!

Parameters:
key16 random bytes used as key
bEncryptif true, the key should be used for encryption (otherwise it will be used for decryption)
Return values:
E_SUCCESS

References E_SUCCESS, m_bKeySet, m_iv1, m_iv2, m_keyAES1, and m_keyAES2.

SINT32 CASymCipher::setKeys ( const UINT8 key,
UINT32  keysize 
)

Sets the keys for crypt1() and crypt2() either to the same key (if keysize==KEY_SIZE) or to different values, if keysize==2* KEY_SIZE.

References E_SUCCESS, E_UNKNOWN, KEY_SIZE, m_bKeySet, m_iv1, m_iv2, m_keyAES1, m_keyAES2, and setKey().

Referenced by CALastMixA::loop(), CAFirstMixA::loop(), CALocalProxy::loop(), and mm_loopReadFromMixBefore().


Member Data Documentation

bool CASymCipher::m_bKeySet [protected]
UINT8* CASymCipher::m_iv1 [protected]
UINT8* CASymCipher::m_iv2 [protected]
AES_KEY* CASymCipher::m_keyAES1 [protected]
AES_KEY* CASymCipher::m_keyAES2 [protected]

Referenced by CASymCipher(), and ~CASymCipher().

Referenced by CASymCipher(), and ~CASymCipher().

gcm_ctx_64k* CASymCipher::m_pGCMCtxDec [private]
gcm_ctx_64k* CASymCipher::m_pGCMCtxEnc [private]