diff --git a/crypto/base64/base64.c b/crypto/base64/base64.c index 3d920598c..6ce6007f6 100644 --- a/crypto/base64/base64.c +++ b/crypto/base64/base64.c @@ -122,6 +122,19 @@ int EVP_EncodedLength(size_t *out_len, size_t len) { return 1; } +EVP_ENCODE_CTX *EVP_ENCODE_CTX_new(void) { + EVP_ENCODE_CTX *ret = OPENSSL_malloc(sizeof(EVP_ENCODE_CTX)); + if (ret == NULL) { + return NULL; + } + OPENSSL_memset(ret, 0, sizeof(EVP_ENCODE_CTX)); + return ret; +} + +void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX *ctx) { + OPENSSL_free(ctx); +} + void EVP_EncodeInit(EVP_ENCODE_CTX *ctx) { OPENSSL_memset(ctx, 0, sizeof(EVP_ENCODE_CTX)); } diff --git a/crypto/dsa/dsa.c b/crypto/dsa/dsa.c index c8695687c..8e77ea392 100644 --- a/crypto/dsa/dsa.c +++ b/crypto/dsa/dsa.c @@ -550,6 +550,27 @@ void DSA_SIG_free(DSA_SIG *sig) { OPENSSL_free(sig); } +void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **out_r, + const BIGNUM **out_s) { + if (out_r != NULL) { + *out_r = sig->r; + } + if (out_s != NULL) { + *out_s = sig->s; + } +} + +int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s) { + if (r == NULL || s == NULL) { + return 0; + } + BN_free(sig->r); + BN_free(sig->s); + sig->r = r; + sig->s = s; + return 1; +} + // mod_mul_consttime sets |r| to |a| * |b| modulo |mont->N|, treating |a| and // |b| as secret. This function internally uses Montgomery reduction, but // neither inputs nor outputs are in Montgomery form. diff --git a/crypto/fipsmodule/cipher/cipher.c b/crypto/fipsmodule/cipher/cipher.c index 51c96b459..64ee544a3 100644 --- a/crypto/fipsmodule/cipher/cipher.c +++ b/crypto/fipsmodule/cipher/cipher.c @@ -629,6 +629,18 @@ int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, return EVP_CipherInit(ctx, cipher, key, iv, 0); } +int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len) { + return EVP_CipherFinal_ex(ctx, out, out_len); +} + +int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len) { + return EVP_EncryptFinal_ex(ctx, out, out_len); +} + +int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len) { + return EVP_DecryptFinal_ex(ctx, out, out_len); +} + int EVP_add_cipher_alias(const char *a, const char *b) { return 1; } diff --git a/include/openssl/base64.h b/include/openssl/base64.h index c88546d7b..369ba9c3d 100644 --- a/include/openssl/base64.h +++ b/include/openssl/base64.h @@ -111,6 +111,14 @@ OPENSSL_EXPORT int EVP_DecodeBase64(uint8_t *out, size_t *out_len, // very specific to PEM. It is also very lenient of invalid input. Use of any of // these functions is thus deprecated. +// EVP_ENCODE_CTX_new returns a newly-allocated |EVP_ENCODE_CTX| or NULL on +// error. The caller must release the result with |EVP_ENCODE_CTX_free| when +// done. +OPENSSL_EXPORT EVP_ENCODE_CTX *EVP_ENCODE_CTX_new(void); + +// EVP_ENCODE_CTX_free releases memory associated with |ctx|. +OPENSSL_EXPORT void EVP_ENCODE_CTX_free(EVP_ENCODE_CTX *ctx); + // EVP_EncodeInit initialises |*ctx|, which is typically stack // allocated, for an encoding operation. // diff --git a/include/openssl/cipher.h b/include/openssl/cipher.h index 09d72ec2c..2458847e5 100644 --- a/include/openssl/cipher.h +++ b/include/openssl/cipher.h @@ -201,7 +201,7 @@ OPENSSL_EXPORT int EVP_DecryptUpdate(EVP_CIPHER_CTX *ctx, uint8_t *out, // // WARNING: it is unsafe to call this function with unauthenticated // ciphertext if padding is enabled. -OPENSSL_EXPORT int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, +OPENSSL_EXPORT int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, uint8_t *out, int *out_len); // EVP_Cipher performs a one-shot encryption/decryption operation. No partial @@ -408,6 +408,18 @@ OPENSSL_EXPORT int EVP_DecryptInit(EVP_CIPHER_CTX *ctx, const EVP_CIPHER *cipher, const uint8_t *key, const uint8_t *iv); +// EVP_CipherFinal calls |EVP_CipherFinal_ex|. +OPENSSL_EXPORT int EVP_CipherFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, + int *out_len); + +// EVP_EncryptFinal calls |EVP_EncryptFinal_ex|. +OPENSSL_EXPORT int EVP_EncryptFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, + int *out_len); + +// EVP_DecryptFinal calls |EVP_DecryptFinal_ex|. +OPENSSL_EXPORT int EVP_DecryptFinal(EVP_CIPHER_CTX *ctx, uint8_t *out, + int *out_len); + // EVP_add_cipher_alias does nothing and returns one. OPENSSL_EXPORT int EVP_add_cipher_alias(const char *a, const char *b); diff --git a/include/openssl/dsa.h b/include/openssl/dsa.h index 166525119..e6ddce672 100644 --- a/include/openssl/dsa.h +++ b/include/openssl/dsa.h @@ -189,6 +189,16 @@ OPENSSL_EXPORT DSA_SIG *DSA_SIG_new(void); // DSA_SIG_free frees the contents of |sig| and then frees |sig| itself. OPENSSL_EXPORT void DSA_SIG_free(DSA_SIG *sig); +// DSA_SIG_get0 sets |*out_r| and |*out_s|, if non-NULL, to the two components +// of |sig|. +OPENSSL_EXPORT void DSA_SIG_get0(const DSA_SIG *sig, const BIGNUM **out_r, + const BIGNUM **out_s); + +// DSA_SIG_set0 sets |sig|'s components to |r| and |s|, neither of which may be +// NULL. On success, it takes ownership of each argument and returns one. +// Otherwise, it returns zero. +OPENSSL_EXPORT int DSA_SIG_set0(DSA_SIG *sig, BIGNUM *r, BIGNUM *s); + // DSA_do_sign returns a signature of the hash in |digest| by the key in |dsa| // and returns an allocated, DSA_SIG structure, or NULL on error. OPENSSL_EXPORT DSA_SIG *DSA_do_sign(const uint8_t *digest, size_t digest_len,