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 d9181272105915622a3eb8940e08aaf6e00f385c Mon Sep 17 00:00:00 2001
From: Hood <hood@mit.edu>
Date: Wed, 8 Sep 2021 17:49:15 -0700
Subject: [PATCH] Fix dup

---
 src/library_fs.js      |  7 ++++++-
 src/library_syscall.js | 12 ++++++------
 2 files changed, 12 insertions(+), 7 deletions(-)

This should fix two problems with the `dup` system calls:
1. `dup` expects that every file descriptor has a corresponding file (so pipes and (https://github.com/emscripten-core/emscripten/issues/14640)
   files that have been unlinked (https://github.com/emscripten-core/emscripten/issues/15012) cannot be duplicated ).
2. The dup'd file descriptor does not share flags and position with the original file desciptor.

This is a simplification of an upstream pull request that would fix this problem.
https://github.com/emscripten-core/emscripten/pull/9396/files
This patch is simpler than the upstream one but leaves NODERAWFS broken.


diff --git a/emsdk/upstream/emscripten/src/library_fs.js b/emsdk/upstream/emscripten/src/library_fs.js
index 4ca59469c..519fab972 100644
--- a/emsdk/upstream/emscripten/src/library_fs.js
+++ b/emsdk/upstream/emscripten/src/library_fs.js
@@ -425,11 +425,16 @@ FS.staticInit();` +
           },
           isAppend: {
             get: function() { return (this.flags & {{{ cDefine('O_APPEND') }}}); }
-          }
+          },
+          get flags() { return this.shared.flags; },
+          set flags(value) { this.shared.flags = value; },
+          get position() { return this.shared.position; },
+          set position(value) { this.shared.position = value; },
         };
       }
       // clone it, so we can return an instance of FSStream
       var newStream = new FS.FSStream();
+      newStream.shared = {};
       for (var p in stream) {
         newStream[p] = stream[p];
       }
diff --git a/emsdk/upstream/emscripten/src/library_syscall.js b/emsdk/upstream/emscripten/src/library_syscall.js
index 96d2ec0c3..0001624ec 100644
--- a/emsdk/upstream/emscripten/src/library_syscall.js
+++ b/emsdk/upstream/emscripten/src/library_syscall.js
@@ -137,10 +137,10 @@ var SyscallsLibrary = {
       }
       return 0;
     },
-    doDup: function(path, flags, suggestFD) {
+    doDup: function(stream, suggestFD) {
       var suggest = FS.getStream(suggestFD);
       if (suggest) FS.close(suggest);
-      return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
+      return FS.createStream(stream, suggestFD, suggestFD).fd;
     },
     doReadv: function(stream, iov, iovcnt, offset) {
       var ret = 0;
@@ -380,7 +380,7 @@ var SyscallsLibrary = {
   },
   __sys_dup: function(fd) {
     var old = SYSCALLS.getStreamFromFD(fd);
-    return FS.open(old.path, old.flags, 0).fd;
+    return FS.createStream(old, 0).fd;
   },
   __sys_pipe__deps: ['$PIPEFS'],
   __sys_pipe: function(fdPtr) {
@@ -472,7 +472,7 @@ var SyscallsLibrary = {
   __sys_dup2: function(oldfd, suggestFD) {
     var old = SYSCALLS.getStreamFromFD(oldfd);
     if (old.fd === suggestFD) return suggestFD;
-    return SYSCALLS.doDup(old.path, old.flags, suggestFD);
+    return SYSCALLS.doDup(old, suggestFD);
   },
   __sys_getppid__nothrow: true,
   __sys_getppid__proxy: false,
@@ -1167,7 +1167,7 @@ var SyscallsLibrary = {
           return -{{{ cDefine('EINVAL') }}};
         }
         var newStream;
-        newStream = FS.open(stream.path, stream.flags, 0, arg);
+        newStream = FS.createStream(stream, arg);
         return newStream.fd;
       }
       case {{{ cDefine('F_GETFD') }}}:
@@ -1403,7 +1403,7 @@ var SyscallsLibrary = {
     assert(!flags);
 #endif
     if (old.fd === suggestFD) return -{{{ cDefine('EINVAL') }}};
-    return SYSCALLS.doDup(old.path, old.flags, suggestFD);
+    return SYSCALLS.doDup(old, suggestFD);
   },
   __sys_pipe2__nothrow: true,
   __sys_pipe2__proxy: false,
-- 
2.17.1


From d9181272105915622a3eb8940e08aaf6e00f385c Mon Sep 17 00:00:00 2001
From: Hood <hood@mit.edu>
Date: Wed, 8 Sep 2021 17:49:15 -0700
Subject: [PATCH] Fix dup

---
 src/library_fs.js      |  7 ++++++-
 src/library_syscall.js | 12 ++++++------
 2 files changed, 12 insertions(+), 7 deletions(-)

This should fix two problems with the `dup` system calls:
1. `dup` expects that every file descriptor has a corresponding file (so pipes and (https://github.com/emscripten-core/emscripten/issues/14640)
   files that have been unlinked (https://github.com/emscripten-core/emscripten/issues/15012) cannot be duplicated ).
2. The dup'd file descriptor does not share flags and position with the original file desciptor.

This is a simplification of an upstream pull request that would fix this problem.
https://github.com/emscripten-core/emscripten/pull/9396/files
This patch is simpler than the upstream one but leaves NODERAWFS broken.


diff --git a/emsdk/upstream/emscripten/src/library_fs.js b/emsdk/upstream/emscripten/src/library_fs.js
index 4ca59469c..519fab972 100644
--- a/emsdk/upstream/emscripten/src/library_fs.js
+++ b/emsdk/upstream/emscripten/src/library_fs.js
@@ -425,11 +425,16 @@ FS.staticInit();` +
           },
           isAppend: {
             get: function() { return (this.flags & {{{ cDefine('O_APPEND') }}}); }
-          }
+          },
+          get flags() { return this.shared.flags; },
+          set flags(value) { this.shared.flags = value; },
+          get position() { return this.shared.position; },
+          set position(value) { this.shared.position = value; },
         };
       }
       // clone it, so we can return an instance of FSStream
       var newStream = new FS.FSStream();
