VncServerClient::AuthState ServerAuthenticationManager::performLogonAuthentication( VncServerClient* client, VariantArrayMessage& message ) { switch( client->authState() ) { case VncServerClient::AuthInit: { CryptoCore::PrivateKey privateKey = CryptoCore::KeyGenerator().createRSA( CryptoCore::RsaKeySize ); client->setPrivateKey( privateKey.toPEM() ); CryptoCore::PublicKey publicKey = privateKey.toPublicKey(); if( VariantArrayMessage( message.ioDevice() ).write( publicKey.toPEM() ).send() ) { return VncServerClient::AuthPassword; } else { qDebug( "ServerAuthenticationManager::performLogonAuthentication(): failed to send public key" ); return VncServerClient::AuthFinishedFail; } } case VncServerClient::AuthPassword: { CryptoCore::PrivateKey privateKey = CryptoCore::PrivateKey::fromPEM( client->privateKey() ); CryptoCore::SecureArray encryptedPassword( message.read().toByteArray() ); CryptoCore::SecureArray decryptedPassword; if( privateKey.decrypt( encryptedPassword, &decryptedPassword, CryptoCore::DefaultEncryptionAlgorithm ) == false ) { qWarning( "ServerAuthenticationManager::performLogonAuthentication(): failed to decrypt password" ); return VncServerClient::AuthFinishedFail; } AuthenticationCredentials credentials; credentials.setLogonUsername( client->username() ); credentials.setLogonPassword( QString::fromUtf8( decryptedPassword.toByteArray() ) ); if( LogonAuthentication::authenticateUser( credentials ) ) { qDebug( "ServerAuthenticationManager::performLogonAuthentication(): SUCCESS" ); return VncServerClient::AuthFinishedSuccess; } qDebug( "ServerAuthenticationManager::performLogonAuthentication(): FAIL" ); return VncServerClient::AuthFinishedFail; } default: break; } return VncServerClient::AuthFinishedFail; }
AuthenticationCredentials PasswordDialog::credentials() const { AuthenticationCredentials cred; cred.setLogonUsername( username() ); cred.setLogonPassword( password() ); return cred; }