Go to the documentation of this file.
   32 #define TRACE_LEVEL SSH_TRACE_LEVEL 
   41 #if (SSH_SUPPORT == ENABLED) 
   57    const char_t *macAlgo, uint8_t 
x)
 
   73 #if (SSH_STREAM_CIPHER_SUPPORT == ENABLED) 
  110       encryptionEngine->
hmacContext = &connection->hmacContext;
 
  114 #if (SSH_CBC_CIPHER_SUPPORT == ENABLED || SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  148       encryptionEngine->
hmacContext = &connection->hmacContext;
 
  152 #if (SSH_GCM_CIPHER_SUPPORT == ENABLED || SSH_RFC5647_SUPPORT == ENABLED) 
  187 #if (SSH_CHACHA20_POLY1305_SUPPORT == ENABLED) 
  227 #if (SSH_GCM_CIPHER_SUPPORT == ENABLED || SSH_RFC5647_SUPPORT == ENABLED) 
  268 #if (SSH_RC4_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED) 
  279 #if (SSH_RC4_128_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED) 
  290 #if (SSH_RC4_256_SUPPORT == ENABLED && SSH_STREAM_CIPHER_SUPPORT == ENABLED) 
  301 #if (SSH_CAST128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  313 #if (SSH_CAST128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  325 #if (SSH_IDEA_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  336 #if (SSH_IDEA_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  347 #if (SSH_BLOWFISH_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  359 #if (SSH_BLOWFISH_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  371 #if (SSH_3DES_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  383 #if (SSH_3DES_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  395 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  407 #if (SSH_AES_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  419 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  431 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  443 #if (SSH_AES_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  455 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  467 #if (SSH_TWOFISH_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  478 #if (SSH_TWOFISH_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  489 #if (SSH_TWOFISH_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  501 #if (SSH_TWOFISH_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  512 #if (SSH_TWOFISH_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  523 #if (SSH_TWOFISH_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  534 #if (SSH_SERPENT_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  545 #if (SSH_SERPENT_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  556 #if (SSH_SERPENT_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  567 #if (SSH_SERPENT_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  578 #if (SSH_SERPENT_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  589 #if (SSH_SERPENT_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  600 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  611 #if (SSH_CAMELLIA_192_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  622 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  633 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  644 #if (SSH_CAMELLIA_192_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  655 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_CTR_CIPHER_SUPPORT == ENABLED) 
  666 #if (SSH_SEED_SUPPORT == ENABLED && SSH_CBC_CIPHER_SUPPORT == ENABLED) 
  677 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED) 
  689 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED) 
  701 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  712 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  723 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  734 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  745 #if (SSH_CHACHA20_POLY1305_SUPPORT == ENABLED) 
  785 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED) 
  792       encryptionEngine->
macSize = 16;
 
  797 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_GCM_CIPHER_SUPPORT == ENABLED) 
  804       encryptionEngine->
macSize = 16;
 
  809 #if (SSH_AES_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  815       encryptionEngine->
macSize = 16;
 
  820 #if (SSH_AES_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  826       encryptionEngine->
macSize = 16;
 
  831 #if (SSH_CAMELLIA_128_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  837       encryptionEngine->
macSize = 16;
 
  842 #if (SSH_CAMELLIA_256_SUPPORT == ENABLED && SSH_RFC5647_SUPPORT == ENABLED) 
  848       encryptionEngine->
macSize = 16;
 
  853 #if (SSH_CHACHA20_POLY1305_SUPPORT == ENABLED) 
  860       encryptionEngine->
macSize = 16;
 
  865 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_SUPPORT == ENABLED) 
  876 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_SUPPORT == ENABLED && \ 
  877    SSH_ETM_SUPPORT == ENABLED) 
  888 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_96_SUPPORT == ENABLED) 
  894       encryptionEngine->
macSize = 12;
 
  899 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_MD5_96_SUPPORT == ENABLED && \ 
  900    SSH_ETM_SUPPORT == ENABLED) 
  906       encryptionEngine->
macSize = 12;
 
  911 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_RIPEMD160_SUPPORT == ENABLED) 
  923 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_RIPEMD160_SUPPORT == ENABLED && \ 
  924    SSH_ETM_SUPPORT == ENABLED) 
  935 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED) 
  946 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_SUPPORT == ENABLED && \ 
  947    SSH_ETM_SUPPORT == ENABLED) 
  958 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_96_SUPPORT == ENABLED) 
  964       encryptionEngine->
macSize = 12;
 
  969 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA1_96_SUPPORT == ENABLED && \ 
  970    SSH_ETM_SUPPORT == ENABLED) 
  976       encryptionEngine->
macSize = 12;
 
  981 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED) 
  992 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA256_SUPPORT == ENABLED && \ 
  993    SSH_ETM_SUPPORT == ENABLED) 
 1004 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED) 
 1015 #if (SSH_HMAC_SUPPORT == ENABLED && SSH_SHA512_SUPPORT == ENABLED && \ 
 1016    SSH_ETM_SUPPORT == ENABLED) 
 1060    hashAlgo = connection->hashAlgo;
 
 1063    if(hashAlgo != NULL)
 
 1069       if(hashContext != NULL)
 
 1072          hashAlgo->
