version 1.111, 2018/02/23 15:58:37 |
version 1.112, 2018/09/13 02:08:33 |
|
|
} |
} |
|
|
int |
int |
cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, u_int len) |
cipher_get_keyiv(struct sshcipher_ctx *cc, u_char *iv, size_t len) |
{ |
{ |
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
const struct sshcipher *c = cc->cipher; |
const struct sshcipher *c = cc->cipher; |
|
|
return 0; |
return 0; |
else if (evplen < 0) |
else if (evplen < 0) |
return SSH_ERR_LIBCRYPTO_ERROR; |
return SSH_ERR_LIBCRYPTO_ERROR; |
if ((u_int)evplen != len) |
if ((size_t)evplen != len) |
return SSH_ERR_INVALID_ARGUMENT; |
return SSH_ERR_INVALID_ARGUMENT; |
if (cipher_authlen(c)) { |
if (cipher_authlen(c)) { |
if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN, |
if (!EVP_CIPHER_CTX_ctrl(cc->evp, EVP_CTRL_GCM_IV_GEN, |
len, iv)) |
len, iv)) |
return SSH_ERR_LIBCRYPTO_ERROR; |
return SSH_ERR_LIBCRYPTO_ERROR; |
} else |
} else if (!EVP_CIPHER_CTX_get_iv(cc->evp, iv, len)) |
memcpy(iv, cc->evp->iv, len); |
return SSH_ERR_LIBCRYPTO_ERROR; |
#endif |
#endif |
return 0; |
return 0; |
} |
} |
|
|
int |
int |
cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv) |
cipher_set_keyiv(struct sshcipher_ctx *cc, const u_char *iv, size_t len) |
{ |
{ |
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
const struct sshcipher *c = cc->cipher; |
const struct sshcipher *c = cc->cipher; |
|
|
evplen = EVP_CIPHER_CTX_iv_length(cc->evp); |
evplen = EVP_CIPHER_CTX_iv_length(cc->evp); |
if (evplen <= 0) |
if (evplen <= 0) |
return SSH_ERR_LIBCRYPTO_ERROR; |
return SSH_ERR_LIBCRYPTO_ERROR; |
|
if ((size_t)evplen != len) |
|
return SSH_ERR_INVALID_ARGUMENT; |
if (cipher_authlen(c)) { |
if (cipher_authlen(c)) { |
/* XXX iv arg is const, but EVP_CIPHER_CTX_ctrl isn't */ |
/* XXX iv arg is const, but EVP_CIPHER_CTX_ctrl isn't */ |
if (!EVP_CIPHER_CTX_ctrl(cc->evp, |
if (!EVP_CIPHER_CTX_ctrl(cc->evp, |
EVP_CTRL_GCM_SET_IV_FIXED, -1, (void *)iv)) |
EVP_CTRL_GCM_SET_IV_FIXED, -1, (void *)iv)) |
return SSH_ERR_LIBCRYPTO_ERROR; |
return SSH_ERR_LIBCRYPTO_ERROR; |
} else |
} else if (!EVP_CIPHER_CTX_set_iv(cc->evp, iv, evplen)) |
memcpy(cc->evp->iv, iv, evplen); |
return SSH_ERR_LIBCRYPTO_ERROR; |
#endif |
#endif |
return 0; |
return 0; |
} |
} |