txiki.js icon indicating copy to clipboard operation
txiki.js copied to clipboard

Add mbedtls to support https & crypto

Open Gary-Hobson opened this issue 2 years ago • 12 comments

I noticed that now in txiki, http is implemented using curl, can we add support for https? This may require adding a new dependency library mbedtls, if this is allowed I might be able to get this working

mbedtls also comes with a variety of encryption and decryption algorithms Adding it can throw away the existing hashlib.js, it is very inefficient to let JS execute these algorithms

Gary-Hobson avatar Jan 03 '23 16:01 Gary-Hobson

Hey there!

Sure thing, I do want us to have mbedtls integrated, and migrate all the hashing stuff to it.

That should not be a requirement for https in curl today though, since we link with the system one on most platforms, which in turn uses WinSSL, whatever calls it's thing or OpenSSL. Not ideal, I know, but one step at a time :-)

saghul avatar Jan 03 '23 17:01 saghul

I'm wondering if we can import serveTls from Deno's https://deno.land/[email protected]/http/server.ts?

When I run

./deno repl --allow-net --allow-read --allow-write
Deno 1.29.2
exit using ctrl+d, ctrl+c, or close()
> import { serveTls } from "https://deno.land/[email protected]/http/server.ts";

the C source code is downloaded to /home/user/.cache/deno/deps/https/deno.land/.

guest271314 avatar Jan 08 '23 19:01 guest271314

Deno uses Rust and OpenSSL and I'd like to keep txikiJS simple, so I think mbedtls is a better fit for the project.

saghul avatar Jan 23 '23 15:01 saghul

FYI

https://github.com/czanyou/wotjs-core/blob/main/src/tls.c https://github.com/czanyou/wotjs-core/blob/main/src/crypto.c

junsik avatar Mar 09 '23 11:03 junsik

Oh, nice! Might be able to reuse some of that!

saghul avatar Mar 09 '23 12:03 saghul

I tried building wotjs-core. Error thrown at

wotjs-core/src/misc.c:27:10: fatal error: version.h: No such file or directory
   27 | #include "version.h"
      |          ^~~~~~~~~~~

Can't the HTTP server parts be extracted and used within QuickJS?

guest271314 avatar Mar 11 '23 18:03 guest271314

They can likely be migrated to txiki.js, since that's a fork, but a 2 year old one, and a lot has changed since.

saghul avatar Mar 11 '23 19:03 saghul

I've been testing server implementations, C and other languages. I think busybox's httpd https://github.com/mirror/busybox/blob/master/networking/httpd.c is simple enough to port to QuickJS.

For my use case I just need to create a server to load an HTML page so I can hand off handling the request and response to a local ServiceWorker.

Other options include coralmicro HTTP server https://github.com/google-coral/coralmicro/blob/main/libs/base/http_server.cc, and Chromium's HTTP servr https://github.com/chromium/chromium/blob/main/net/server/http_server.cc.

guest271314 avatar Mar 11 '23 19:03 guest271314

Unfortunately none of those options are a good fit for txiki.js.

The BusyBox implementation is GPL, so incompatible with the current license.

The other 2 are written in C++ and I don't want to start adding c++ code here.

I think https://github.com/rsenn/qjs-net is a better option, but I need to integrate the event loop with libuv instead of using the default in libwebsockets, and last I checked it wasn't very well documented.

saghul avatar Mar 12 '23 08:03 saghul

@saghul I couldn't get https://github.com/rsenn/qjs-net to compile the last time I tried. There is also https://github.com/QuickJS-Web-project/quickwebserver, which I also had issues compiling after upstream updates.

guest271314 avatar Mar 12 '23 14:03 guest271314

qjs-net is failing to build on Debian/Ubuntu Linux due to this

Compile module '/home/user/qjs-net/js/rpc.js' ...
Compiling module js/rpc.js
-- Compile QuickJS module 'rpc.c' from 'js/rpc.js'
-- Configuring incomplete, errors occurred!
See also "/home/user/qjs-net/build/CMakeFiles/CMakeOutput.log".
See also "/home/user/qjs-net/build/CMakeFiles/CMakeError.log".
/usr/bin/cc  -DCHECK_FUNCTION_EXISTS=strlcpy -rdynamic CMakeFiles/cmTC_49f1a.dir/CheckFunctionExists.c.o -o cmTC_49f1a 
/usr/bin/ld: CMakeFiles/cmTC_49f1a.dir/CheckFunctionExists.c.o: in function `main':
CheckFunctionExists.c:(.text+0x14): undefined reference to `strlcpy'
collect2: error: ld returned 1 exit status
gmake[1]: *** [CMakeFiles/cmTC_49f1a.dir/build.make:99: cmTC_49f1a] Error 1
gmake[1]: Leaving directory '/home/user/qjs-net/build/CMakeFiles/CMakeTmp'
gmake: *** [Makefile:127: cmTC_49f1a/fast] Error 2

I'm not sure what to modify or pass to cmake to link to strlcpy (https://stackoverflow.com/questions/72492507/how-to-link-strlcpy-in-makefile-in-c-undefined-reference-to-strlcpy).

guest271314 avatar Mar 12 '23 21:03 guest271314

I'd suggest you open an issue on their repo. IIRC strlcpy comes from BSD.

saghul avatar Mar 13 '23 08:03 saghul