%PDF- %PDF-
| Direktori : /data/old/usr/lib/golang/src/crypto/internal/boring/ |
| Current File : //data/old/usr/lib/golang/src/crypto/internal/boring/openssl_port_rsa.c.orig |
// This file contains RSA portability wrappers.
// +build linux
// +build !android
// +build !no_openssl
// +build !cmd_go_bootstrap
// +build !msan
// +build !static
#include "goboringcrypto.h"
// Only in BoringSSL.
int _goboringcrypto_RSA_generate_key_fips(GO_RSA *rsa, int size, GO_BN_GENCB *cb)
{
// BoringSSL's RSA_generate_key_fips hard-codes e to 65537.
BIGNUM *e = _goboringcrypto_BN_new();
if (e == NULL)
return 0;
int ret = _goboringcrypto_BN_set_word(e, RSA_F4) && _goboringcrypto_RSA_generate_key_ex(rsa, size, e, cb);
_goboringcrypto_BN_free(e);
return ret;
}
int _goboringcrypto_RSA_digest_and_sign_pss_mgf1(GO_RSA *rsa, unsigned int *out_len, uint8_t *out, size_t max_out,
const uint8_t *in, size_t in_len, EVP_MD *md, const EVP_MD *mgf1_md, int salt_len)
{
EVP_PKEY_CTX *ctx;
unsigned int siglen;
int ret = 0;
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
if (!key) {
goto err;
}
if (!_goboringcrypto_EVP_PKEY_set1_RSA(key, rsa))
goto err;
ctx = _goboringcrypto_EVP_PKEY_CTX_new(key, NULL /* no engine */);
if (!ctx)
goto err;
EVP_MD_CTX *mdctx = NULL;
if (!(mdctx = _goboringcrypto_EVP_MD_CTX_create()))
goto err;
if (1 != _goboringcrypto_EVP_DigestSignInit(mdctx, &ctx, md, NULL, key))
goto err;
if (_goboringcrypto_EVP_PKEY_sign_init(ctx) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_signature_md(ctx, md) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, salt_len) <= 0)
goto err;
if (mgf1_md)
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, mgf1_md) <= 0)
goto err;
if (1 != _goboringcrypto_EVP_DigestUpdate(mdctx, in, in_len))
goto err;
/* Obtain the signature length */
if (1 != _goboringcrypto_EVP_DigestSignFinal(mdctx, NULL, out_len))
goto err;
/* Obtain the signature */
if (1 != _goboringcrypto_EVP_DigestSignFinal(mdctx, out, out_len))
goto err;
ret = 1;
err:
if (mdctx)
_goboringcrypto_EVP_MD_CTX_free(mdctx);
if (ctx)
_goboringcrypto_EVP_PKEY_CTX_free(ctx);
if (key)
_goboringcrypto_EVP_PKEY_free(key);
return ret;
}
int _goboringcrypto_RSA_sign_pss_mgf1(GO_RSA *rsa, unsigned int *out_len, uint8_t *out, unsigned int max_out,
const uint8_t *in, unsigned int in_len, EVP_MD *md, const EVP_MD *mgf1_md, int salt_len) {
EVP_PKEY_CTX *ctx;
EVP_PKEY *pkey;
size_t siglen;
int ret = 0;
pkey = _goboringcrypto_EVP_PKEY_new();
if (!pkey)
goto err;
if (_goboringcrypto_EVP_PKEY_set1_RSA(pkey, rsa) <= 0)
goto err;
ctx = _goboringcrypto_EVP_PKEY_CTX_new(pkey, NULL /* no engine */);
if (!ctx)
goto err;
if (_goboringcrypto_EVP_PKEY_sign_init(ctx) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_signature_md(ctx, md) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, salt_len) <= 0)
goto err;
if (mgf1_md)
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, mgf1_md) <= 0)
goto err;
/* Determine buffer length */
if (_goboringcrypto_EVP_PKEY_sign(ctx, NULL, &siglen, in, in_len) <= 0)
goto err;
if (max_out < siglen)
goto err;
if (_goboringcrypto_EVP_PKEY_sign(ctx, out, &siglen, in, in_len) <= 0)
goto err;
*out_len = siglen;
ret = 1;
err:
if (ctx)
_goboringcrypto_EVP_PKEY_CTX_free(ctx);
if (pkey)
_goboringcrypto_EVP_PKEY_free(pkey);
return ret;
}
int _goboringcrypto_RSA_verify_pss_mgf1(RSA *rsa, const uint8_t *msg, unsigned int msg_len,
EVP_MD *md, const EVP_MD *mgf1_md, int salt_len, const uint8_t *sig, unsigned int sig_len) {
EVP_PKEY_CTX *ctx;
EVP_PKEY *pkey;
int ret = 0;
pkey = _goboringcrypto_EVP_PKEY_new();
if (!pkey)
goto err;
if (_goboringcrypto_EVP_PKEY_set1_RSA(pkey, rsa) <= 0)
goto err;
ctx = _goboringcrypto_EVP_PKEY_CTX_new(pkey, NULL /* no engine */);
if (!ctx)
goto err;
if (_goboringcrypto_EVP_PKEY_verify_init(ctx) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PSS_PADDING) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_pss_saltlen(ctx, salt_len) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_CTX_set_signature_md(ctx, md) <= 0)
goto err;
if (mgf1_md)
if (_goboringcrypto_EVP_PKEY_CTX_set_rsa_mgf1_md(ctx, mgf1_md) <= 0)
goto err;
if (_goboringcrypto_EVP_PKEY_verify(ctx, sig, sig_len, msg, msg_len) <= 0)
goto err;
ret = 1;
err:
if (ctx)
_goboringcrypto_EVP_PKEY_CTX_free(ctx);
if (pkey)
_goboringcrypto_EVP_PKEY_free(pkey);
return ret;
}
int _goboringcrypto_EVP_RSA_sign(EVP_MD *md, const uint8_t *msg, unsigned int msgLen, uint8_t *sig, unsigned int *slen, RSA *rsa)
{
int result;
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
if (!key) {
return 0;
}
if (!_goboringcrypto_EVP_PKEY_set1_RSA(key, rsa)) {
result = 0;
goto err;
}
result = _goboringcrypto_EVP_sign(md, NULL, msg, msgLen, sig, slen, key);
err:
_goboringcrypto_EVP_PKEY_free(key);
return result;
}
int _goboringcrypto_EVP_RSA_verify(EVP_MD *md, const uint8_t *msg, unsigned int msgLen, const uint8_t *sig, unsigned int slen, GO_RSA *rsa)
{
int result;
EVP_PKEY *key = _goboringcrypto_EVP_PKEY_new();
if (!key) {
return 0;
}
if (!_goboringcrypto_EVP_PKEY_set1_RSA(key, rsa)) {
result = 0;
goto err;
}
result = _goboringcrypto_EVP_verify(md, NULL, msg, msgLen, sig, slen, key);
err:
_goboringcrypto_EVP_PKEY_free(key);
return result;
}