| 
					
				 | 
			
			
				@@ -1,51 +1,16 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-From 74ea482102e1a7c1845b3eec19cbdb21264836d4 Mon Sep 17 00:00:00 2001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+From 68352e0cb94fe08b220d4befec828171ec871154 Mon Sep 17 00:00:00 2001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 From: =?UTF-8?q?Timo=20Ter=C3=A4s?= <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Date: Fri, 5 Apr 2024 12:06:56 +0300 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Subject: [PATCH 1/4] add alternate url wget implementation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Subject: [PATCH 1/2] add alternate url wget implementation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- .gitlab-ci.yml    |  16 ++++- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  meson.build       |   6 +- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  meson_options.txt |   1 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- src/io_url_wget.c | 150 ++++++++++++++++++++++++++++++++++++++++++++++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- src/meson.build   |   4 +- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 5 files changed, 173 insertions(+), 4 deletions(-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ src/io_url_wget.c | 137 ++++++++++++++++++++++++++++++++++++++++++++++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ src/meson.build   |   8 ++- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 4 files changed, 150 insertions(+), 2 deletions(-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  create mode 100644 src/io_url_wget.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 7fc86563..b7e00008 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- a/.gitlab-ci.yml 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+++ b/.gitlab-ci.yml 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -24,7 +24,19 @@ test:alpine: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     script: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - apk update 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - apk add make gcc git musl-dev openssl-dev linux-headers zlib-dev zstd-dev lua5.3-dev lua5.3-lzlib meson zlib-static zstd-static openssl-libs-static 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--        - meson build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - meson setup build -Dstatic_apk=true 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - ninja -C build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+    tags: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - docker-alpine 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - x86_64 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+test:alpine-alt-config: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+    image: alpine 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+    stage: test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+    script: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - apk update 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - apk add make gcc git musl-dev openssl-dev linux-headers zlib-dev lua5.3-dev lua5.3-lzlib meson 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - meson setup build -Durl_backend=wget -Dzstd=false 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - ninja -C build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     tags: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - docker-alpine 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -38,7 +50,7 @@ test:debian: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - apt-get install -y make gcc git libssl-dev zlib1g-dev libzstd-dev lua5.3-dev lua5.2 lua-zlib-dev sudo meson 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - unlink /bin/sh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - ln -s /bin/bash /bin/sh 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--        - meson build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        - meson setup build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - ninja -C build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     tags: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         - docker-alpine 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/meson.build b/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 index 1a44c11f..9a14cac0 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- a/meson.build 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -63,26 +28,26 @@ index 1a44c11f..9a14cac0 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  subdir('src') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  subdir('tests') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/meson_options.txt b/meson_options.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 693f46ec..940fe9a4 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+index 693f46ec..44b88b32 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- a/meson_options.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +++ b/meson_options.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 @@ -5,5 +5,6 @@ option('help', description: 'Build help into apk binaries, needs lua', type: 'fe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  option('lua', description: 'Build luaapk (lua bindings)', type: 'feature', value: 'auto') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  option('lua_version', description: 'Lua version to build against', type: 'string', value: '5.3') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  option('static_apk', description: 'Also build apk.static', type: 'boolean', value: false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+option('url_backend', description: 'URL backend', type: 'combo', choices: ['libfetch', 'wget'], value: 'libfetch') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++option('url_backend', description: 'URL backend', type: 'string', value: 'libfetch') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  option('uvol_db_target', description: 'Default target for uvol database layer', type: 'string') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  option('zstd', description: 'Build with zstd support', type: 'boolean', value: true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/src/io_url_wget.c b/src/io_url_wget.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 new file mode 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 00000000..9a929222 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+index 00000000..d8885a4f 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- /dev/null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +++ b/src/io_url_wget.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -0,0 +1,150 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -0,0 +1,137 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +/* io_url_wget.c - Alpine Package Keeper (APK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + * Copyright (C) 2005-2008 Natanael Copa <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ * Copyright (C) 2008-2011 Timo Teräs <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ * Copyright (C) 2008-2011 Timo Teräs <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + * All rights reserved. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + * SPDX-License-Identifier: GPL-2.0-only 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -93,9 +58,6 @@ index 00000000..9a929222 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <sys/wait.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include "apk_io.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static char wget_timeout[16]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static char wget_no_check_certificate; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +static int wget_translate_status(int status) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (!WIFEXITED(status)) return -EFAULT; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -118,19 +80,11 @@ index 00000000..9a929222 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +static int wget_spawn(const char *url, pid_t *pid, int *fd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	int i = 0, r, pipefds[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	int r, pipefds[2]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	posix_spawn_file_actions_t act; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	char *argv[16]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = "wget"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = "-q"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = "-T"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = wget_timeout; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (wget_no_check_certificate) argv[i++] = "--no-check-certificate"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = (char *) url; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = "-O"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = "-"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	argv[i++] = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	char *argv[] = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		(char*)"wget", "-q", (char*) url, "-O", "-", 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (pipe2(pipefds, O_CLOEXEC) != 0) return -errno; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -214,12 +168,10 @@ index 00000000..9a929222 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +void apk_io_url_no_check_certificate(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	wget_no_check_certificate = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +void apk_io_url_set_timeout(int timeout) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	snprintf(wget_timeout, sizeof wget_timeout, "%d", timeout); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +void apk_io_url_set_redirect_callback(void (*cb)(int, const char *)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -230,97 +182,39 @@ index 00000000..9a929222 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/src/meson.build b/src/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index c1aae550..38e9d3b0 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+index c1aae550..28bfce7e 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- a/src/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +++ b/src/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -1,3 +1,5 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+url_backend = get_option('url_backend') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk_so_version = '2.99.0' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	'adb.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -22,8 +24,8 @@ libapk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -22,7 +22,6 @@ libapk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'fs_uvol.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'hash.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'io.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 -	'io_url_libfetch.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'io_gunzip.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	'io_url_@[email protected]'.format(url_backend), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'package.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'pathbuilder.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	'print.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-GitLab 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-From b9fe78fbf19bb10e1d0b8eb1cb1de123bee2ed7e Mon Sep 17 00:00:00 2001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-From: Christian Marangi <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Date: Tue, 16 Apr 2024 17:55:15 +0200 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Subject: [PATCH 2/4] add option to configure url backend in legacy make build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- system 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Can be configured by setting URL_BACKEND. If not set libfetch is 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-selected by default. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Signed-off-by: Christian Marangi <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- src/Makefile | 20 ++++++++++++++------ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 1 file changed, 14 insertions(+), 6 deletions(-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-diff --git a/src/Makefile b/src/Makefile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index f7873cb1..efdc68df 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- a/src/Makefile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+++ b/src/Makefile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -9,8 +9,8 @@ else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- $(error Lua interpreter not found. Please specify LUA interpreter, or use LUA=no to build without help.) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--OPENSSL_CFLAGS		:= $(shell $(PKG_CONFIG) --cflags openssl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--OPENSSL_LIBS		:= $(shell $(PKG_CONFIG) --libs openssl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+OPENSSL_CFLAGS         := $(shell $(PKG_CONFIG) --cflags openssl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+OPENSSL_LIBS           := $(shell $(PKG_CONFIG) --libs openssl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- ZLIB_CFLAGS		:= $(shell $(PKG_CONFIG) --cflags zlib) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- ZLIB_LIBS		:= $(shell $(PKG_CONFIG) --libs zlib) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -21,10 +21,18 @@ libapk_so		:= $(obj)/libapk.so.$(libapk_soname) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk.so.$(libapk_soname)-objs := \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	adb.o adb_comp.o adb_walk_adb.o adb_walk_genadb.o adb_walk_gentext.o adb_walk_text.o apk_adb.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	atom.o blob.o commit.o common.o context.o crypto.o crypto_openssl.o ctype.o database.o hash.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--	extract_v2.o extract_v3.o fs_fsys.o fs_uvol.o io.o io_gunzip.o io_url_libfetch.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--	tar.o package.o pathbuilder.o print.o solver.o trust.o version.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	extract_v2.o extract_v3.o fs_fsys.o fs_uvol.o io.o io_gunzip.o tar.o package.o pathbuilder.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	print.o solver.o trust.o version.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -87,6 +86,13 @@ apk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	'applet.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--libapk.so.$(libapk_soname)-libs := libfetch/libfetch.a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+libapk.so.$(libapk_soname)-libs := 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ifeq ($(URL_BACKEND),wget) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+libapk.so.$(libapk_soname)-objs += io_url_wget.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+CFLAGS_ALL += -Ilibfetch 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+libapk.so.$(libapk_soname)-objs += io_url_libfetch.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+libapk.so.$(libapk_soname)-libs += libfetch/libfetch.a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++url_backend = get_option('url_backend') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++if url_backend == 'libfetch' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	libapk_src += [	'io_url_libfetch.c' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++elif url_backend == 'wget' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	libapk_src += [	'io_url_wget.c' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- # ZSTD support can be disabled 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- ifneq ($(ZSTD),no) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -79,7 +87,7 @@ LIBS_apk		:= -lapk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- LIBS_apk-test		:= -lapk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- LIBS_apk.so		:= -L$(obj) -lapk 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--CFLAGS_ALL		+= -D_ATFILE_SOURCE -Ilibfetch -Iportability 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+CFLAGS_ALL		+= -D_ATFILE_SOURCE -Iportability 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- CFLAGS_apk.o		:= -DAPK_VERSION=\"$(VERSION)\" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- CFLAGS_apk-static.o	:= -DAPK_VERSION=\"$(VERSION)\" -DOPENSSL_NO_ENGINE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- CFLAGS_apk-test.o	:= -DAPK_VERSION=\"$(VERSION)\" -DOPENSSL_NO_ENGINE -DTEST_MODE 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ if lua_bin.found() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	genhelp_script = files('genhelp.lua') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	genhelp_args = [lua_bin, genhelp_script, '@INPUT@'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 GitLab 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-From 0418b684898403c49905c1f0e4b7c5ca522b2d50 Mon Sep 17 00:00:00 2001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+From dc7ff789a45522eb847118a29b60b896de55d083 Mon Sep 17 00:00:00 2001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 From: Jonas Jelonek <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Date: Sun, 14 Apr 2024 00:20:14 +0200 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Subject: [PATCH 3/4] crypto: add support for mbedtls as backend 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Subject: [PATCH 2/2] crypto: add support for mbedtls as backend 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 backend is selected at compile-time with crypto_backend option 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -331,16 +225,11 @@ Signed-off-by: Jonas Jelonek <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  libfetch/meson.build     |   2 +- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  meson.build              |  14 +- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  meson_options.txt        |   1 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- portability/getrandom.c  |  19 +++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- portability/meson.build  |   3 +- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- portability/sys/random.h |   6 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  src/apk_crypto.h         |   5 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- src/apk_crypto_mbedtls.h |  30 +++++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- src/crypto_mbedtls.c     | 285 +++++++++++++++++++++++++++++++++++++++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- src/meson.build          |  21 ++- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 10 files changed, 373 insertions(+), 13 deletions(-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- create mode 100644 portability/getrandom.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- create mode 100644 portability/sys/random.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ src/apk_crypto_mbedtls.h |  26 ++++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ src/crypto_mbedtls.c     | 305 +++++++++++++++++++++++++++++++++++++++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ src/meson.build          |  23 ++- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 7 files changed, 364 insertions(+), 12 deletions(-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  create mode 100644 src/apk_crypto_mbedtls.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  create mode 100644 src/crypto_mbedtls.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -388,66 +277,17 @@ index 9a14cac0..3a83f4e1 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  add_project_arguments('-D_GNU_SOURCE', language: 'c') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/meson_options.txt b/meson_options.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 940fe9a4..df0b07dc 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+index 44b88b32..2b1d24ce 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- a/meson_options.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +++ b/meson_options.txt 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -1,4 +1,5 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- option('arch_prefix', description: 'Define a custom arch prefix for default arch', type: 'string') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+option('crypto_backend', description: 'Crypto backend', type: 'combo', choices: ['openssl', 'mbedtls'], value: 'openssl') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- option('compressed-help', description: 'Compress help database, needs lua-zlib', type: 'boolean', value: true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- option('docs', description: 'Build manpages with scdoc', type: 'feature', value: 'auto') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- option('help', description: 'Build help into apk binaries, needs lua', type: 'feature', value: 'auto') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-diff --git a/portability/getrandom.c b/portability/getrandom.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-new file mode 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 00000000..b2f4a07c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- /dev/null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+++ b/portability/getrandom.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -0,0 +1,19 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <sys/random.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <sys/types.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <unistd.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <fcntl.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ssize_t getrandom(void *buf, size_t buflen, unsigned int flags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	int fd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	ssize_t ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	fd = open("/dev/urandom", O_RDONLY|O_CLOEXEC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (fd < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	ret = read(fd, buf, buflen); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	close(fd); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-diff --git a/portability/meson.build b/portability/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 89957c3c..3172044e 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- a/portability/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+++ b/portability/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -3,7 +3,8 @@ cc = meson.get_compiler('c') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libportability_src = [] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- check_symbols = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--	['memrchr', 'memrchr.c', 'NEED_MEMRCHR', 'string.h'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	['getrandom', 'getrandom.c', 'NEED_GETRANDOM', 'sys/random.h'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        ['memrchr', 'memrchr.c', 'NEED_MEMRCHR', 'string.h'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	['mknodat', 'mknodat.c', 'NEED_MKNODAT', 'sys/stat.h'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	['pipe2', 'pipe2.c', 'NEED_PIPE2', 'unistd.h'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	['qsort_r', 'qsort_r.c', 'NEED_QSORT_R', 'stdlib.h'], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-diff --git a/portability/sys/random.h b/portability/sys/random.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-new file mode 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 00000000..02d5b1ca 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- /dev/null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+++ b/portability/sys/random.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -0,0 +1,6 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include_next <sys/random.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <sys/types.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#ifdef NEED_GETRANDOM 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ssize_t getrandom(void *buf, size_t buflen, unsigned int flags); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -5,6 +5,7 @@ option('help', description: 'Build help into apk binaries, needs lua', type: 'fe 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ option('lua', description: 'Build luaapk (lua bindings)', type: 'feature', value: 'auto') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ option('lua_version', description: 'Lua version to build against', type: 'string', value: '5.3') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ option('static_apk', description: 'Also build apk.static', type: 'boolean', value: false) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++option('crypto_backend', description: 'SSL backend', type: 'string', value: 'openssl') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ option('url_backend', description: 'URL backend', type: 'string', value: 'libfetch') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ option('uvol_db_target', description: 'Default target for uvol database layer', type: 'string') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ option('zstd', description: 'Build with zstd support', type: 'boolean', value: true) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/src/apk_crypto.h b/src/apk_crypto.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 index 7de88dfc..5cae3bfe 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- a/src/apk_crypto.h 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -467,10 +307,10 @@ index 7de88dfc..5cae3bfe 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/src/apk_crypto_mbedtls.h b/src/apk_crypto_mbedtls.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 new file mode 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 00000000..5481d149 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+index 00000000..e379535b 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- /dev/null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +++ b/src/apk_crypto_mbedtls.h 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -0,0 +1,30 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -0,0 +1,26 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +/* apk_crypto_mbedtls.h - Alpine Package Keeper (APK) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + * Copyright (C) 2024 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -484,45 +324,36 @@ index 00000000..5481d149 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <mbedtls/md.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <mbedtls/pk.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <mbedtls/bignum.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +struct apk_pkey { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	uint8_t id[16]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	mbedtls_pk_context key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_pk_context *key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +struct apk_digest_ctx { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	mbedtls_md_context_t mdctx; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_md_context_t *mdctx; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	struct apk_pkey *sigver_key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	uint8_t alg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+/* based on mbedtls' internal pkwrite.h calculations */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#define APK_ENC_KEY_MAX_LENGTH          (38 + 2 * MBEDTLS_MPI_MAX_SIZE) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/src/crypto_mbedtls.c b/src/crypto_mbedtls.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 new file mode 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 00000000..73d60e9d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+index 00000000..9ce148b5 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- /dev/null 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +++ b/src/crypto_mbedtls.c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -0,0 +1,285 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -0,0 +1,305 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <errno.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <stdio.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <stdlib.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <fcntl.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <sys/random.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <sys/stat.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#include <unistd.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <mbedtls/platform.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <mbedtls/md.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <mbedtls/pk.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <mbedtls/entropy.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#ifdef MBEDTLS_PSA_CRYPTO_C 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include <psa/crypto.h> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#include "apk_crypto.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -559,11 +390,14 @@ index 00000000..73d60e9d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +int apk_digest_ctx_init(struct apk_digest_ctx *dctx, uint8_t alg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	dctx->alg = alg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	dctx->mdctx = malloc(sizeof(mbedtls_md_context_t)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (!dctx->mdctx) return -ENOMEM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	mbedtls_md_init(&dctx->mdctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_md_init(dctx->mdctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (alg == APK_DIGEST_NONE) return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (mbedtls_md_setup(&dctx->mdctx, apk_digest_alg_to_mdinfo(alg), 0) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		mbedtls_md_starts(&dctx->mdctx)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (mbedtls_md_setup(dctx->mdctx, apk_digest_alg_to_mdinfo(alg), 0) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		mbedtls_md_starts(dctx->mdctx)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	return 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -572,77 +406,105 @@ index 00000000..73d60e9d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +int apk_digest_ctx_reset(struct apk_digest_ctx *dctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (dctx->alg == APK_DIGEST_NONE) return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (mbedtls_md_starts(&dctx->mdctx)) return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (mbedtls_md_starts(dctx->mdctx)) return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +int apk_digest_ctx_reset_alg(struct apk_digest_ctx *dctx, uint8_t alg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	mbedtls_md_free(&dctx->mdctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_md_free(dctx->mdctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	dctx->alg = alg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (alg == APK_DIGEST_NONE) return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (mbedtls_md_setup(&dctx->mdctx, apk_digest_alg_to_mdinfo(alg), 0) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		mbedtls_md_starts(&dctx->mdctx)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (mbedtls_md_setup(dctx->mdctx, apk_digest_alg_to_mdinfo(alg), 0) || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		mbedtls_md_starts(dctx->mdctx)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +void apk_digest_ctx_free(struct apk_digest_ctx *dctx) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	mbedtls_md_free(&dctx->mdctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	free(dctx->mdctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	dctx->mdctx = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +int apk_digest_ctx_update(struct apk_digest_ctx *dctx, const void *ptr, size_t sz) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (dctx->alg == APK_DIGEST_NONE) return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return mbedtls_md_update(&dctx->mdctx, ptr, sz) == 0 ? 0 : -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	return mbedtls_md_update(dctx->mdctx, ptr, sz) == 0 ? 0 : -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +int apk_digest_ctx_final(struct apk_digest_ctx *dctx, struct apk_digest *d) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (mbedtls_md_finish(&dctx->mdctx, d->data)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (mbedtls_md_finish(dctx->mdctx, d->data)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		apk_digest_reset(d); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_md_free(dctx->mdctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	d->alg = dctx->alg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	d->len = apk_digest_alg_len(d->alg); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static int apk_load_file_at(int dirfd, const char *fn, unsigned char **buf, size_t *n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++// Entropy function adopted from ustream-ssl to avoid using the bloated mbedtls' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++// mbedtls_entropy_context and mbedtls_ctr_drbg_context. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++static int _apk_random(void *ctx, unsigned char *out, size_t len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	struct stat stats; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	size_t size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	int fd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	static FILE *f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if ((fd = openat(dirfd, fn, O_RDONLY|O_CLOEXEC)) < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		return -errno; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (!f) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		f = fopen("/dev/urandom", "r"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (fread(out, len, 1, f) != 1) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (fstat(fd, &stats)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		close(fd); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		return -errno; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++// adopted from mbedtls_pk_load_file 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++static int apk_load_file_fd(int fd, unsigned char **buf, size_t *n) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	FILE *f; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	long size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if ((f = fdopen(fd, "rb")) == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		return MBEDTLS_ERR_PK_FILE_IO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#if (MBEDTLS_VERSION_NUMBER >= 0x03000000) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	/* Ensure no stdio buffering of secrets, as such buffers cannot be wiped. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_setbuf(f, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	fseek(f, 0, SEEK_END); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if ((size = ftell(f)) == -1) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		fclose(f); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		return MBEDTLS_ERR_PK_FILE_IO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	fseek(f, 0, SEEK_SET); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	size = (size_t)stats.st_size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	*n = size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	*n = (size_t) size; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (size == 0 || (*buf = mbedtls_calloc(1, size + 1)) == NULL) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (*n + 1 == 0 || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		(*buf = mbedtls_calloc(1, *n + 1)) == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		fclose(f); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return MBEDTLS_ERR_PK_ALLOC_FAILED; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (read(fd, *buf, size) != size) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		close(fd); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (fread(*buf, 1, *n, f) != *n) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		fclose(f); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		mbedtls_platform_zeroize(*buf, size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		mbedtls_platform_zeroize(*buf, *n); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		mbedtls_free(*buf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return MBEDTLS_ERR_PK_FILE_IO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	close(fd); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	(*buf)[size] = '\0'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	fclose(f); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	(*buf)[*n] = '\0'; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (strstr((const char *) *buf, "-----BEGIN ") != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		++*n; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -651,79 +513,68 @@ index 00000000..73d60e9d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static int apk_pkey_init(struct apk_pkey *pkey) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++static int apk_pkey_init(struct apk_pkey *pkey, mbedtls_pk_context *key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	unsigned char dig[APK_DIGEST_MAX_LENGTH]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	unsigned char pub[APK_ENC_KEY_MAX_LENGTH] = {}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	unsigned char dig[APK_DIGEST_MAX_LENGTH], *pub = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	unsigned char *c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	int len, r = -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	int len, publen, r = -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	c = pub + APK_ENC_KEY_MAX_LENGTH; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	// Assume byte len is always * 2 + NULL terminated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	publen = mbedtls_pk_get_len(key) * 2 + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	pub = malloc(publen); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (!pub) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		return -ENOMEM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	c = pub + publen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	// key is written backwards into pub starting at c! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if ((len = mbedtls_pk_write_pubkey(&c, pub, &pkey->key)) < 0) return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (!mbedtls_md(apk_digest_alg_to_mdinfo(APK_DIGEST_SHA512), c, len, dig)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if ((len = mbedtls_pk_write_pubkey(&c, pub, key)) < 0) return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (!mbedtls_md(apk_digest_alg_to_mdinfo(APK_DIGEST_SHA512), pub, len, dig)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		memcpy(pkey->id, dig, sizeof pkey->id); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		r = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	free(pub); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	pkey->key = key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	return r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +void apk_pkey_free(struct apk_pkey *pkey) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	mbedtls_pk_free(&pkey->key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static int apk_random(void *ctx, unsigned char *out, size_t len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return (int)getrandom(out, len, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_pk_free(pkey->key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#if MBEDTLS_VERSION_NUMBER >= 0x03000000 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static inline int apk_mbedtls_parse_privkey(struct apk_pkey *pkey, const unsigned char *buf, size_t blen) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return mbedtls_pk_parse_key(&pkey->key, buf, blen, NULL, 0, apk_random, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static inline int apk_mbedtls_sign(struct apk_digest_ctx *dctx, struct apk_digest *dig, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+				   unsigned char *sig, size_t *sig_len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return mbedtls_pk_sign(&dctx->sigver_key->key, apk_digest_alg_to_mbedtls_type(dctx->alg), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+			       (const unsigned char *)&dig->data, dig->len, sig, sizeof *sig, sig_len, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+			       apk_random, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static inline int apk_mbedtls_parse_privkey(struct apk_pkey *pkey, const unsigned char *buf, size_t blen) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return mbedtls_pk_parse_key(&pkey->key, buf, blen, NULL, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+static inline int apk_mbedtls_sign(struct apk_digest_ctx *dctx, struct apk_digest *dig, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+				   unsigned char *sig, size_t *sig_len) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return mbedtls_pk_sign(&dctx->sigver_key->key, apk_digest_alg_to_mbedtls_type(dctx->alg), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+			       (const unsigned char *)&dig->data, dig->len, sig, sig_len, apk_random, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +int apk_pkey_load(struct apk_pkey *pkey, int dirfd, const char *fn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	unsigned char *buf = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	size_t blen = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	int ret; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_pk_context *key; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	unsigned char *buf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	size_t blen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	int ret, fd; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (apk_load_file_at(dirfd, fn, &buf, &blen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	fd = openat(dirfd, fn, O_RDONLY|O_CLOEXEC); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (fd < 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		return -errno; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	mbedtls_pk_init(&pkey->key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if ((ret = mbedtls_pk_parse_public_key(&pkey->key, buf, blen)) != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+		ret = apk_mbedtls_parse_privkey(pkey, buf, blen); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	key = malloc(sizeof *key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (!key) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		return -ENOMEM; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	mbedtls_pk_init(key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (apk_load_file_fd(fd, &buf, &blen)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		return -APKE_CRYPTO_ERROR; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if ((ret = mbedtls_pk_parse_public_key(key, buf, blen)) != 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#if (MBEDTLS_VERSION_NUMBER >= 0x03000000) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		ret = mbedtls_pk_parse_key(key, buf, blen, NULL, 0, _apk_random, NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++		ret = mbedtls_pk_parse_key(key, buf, blen, NULL, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	mbedtls_platform_zeroize(buf, blen); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	mbedtls_free(buf); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (ret != 0) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return -APKE_CRYPTO_KEY_FORMAT; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	return apk_pkey_init(pkey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	return apk_pkey_init(pkey, key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +int apk_sign_start(struct apk_digest_ctx *dctx, uint8_t alg, struct apk_pkey *pkey) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -743,10 +594,16 @@ index 00000000..73d60e9d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (apk_digest_ctx_final(dctx, &dig)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return -APKE_SIGNATURE_GEN_FAILURE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (apk_mbedtls_sign(dctx, &dig, sig, len)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#if (MBEDTLS_VERSION_NUMBER >= 0x03000000)	 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (mbedtls_pk_sign(dctx->sigver_key->key, apk_digest_alg_to_mbedtls_type(dctx->alg), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++						&dig.data, dig.len, sig, sizeof *sig, len, _apk_random, NULL)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (mbedtls_pk_sign(dctx->sigver_key->key, apk_digest_alg_to_mbedtls_type(dctx->alg), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++						&dig.data, dig.len, sig, len, _apk_random, NULL)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		r = -APKE_SIGNATURE_GEN_FAILURE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	dctx->sigver_key = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	return r; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -769,8 +626,7 @@ index 00000000..73d60e9d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	if (apk_digest_ctx_final(dctx, &dig)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		return -APKE_SIGNATURE_GEN_FAILURE; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	if (mbedtls_pk_verify(&dctx->sigver_key->key, apk_digest_alg_to_mbedtls_type(dctx->alg), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+			      (const unsigned char *)&dig.data, dig.len, sig, len)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	if (mbedtls_pk_verify(dctx->sigver_key->key, apk_digest_alg_to_mbedtls_type(dctx->alg), &dig.data, dig.len, sig, len)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +		r = -APKE_SIGNATURE_INVALID; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	dctx->sigver_key = NULL; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -793,33 +649,26 @@ index 00000000..73d60e9d 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 diff --git a/src/meson.build b/src/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index 38e9d3b0..e1204fc0 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+index 28bfce7e..4eab6e0d 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --- a/src/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +++ b/src/meson.build 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -1,3 +1,4 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+crypto_backend = get_option('crypto_backend') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- url_backend = get_option('url_backend') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk_so_version = '2.99.0' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -15,7 +16,7 @@ libapk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -13,7 +13,6 @@ libapk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'common.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'context.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'crypto.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 -	'crypto_openssl.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        'crypto_@[email protected]'.format(crypto_backend), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'ctype.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'database.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'extract_v2.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -40,7 +41,7 @@ libapk_headers = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -37,7 +36,6 @@ libapk_headers = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'apk_atom.h', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'apk_blob.h', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'apk_crypto.h', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 -	'apk_crypto_openssl.h', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+        'apk_crypto_@[email protected]'.format(crypto_backend), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'apk_ctype.h', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'apk_database.h', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'apk_defines.h', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -89,6 +90,17 @@ apk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -86,6 +84,11 @@ apk_src = [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	'applet.c', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -828,16 +677,28 @@ index 38e9d3b0..e1204fc0 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	'-D_ATFILE_SOURCE', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ url_backend = get_option('url_backend') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ if url_backend == 'libfetch' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	libapk_src += [	'io_url_libfetch.c' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -93,6 +96,17 @@ elif url_backend == 'wget' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 	libapk_src += [	'io_url_wget.c' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++crypto_backend = get_option('crypto_backend') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +if crypto_backend == 'openssl' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	apk_cargs += [ '-DCRYPTO_USE_OPENSSL' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	libapk_src += [ 'crypto_openssl.c' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	libapk_headers += [ 'apk_crypto_openssl.h' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +elif crypto_backend == 'mbedtls' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +	apk_cargs += [ '-DCRYPTO_USE_MBEDTLS' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	libapk_src += [ 'crypto_mbedtls.c' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				++	libapk_headers += [ 'apk_crypto_mbedtls.h' ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 +endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 + 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  if lua_bin.found() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	genhelp_script = files('genhelp.lua') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  	genhelp_args = [lua_bin, genhelp_script, '@INPUT@'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -115,11 +127,6 @@ endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+@@ -119,11 +133,6 @@ endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  apk_src += [ generated_help ] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -852,66 +713,3 @@ index 38e9d3b0..e1204fc0 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 --  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 GitLab 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-From 34bb1021284dccbf97f02b0a0bb9e751b8887cad Mon Sep 17 00:00:00 2001 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-From: Christian Marangi <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Date: Tue, 16 Apr 2024 17:56:45 +0200 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Subject: [PATCH 4/4] add option to configure crypto backend in legacy make 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- build system 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Define CRYPTO to select mbedtls as alternative crypto backend. By 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-default openssl is used. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-Signed-off-by: Christian Marangi <[email protected]> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- src/Makefile | 20 +++++++++++++++----- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 1 file changed, 15 insertions(+), 5 deletions(-) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-diff --git a/src/Makefile b/src/Makefile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-index efdc68df..97db0e72 100644 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---- a/src/Makefile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+++ b/src/Makefile 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -20,9 +20,9 @@ libapk_soname		:= 2.99.0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk_so		:= $(obj)/libapk.so.$(libapk_soname) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk.so.$(libapk_soname)-objs := \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 	adb.o adb_comp.o adb_walk_adb.o adb_walk_genadb.o adb_walk_gentext.o adb_walk_text.o apk_adb.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--	atom.o blob.o commit.o common.o context.o crypto.o crypto_openssl.o ctype.o database.o hash.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--	extract_v2.o extract_v3.o fs_fsys.o fs_uvol.o io.o io_gunzip.o tar.o package.o pathbuilder.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--	print.o solver.o trust.o version.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	atom.o blob.o commit.o common.o context.o crypto.o ctype.o database.o hash.o extract_v2.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	extract_v3.o fs_fsys.o fs_uvol.o io.o io_gunzip.o tar.o package.o pathbuilder.o print.o \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+	solver.o trust.o version.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk.so.$(libapk_soname)-libs := 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -34,6 +34,16 @@ libapk.so.$(libapk_soname)-objs += io_url_libfetch.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- libapk.so.$(libapk_soname)-libs += libfetch/libfetch.a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ifeq ($(CRYPTO),mbedtls) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+CRYPTO_CFLAGS		:= $(shell $(PKG_CONFIG) --cflags mbedtls mbedcrypto) -DCRYPTO_USE_MBEDTLS 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+CRYPTO_LIBS		:= $(shell $(PKG_CONFIG) --libs mbedtls mbedcrypto) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+libapk.so.$(libapk_soname)-objs += crypto_mbedtls.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+CRYPTO_CFLAGS		:= $(shell $(PKG_CONFIG) --cflags openssl) -DCRYPTO_USE_OPENSSL 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+CRYPTO_LIBS		:= $(shell $(PKG_CONFIG) --libs openssl) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+libapk.so.$(libapk_soname)-objs += crypto_openssl.o 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- # ZSTD support can be disabled 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- ifneq ($(ZSTD),no) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- ZSTD_CFLAGS		:= $(shell $(PKG_CONFIG) --cflags libzstd) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-@@ -100,9 +110,9 @@ LIBS_apk.static		:= -Wl,--as-needed -ldl -Wl,--no-as-needed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- LDFLAGS_apk		+= -L$(obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- LDFLAGS_apk-test	+= -L$(obj) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--CFLAGS_ALL		+= $(OPENSSL_CFLAGS) $(ZLIB_CFLAGS) $(ZSTD_CFLAGS) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+CFLAGS_ALL		+= $(CRYPTO_CFLAGS) $(ZLIB_CFLAGS) $(ZSTD_CFLAGS) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- LIBS			:= -Wl,--as-needed \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				--				$(OPENSSL_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-+				$(CRYPTO_LIBS) $(ZLIB_LIBS) $(ZSTD_LIBS) \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 			   -Wl,--no-as-needed 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- # Help generation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				---  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-GitLab 
			 |