vb

2013-09-16 3 views
5

Ben sadece n, e, d kullanarak Openssl için RSA anahtar çiftini yükleme bir yol bulmaya çalışıyorum. RSA için openssl belgelerine göre bu bileşenler (p, q, vb.) NULL olabilir, ancak bulmayı başardığım tuşları yüklemek için tek işlev i2d_RSAPrivateKey/i2d_RSAPublicKey'dir. Talihsiz bu işlevler sadece DER formatındaki tuşlarla çalışır.vb

Yani RSA yapısına doğrudan başa çıkma haricinde benim anahtarları (n, e, d) yüklemek için herhangi bir yolu var mı?

cevap

2

... bu işlevler DER formatında tuşları ile çalışır.

OpenSSL en app.c yarar bir dosyadan anahtarları yüklemek için kullandığı kodu vardır (eğer BIO farklı kullanabilirsiniz çünkü pratik amaçlar için, dosya veya belleğe arasında hiçbir fark yoktur). Aşağıda yeniden üretildi ve bir dizi format sunuyor.

Anahtarları (n, e, d) doğrudan RSA yapısına ayırmak dışında yüklemek için herhangi bir yol var mı?

Anahtarlarınız ne biçimidir?


EVP_PKEY *load_key(BIO *err, const char *file, int format, int maybe_stdin, 
        const char *pass, ENGINE *e, const char *key_descrip) 
{ 
    BIO *key=NULL; 
    EVP_PKEY *pkey=NULL; 
    PW_CB_DATA cb_data; 

    cb_data.password = pass; 
    cb_data.prompt_info = file; 

    if (file == NULL && (!maybe_stdin || format == FORMAT_ENGINE)) 
    { 
     BIO_printf(err,"no keyfile specified\n"); 
     goto end; 
    } 
#ifndef OPENSSL_NO_ENGINE 
    if (format == FORMAT_ENGINE) 
    { 
     if (!e) 
      BIO_printf(err,"no engine specified\n"); 
     else 
     { 
      pkey = ENGINE_load_private_key(e, file, 
              ui_method, &cb_data); 
      if (!pkey) 
      { 
       BIO_printf(err,"cannot load %s from engine\n",key_descrip); 
       ERR_print_errors(err); 
      } 
     } 
     goto end; 
    } 
#endif 
    key=BIO_new(BIO_s_file()); 
    if (key == NULL) 
    { 
     ERR_print_errors(err); 
     goto end; 
    } 
    if (file == NULL && maybe_stdin) 
    { 
#ifdef _IONBF 
# ifndef OPENSSL_NO_SETVBUF_IONBF 
     setvbuf(stdin, NULL, _IONBF, 0); 
# endif /* ndef OPENSSL_NO_SETVBUF_IONBF */ 
#endif 
     BIO_set_fp(key,stdin,BIO_NOCLOSE); 
    } 
    else 
     if (BIO_read_filename(key,file) <= 0) 
     { 
      BIO_printf(err, "Error opening %s %s\n", 
         key_descrip, file); 
      ERR_print_errors(err); 
      goto end; 
     } 
    if (format == FORMAT_ASN1) 
    { 
     pkey=d2i_PrivateKey_bio(key, NULL); 
    } 
    else if (format == FORMAT_PEM) 
    { 
     pkey=PEM_read_bio_PrivateKey(key,NULL, 
            (pem_password_cb *)password_callback, &cb_data); 
    } 
#if !defined(OPENSSL_NO_RC4) && !defined(OPENSSL_NO_RSA) 
    else if (format == FORMAT_NETSCAPE || format == FORMAT_IISSGC) 
     pkey = load_netscape_key(err, key, file, key_descrip, format); 
#endif 
    else if (format == FORMAT_PKCS12) 
    { 
     if (!load_pkcs12(err, key, key_descrip, 
         (pem_password_cb *)password_callback, &cb_data, 
         &pkey, NULL, NULL)) 
      goto end; 
    } 
#if !defined(OPENSSL_NO_RSA) && !defined(OPENSSL_NO_DSA) && !defined (OPENSSL_NO_RC4) 
    else if (format == FORMAT_MSBLOB) 
     pkey = b2i_PrivateKey_bio(key); 
    else if (format == FORMAT_PVK) 
     pkey = b2i_PVK_bio(key, (pem_password_cb *)password_callback, 
          &cb_data); 
#endif 
    else 
    { 
     BIO_printf(err,"bad input format specified for key file\n"); 
     goto end; 
    } 
end: 
    if (key != NULL) BIO_free(key); 
    if (pkey == NULL) 
    { 
     BIO_printf(err,"unable to load %s\n", key_descrip); 
     ERR_print_errors(err); 
    } 
    return(pkey); 
}