diff --git a/ap/lib/libssl/openssl-1.1.1o/test/gosttest.c b/ap/lib/libssl/openssl-1.1.1o/test/gosttest.c
new file mode 100644
index 0000000..1a31a33
--- /dev/null
+++ b/ap/lib/libssl/openssl-1.1.1o/test/gosttest.c
@@ -0,0 +1,91 @@
+/*
+ * Copyright 2018 The OpenSSL Project Authors. All Rights Reserved.
+ *
+ * Licensed under the OpenSSL license (the "License").  You may not use
+ * this file except in compliance with the License.  You can obtain a copy
+ * in the file LICENSE in the source distribution or at
+ * https://www.openssl.org/source/license.html
+ */
+
+#include "ssltestlib.h"
+#include "testutil.h"
+#include "internal/nelem.h"
+
+static char *cert1 = NULL;
+static char *privkey1 = NULL;
+static char *cert2 = NULL;
+static char *privkey2 = NULL;
+
+static struct {
+    char *cipher;
+    int expected_prot;
+    int certnum;
+} ciphers[] = {
+    /* Server doesn't have a cert with appropriate sig algs - should fail */
+    {"AES128-SHA", 0, 0},
+    /* Server doesn't have a TLSv1.3 capable cert - should use TLSv1.2 */
+    {"GOST2012-GOST8912-GOST8912", TLS1_2_VERSION, 0},
+    /* Server doesn't have a TLSv1.3 capable cert - should use TLSv1.2 */
+    {"GOST2012-GOST8912-GOST8912", TLS1_2_VERSION, 1},
+    /* Server doesn't have a TLSv1.3 capable cert - should use TLSv1.2 */
+    {"GOST2001-GOST89-GOST89", TLS1_2_VERSION, 0},
+};
+
+/* Test that we never negotiate TLSv1.3 if using GOST */
+static int test_tls13(int idx)
+{
+    SSL_CTX *cctx = NULL, *sctx = NULL;
+    SSL *clientssl = NULL, *serverssl = NULL;
+    int testresult = 0;
+
+    if (!TEST_true(create_ssl_ctx_pair(TLS_server_method(),
+                                       TLS_client_method(),
+                                       TLS1_VERSION,
+                                       TLS_MAX_VERSION,
+                                       &sctx, &cctx,
+                                       ciphers[idx].certnum == 0 ? cert1
+                                                                 : cert2,
+                                       ciphers[idx].certnum == 0 ? privkey1
+                                                                 : privkey2)))
+        goto end;
+
+    if (!TEST_true(SSL_CTX_set_cipher_list(cctx, ciphers[idx].cipher))
+            || !TEST_true(SSL_CTX_set_cipher_list(sctx, ciphers[idx].cipher))
+            || !TEST_true(create_ssl_objects(sctx, cctx, &serverssl, &clientssl,
+                                             NULL, NULL)))
+        goto end;
+
+    if (ciphers[idx].expected_prot == 0) {
+        if (!TEST_false(create_ssl_connection(serverssl, clientssl,
+                                              SSL_ERROR_NONE)))
+            goto end;
+    } else {
+        if (!TEST_true(create_ssl_connection(serverssl, clientssl,
+                                             SSL_ERROR_NONE))
+                || !TEST_int_eq(SSL_version(clientssl),
+                                ciphers[idx].expected_prot))
+        goto end;
+    }
+
+    testresult = 1;
+
+ end:
+    SSL_free(serverssl);
+    SSL_free(clientssl);
+    SSL_CTX_free(sctx);
+    SSL_CTX_free(cctx);
+
+    return testresult;
+}
+
+int setup_tests(void)
+{
+    if (!TEST_ptr(cert1 = test_get_argument(0))
+            || !TEST_ptr(privkey1 = test_get_argument(1))
+            || !TEST_ptr(cert2 = test_get_argument(2))
+            || !TEST_ptr(privkey2 = test_get_argument(3)))
+        return 0;
+
+    ADD_ALL_TESTS(test_tls13, OSSL_NELEM(ciphers));
+    return 1;
+}