+      newStream.shared = {};
       for (var p in stream) {
         newStream[p] = stream[p];
       }
diff --git a/emsdk/upstream/emscripten/src/library_syscall.js b/emsdk/upstream/emscripten/src/library_syscall.js
index 96d2ec0c3..0001624ec 100644
--- a/emsdk/upstream/emscripten/src/library_syscall.js
+++ b/emsdk/upstream/emscripten/src/library_syscall.js
@@ -137,10 +137,10 @@ var SyscallsLibrary = {
       }
       return 0;
     },
-    doDup: function(path, flags, suggestFD) {
+    doDup: function(stream, suggestFD) {
       var suggest = FS.getStream(suggestFD);
       if (suggest) FS.close(suggest);
-      return FS.open(path, flags, 0, suggestFD, suggestFD).fd;
+      return FS.createStream(stream, suggestFD, suggestFD).fd;
     },
     doReadv: function(stream, iov, iovcnt, offset) {
       var ret = 0;
@@ -380,7 +380,7 @@ var SyscallsLibrary = {
   },
   __sys_dup: function(fd) {
     var old = SYSCALLS.getStreamFromFD(fd);
-    return FS.open(old.path, old.flags, 0).fd;
+    return FS.createStream(old, 0).fd;
   },
   __sys_pipe__deps: ['$PIPEFS'],
   __sys_pipe: function(fdPtr) {
@@ -472,7 +472,7 @@ var SyscallsLibrary = {
   __sys_dup2: function(oldfd, suggestFD) {
     var old = SYSCALLS.getStreamFromFD(oldfd);
     if (old.fd === suggestFD) return suggestFD;
-    return SYSCALLS.doDup(old.path, old.flags, suggestFD);
+    return SYSCALLS.doDup(old, suggestFD);
   },
   __sys_getppid__nothrow: true,
   __sys_getppid__proxy: false,
@@ -1167,7 +1167,7 @@ var SyscallsLibrary = {
           return -{{{ cDefine('EINVAL') }}};
         }
         var newStream;
-        newStream = FS.open(stream.path, stream.flags, 0, arg);
+        newStream = FS.createStream(stream, arg);
         return newStream.fd;
       }
       case {{{ cDefine('F_GETFD') }}}:
@@ -1403,7 +1403,7 @@ var SyscallsLibrary = {
     assert(!flags);
 #endif
     if (old.fd === suggestFD) return -{{{ cDefine('EINVAL') }}};
-    return SYSCALLS.doDup(old.path, old.flags, suggestFD);
+    return SYSCALLS.doDup(old, suggestFD);
   },
   __sys_pipe2__nothrow: true,
   __sys_pipe2__proxy: false,
-- 
2.17.1

