AString cLuaTCPLink::StartTLSServer( const AString & a_OwnCertData, const AString & a_OwnPrivKeyData, const AString & a_OwnPrivKeyPassword, const AString & a_StartTLSData ) { auto link = m_Link; if (link != nullptr) { // Create the peer cert: auto OwnCert = std::make_shared<cX509Cert>(); int res = OwnCert->Parse(a_OwnCertData.data(), a_OwnCertData.size()); if (res != 0) { return Printf("Cannot parse server certificate: -0x%x", res); } auto OwnPrivKey = std::make_shared<cCryptoKey>(); res = OwnPrivKey->ParsePrivate(a_OwnPrivKeyData.data(), a_OwnPrivKeyData.size(), a_OwnPrivKeyPassword); if (res != 0) { return Printf("Cannot parse server private key: -0x%x", res); } return link->StartTLSServer(OwnCert, OwnPrivKey, a_StartTLSData); } return ""; }
/** Binds cLuaTCPLink::StartTLSServer */ static int tolua_cTCPLink_StartTLSServer(lua_State * L) { // Function signature: // LinkInstance:StartTLSServer(OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData) -> [true] or [nil, ErrMsg] cLuaState S(L); if ( !S.CheckParamSelf("cTCPLink") || !S.CheckParamString(2, 4) || // Param 5 is optional, don't check !S.CheckParamEnd(6) ) { return 0; } // Get the link: auto Link = *static_cast<cLuaTCPLink **>(lua_touserdata(L, 1)); ASSERT(Link != nullptr); // Checked by CheckParamSelf() // Read the params: AString OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData; S.GetStackValues(2, OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData); // Start the TLS handshake: AString res = Link->StartTLSServer(OwnCert, OwnPrivKey, OwnPrivKeyPassword, StartTLSData); if (!res.empty()) { S.Push(cLuaState::Nil, Printf("Cannot start TLS on link to %s:%d: %s", Link->GetRemoteIP().c_str(), Link->GetRemotePort(), res.c_str())); return 2; } S.Push(true); return 1; }