init(hashContext);
 
 1073          hashAlgo->
update(hashContext, connection->k, connection->kLen);
 
 1074          hashAlgo->
update(hashContext, connection->h, connection->hLen);
 
 1075          hashAlgo->
update(hashContext, &
x, 
sizeof(
x));
 
 1076          hashAlgo->
update(hashContext, connection->sessionId, connection->sessionIdLen);
 
 1077          hashAlgo->
final(hashContext, digest);
 
 1082             output[
n] = digest[
n];
 
 1088          while(
n < outputLen)
 
 1091             hashAlgo->
init(hashContext);
 
 1092             hashAlgo->
update(hashContext, connection->k, connection->kLen);
 
 1093             hashAlgo->
update(hashContext, connection->h, connection->hLen);
 
 1094             hashAlgo->
update(hashContext, output, 
n);
 
 1095             hashAlgo->
final(hashContext, digest);
 
 1098             for(i = 0; i < hashAlgo->
digestSize && 
n < outputLen; i++, 
n++)
 
 1100                output[
n] = digest[i];
 
 1136    const uint8_t *key, 
size_t keyLen)
 
 1138 #if (SSH_KEY_LOG_SUPPORT == ENABLED) 
 1142    context = connection->context;
 
 1145    if(context->keyLogCallback != NULL)
 
 1162             n += 
osSprintf(buffer + 
n, 
"%02" PRIX8, connection->cookie[i]);
 
 1170          for(i = 0; i < keyLen; i++)
 
 1180          context->keyLogCallback(connection, buffer);
 
  
#define TWOFISH_CIPHER_ALGO
Generic hash algorithm context.
void sshFreeEncryptionEngine(SshEncryptionEngine *encryptionEngine)
Release encryption engine.
uint8_t macKey[SSH_MAX_HASH_DIGEST_SIZE]
Integrity key.
#define BLOWFISH_CIPHER_ALGO
uint8_t iv[SSH_MAX_CIPHER_BLOCK_SIZE]
Initialization vector.
void sshDumpKey(SshConnection *connection, const char_t *label, const uint8_t *key, size_t keyLen)
Dump secret key (for debugging purpose only)
const HashAlgo * hashAlgo
Hash algorithm for MAC operations.
GcmContext gcmContext
GCM context.
size_t macSize
Size of the MAC tag, in bytes.
__weak_func error_t gcmInit(GcmContext *context, const CipherAlgo *cipherAlgo, void *cipherContext)
Initialize GCM context.
#define SERPENT_CIPHER_ALGO
#define SSH_MAX_CIPHER_BLOCK_SIZE
CipherAlgoEncryptStream encryptStream
@ ERROR_UNSUPPORTED_CIPHER_MODE
@ ERROR_UNSUPPORTED_HASH_ALGO
CipherMode cipherMode
Cipher mode of operation.
#define osSprintf(dest,...)
bool_t sshCompareAlgo(const char_t *name1, const char_t *name2)
Compare algorithm names.
@ ERROR_FAILURE
Generic error code.
#define RIPEMD160_DIGEST_SIZE
const CipherAlgo * cipherAlgo
Cipher algorithm.
uint8_t encKey[SSH_MAX_ENC_KEY_SIZE]
Encryption key.
bool_t etm
Encrypt-then-MAC.
error_t sshInitEncryptionEngine(SshConnection *connection, SshEncryptionEngine *encryptionEngine, const char_t *encAlgo, const char_t *macAlgo, uint8_t x)
Initialize encryption engine.
CipherContext cipherContext
Cipher context.
#define CAMELLIA_CIPHER_ALGO
error_t sshSelectCipherAlgo(SshEncryptionEngine *encryptionEngine, const char_t *encAlgo)
Select the relevant cipher algorithm.
#define RIPEMD160_HASH_ALGO
#define SSH_MAX_HASH_DIGEST_SIZE
error_t sshSelectHashAlgo(SshEncryptionEngine *encryptionEngine, const char_t *encAlgo, const char_t *macAlgo)
Select the relevant hash algorithm.
#define SSH_MAX_ENC_KEY_SIZE
@ ERROR_UNSUPPORTED_CIPHER_ALGO
error_t sshDeriveKey(SshConnection *connection, uint8_t x, uint8_t *output, size_t outputLen)
Key derivation function.
#define CAST128_CIPHER_ALGO
HmacContext * hmacContext
HMAC context.
Common interface for hash algorithms.
#define sshAllocMem(size)
@ CIPHER_MODE_CHACHA20_POLY1305
#define osMemset(p, value, length)
#define SHA256_DIGEST_SIZE
#define SHA512_DIGEST_SIZE
size_t encKeyLen
Length of the encryption key, in bytes.