Resolves #761.

ssl passes 46/168 tests. 108 fail due to inability to start a socket and another 14 failing with attribute errors due to missing library functions.

### Checklists

- [x] Add a [CHANGELOG](https://github.com/pyodide/pyodide/blob/main/docs/project/changelog.md) entry
- [x] Add / update tests

Add cryptography, openssl, and _ssl packages. Resolves #761.

ssl passes 46/168 tests. 108 fail due to inability to start a socket and another 14 failing with attribute errors due to missing library functions.

### Checklists

- [x] Add a [CHANGELOG](https://github.com/pyodide/pyodide/blob/main/docs/project/changelog.md) entry
- [x] Add / update tests

From a4aec920c76ebcb8360350ff0046c7a0c74c0cf2 Mon Sep 17 00:00:00 2001
From: Hood <hood@mit.edu>
Date: Thu, 24 Jun 2021 14:55:10 -0700
Subject: [PATCH] xfail core ctypes tests that don't work

PyCode_SetExtra doesn't work and ctypes doesn't seem to work with variadic functions including PyUnicode_FromFormat/
---
 Lib/test/test_code.py    | 7 +++++--
 Lib/test/test_unicode.py | 1 +
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py
index ac3dde7..d91a350 100644
--- a/Lib/test/test_code.py
+++ b/Lib/test/test_code.py
@@ -389,6 +389,7 @@ if check_impl_detail(cpython=True) and ctypes is not None:
                               ctypes.c_voidp(100)), 0)
 
         def test_free_called(self):
+            raise unittest.SkipTest("PyCode_SetExtra is broken")
             # Verify that the provided free function gets invoked
             # when the code object is cleaned up.
             f = self.get_func()
@@ -398,6 +399,7 @@ if check_impl_detail(cpython=True) and ctypes is not None:
             self.assertEqual(LAST_FREED, 100)
 
         def test_get_set(self):
+            raise unittest.SkipTest("PyCode_SetExtra is broken")
             # Test basic get/set round tripping.
             f = self.get_func()
 
@@ -414,6 +416,7 @@ if check_impl_detail(cpython=True) and ctypes is not None:
             del f
 
         def test_free_different_thread(self):
+            raise unittest.SkipTest("Requires threading")
             # Freeing a code object on a different thread then
             # where the co_extra was set should be safe.
             f = self.get_func()
@@ -438,8 +441,8 @@ def test_main(verbose=None):
     from test import test_code
     run_doctest(test_code, verbose)
     tests = [CodeTest, CodeConstsTest, CodeWeakRefTest]
-    if check_impl_detail(cpython=True) and ctypes is not None:
-        tests.append(CoExtra)
+    # if check_impl_detail(cpython=True) and ctypes is not None:
+    #     tests.append(CoExtra)
     run_unittest(*tests)
 
 if __name__ == "__main__":

From a4aec920c76ebcb8360350ff0046c7a0c74c0cf2 Mon Sep 17 00:00:00 2001
From: Hood <hood@mit.edu>
Date: Thu, 24 Jun 2021 14:55:10 -0700
Subject: [PATCH] xfail core ctypes tests that don't work

PyCode_SetExtra doesn't work and ctypes doesn't seem to work with variadic functions including PyUnicode_FromFormat/
---
 Lib/test/test_code.py    | 7 +++++--
 Lib/test/test_unicode.py | 1 +
 2 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/Lib/test/test_code.py b/Lib/test/test_code.py
index ac3dde7..d91a350 100644
--- a/Lib/test/test_code.py
+++ b/Lib/test/test_code.py
@@ -389,6 +389,7 @@ if check_impl_detail(cpython=True) and ctypes is not None:
                               ctypes.c_voidp(100)), 0)
 
         def test_free_called(self):
+            raise unittest.SkipTest("PyCode_SetExtra is broken")
             # Verify that the provided free function gets invoked
             # when the code object is cleaned up.
             f = self.get_func()
@@ -398,6 +399,7 @@ if check_impl_detail(cpython=True) and ctypes is not None:
             self.assertEqual(LAST_FREED, 100)
 
         def test_get_set(self):
+            raise unittest.SkipTest("PyCode_SetExtra is broken")
             # Test basic get/set round tripping.
             f = self.get_func()
 
@@ -414,6 +416,7 @@ if check_impl_detail(cpython=True) and ctypes is not None:
             del f
 
         def test_free_different_thread(self):
+            raise unittest.SkipTest("Requires threading")
             # Freeing a code object on a different thread then
             # where the co_extra was set should be safe.
             f = self.get_func()
@@ -438,8 +441,8 @@ def test_main(verbose=None):
     from test import test_code
     run_doctest(test_code, verbose)
     tests = [CodeTest, CodeConstsTest, CodeWeakRefTest]
-    if check_impl_detail(cpython=True) and ctypes is not None:
-        tests.append(CoExtra)
+    # if check_impl_detail(cpython=True) and ctypes is not None:
+    #     tests.append(CoExtra)
     run_unittest(*tests)
 
 if __name__ == "__main__":
