42#include <openssl/bio.h>
43#include <openssl/err.h>
44#include <openssl/pem.h>
45#if OPENSSL_VERSION_NUMBER >= 0x30000000L
46#include <openssl/core_names.h>
51 EVP_PKEY_CTX *ckctx = EVP_PKEY_CTX_new(pkey, 0);
52 rc = EVP_PKEY_check(ckctx);
53 EVP_PKEY_CTX_free(ckctx);
64 EPNAME(
"RSA::XrdCryptosslRSA");
76 DEBUG(
"bits: "<<bits<<
", exp: "<<exp);
81 DEBUG(
"cannot allocate new exponent");
87 EVP_PKEY_CTX *pkctx = EVP_PKEY_CTX_new_id(EVP_PKEY_RSA, 0);
88 EVP_PKEY_keygen_init(pkctx);
89 EVP_PKEY_CTX_set_rsa_keygen_bits(pkctx, bits);
90#if OPENSSL_VERSION_NUMBER >= 0x30000000L
91 EVP_PKEY_CTX_set1_rsa_keygen_pubexp(pkctx, e);
94 EVP_PKEY_CTX_set_rsa_keygen_pubexp(pkctx, e);
96 EVP_PKEY_keygen(pkctx, &fEVP);
97 EVP_PKEY_CTX_free(pkctx);
103 DEBUG(
"basic length: "<<EVP_PKEY_size(fEVP)<<
" bytes");
105 DEBUG(
"WARNING: generated key is invalid");
134 EPNAME(
"RSA::XrdCryptosslRSA_key");
142 DEBUG(
"no input key");
153 DEBUG(
"key contains inconsistent information");
168 EPNAME(
"RSA::XrdCryptosslRSA_copy");
175 DEBUG(
"input key is empty");
180#if OPENSSL_VERSION_NUMBER >= 0x30000000L
181 BIGNUM *d = BN_new();
183 (EVP_PKEY_get_bn_param(r.fEVP, OSSL_PKEY_PARAM_RSA_D, &d) != 1);
187 RSA_get0_key(EVP_PKEY_get0_RSA(r.fEVP), 0, 0, &d);
188 bool publiconly = (d == 0);
192 BIO *bcpy = BIO_new(BIO_s_mem());
197 ok = (PEM_write_bio_PUBKEY(bcpy, r.fEVP) != 0);
200 ok = (PEM_write_bio_PrivateKey(bcpy,r.fEVP,0,0,0,0,0) != 0);
205 if ((fEVP = PEM_read_bio_PUBKEY(bcpy, 0, 0, 0))) {
209 if ((fEVP = PEM_read_bio_PrivateKey(bcpy,0,0,0))) {
239 int lcmax = EVP_PKEY_size(fEVP) - 42;
241 return ((lin / lcmax) + 1) * EVP_PKEY_size(fEVP);
262 EVP_PKEY *keytmp = 0;
265 BIO *bpub = BIO_new(BIO_s_mem());
268 lpub = (lpub <= 0) ? strlen(pub) : lpub;
271 BIO_write(bpub,(
void *)pub,lpub);
274 if ((keytmp = PEM_read_bio_PUBKEY(bpub, 0, 0, 0))) {
301 BIO *bpri = BIO_new(BIO_s_mem());
304 lpri = (lpri <= 0) ? strlen(pri) : lpri;
307 BIO_write(bpri,(
void *)pri,lpri);
310 if (PEM_read_bio_PrivateKey(bpri, &fEVP, 0, 0)) {
325 DEBUG(
"---------------------------------------");
326 DEBUG(
"address: "<<
this);
331 DEBUG(
"export pub key:"<<std::endl<<btmp);
334 DEBUG(
"cannot allocate memory for public key");
337 DEBUG(
"key is invalid");
339 DEBUG(
"---------------------------------------");
349 BIO *bkey = BIO_new(BIO_s_mem());
351 PEM_write_bio_PUBKEY(bkey,fEVP);
354 publen = (int) BIO_get_mem_data(bkey, &cbio);
366 EPNAME(
"RSA::ExportPublic");
370 DEBUG(
"key not valid");
376 DEBUG(
"output buffer undefined!");
381 BIO *bkey = BIO_new(BIO_s_mem());
384 PEM_write_bio_PUBKEY(bkey,fEVP);
388 int lbio = (int) BIO_get_mem_data(bkey, &cbio);
389 if (lbio <= 0 || !cbio) {
390 DEBUG(
"problems attaching to BIO content");
395 memcpy(out, cbio, lbio);
398 DEBUG(
"("<<lbio<<
" bytes) "<< std::endl <<out);
411 BIO *bkey = BIO_new(BIO_s_mem());
413 PEM_write_bio_PrivateKey(bkey,fEVP,0,0,0,0,0);
416 prilen = (int) BIO_get_mem_data(bkey, &cbio);
429 EPNAME(
"RSA::ExportPrivate");
433 DEBUG(
"key not valid");
439 DEBUG(
"output buffer undefined!");
444 BIO *bkey = BIO_new(BIO_s_mem());
447 PEM_write_bio_PrivateKey(bkey,fEVP,0,0,0,0,0);
451 int lbio = (int) BIO_get_mem_data(bkey, &cbio);
452 if (lbio <= 0 || !cbio) {
453 DEBUG(
"problems attaching to BIO content");
458 memcpy(out, cbio, lbio);
461 DEBUG(
"("<<lbio<<
" bytes) "<< std::endl <<out);
474 EPNAME(
"RSA::EncryptPrivate");
477 if (!in || lin <= 0) {
478 DEBUG(
"input buffer undefined");
483 if (!out || loutmax <= 0) {
484 DEBUG(
"output buffer undefined");
490 size_t lcmax = EVP_PKEY_size(fEVP) - 11;
496 EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(fEVP, 0);
497 EVP_PKEY_sign_init(ctx);
498 EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING);
499 while (len > 0 && ke <=
int(loutmax - lout)) {
500 size_t lc = (len > lcmax) ? lcmax : len;
502 if (EVP_PKEY_sign(ctx, (
unsigned char *)&out[ke], &lout,
503 (
unsigned char *)&in[kk], lc) <= 0) {
504 EVP_PKEY_CTX_free(ctx);
506 ERR_error_string(ERR_get_error(), serr);
507 DEBUG(
"error: " <<serr);
514 EVP_PKEY_CTX_free(ctx);
515 if (len > 0 && ke >
int(loutmax - lout))
516 DEBUG(
"buffer truncated");
529 EPNAME(
"RSA::EncryptPublic");
532 if (!in || lin <= 0) {
533 DEBUG(
"input buffer undefined");
538 if (!out || loutmax <= 0) {
539 DEBUG(
"output buffer undefined");
545 size_t lcmax = EVP_PKEY_size(fEVP) - 42;
551 EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(fEVP, 0);
552 EVP_PKEY_encrypt_init(ctx);
553 EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
554 while (len > 0 && ke <=
int(loutmax - lout)) {
555 size_t lc = (len > lcmax) ? lcmax : len;
557 if (EVP_PKEY_encrypt(ctx, (
unsigned char *)&out[ke], &lout,
558 (
unsigned char *)&in[kk], lc) <= 0) {
559 EVP_PKEY_CTX_free(ctx);
561 ERR_error_string(ERR_get_error(), serr);
562 DEBUG(
"error: " <<serr);
569 EVP_PKEY_CTX_free(ctx);
570 if (len > 0 && ke >
int(loutmax - lout))
571 DEBUG(
"buffer truncated");
584 EPNAME(
"RSA::DecryptPrivate");
587 if (!in || lin <= 0) {
588 DEBUG(
"input buffer undefined");
593 if (!out || loutmax <= 0) {
594 DEBUG(
"output buffer undefined");
600 size_t lcmax = EVP_PKEY_size(fEVP);
606 EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(fEVP, 0);
607 EVP_PKEY_decrypt_init(ctx);
608 EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_OAEP_PADDING);
609 while (len > 0 && ke <=
int(loutmax - lout)) {
611 if (EVP_PKEY_decrypt(ctx, (
unsigned char *)&out[ke], &lout,
612 (
unsigned char *)&in[kk], lcmax) <= 0) {
613 EVP_PKEY_CTX_free(ctx);
615 ERR_error_string(ERR_get_error(), serr);
616 DEBUG(
"error: " <<serr);
623 EVP_PKEY_CTX_free(ctx);
624 if (len > 0 && ke >
int(loutmax - lout))
625 PRINT(
"buffer truncated");
638 EPNAME(
"RSA::DecryptPublic");
641 if (!in || lin <= 0) {
642 DEBUG(
"input buffer undefined");
647 if (!out || loutmax <= 0) {
648 DEBUG(
"output buffer undefined");
654 size_t lcmax = EVP_PKEY_size(fEVP);
660 EVP_PKEY_CTX *ctx = EVP_PKEY_CTX_new(fEVP, 0);
661 EVP_PKEY_verify_recover_init(ctx);
662 EVP_PKEY_CTX_set_rsa_padding(ctx, RSA_PKCS1_PADDING);
663 while (len > 0 && ke <=
int(loutmax - lout)) {
665 if (EVP_PKEY_verify_recover(ctx, (
unsigned char *)&out[ke], &lout,
666 (
unsigned char *)&in[kk], lcmax) <= 0) {
667 EVP_PKEY_CTX_free(ctx);
669 ERR_error_string(ERR_get_error(), serr);
670 PRINT(
"error: " <<serr);
677 EVP_PKEY_CTX_free(ctx);
678 if (len > 0 && ke >
int(loutmax - lout))
679 PRINT(
"buffer truncated");
#define XrdCryptoMinRSABits
#define XrdCryptoDefRSAExp
#define XrdCryptoDefRSABits
static int XrdCheckRSA(EVP_PKEY *pkey)
static int XrdCheckRSA(EVP_PKEY *pkey)
int EncryptPrivate(const char *in, int lin, char *out, int lout)
int ExportPublic(char *out, int lout)
int ImportPublic(const char *in, int lin)
XrdCryptosslRSA(int bits=XrdCryptoMinRSABits, int exp=XrdCryptoDefRSAExp)
int DecryptPrivate(const char *in, int lin, char *out, int lout)
int ExportPrivate(char *out, int lout)
int ImportPrivate(const char *in, int lin)
virtual ~XrdCryptosslRSA()
int EncryptPublic(const char *in, int lin, char *out, int lout)
int DecryptPublic(const char *in, int lin, char *out, int lout)