aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c
diff options
context:
space:
mode:
authororivej <orivej@yandex-team.ru>2022-02-10 16:44:49 +0300
committerDaniil Cherednik <dcherednik@yandex-team.ru>2022-02-10 16:44:49 +0300
commit718c552901d703c502ccbefdfc3c9028d608b947 (patch)
tree46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c
parente9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff)
downloadydb-718c552901d703c502ccbefdfc3c9028d608b947.tar.gz
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c')
-rw-r--r--contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c346
1 files changed, 173 insertions, 173 deletions
diff --git a/contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c b/contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c
index d1d37d1bee..05893201ca 100644
--- a/contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c
+++ b/contrib/restricted/aws/s2n/crypto/s2n_ecdsa.c
@@ -1,173 +1,173 @@
-/*
- * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
- *
- * Licensed under the Apache License, Version 2.0 (the "License").
- * You may not use this file except in compliance with the License.
- * A copy of the License is located at
- *
- * http://aws.amazon.com/apache2.0
- *
- * or in the "license" file accompanying this file. This file is distributed
- * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
- * express or implied. See the License for the specific language governing
- * permissions and limitations under the License.
- */
-
-#include <openssl/ec.h>
-#include <openssl/ecdsa.h>
-#include <openssl/x509.h>
-#include "stuffer/s2n_stuffer.h"
-
-#include "error/s2n_errno.h"
-#include "utils/s2n_blob.h"
-#include "utils/s2n_mem.h"
-#include "utils/s2n_random.h"
-#include "utils/s2n_safety.h"
-
-#include "crypto/s2n_ecdsa.h"
-#include "crypto/s2n_ecc_evp.h"
-#include "crypto/s2n_hash.h"
-#include "crypto/s2n_openssl.h"
-#include "crypto/s2n_pkey.h"
-
-int s2n_ecdsa_der_signature_size(const struct s2n_pkey *pkey)
-{
- const struct s2n_ecdsa_key *ecdsa_key = &pkey->key.ecdsa_key;
- notnull_check(ecdsa_key->ec_key);
-
- return ECDSA_size(ecdsa_key->ec_key);
-}
-
-static int s2n_ecdsa_sign(const struct s2n_pkey *priv, s2n_signature_algorithm sig_alg,
- struct s2n_hash_state *digest, struct s2n_blob *signature)
-{
- sig_alg_check(sig_alg, S2N_SIGNATURE_ECDSA);
-
- const s2n_ecdsa_private_key *key = &priv->key.ecdsa_key;
- notnull_check(key->ec_key);
-
- uint8_t digest_length;
- GUARD(s2n_hash_digest_size(digest->alg, &digest_length));
- lte_check(digest_length, S2N_MAX_DIGEST_LEN);
-
- uint8_t digest_out[S2N_MAX_DIGEST_LEN];
- GUARD(s2n_hash_digest(digest, digest_out, digest_length));
-
- unsigned int signature_size = signature->size;
- GUARD_OSSL(ECDSA_sign(0, digest_out, digest_length, signature->data, &signature_size, key->ec_key), S2N_ERR_SIGN);
- S2N_ERROR_IF(signature_size > signature->size, S2N_ERR_SIZE_MISMATCH);
- signature->size = signature_size;
-
- GUARD(s2n_hash_reset(digest));
-
- return 0;
-}
-
-static int s2n_ecdsa_verify(const struct s2n_pkey *pub, s2n_signature_algorithm sig_alg,
- struct s2n_hash_state *digest, struct s2n_blob *signature)
-{
- sig_alg_check(sig_alg, S2N_SIGNATURE_ECDSA);
-
- const s2n_ecdsa_public_key *key = &pub->key.ecdsa_key;
- notnull_check(key->ec_key);
-
- uint8_t digest_length;
- GUARD(s2n_hash_digest_size(digest->alg, &digest_length));
- lte_check(digest_length, S2N_MAX_DIGEST_LEN);
-
- uint8_t digest_out[S2N_MAX_DIGEST_LEN];
- GUARD(s2n_hash_digest(digest, digest_out, digest_length));
-
- /* ECDSA_verify ignores the first parameter */
- GUARD_OSSL(ECDSA_verify(0, digest_out, digest_length, signature->data, signature->size, key->ec_key), S2N_ERR_VERIFY_SIGNATURE);
-
- GUARD(s2n_hash_reset(digest));
-
- return 0;
-}
-
-static int s2n_ecdsa_keys_match(const struct s2n_pkey *pub, const struct s2n_pkey *priv)
-{
- uint8_t input[16] = { 1 };
- DEFER_CLEANUP(struct s2n_blob signature = { 0 }, s2n_free);
- DEFER_CLEANUP(struct s2n_hash_state state_in = { 0 }, s2n_hash_free);
- DEFER_CLEANUP(struct s2n_hash_state state_out = { 0 }, s2n_hash_free);
-
- /* s2n_hash_new only allocates memory when using high-level EVP hashes, currently restricted to FIPS mode. */
- GUARD(s2n_hash_new(&state_in));
- GUARD(s2n_hash_new(&state_out));
-
- GUARD(s2n_hash_init(&state_in, S2N_HASH_SHA1));
- GUARD(s2n_hash_init(&state_out, S2N_HASH_SHA1));
- GUARD(s2n_hash_update(&state_in, input, sizeof(input)));
- GUARD(s2n_hash_update(&state_out, input, sizeof(input)));
-
- GUARD(s2n_alloc(&signature, s2n_ecdsa_der_signature_size(priv)));
-
- GUARD(s2n_ecdsa_sign(priv, S2N_SIGNATURE_ECDSA, &state_in, &signature));
- GUARD(s2n_ecdsa_verify(pub, S2N_SIGNATURE_ECDSA, &state_out, &signature));
-
- return 0;
-}
-
-static int s2n_ecdsa_key_free(struct s2n_pkey *pkey)
-{
- struct s2n_ecdsa_key *ecdsa_key = &pkey->key.ecdsa_key;
- if (ecdsa_key->ec_key == NULL) {
- return 0;
- }
-
- EC_KEY_free(ecdsa_key->ec_key);
- ecdsa_key->ec_key = NULL;
-
- return 0;
-}
-
-static int s2n_ecdsa_check_key_exists(const struct s2n_pkey *pkey)
-{
- const struct s2n_ecdsa_key *ecdsa_key = &pkey->key.ecdsa_key;
- notnull_check(ecdsa_key->ec_key);
- return 0;
-}
-
-int s2n_evp_pkey_to_ecdsa_private_key(s2n_ecdsa_private_key *ecdsa_key, EVP_PKEY *evp_private_key)
-{
- EC_KEY *ec_key = EVP_PKEY_get1_EC_KEY(evp_private_key);
- S2N_ERROR_IF(ec_key == NULL, S2N_ERR_DECODE_PRIVATE_KEY);
-
- ecdsa_key->ec_key = ec_key;
- return 0;
-}
-
-int s2n_evp_pkey_to_ecdsa_public_key(s2n_ecdsa_public_key *ecdsa_key, EVP_PKEY *evp_public_key)
-{
- EC_KEY *ec_key = EVP_PKEY_get1_EC_KEY(evp_public_key);
- S2N_ERROR_IF(ec_key == NULL, S2N_ERR_DECODE_CERTIFICATE);
-
- ecdsa_key->ec_key = ec_key;
- return 0;
-}
-
-int s2n_ecdsa_pkey_init(struct s2n_pkey *pkey) {
- pkey->size = &s2n_ecdsa_der_signature_size;
- pkey->sign = &s2n_ecdsa_sign;
- pkey->verify = &s2n_ecdsa_verify;
- pkey->encrypt = NULL; /* No function for encryption */
- pkey->decrypt = NULL; /* No function for decryption */
- pkey->match = &s2n_ecdsa_keys_match;
- pkey->free = &s2n_ecdsa_key_free;
- pkey->check_key = &s2n_ecdsa_check_key_exists;
- return 0;
-}
-
-int s2n_ecdsa_pkey_matches_curve(const struct s2n_ecdsa_key *ecdsa_key, const struct s2n_ecc_named_curve *curve)
-{
- notnull_check(ecdsa_key);
- notnull_check(ecdsa_key->ec_key);
- notnull_check(curve);
-
- int curve_id = EC_GROUP_get_curve_name(EC_KEY_get0_group(ecdsa_key->ec_key));
- eq_check(curve_id, curve->libcrypto_nid);
-
- return 0;
-}
+/*
+ * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License").
+ * You may not use this file except in compliance with the License.
+ * A copy of the License is located at
+ *
+ * http://aws.amazon.com/apache2.0
+ *
+ * or in the "license" file accompanying this file. This file is distributed
+ * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
+ * express or implied. See the License for the specific language governing
+ * permissions and limitations under the License.
+ */
+
+#include <openssl/ec.h>
+#include <openssl/ecdsa.h>
+#include <openssl/x509.h>
+#include "stuffer/s2n_stuffer.h"
+
+#include "error/s2n_errno.h"
+#include "utils/s2n_blob.h"
+#include "utils/s2n_mem.h"
+#include "utils/s2n_random.h"
+#include "utils/s2n_safety.h"
+
+#include "crypto/s2n_ecdsa.h"
+#include "crypto/s2n_ecc_evp.h"
+#include "crypto/s2n_hash.h"
+#include "crypto/s2n_openssl.h"
+#include "crypto/s2n_pkey.h"
+
+int s2n_ecdsa_der_signature_size(const struct s2n_pkey *pkey)
+{
+ const struct s2n_ecdsa_key *ecdsa_key = &pkey->key.ecdsa_key;
+ notnull_check(ecdsa_key->ec_key);
+
+ return ECDSA_size(ecdsa_key->ec_key);
+}
+
+static int s2n_ecdsa_sign(const struct s2n_pkey *priv, s2n_signature_algorithm sig_alg,
+ struct s2n_hash_state *digest, struct s2n_blob *signature)
+{
+ sig_alg_check(sig_alg, S2N_SIGNATURE_ECDSA);
+
+ const s2n_ecdsa_private_key *key = &priv->key.ecdsa_key;
+ notnull_check(key->ec_key);
+
+ uint8_t digest_length;
+ GUARD(s2n_hash_digest_size(digest->alg, &digest_length));
+ lte_check(digest_length, S2N_MAX_DIGEST_LEN);
+
+ uint8_t digest_out[S2N_MAX_DIGEST_LEN];
+ GUARD(s2n_hash_digest(digest, digest_out, digest_length));
+
+ unsigned int signature_size = signature->size;
+ GUARD_OSSL(ECDSA_sign(0, digest_out, digest_length, signature->data, &signature_size, key->ec_key), S2N_ERR_SIGN);
+ S2N_ERROR_IF(signature_size > signature->size, S2N_ERR_SIZE_MISMATCH);
+ signature->size = signature_size;
+
+ GUARD(s2n_hash_reset(digest));
+
+ return 0;
+}
+
+static int s2n_ecdsa_verify(const struct s2n_pkey *pub, s2n_signature_algorithm sig_alg,
+ struct s2n_hash_state *digest, struct s2n_blob *signature)
+{
+ sig_alg_check(sig_alg, S2N_SIGNATURE_ECDSA);
+
+ const s2n_ecdsa_public_key *key = &pub->key.ecdsa_key;
+ notnull_check(key->ec_key);
+
+ uint8_t digest_length;
+ GUARD(s2n_hash_digest_size(digest->alg, &digest_length));
+ lte_check(digest_length, S2N_MAX_DIGEST_LEN);
+
+ uint8_t digest_out[S2N_MAX_DIGEST_LEN];
+ GUARD(s2n_hash_digest(digest, digest_out, digest_length));
+
+ /* ECDSA_verify ignores the first parameter */
+ GUARD_OSSL(ECDSA_verify(0, digest_out, digest_length, signature->data, signature->size, key->ec_key), S2N_ERR_VERIFY_SIGNATURE);
+
+ GUARD(s2n_hash_reset(digest));
+
+ return 0;
+}
+
+static int s2n_ecdsa_keys_match(const struct s2n_pkey *pub, const struct s2n_pkey *priv)
+{
+ uint8_t input[16] = { 1 };
+ DEFER_CLEANUP(struct s2n_blob signature = { 0 }, s2n_free);
+ DEFER_CLEANUP(struct s2n_hash_state state_in = { 0 }, s2n_hash_free);
+ DEFER_CLEANUP(struct s2n_hash_state state_out = { 0 }, s2n_hash_free);
+
+ /* s2n_hash_new only allocates memory when using high-level EVP hashes, currently restricted to FIPS mode. */
+ GUARD(s2n_hash_new(&state_in));
+ GUARD(s2n_hash_new(&state_out));
+
+ GUARD(s2n_hash_init(&state_in, S2N_HASH_SHA1));
+ GUARD(s2n_hash_init(&state_out, S2N_HASH_SHA1));
+ GUARD(s2n_hash_update(&state_in, input, sizeof(input)));
+ GUARD(s2n_hash_update(&state_out, input, sizeof(input)));
+
+ GUARD(s2n_alloc(&signature, s2n_ecdsa_der_signature_size(priv)));
+
+ GUARD(s2n_ecdsa_sign(priv, S2N_SIGNATURE_ECDSA, &state_in, &signature));
+ GUARD(s2n_ecdsa_verify(pub, S2N_SIGNATURE_ECDSA, &state_out, &signature));
+
+ return 0;
+}
+
+static int s2n_ecdsa_key_free(struct s2n_pkey *pkey)
+{
+ struct s2n_ecdsa_key *ecdsa_key = &pkey->key.ecdsa_key;
+ if (ecdsa_key->ec_key == NULL) {
+ return 0;
+ }
+
+ EC_KEY_free(ecdsa_key->ec_key);
+ ecdsa_key->ec_key = NULL;
+
+ return 0;
+}
+
+static int s2n_ecdsa_check_key_exists(const struct s2n_pkey *pkey)
+{
+ const struct s2n_ecdsa_key *ecdsa_key = &pkey->key.ecdsa_key;
+ notnull_check(ecdsa_key->ec_key);
+ return 0;
+}
+
+int s2n_evp_pkey_to_ecdsa_private_key(s2n_ecdsa_private_key *ecdsa_key, EVP_PKEY *evp_private_key)
+{
+ EC_KEY *ec_key = EVP_PKEY_get1_EC_KEY(evp_private_key);
+ S2N_ERROR_IF(ec_key == NULL, S2N_ERR_DECODE_PRIVATE_KEY);
+
+ ecdsa_key->ec_key = ec_key;
+ return 0;
+}
+
+int s2n_evp_pkey_to_ecdsa_public_key(s2n_ecdsa_public_key *ecdsa_key, EVP_PKEY *evp_public_key)
+{
+ EC_KEY *ec_key = EVP_PKEY_get1_EC_KEY(evp_public_key);
+ S2N_ERROR_IF(ec_key == NULL, S2N_ERR_DECODE_CERTIFICATE);
+
+ ecdsa_key->ec_key = ec_key;
+ return 0;
+}
+
+int s2n_ecdsa_pkey_init(struct s2n_pkey *pkey) {
+ pkey->size = &s2n_ecdsa_der_signature_size;
+ pkey->sign = &s2n_ecdsa_sign;
+ pkey->verify = &s2n_ecdsa_verify;
+ pkey->encrypt = NULL; /* No function for encryption */
+ pkey->decrypt = NULL; /* No function for decryption */
+ pkey->match = &s2n_ecdsa_keys_match;
+ pkey->free = &s2n_ecdsa_key_free;
+ pkey->check_key = &s2n_ecdsa_check_key_exists;
+ return 0;
+}
+
+int s2n_ecdsa_pkey_matches_curve(const struct s2n_ecdsa_key *ecdsa_key, const struct s2n_ecc_named_curve *curve)
+{
+ notnull_check(ecdsa_key);
+ notnull_check(ecdsa_key->ec_key);
+ notnull_check(curve);
+
+ int curve_id = EC_GROUP_get_curve_name(EC_KEY_get0_group(ecdsa_key->ec_key));
+ eq_check(curve_id, curve->libcrypto_nid);
+
+ return 0;
+}