public TlsPskConnection Accept() { OpenSSL.OpenSSLCheck(OpenSSL.BIO_do_handshake(in_bio) == 1, "BIO_do_handshake"); IntPtr conn = OpenSSL.BIO_pop(in_bio); IntPtr ssl; OpenSSL.BIO_get_ssl(conn, out ssl); OpenSSL.OpenSSLCheck(ssl != IntPtr.Zero, "BIO_get_ssl"); OpenSSL.SSL_use_psk_identity_hint(ssl, identityHint); OpenSSL.SSL_set_psk_server_callback(ssl, (ssl_, identity, pskOut, max_psk_len) => { Marshal.Copy(psk, 0, pskOut, (int)Math.Min(psk.Length, max_psk_len)); return((uint)psk.Length); }); OpenSSL.OpenSSLCheck(OpenSSL.BIO_do_handshake(conn) == 1, "BIO_do_handshake"); return(new TlsPskConnection(conn)); }