#include #include "dns.h" // NSPR include files #include #include #include #include // NSS include files #include #include #include #include #include #include // Qt Include Files, should come after NSPR / NSS #include #include NSSInitContext *nssContext; SECMODModule *builtInRootsMod; // PK11 Password Function typedef typedef char *(*PK11PasswordFunc)( PK11SlotInfo *slot, PRBool retry, void *arg); void init() { // NSPR Init PR_Init(PR_USER_THREAD, PR_PRIORITY_NORMAL, 0); // NSS Init nssContext = NSS_InitContext("sql:/etc/pki/nssdb", "", "", "", NULL, NSS_INIT_READONLY | NSS_INIT_PK11RELOAD); if(nssContext == NULL) { const PRErrorCode err = PR_GetError(); fprintf(stderr, "NSSInitContext failed: Error code %d: %s\n", err, PR_ErrorToName(err)); exit(1); } // Ciphers to enable static const PRUint16 goodCiphers[] = { TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, SSL_NULL_WITH_NULL_NULL // Sentinel value }; PRBool foundGoodCipher = PR_FALSE; for(const PRUint16 *p = goodCiphers; *p != SSL_NULL_WITH_NULL_NULL; ++p) { PRInt32 policy; if(SSL_CipherPolicyGet(*p, &policy) != SECSuccess) { const PRErrorCode err = PR_GetError(); fprintf(stderr, "Error: Policy for cipher %u: error %d: %s\n", (unsigned)*p, err, PR_ErrorToName(err)); exit(1); } if(policy == SSL_ALLOWED) { // Policy allowed this cipher choice fprintf(stderr, "Info: found cipher %x\n", (unsigned) *p); foundGoodCipher = PR_TRUE; break; } } if(!foundGoodCipher) { if(NSS_SetDomesticPolicy() != SECSuccess) { const PRErrorCode err = PR_GetError(); fprintf(stderr, "Error: NSS_SetDomesticPolicy: error %d: %s\n", err, PR_ErrorToName(err)); exit(1); } } // Initialize trusted certificate store char module_name[] = "library=libnssckbi.so name=\"Root Certs\""; builtInRootsMod = SECMOD_LoadUserModule(module_name, NULL, PR_FALSE); if(builtInRootsMod == NULL || !builtInRootsMod->loaded) { const PRErrorCode err = PR_GetError(); fprintf(stderr, "Error: Loading built in roots module failed, code %d: %s\n", err, PR_ErrorToName(err)); exit(1); } } int main(int argc, char* argv[]) { init(); PRNetAddr theAddr; LookupName((char *)"buyvm.theoks.net", &theAddr); char ipString[80]; PRStatus status = PR_NetAddrToString(&theAddr, ipString, 75); if(status == PR_FAILURE) { const PRErrorCode err = PR_GetError(); fprintf(stderr, "Error: Converting PRNetAddr to string %d: %s\n", err, PR_ErrorToName(err)); exit(1); } PRFileDesc *tcpSocket = PR_NewTCPSocket(); theAddr.inet.port = 443; PRFileDesc *nssSocket; SSL_ImportFD(NULL, tcpSocket); QApplication app(argc, argv); QWidget mainWindow; mainWindow.resize(1280, 720); mainWindow.setWindowTitle("oksirc - early Qt test"); QPlainTextEdit *mainLog = new QPlainTextEdit(); mainLog->setReadOnly(true); QLineEdit *textEntry = new QLineEdit(); QPushButton *sendButton = new QPushButton(QApplication::translate("send", "Send")); QHBoxLayout *entryLineLayout = new QHBoxLayout(); entryLineLayout->addWidget(textEntry); entryLineLayout->addWidget(sendButton); QVBoxLayout *mainLogAndLineLayout = new QVBoxLayout(); mainLogAndLineLayout->addWidget(mainLog); mainLogAndLineLayout->addLayout(entryLineLayout); mainWindow.setLayout(mainLogAndLineLayout); mainWindow.show(); textEntry->setFocus(); char messageBuf[1024]; sprintf(messageBuf, "Found IP Address: %s", ipString); mainLog->appendPlainText(messageBuf); SECMOD_DestroyModule(builtInRootsMod); NSS_ShutdownContext(nssContext); return app.exec(); }