Hello everyone, I’m new at OpenSSL programming and encountered a problem while build TLS connection. I’m working on a crypto chip ATECC508A. So the client private key is stored in the chip and no way to get it out. However during standard TLS handshake, I need to provide client private key by “SSL_CTX_use_private_key()” if server needs to identify the client. Because the server will give a “challenge” to client and client needs to encrypt it by client private key. Then the server will decode it by client public key and check if they match. For your reference: https://en.wikipedia.org/wiki/Transport_Layer_Security#TLS_handshake I have written my sample client and server code. Everything works fine if I use my own test certificates: selft-signed CA and client cert signed by CA (this means I have the test client cert private key so that I could use SSL_CTX_use_private_key() to import it). The problem is here, in ATECC508A, I’m not able to provide private key directly but have API to sign any digests. So I wonder are there any ways to do some “modification” during handshake? I have tried following two ways:
Those are what I tried and of course failed every try. :( So could anyone point me what should I do? Maybe I used wrong engine, missed some important callback or others? Best Regards, Jim ========= I post my client test code for your reference: #include <openssl/ssl.h> #include <openssl/conf.h> #include "openssl/eccx08_engine.h" #include "openssl/eccx08_engine_internal.h" int main() { static ENGINE *ateccx08_engine; OpenSSL_add_all_algorithms(); ERR_load_crypto_strings(); PRINTF("ENGINE_load_dynamic"); ENGINE_load_dynamic(); printf("CONF_modules_load_file"); if (!CONF_modules_load_file(NULL, NULL, CONF_MFLAGS_DEFAULT_SECTION)) { printf("Config failed to load"); } printf("ENGINE_by_id"); ateccx08_engine = ENGINE_by_id("ateccx08"); if (ateccx08_engine == NULL) { printf("Engine failed to load"); } // after some initialization // load client-side cert and key, signed by intermediate cert SSL_CTX_use_certificate_file(m_ctx, ClientCertificateFileTest, SSL_FILETYPE_PEM); // no need anymore because no way to extract private key // SSL_CTX_use_PrivateKey_file(m_ctx, ClientPrivateKeyFileTest, SSL_FILETYPE_PEM); // load intermediate cert, signed by CA X509* chaincert = X509_new(); BIO* bio_cert = BIO_new_file(SignerCertificateFileTest, "rb"); PEM_read_bio_X509(bio_cert, &chaincert, NULL, NULL); SSL_CTX_add1_chain_cert(m_ctx, chaincert) m_ssl = SSL_new(m_ctx); // get_seocket is my own API m_sock = get_socket(); SSL_set_fd(m_ssl, m_sock) // doing handshake and build connection, however no output from ECDSA sign algorithm auto r = SSL_connect(m_ssl); } |
-- openssl-users mailing list To unsubscribe: https://mta.openssl.org/mailman/listinfo/openssl-users