richard pushed to branch main at The Tor Project / Applications / tor-browser-build
Commits:
- 
143097f5
by Nicolas Vigier at 2023-06-12T16:49:23+02:00
- 
9281ddbf
by Nicolas Vigier at 2023-06-12T16:49:25+02:00
- 
d511d4ac
by Nicolas Vigier at 2023-06-12T16:49:27+02:00
- 
867cd64c
by Nicolas Vigier at 2023-06-12T16:49:29+02:00
- 
8213c52c
by Nicolas Vigier at 2023-06-12T16:49:30+02:00
20 changed files:
- .gitlab/issue_templates/Release Prep - Tor Browser Alpha.md
- .gitlab/issue_templates/Release Prep - Tor Browser Stable.md
- projects/android-toolchain/config
- − projects/osslsigncode/0001-Make-code-work-with-OpenSSL-1.1.patch
- projects/osslsigncode/build
- projects/osslsigncode/config
- − projects/osslsigncode/timestamping.patch
- − tools/signing/android-signing.mullvadbrowser
- − tools/signing/android-signing.torbrowser
- tools/signing/authenticode-timestamping.sh
- tools/signing/do-all-signing
- tools/signing/linux-signer-gpg-sign
- + tools/signing/linux-signer-sign-android-apks
- + tools/signing/linux-signer-sign-android-apks.torbrowser
- tools/signing/machines-setup/setup-signing-machine
- + tools/signing/machines-setup/sudoers.d/sign-apk
- tools/signing/machines-setup/upload-tbb-to-signing-machine
- − tools/signing/set-config.android-signing
- tools/signing/android-signing → tools/signing/wrappers/sign-apk
- tools/signing/wrappers/sign-exe
Changes:
| ... | ... | @@ -173,7 +173,6 @@ Tor Browser Alpha (and Nightly) are on the `main` branch | 
| 173 | 173 |      - `cd tor-browser-build/tools/signing/`
 | 
| 174 | 174 |      - `./macos-signer-proxy`
 | 
| 175 | 175 |  - [ ] On `$(STAGING_SERVER)` in a separate `screen` session, ensure tor daemon is running with SOCKS5 proxy on the default port 9050
 | 
| 176 | -- [ ] apk signing : copy signed `*multi.apk` files to the unsigned build outputs directory
 | |
| 177 | 176 |  - [ ] run do-all-signing script:
 | 
| 178 | 177 |      - `cd tor-browser-build/tools/signing/`
 | 
| 179 | 178 |      - `./do-all-signing.torbrowser`
 | 
| ... | ... | @@ -178,7 +178,6 @@ Tor Browser Stable lives in the various `maint-$(TOR_BROWSER_MAJOR).$(TOR_BROWSE | 
| 178 | 178 |      - `cd tor-browser-build/tools/signing/`
 | 
| 179 | 179 |      - `./macos-signer-proxy`
 | 
| 180 | 180 |  - [ ] On `$(STAGING_SERVER)` in a separate `screen` session, ensure tor daemon is running with SOCKS5 proxy on the default port 9050
 | 
| 181 | -- [ ] apk signing : copy signed `*multi.apk` files to the unsigned build outputs directory
 | |
| 182 | 181 |  - [ ] run do-all-signing script:
 | 
| 183 | 182 |      - `cd tor-browser-build/tools/signing/`
 | 
| 184 | 183 |      - `./do-all-signing.sh`
 | 
| ... | ... | @@ -95,9 +95,8 @@ steps: | 
| 95 | 95 |        #!/bin/bash
 | 
| 96 | 96 |        set -e
 | 
| 97 | 97 |        mv -v [% c("input_files_by_name/build_tools") %] [% dest_dir _ '/' _ c('filename') %]
 | 
| 98 | -    var:
 | |
| 99 | -      container:
 | |
| 100 | -        use_container: 0
 | |
| 98 | +    container:
 | |
| 99 | +      use_container: 0
 | |
| 101 | 100 |      input_files:
 | 
| 102 | 101 |        - URL: '[% c("var/google_repo") %]/[% c("var/build_tools_filename") %]'
 | 
| 103 | 102 |          name: build_tools
 | 
| 1 | -From 86931f9d7c3d73b97010e598a5ad41ea4fab2b63 Mon Sep 17 00:00:00 2001
 | |
| 2 | -From: =?UTF-8?q?Reimar=20D=C3=B6ffinger?= <Reimar.Doeffinger@xxxxxx>
 | |
| 3 | -Date: Sun, 12 Mar 2017 23:00:12 +0100
 | |
| 4 | -Subject: [PATCH] Make code work with OpenSSL 1.1.
 | |
| 5 | - | |
| 6 | -Changes in consist of:
 | |
| 7 | -- Use EVP_MD_CTX_new/free API instead of on-stack allocation
 | |
| 8 | -- Remove some M_ prefixes like for ASN1_IA5STRING_new
 | |
| 9 | -- Remove pagehash functionality because it is useless to me and
 | |
| 10 | -  fixing it would be a pain. Would require declaring a few
 | |
| 11 | -  ASN_SEQUENCES and use that to get the required i2d functions
 | |
| 12 | -  from what I could find out.
 | |
| 13 | -- Remove OBJ_create calls that seem to serve no purpose,
 | |
| 14 | -  now crash because NULL pointers are no longer handled
 | |
| 15 | -  (who changes API that way?!) and even if that was fixed
 | |
| 16 | -  lead to errors when these objects are later created
 | |
| 17 | -  again/"for real" by OBJ_txt2nid or OBJ_txt2obj (I think,
 | |
| 18 | -  did not investigate further).
 | |
| 19 | - | |
| 20 | -diff --git a/osslsigncode.c b/osslsigncode.c
 | |
| 21 | -index 2978c02..3797458 100644
 | |
| 22 | ---- a/osslsigncode.c
 | |
| 23 | -+++ b/osslsigncode.c
 | |
| 24 | -@@ -450,16 +450,16 @@ static SpcSpOpusInfo* createOpus(const char *desc, const char *url)
 | |
| 25 | - 	if (desc) {
 | |
| 26 | - 		info->programName = SpcString_new();
 | |
| 27 | - 		info->programName->type = 1;
 | |
| 28 | --		info->programName->value.ascii = M_ASN1_IA5STRING_new();
 | |
| 29 | --		ASN1_STRING_set((ASN1_STRING *)info->programName->value.ascii,
 | |
| 30 | -+		info->programName->value.ascii = ASN1_IA5STRING_new();
 | |
| 31 | -+		ASN1_STRING_set(info->programName->value.ascii,
 | |
| 32 | - 						(const unsigned char*)desc, strlen(desc));
 | |
| 33 | - 	}
 | |
| 34 | - 
 | |
| 35 | - 	if (url) {
 | |
| 36 | - 		info->moreInfo = SpcLink_new();
 | |
| 37 | - 		info->moreInfo->type = 0;
 | |
| 38 | --		info->moreInfo->value.url = "">
 | |
| 39 | --		ASN1_STRING_set((ASN1_STRING *)info->moreInfo->value.url,
 | |
| 40 | -+		info->moreInfo->value.url = "">
 | |
| 41 | -+		ASN1_STRING_set(info->moreInfo->value.url,
 | |
| 42 | - 						(const unsigned char*)url, strlen(url));
 | |
| 43 | - 	}
 | |
| 44 | - 
 | |
| 45 | -@@ -609,19 +609,20 @@ static int add_timestamp(PKCS7 *sig, char *url, char *proxy, int rfc3161, const
 | |
| 46 | - 
 | |
| 47 | - 	if (rfc3161) {
 | |
| 48 | - 		unsigned char mdbuf[EVP_MAX_MD_SIZE];
 | |
| 49 | --		EVP_MD_CTX mdctx;
 | |
| 50 | -+		EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
 | |
| 51 | - 
 | |
| 52 | --		EVP_MD_CTX_init(&mdctx);
 | |
| 53 | --		EVP_DigestInit(&mdctx, md);
 | |
| 54 | --		EVP_DigestUpdate(&mdctx, si->enc_digest->data, si->enc_digest->length);
 | |
| 55 | --		EVP_DigestFinal(&mdctx, mdbuf, NULL);
 | |
| 56 | -+		EVP_DigestInit(mdctx, md);
 | |
| 57 | -+		EVP_DigestUpdate(mdctx, si->enc_digest->data, si->enc_digest->length);
 | |
| 58 | -+		EVP_DigestFinal(mdctx, mdbuf, NULL);
 | |
| 59 | -+		EVP_MD_CTX_free(mdctx);
 | |
| 60 | -+		mdctx = NULL;
 | |
| 61 | - 
 | |
| 62 | - 		TimeStampReq *req = TimeStampReq_new();
 | |
| 63 | - 		ASN1_INTEGER_set(req->version, 1);
 | |
| 64 | - 		req->messageImprint->digestAlgorithm->algorithm = OBJ_nid2obj(EVP_MD_nid(md));
 | |
| 65 | - 		req->messageImprint->digestAlgorithm->parameters = ASN1_TYPE_new();
 | |
| 66 | - 		req->messageImprint->digestAlgorithm->parameters->type = V_ASN1_NULL;
 | |
| 67 | --		M_ASN1_OCTET_STRING_set(req->messageImprint->digest, mdbuf, EVP_MD_size(md));
 | |
| 68 | -+		ASN1_OCTET_STRING_set(req->messageImprint->digest, mdbuf, EVP_MD_size(md));
 | |
| 69 | - 		req->certReq = (void*)0x1;
 | |
| 70 | - 
 | |
| 71 | - 		len = i2d_TimeStampReq(req, NULL);
 | |
| 72 | -@@ -921,83 +922,8 @@ static const unsigned char classid_page_hash[] = {
 | |
| 73 | - 	0xAE, 0x05, 0xA2, 0x17, 0xDA, 0x8E, 0x60, 0xD6
 | |
| 74 | - };
 | |
| 75 | - 
 | |
| 76 | --static unsigned char *calc_page_hash(char *indata, unsigned int peheader, int pe32plus,
 | |
| 77 | --									 unsigned int sigpos, int phtype, unsigned int *phlen);
 | |
| 78 | --
 | |
| 79 | --DECLARE_STACK_OF(ASN1_OCTET_STRING)
 | |
| 80 | --#ifndef sk_ASN1_OCTET_STRING_new_null
 | |
| 81 | --#define sk_ASN1_OCTET_STRING_new_null() SKM_sk_new_null(ASN1_OCTET_STRING)
 | |
| 82 | --#define sk_ASN1_OCTET_STRING_free(st) SKM_sk_free(ASN1_OCTET_STRING, (st))
 | |
| 83 | --#define sk_ASN1_OCTET_STRING_push(st, val) SKM_sk_push(ASN1_OCTET_STRING, (st), (val))
 | |
| 84 | --#define i2d_ASN1_SET_OF_ASN1_OCTET_STRING(st, pp, i2d_func, ex_tag, ex_class, is_set) \
 | |
| 85 | --	SKM_ASN1_SET_OF_i2d(ASN1_OCTET_STRING, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
 | |
| 86 | --#endif
 | |
| 87 | --
 | |
| 88 | --DECLARE_STACK_OF(SpcAttributeTypeAndOptionalValue)
 | |
| 89 | --#ifndef sk_SpcAttributeTypeAndOptionalValue_new_null
 | |
| 90 | --#define sk_SpcAttributeTypeAndOptionalValue_new_null() SKM_sk_new_null(SpcAttributeTypeAndOptionalValue)
 | |
| 91 | --#define sk_SpcAttributeTypeAndOptionalValue_free(st) SKM_sk_free(SpcAttributeTypeAndOptionalValue, (st))
 | |
| 92 | --#define sk_SpcAttributeTypeAndOptionalValue_push(st, val) SKM_sk_push(SpcAttributeTypeAndOptionalValue, (st), (val))
 | |
| 93 | --#define i2d_SpcAttributeTypeAndOptionalValue(st, pp, i2d_func, ex_tag, ex_class, is_set) \
 | |
| 94 | --	SKM_ASN1_SET_OF_i2d(SpcAttributeTypeAndOptionalValue, (st), (pp), (i2d_func), (ex_tag), (ex_class), (is_set))
 | |
| 95 | --#endif
 | |
| 96 | --
 | |
| 97 | --static SpcLink *get_page_hash_link(int phtype, char *indata, unsigned int peheader, int pe32plus, unsigned int sigpos)
 | |
| 98 | --{
 | |
| 99 | --	unsigned int phlen;
 | |
| 100 | --	unsigned char *ph = calc_page_hash(indata, peheader, pe32plus, sigpos, phtype, &phlen);
 | |
| 101 | --	if (!ph) {
 | |
| 102 | --		fprintf(stderr, "Failed to calculate page hash\n");
 | |
| 103 | --		exit(-1);
 | |
| 104 | --	}
 | |
| 105 | --
 | |
| 106 | --	ASN1_OCTET_STRING *ostr = M_ASN1_OCTET_STRING_new();
 | |
| 107 | --	M_ASN1_OCTET_STRING_set(ostr, ph, phlen);
 | |
| 108 | --	free(ph);
 | |
| 109 | --
 | |
| 110 | --	STACK_OF(ASN1_OCTET_STRING) *oset = sk_ASN1_OCTET_STRING_new_null();
 | |
| 111 | --	sk_ASN1_OCTET_STRING_push(oset, ostr);
 | |
| 112 | --	unsigned char *p, *tmp;
 | |
| 113 | --	unsigned int l;
 | |
| 114 | --	l = i2d_ASN1_SET_OF_ASN1_OCTET_STRING(oset, NULL, i2d_ASN1_OCTET_STRING,
 | |
| 115 | --										  V_ASN1_SET, V_ASN1_UNIVERSAL, IS_SET);
 | |
| 116 | --	tmp = p = OPENSSL_malloc(l);
 | |
| 117 | --	i2d_ASN1_SET_OF_ASN1_OCTET_STRING(oset, &tmp, i2d_ASN1_OCTET_STRING,
 | |
| 118 | --									  V_ASN1_SET, V_ASN1_UNIVERSAL, IS_SET);
 | |
| 119 | --	ASN1_OCTET_STRING_free(ostr);
 | |
| 120 | --	sk_ASN1_OCTET_STRING_free(oset);
 | |
| 121 | --
 | |
| 122 | --	SpcAttributeTypeAndOptionalValue *aval = SpcAttributeTypeAndOptionalValue_new();
 | |
| 123 | --	aval->type = OBJ_txt2obj((phtype == NID_sha1) ? SPC_PE_IMAGE_PAGE_HASHES_V1 : SPC_PE_IMAGE_PAGE_HASHES_V2, 1);
 | |
| 124 | --	aval->value = ASN1_TYPE_new();
 | |
| 125 | --	aval->value->type = V_ASN1_SET;
 | |
| 126 | --	aval->value->value.set = ASN1_STRING_new();
 | |
| 127 | --	ASN1_STRING_set(aval->value->value.set, p, l);
 | |
| 128 | --	OPENSSL_free(p);
 | |
| 129 | --
 | |
| 130 | --	STACK_OF(SpcAttributeTypeAndOptionalValue) *aset = sk_SpcAttributeTypeAndOptionalValue_new_null();
 | |
| 131 | --	sk_SpcAttributeTypeAndOptionalValue_push(aset, aval);
 | |
| 132 | --	l = i2d_SpcAttributeTypeAndOptionalValue(aset, NULL, i2d_SpcAttributeTypeAndOptionalValue,
 | |
| 133 | --											 V_ASN1_SET, V_ASN1_UNIVERSAL, IS_SET);
 | |
| 134 | --	tmp = p = OPENSSL_malloc(l);
 | |
| 135 | --	l = i2d_SpcAttributeTypeAndOptionalValue(aset, &tmp, i2d_SpcAttributeTypeAndOptionalValue,
 | |
| 136 | --											 V_ASN1_SET, V_ASN1_UNIVERSAL, IS_SET);
 | |
| 137 | --	sk_SpcAttributeTypeAndOptionalValue_free(aset);
 | |
| 138 | --	SpcAttributeTypeAndOptionalValue_free(aval);
 | |
| 139 | --
 | |
| 140 | --	SpcSerializedObject *so = SpcSerializedObject_new();
 | |
| 141 | --	M_ASN1_OCTET_STRING_set(so->classId, classid_page_hash, sizeof(classid_page_hash));
 | |
| 142 | --	M_ASN1_OCTET_STRING_set(so->serializedData, p, l);
 | |
| 143 | --	OPENSSL_free(p);
 | |
| 144 | --
 | |
| 145 | --	SpcLink *link = SpcLink_new();
 | |
| 146 | --	link->type = 1;
 | |
| 147 | --	link->value.moniker = so;
 | |
| 148 | --	return link;
 | |
| 149 | --}
 | |
| 150 | --
 | |
| 151 | - static void get_indirect_data_blob(u_char **blob, int *len, const EVP_MD *md, file_type_t type,
 | |
| 152 | --								   int pagehash, char *indata, unsigned int peheader, int pe32plus,
 | |
| 153 | -+								   char *indata, unsigned int peheader, int pe32plus,
 | |
| 154 | - 								   unsigned int sigpos)
 | |
| 155 | - {
 | |
| 156 | - 	static const unsigned char msistr[] = {
 | |
| 157 | -@@ -1024,14 +950,7 @@ static void get_indirect_data_blob(u_char **blob, int *len, const EVP_MD *md, fi
 | |
| 158 | - 	} else if (type == FILE_TYPE_PE) {
 | |
| 159 | - 		SpcPeImageData *pid = SpcPeImageData_new();
 | |
| 160 | - 		ASN1_BIT_STRING_set(pid->flags, (unsigned char*)"0", 0);
 | |
| 161 | --		if (pagehash) {
 | |
| 162 | --			int phtype = NID_sha1;
 | |
| 163 | --			if (EVP_MD_size(md) > EVP_MD_size(EVP_sha1()))
 | |
| 164 | --				phtype = NID_sha256;
 | |
| 165 | --			pid->file = get_page_hash_link(phtype, indata, peheader, pe32plus, sigpos);
 | |
| 166 | --		} else {
 | |
| 167 | --			pid->file = get_obsolete_link();
 | |
| 168 | --		}
 | |
| 169 | -+		pid->file = get_obsolete_link();
 | |
| 170 | - 		l = i2d_SpcPeImageData(pid, NULL);
 | |
| 171 | - 		p = OPENSSL_malloc(l);
 | |
| 172 | - 		i2d_SpcPeImageData(pid, &p);
 | |
| 173 | -@@ -1046,7 +965,7 @@ static void get_indirect_data_blob(u_char **blob, int *len, const EVP_MD *md, fi
 | |
| 174 | - 		ASN1_INTEGER_set(si->d, 0);
 | |
| 175 | - 		ASN1_INTEGER_set(si->e, 0);
 | |
| 176 | - 		ASN1_INTEGER_set(si->f, 0);
 | |
| 177 | --		M_ASN1_OCTET_STRING_set(si->string, msistr, sizeof(msistr));
 | |
| 178 | -+		ASN1_OCTET_STRING_set(si->string, msistr, sizeof(msistr));
 | |
| 179 | - 		l = i2d_SpcSipInfo(si, NULL);
 | |
| 180 | - 		p = OPENSSL_malloc(l);
 | |
| 181 | - 		i2d_SpcSipInfo(si, &p);
 | |
| 182 | -@@ -1068,7 +987,7 @@ static void get_indirect_data_blob(u_char **blob, int *len, const EVP_MD *md, fi
 | |
| 183 | - 	hashlen = EVP_MD_size(md);
 | |
| 184 | - 	hash = OPENSSL_malloc(hashlen);
 | |
| 185 | - 	memset(hash, 0, hashlen);
 | |
| 186 | --	M_ASN1_OCTET_STRING_set(idc->messageDigest->digest, hash, hashlen);
 | |
| 187 | -+	ASN1_OCTET_STRING_set(idc->messageDigest->digest, hash, hashlen);
 | |
| 188 | - 	OPENSSL_free(hash);
 | |
| 189 | - 
 | |
| 190 | - 	*len  = i2d_SpcIndirectDataContent(idc, NULL);
 | |
| 191 | -@@ -1923,19 +1842,18 @@ static void calc_pe_digest(BIO *bio, const EVP_MD *md, unsigned char *mdbuf,
 | |
| 192 | - 						   unsigned int peheader, int pe32plus, unsigned int fileend)
 | |
| 193 | - {
 | |
| 194 | - 	static unsigned char bfb[16*1024*1024];
 | |
| 195 | --	EVP_MD_CTX mdctx;
 | |
| 196 | -+	EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
 | |
| 197 | - 
 | |
| 198 | --	EVP_MD_CTX_init(&mdctx);
 | |
| 199 | --	EVP_DigestInit(&mdctx, md);
 | |
| 200 | -+	EVP_DigestInit(mdctx, md);
 | |
| 201 | - 
 | |
| 202 | - 	memset(mdbuf, 0, EVP_MAX_MD_SIZE);
 | |
| 203 | - 
 | |
| 204 | - 	(void)BIO_seek(bio, 0);
 | |
| 205 | - 	BIO_read(bio, bfb, peheader + 88);
 | |
| 206 | --	EVP_DigestUpdate(&mdctx, bfb, peheader + 88);
 | |
| 207 | -+	EVP_DigestUpdate(mdctx, bfb, peheader + 88);
 | |
| 208 | - 	BIO_read(bio, bfb, 4);
 | |
| 209 | - 	BIO_read(bio, bfb, 60+pe32plus*16);
 | |
| 210 | --	EVP_DigestUpdate(&mdctx, bfb, 60+pe32plus*16);
 | |
| 211 | -+	EVP_DigestUpdate(mdctx, bfb, 60+pe32plus*16);
 | |
| 212 | - 	BIO_read(bio, bfb, 8);
 | |
| 213 | - 
 | |
| 214 | - 	unsigned int n = peheader + 88 + 4 + 60+pe32plus*16 + 8;
 | |
| 215 | -@@ -1946,11 +1864,12 @@ static void calc_pe_digest(BIO *bio, const EVP_MD *md, unsigned char *mdbuf,
 | |
| 216 | - 		int l = BIO_read(bio, bfb, want);
 | |
| 217 | - 		if (l <= 0)
 | |
| 218 | - 			break;
 | |
| 219 | --		EVP_DigestUpdate(&mdctx, bfb, l);
 | |
| 220 | -+		EVP_DigestUpdate(mdctx, bfb, l);
 | |
| 221 | - 		n += l;
 | |
| 222 | - 	}
 | |
| 223 | - 
 | |
| 224 | --	EVP_DigestFinal(&mdctx, mdbuf, NULL);
 | |
| 225 | -+	EVP_DigestFinal(mdctx, mdbuf, NULL);
 | |
| 226 | -+	EVP_MD_CTX_free(mdctx);
 | |
| 227 | - }
 | |
| 228 | - 
 | |
| 229 | - 
 | |
| 230 | -@@ -2019,16 +1938,15 @@ static unsigned char *calc_page_hash(char *indata, unsigned int peheader, int pe
 | |
| 231 | - 	int phlen = pphlen * (3 + nsections + sigpos / pagesize);
 | |
| 232 | - 	unsigned char *res = malloc(phlen);
 | |
| 233 | - 	unsigned char *zeroes = calloc(pagesize, 1);
 | |
| 234 | --	EVP_MD_CTX mdctx;
 | |
| 235 | --
 | |
| 236 | --	EVP_MD_CTX_init(&mdctx);
 | |
| 237 | --	EVP_DigestInit(&mdctx, md);
 | |
| 238 | --	EVP_DigestUpdate(&mdctx, indata, peheader + 88);
 | |
| 239 | --	EVP_DigestUpdate(&mdctx, indata + peheader + 92, 60 + pe32plus*16);
 | |
| 240 | --	EVP_DigestUpdate(&mdctx, indata + peheader + 160 + pe32plus*16, hdrsize - (peheader + 160 + pe32plus*16));
 | |
| 241 | --	EVP_DigestUpdate(&mdctx, zeroes, pagesize - hdrsize);
 | |
| 242 | -+	EVP_MD_CTX *mdctx = EVP_MD_CTX_new();
 | |
| 243 | -+
 | |
| 244 | -+	EVP_DigestInit(mdctx, md);
 | |
| 245 | -+	EVP_DigestUpdate(mdctx, indata, peheader + 88);
 | |
| 246 | -+	EVP_DigestUpdate(mdctx, indata + peheader + 92, 60 + pe32plus*16);
 | |
| 247 | -+	EVP_DigestUpdate(mdctx, indata + peheader + 160 + pe32plus*16, hdrsize - (peheader + 160 + pe32plus*16));
 | |
| 248 | -+	EVP_DigestUpdate(mdctx, zeroes, pagesize - hdrsize);
 | |
| 249 | - 	memset(res, 0, 4);
 | |
| 250 | --	EVP_DigestFinal(&mdctx, res + 4, NULL);
 | |
| 251 | -+	EVP_DigestFinal(mdctx, res + 4, NULL);
 | |
| 252 | - 
 | |
| 253 | - 	unsigned short sizeofopthdr = GET_UINT16_LE(indata + peheader + 20);
 | |
| 254 | - 	char *sections = indata + peheader + 24 + sizeofopthdr;
 | |
| 255 | -@@ -2040,18 +1958,20 @@ static unsigned char *calc_page_hash(char *indata, unsigned int peheader, int pe
 | |
| 256 | - 		unsigned int l;
 | |
| 257 | - 		for (l=0; l < rs; l+=pagesize, pi++) {
 | |
| 258 | - 			PUT_UINT32_LE(ro + l, res + pi*pphlen);
 | |
| 259 | --			EVP_DigestInit(&mdctx, md);
 | |
| 260 | -+			EVP_DigestInit(mdctx, md);
 | |
| 261 | - 			if (rs - l < pagesize) {
 | |
| 262 | --				EVP_DigestUpdate(&mdctx, indata + ro + l, rs - l);
 | |
| 263 | --				EVP_DigestUpdate(&mdctx, zeroes, pagesize - (rs - l));
 | |
| 264 | -+				EVP_DigestUpdate(mdctx, indata + ro + l, rs - l);
 | |
| 265 | -+				EVP_DigestUpdate(mdctx, zeroes, pagesize - (rs - l));
 | |
| 266 | - 			} else {
 | |
| 267 | --				EVP_DigestUpdate(&mdctx, indata + ro + l, pagesize);
 | |
| 268 | -+				EVP_DigestUpdate(mdctx, indata + ro + l, pagesize);
 | |
| 269 | - 			}
 | |
| 270 | --			EVP_DigestFinal(&mdctx, res + pi*pphlen + 4, NULL);
 | |
| 271 | -+			EVP_DigestFinal(mdctx, res + pi*pphlen + 4, NULL);
 | |
| 272 | - 		}
 | |
| 273 | - 		lastpos = ro + rs;
 | |
| 274 | - 		sections += 40;
 | |
| 275 | - 	}
 | |
| 276 | -+	EVP_MD_CTX_free(mdctx);
 | |
| 277 | -+	mdctx = NULL;
 | |
| 278 | - 	PUT_UINT32_LE(lastpos, res + pi*pphlen);
 | |
| 279 | - 	memset(res + pi*pphlen + 4, 0, EVP_MD_size(md));
 | |
| 280 | - 	pi++;
 | |
| 281 | -@@ -2413,7 +2333,7 @@ int main(int argc, char **argv)
 | |
| 282 | - 	int nturl = 0, ntsurl = 0;
 | |
| 283 | - 	int addBlob = 0;
 | |
| 284 | - 	u_char *p = NULL;
 | |
| 285 | --	int ret = 0, i, len = 0, jp = -1, pe32plus = 0, comm = 0, pagehash = 0;
 | |
| 286 | -+	int ret = 0, i, len = 0, jp = -1, pe32plus = 0, comm = 0;
 | |
| 287 | - 	unsigned int tmp, peheader = 0, padlen = 0;
 | |
| 288 | - 	off_t filesize, fileend, sigfilesize, sigfileend, outdatasize;
 | |
| 289 | - 	file_type_t type;
 | |
| 290 | -@@ -2448,13 +2368,6 @@ int main(int argc, char **argv)
 | |
| 291 | - 	ERR_load_crypto_strings();
 | |
| 292 | - 	OPENSSL_add_all_algorithms_conf();
 | |
| 293 | - 
 | |
| 294 | --	/* create some MS Authenticode OIDS we need later on */
 | |
| 295 | --	if (!OBJ_create(SPC_STATEMENT_TYPE_OBJID, NULL, NULL) ||
 | |
| 296 | --		!OBJ_create(SPC_MS_JAVA_SOMETHING, NULL, NULL) ||
 | |
| 297 | --		!OBJ_create(SPC_SP_OPUS_INFO_OBJID, NULL, NULL) ||
 | |
| 298 | --		!OBJ_create(SPC_NESTED_SIGNATURE_OBJID, NULL, NULL))
 | |
| 299 | --		DO_EXIT_0("Failed to add objects\n");
 | |
| 300 | --
 | |
| 301 | - 	md = EVP_sha1();
 | |
| 302 | - 
 | |
| 303 | - 	if (argc > 1) {
 | |
| 304 | -@@ -2531,8 +2444,6 @@ int main(int argc, char **argv)
 | |
| 305 | - 			readpass = *(++argv);
 | |
| 306 | - 		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-comm")) {
 | |
| 307 | - 			comm = 1;
 | |
| 308 | --		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-ph")) {
 | |
| 309 | --			pagehash = 1;
 | |
| 310 | - 		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-n")) {
 | |
| 311 | - 			if (--argc < 1) usage(argv0);
 | |
| 312 | - 			desc = *(++argv);
 | |
| 313 | -@@ -3243,7 +3154,7 @@ int main(int argc, char **argv)
 | |
| 314 | - 		p7x = NULL;
 | |
| 315 | - 	}
 | |
| 316 | - 
 | |
| 317 | --	get_indirect_data_blob(&p, &len, md, type, pagehash, indata, peheader, pe32plus, fileend);
 | |
| 318 | -+	get_indirect_data_blob(&p, &len, md, type, indata, peheader, pe32plus, fileend);
 | |
| 319 | - 	len -= EVP_MD_size(md);
 | |
| 320 | - 	memcpy(buf, p, len);
 | |
| 321 | - 	OPENSSL_free(p);
 | |
| 322 | --- 
 | |
| 323 | -2.34.1
 | |
| 324 | - | 
| ... | ... | @@ -4,11 +4,10 @@ distdir=$(pwd)/dist | 
| 4 | 4 |  mkdir -p $distdir/[% project %]
 | 
| 5 | 5 |  tar xf [% project %]-[% c('version') %].tar.gz
 | 
| 6 | 6 |  cd [% project %]-[% c('version') %]
 | 
| 7 | -patch -p1 < ../0001-Make-code-work-with-OpenSSL-1.1.patch
 | |
| 8 | -patch -p1 < ../timestamping.patch
 | |
| 9 | 7 | |
| 10 | -./autogen.sh
 | |
| 11 | -./configure --prefix=/[% project %]
 | |
| 8 | +mkdir build
 | |
| 9 | +cd build
 | |
| 10 | +cmake -DCMAKE_INSTALL_PREFIX=/[% project %] -S ..
 | |
| 12 | 11 |  make
 | 
| 13 | 12 |  make DESTDIR=$distdir install
 | 
| 14 | 13 | 
| 1 | 1 |  # vim: filetype=yaml sw=2
 | 
| 2 | 2 |  version: '[% c("git_hash").substr(0, 12) %]'
 | 
| 3 | 3 |  git_url: https://github.com/mtrojnar/osslsigncode
 | 
| 4 | -git_hash: e72a1937d1a13e87074e4584f012f13e03fc1d64
 | |
| 4 | +git_hash: d6f94d71f731868a3df86c6e0b8094da0c1412ed
 | |
| 5 | 5 |  filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
 | 
| 6 | 6 |  container:
 | 
| 7 | 7 |    use_container: 0
 | 
| 8 | 8 |  var:
 | 
| 9 | 9 |    deps:
 | 
| 10 | -    - autoconf
 | |
| 11 | -    - libtool
 | |
| 12 | -    - pkg-config
 | |
| 10 | +    - cmake
 | |
| 13 | 11 |      - libssl-dev
 | 
| 14 | 12 |      - libcurl4-openssl-dev
 | 
| 15 | 13 |  input_files:
 | 
| 16 | -  - filename: 0001-Make-code-work-with-OpenSSL-1.1.patch
 | |
| 17 | -  - filename: timestamping.patch
 | |
| 18 | 14 |    - filename: '[% c("var/srcfile") %]'
 | 
| 19 | 15 |      enable: '[% c("var/no-git") %]'
 | 
| 20 | 16 | 
| 1 | -From 28b384e77fa0d4dd38751a0c72ab5976d2e38f75 Mon Sep 17 00:00:00 2001
 | |
| 2 | -From: Georg Koppen <gk@xxxxxxxxxxxxxx>
 | |
| 3 | -Date: Fri, 5 Feb 2016 09:23:10 +0000
 | |
| 4 | -Subject: [PATCH] Allow timestamping with the 'add' command
 | |
| 5 | - | |
| 6 | - | |
| 7 | -diff --git a/osslsigncode.c b/osslsigncode.c
 | |
| 8 | -index 32e37c8..2978c02 100644
 | |
| 9 | ---- a/osslsigncode.c
 | |
| 10 | -+++ b/osslsigncode.c
 | |
| 11 | -@@ -2556,16 +2556,16 @@ int main(int argc, char **argv)
 | |
| 12 | - 			if (--argc < 1) usage(argv0);
 | |
| 13 | - 			url = "">
 | |
| 14 | - #ifdef ENABLE_CURL
 | |
| 15 | --		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-t")) {
 | |
| 16 | -+		} else if ((cmd == CMD_SIGN || cmd == CMD_ADD) && !strcmp(*argv, "-t")) {
 | |
| 17 | - 			if (--argc < 1) usage(argv0);
 | |
| 18 | - 			turl[nturl++] = *(++argv);
 | |
| 19 | --		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-ts")) {
 | |
| 20 | -+		} else if ((cmd == CMD_SIGN || cmd == CMD_ADD) && !strcmp(*argv, "-ts")) {
 | |
| 21 | - 			if (--argc < 1) usage(argv0);
 | |
| 22 | - 			tsurl[ntsurl++] = *(++argv);
 | |
| 23 | --		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-p")) {
 | |
| 24 | -+		} else if ((cmd == CMD_SIGN || cmd == CMD_ADD) && !strcmp(*argv, "-p")) {
 | |
| 25 | - 			if (--argc < 1) usage(argv0);
 | |
| 26 | - 			proxy = *(++argv);
 | |
| 27 | --		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-noverifypeer")) {
 | |
| 28 | -+		} else if ((cmd == CMD_SIGN || cmd == CMD_ADD) && !strcmp(*argv, "-noverifypeer")) {
 | |
| 29 | - 			noverifypeer = 1;
 | |
| 30 | - #endif
 | |
| 31 | - 		} else if ((cmd == CMD_SIGN || cmd == CMD_ADD) && !strcmp(*argv, "-addUnauthenticatedBlob")) {
 | |
| 32 | ---
 | |
| 33 | -2.7.0
 | |
| 34 | - | |
| 35 | - | |
| 36 | -From 8159546dfa270da0e3512dcba983ce15029111d0 Mon Sep 17 00:00:00 2001
 | |
| 37 | -From: Georg Koppen <gk@xxxxxxxxxxxxxx>
 | |
| 38 | -Date: Sat, 11 Apr 2020 05:50:36 +0000
 | |
| 39 | -Subject: [PATCH] fixup! Allow timestamping with the 'add' command
 | |
| 40 | - | |
| 41 | - | |
| 42 | -diff --git a/osslsigncode.c b/osslsigncode.c
 | |
| 43 | -index 3797458..4f4b897 100644
 | |
| 44 | ---- a/osslsigncode.c
 | |
| 45 | -+++ b/osslsigncode.c
 | |
| 46 | -@@ -2447,7 +2447,7 @@ int main(int argc, char **argv)
 | |
| 47 | - 		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-n")) {
 | |
| 48 | - 			if (--argc < 1) usage(argv0);
 | |
| 49 | - 			desc = *(++argv);
 | |
| 50 | --		} else if ((cmd == CMD_SIGN) && !strcmp(*argv, "-h")) {
 | |
| 51 | -+		} else if ((cmd == CMD_SIGN || cmd == CMD_ADD) && !strcmp(*argv, "-h")) {
 | |
| 52 | - 			if (--argc < 1) usage(argv0);
 | |
| 53 | - 			++argv;
 | |
| 54 | - 			if (!strcmp(*argv, "md5")) {
 | |
| 55 | ---
 | |
| 56 | -2.26.0 | 
| 1 | -android-signing | |
| \ No newline at end of file | 
| 1 | -android-signing | |
| \ No newline at end of file | 
| ... | ... | @@ -35,7 +35,7 @@ set -e | 
| 35 | 35 |  script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
 | 
| 36 | 36 |  source "$script_dir/functions"
 | 
| 37 | 37 | |
| 38 | -osslsigncode_file="$script_dir/../../out/osslsigncode/osslsigncode-e72a1937d1a1-25066d.tar.gz"
 | |
| 38 | +osslsigncode_file="$script_dir/../../out/osslsigncode/osslsigncode-d6f94d71f731-3a61fb.tar.gz"
 | |
| 39 | 39 | |
| 40 | 40 |  test -f "$osslsigncode_file" ||
 | 
| 41 | 41 |    exit_error "$osslsigncode_file is missing." \
 | 
| ... | ... | @@ -17,9 +17,12 @@ echo | 
| 17 | 17 |  test -f "$steps_dir/linux-signer-signmars.done" ||
 | 
| 18 | 18 |    read -sp "Enter nssdb7 (mar signing) passphrase: " NSSPASS
 | 
| 19 | 19 |  echo
 | 
| 20 | -#test -f "$steps_dir/linux-signer-authenticode-signing.done" ||
 | |
| 21 | -#  read -sp "Enter windows authenticode (yubihsm) passphrase: " YUBIPASS
 | |
| 22 | -#echo
 | |
| 20 | +test -f "$steps_dir/linux-signer-sign-android-apks.done" ||
 | |
| 21 | +  read -sp "Enter android apk signing password ($tbb_version_type): " KSPASS
 | |
| 22 | +echo
 | |
| 23 | +test -f "$steps_dir/linux-signer-authenticode-signing.done" ||
 | |
| 24 | +  read -sp "Enter windows authenticode passphrase: " YUBIPASS
 | |
| 25 | +echo
 | |
| 23 | 26 |  test -f "$steps_dir/linux-signer-gpg-sign.done" ||
 | 
| 24 | 27 |    read -sp "Enter gpg passphrase: " GPG_PASS
 | 
| 25 | 28 |  echo
 | 
| ... | ... | @@ -106,6 +109,18 @@ function sync-after-signmars { | 
| 106 | 109 |    "$script_dir/sync-linux-signer-to-local"
 | 
| 107 | 110 |  }
 | 
| 108 | 111 | |
| 112 | +function linux-signer-sign-android-apks {
 | |
| 113 | +  ssh "$ssh_host_linux_signer" 'bash -s' << EOF
 | |
| 114 | +  export KSPASS=$KSPASS
 | |
| 115 | +  ~/signing-$SIGNING_PROJECTNAME-$tbb_version_type/linux-signer-sign-android-apks.$SIGNING_PROJECTNAME
 | |
| 116 | +EOF
 | |
| 117 | +  unset KSPASS
 | |
| 118 | +}
 | |
| 119 | + | |
| 120 | +function sync-after-sign-android-apks {
 | |
| 121 | +  "$script_dir/sync-linux-signer-to-local"
 | |
| 122 | +}
 | |
| 123 | + | |
| 109 | 124 |  function download-unsigned-sha256sums-gpg-signatures-from-people-tpo {
 | 
| 110 | 125 |    "$script_dir/download-unsigned-sha256sums-gpg-signatures-from-people-tpo"
 | 
| 111 | 126 |  }
 | 
| ... | ... | @@ -199,10 +214,14 @@ do_step sync-scripts-to-linux-signer | 
| 199 | 214 |  do_step sync-before-linux-signer-signmars
 | 
| 200 | 215 |  do_step linux-signer-signmars
 | 
| 201 | 216 |  do_step sync-after-signmars
 | 
| 202 | -#do_step linux-signer-authenticode-signing
 | |
| 203 | -#do_step sync-after-authenticode-signing
 | |
| 204 | -#do_step authenticode-timestamping
 | |
| 205 | -#do_step sync-after-authenticode-timestamping
 | |
| 217 | +is_project torbrowser && \
 | |
| 218 | +  do_step linux-signer-sign-android-apks
 | |
| 219 | +is_project torbrowser && \
 | |
| 220 | +  do_step sync-after-sign-android-apks
 | |
| 221 | +do_step linux-signer-authenticode-signing
 | |
| 222 | +do_step sync-after-authenticode-signing
 | |
| 223 | +do_step authenticode-timestamping
 | |
| 224 | +do_step sync-after-authenticode-timestamping
 | |
| 206 | 225 |  do_step hash_signed_bundles
 | 
| 207 | 226 |  do_step sync-after-hash
 | 
| 208 | 227 |  do_step linux-signer-gpg-sign
 | 
| ... | ... | @@ -20,4 +20,5 @@ do | 
| 20 | 20 |    tmpsig=$(mktemp)
 | 
| 21 | 21 |    echo "$GPG_PASS" | sudo -u signing-gpg -- "$wrappers_dir/sign-gpg" "$i" > "$tmpsig"
 | 
| 22 | 22 |    mv -f "$tmpsig" "${i}.asc"
 | 
| 23 | +  chmod 644 "${i}.asc"
 | |
| 23 | 24 |  done | 
| 1 | +#!/bin/bash
 | |
| 2 | + | |
| 3 | +set -e
 | |
| 4 | +script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
 | |
| 5 | +source "$script_dir/functions"
 | |
| 6 | +source "$script_dir/set-config.generated-config"
 | |
| 7 | + | |
| 8 | +topdir="$script_dir/../.."
 | |
| 9 | +ARCHS="armv7 aarch64 x86 x86_64"
 | |
| 10 | +projname=$(project-name)
 | |
| 11 | +# tbb_version_type is used in wrappers/sign-apk, so we export it
 | |
| 12 | +export tbb_version_type
 | |
| 13 | + | |
| 14 | +check_installed_packages() {
 | |
| 15 | +  local packages='unzip openjdk-11-jdk-headless openjdk-11-jre-headless'
 | |
| 16 | +  for package in $packages
 | |
| 17 | +  do
 | |
| 18 | +    dpkg -s "$package" | grep -q '^Status: install ok installed$' || \
 | |
| 19 | +      exit_error "package $package is missing"
 | |
| 20 | +  done
 | |
| 21 | +}
 | |
| 22 | + | |
| 23 | +setup_build_tools() {
 | |
| 24 | +  build_tools_dir=/signing/android-build-tools
 | |
| 25 | +  test -f "$build_tools_dir"/android-12/apksigner || \
 | |
| 26 | +    exit_error "$build_tools_dir/android-12/apksigner is missing"
 | |
| 27 | +  export PATH="$build_tools_dir/android-12:${PATH}"
 | |
| 28 | +}
 | |
| 29 | + | |
| 30 | +sign_apk() {
 | |
| 31 | +  sudo -u signing-apk -- /signing/tor-browser-build/tools/signing/wrappers/sign-apk "$(pwd)/$1" "$(pwd)/$2"
 | |
| 32 | +}
 | |
| 33 | + | |
| 34 | +verify_apk() {
 | |
| 35 | +  verified=$(apksigner verify --print-certs --verbose "$1")
 | |
| 36 | +  scheme_v1="Verified using v1 scheme (JAR signing): true"
 | |
| 37 | +  scheme_v2="Verified using v2 scheme (APK Signature Scheme v2): true"
 | |
| 38 | + | |
| 39 | +  # Verify the expected signing key was used, Alpha verses Release based on the filename.
 | |
| 40 | +  if test "$tbb_version_type" = "alpha"; then
 | |
| 41 | +    cert_digest="Signer #1 certificate SHA-256 digest: 15f760b41acbe4783e667102c9f67119be2af62fab07763f9d57f01e5e1074e1"
 | |
| 42 | +    pubkey_digest="Signer #1 public key SHA-256 digest: 4e617e6516f81123ca58e718d617a704ac8365c575bd9e7a731ba5dd0476869d"
 | |
| 43 | +  else
 | |
| 44 | +    cert_digest="Signer #1 certificate SHA-256 digest: 20061f045e737c67375c17794cfedb436a03cec6bacb7cb9f96642205ca2cec8"
 | |
| 45 | +    pubkey_digest="Signer #1 public key SHA-256 digest: 343ca8a2e5452670bdc335a181a4baed909f868937d68c4653e44ef84de8dfc6"
 | |
| 46 | +  fi
 | |
| 47 | +  for digest in "${scheme_v1}" "${scheme_v2}" "${cert_digest}" "${pubkey_digest}"; do
 | |
| 48 | +    if ! echo "${verified}" | grep -q "${digest}"; then
 | |
| 49 | +      echo "Expected digest not found:"
 | |
| 50 | +      echo ${digest}
 | |
| 51 | +      echo "in:"
 | |
| 52 | +      echo ${verified}
 | |
| 53 | +      exit 1
 | |
| 54 | +    fi
 | |
| 55 | +  done
 | |
| 56 | +}
 | |
| 57 | + | |
| 58 | +check_installed_packages
 | |
| 59 | + | |
| 60 | +if [ -z "$KSPASS" ]; then
 | |
| 61 | +    echo "Enter keystore passphrase"
 | |
| 62 | +    stty -echo; read KSPASS; stty echo
 | |
| 63 | +    export KSPASS
 | |
| 64 | +fi
 | |
| 65 | + | |
| 66 | +setup_build_tools
 | |
| 67 | + | |
| 68 | +mkdir -p ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
 | |
| 69 | +chgrp signing ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
 | |
| 70 | +chmod g+w ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
 | |
| 71 | +cp -af ~/"$SIGNING_PROJECTNAME-$tbb_version"/*.apk ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
 | |
| 72 | +cd ~/"$SIGNING_PROJECTNAME-$tbb_version-apks"
 | |
| 73 | + | |
| 74 | +# Sign all packages
 | |
| 75 | +for arch in ${ARCHS}; do
 | |
| 76 | +  qa_apk=${projname}-${tbb_version}-android-${arch}-multi-qa.apk
 | |
| 77 | +  signed_apk=${projname}-${tbb_version}-android-${arch}-multi.apk
 | |
| 78 | +  sign_apk "$qa_apk" "$signed_apk"
 | |
| 79 | +  verify_apk "$signed_apk"
 | |
| 80 | +  cp -f "$signed_apk" ~/"$SIGNING_PROJECTNAME-$tbb_version"
 | |
| 81 | +done
 | |
| 82 | + | |
| 83 | +rm -Rf ~/"$SIGNING_PROJECTNAME-$tbb_version-apks" | 
| 1 | +linux-signer-sign-android-apks | |
| \ No newline at end of file | 
| ... | ... | @@ -83,11 +83,12 @@ create_group signing | 
| 83 | 83 |  create_user signing-gpg
 | 
| 84 | 84 |  create_user signing-mar
 | 
| 85 | 85 |  create_user signing-win yubihsm
 | 
| 86 | - | |
| 86 | +create_user signing-apk signing
 | |
| 87 | 87 | |
| 88 | 88 |  sudoers_file sign-gpg
 | 
| 89 | 89 |  sudoers_file sign-mar
 | 
| 90 | 90 |  sudoers_file sign-exe
 | 
| 91 | +sudoers_file sign-apk
 | |
| 91 | 92 | |
| 92 | 93 |  authorized_keys boklm boklm-tb-release.pub boklm-yk1.pub
 | 
| 93 | 94 |  create_user richard signing
 | 
| ... | ... | @@ -111,6 +112,9 @@ install_packages opensc libengine-pkcs11-openssl | 
| 111 | 112 |  # Install deps for building yubihsm-shell
 | 
| 112 | 113 |  install_packages cmake libusb-1.0-0-dev libedit-dev gengetopt libpcsclite-dev help2man chrpath dh-exec
 | 
| 113 | 114 | |
| 115 | +# Install deps for android/apk signing
 | |
| 116 | +install_packages unzip openjdk-11-jdk-headless openjdk-11-jre-headless
 | |
| 117 | + | |
| 114 | 118 |  # Build and install yubihsm-pkcs11 package
 | 
| 115 | 119 |  create_user build-pkgs
 | 
| 116 | 120 |  if ! dpkg-query -s yubihsm-pkcs11 2> /dev/null | grep -q '^Status: .* installed'; then
 | 
| ... | ... | @@ -132,3 +136,13 @@ if ! test -d /home/signing-mar/mar-tools; then | 
| 132 | 136 |    chmod go+rX "$tmpdir/mar-tools"/*
 | 
| 133 | 137 |    mv "$tmpdir/mar-tools" /home/signing-mar/mar-tools
 | 
| 134 | 138 |  fi
 | 
| 139 | + | |
| 140 | +for rel in release alpha; do
 | |
| 141 | +  keypath=/home/signing-apk/keys/tba_$rel.p12
 | |
| 142 | +  if ! test -f "$keypath"; then
 | |
| 143 | +    echo "$rel key for android should be put in $keypath"
 | |
| 144 | +  else
 | |
| 145 | +    chown signing-apk "$keypath"
 | |
| 146 | +    chmod 700 "$keypath"
 | |
| 147 | +  fi
 | |
| 148 | +done | 
| 1 | +Defaults>signing-apk env_keep += "SIGNING_PROJECTNAME tbb_version_type KSPASS"
 | |
| 2 | +%signing ALL = (signing-apk) NOPASSWD: /signing/tor-browser-build/tools/signing/wrappers/sign-apk | 
| ... | ... | @@ -36,6 +36,12 @@ if ! test -f "./out/yubihsm-shell/$yubihsm_filename"; then | 
| 36 | 36 |    echo "Fetched $yubihsm_filename"
 | 
| 37 | 37 |  fi
 | 
| 38 | 38 | |
| 39 | +android_build_tools_filename=$(./rbm/rbm showconf --step get_build_tools android-toolchain filename)
 | |
| 40 | +if ! test -f "./out/android-toolchain/$android_build_tools_filename"; then
 | |
| 41 | +  ./rbm/rbm build --step get_build_tools android-toolchain
 | |
| 42 | +  echo "Fetched $android_build_tools_filename"
 | |
| 43 | +fi
 | |
| 44 | + | |
| 39 | 45 |  signing_machine='linux-signer'
 | 
| 40 | 46 |  setup_user='setup'
 | 
| 41 | 47 |  signing_dir='/signing'
 | 
| ... | ... | @@ -43,14 +49,26 @@ signing_dir='/signing' | 
| 43 | 49 |  echo "Uploading $osslsigncodefile to $signing_machine"
 | 
| 44 | 50 |  chmod go+r "./out/osslsigncode/$osslsigncodefile"
 | 
| 45 | 51 |  rsync -v "./out/osslsigncode/$osslsigncodefile" "$setup_user@$signing_machine:$signing_dir/$osslsigncodefile"
 | 
| 52 | + | |
| 46 | 53 |  echo "Uploading rbm.tar to $signing_machine"
 | 
| 47 | 54 |  rsync -v "$tmpdir/rbm.tar" "$setup_user@$signing_machine:$signing_dir/rbm.tar"
 | 
| 55 | + | |
| 48 | 56 |  echo "Uploading $martools_filename"
 | 
| 49 | 57 |  chmod go+r "./out/mar-tools/$martools_filename"
 | 
| 50 | 58 |  rsync -v "./out/mar-tools/$martools_filename" "$setup_user@$signing_machine:$signing_dir/$martools_filename"
 | 
| 59 | + | |
| 51 | 60 |  echo "Uploading $yubihsm_filename"
 | 
| 52 | 61 |  chmod go+r "./out/yubihsm-shell/$yubihsm_filename"
 | 
| 53 | 62 |  rsync -v "./out/yubihsm-shell/$yubihsm_filename" "$setup_user@$signing_machine:$signing_dir/$yubihsm_filename"
 | 
| 63 | + | |
| 64 | +echo "Uploading $android_build_tools_filename"
 | |
| 65 | +chmod go+r "./out/android-toolchain/$android_build_tools_filename"
 | |
| 66 | +rsync -v "./out/android-toolchain/$android_build_tools_filename" "$setup_user@$signing_machine:$signing_dir/$android_build_tools_filename"
 | |
| 67 | +echo "Extracting $android_build_tools_filename"
 | |
| 68 | +ssh "$setup_user@$signing_machine" mkdir -p $signing_dir/android-build-tools
 | |
| 69 | +ssh "$setup_user@$signing_machine" unzip -qo -d $signing_dir/android-build-tools "$signing_dir/$android_build_tools_filename"
 | |
| 70 | +ssh "$setup_user@$signing_machine" chmod -R o+rX "$signing_dir/$android_build_tools_filename"
 | |
| 71 | + | |
| 54 | 72 |  echo "Uploading tor-browser-build.tar to $signing_machine"
 | 
| 55 | 73 |  scp -p "$tbbtar" "$setup_user@$signing_machine:$signing_dir/"
 | 
| 56 | 74 |  echo "Extracting tor-browser-build.tar on $signing_machine"
 | 
| 1 | -# The following line should be uncommented and updated:
 | |
| 2 | - | |
| 3 | -#ssh_host_pkgstage=tbbuild
 | |
| 4 | -#pkgstage_tor_browser_build_dir=/home/user/tor-browser-build
 | |
| 5 | -#android_signing_key_dir=/path/to/signing/key/dir
 | |
| 6 | - | |
| 7 | -var_is_defined ssh_host_pkgstage android_signing_key_dir | 
| 1 | 1 |  #!/bin/bash
 | 
| 2 | - | |
| 3 | -# Sign apk for each target architecture.
 | |
| 4 | -# This script does not require command line argument, but it needs 
 | |
| 5 | -# some configuration options to be set in set-config.android-signing:
 | |
| 6 | -#  - ssh_host_pkgstage is the host which you use for staging packages
 | |
| 7 | -#    during signing. The script will download the unsigned .apk files
 | |
| 8 | -#    from this host, and upload the signed .apk there
 | |
| 9 | -#  - pkgstage_tor_browser_build_dir: this is the path to tor-browser-build
 | |
| 10 | -#    on pkgstage
 | |
| 11 | -#  - android_signing_key_dir: the local path where the android signing
 | |
| 12 | -#    keys are located. That directory should contains files tba_alpha.p12
 | |
| 13 | -#    and tba_release.p12 for alpha and release signing keys.
 | |
| 14 | -# The Tor Browser version is taken from set-config.tbb-version
 | |
| 15 | - | |
| 16 | 2 |  set -e
 | 
| 17 | -script_dir=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
 | |
| 18 | -source "$script_dir/functions"
 | |
| 19 | -source "$script_dir/set-config.android-signing"
 | |
| 20 | 3 | |
| 21 | -topdir="$script_dir/../.."
 | |
| 22 | -ARCHS="armv7 aarch64 x86 x86_64"
 | |
| 23 | -projname=$(project-name)
 | |
| 24 | - | |
| 25 | -android_signing_key_path="$android_signing_key_dir/tba_$tbb_version_type.p12"
 | |
| 26 | -test -f "$android_signing_key_path" || exit_error "$android_signing_key_path is missing"
 | |
| 27 | - | |
| 28 | -check_installed_packages() {
 | |
| 29 | -  local packages='unzip openjdk-11-jdk-headless openjdk-11-jre-headless'
 | |
| 30 | -  for package in $packages
 | |
| 4 | +function exit_error {
 | |
| 5 | +  for msg in "$@"
 | |
| 31 | 6 |    do
 | 
| 32 | -    dpkg -s "$package" | grep -q '^Status: install ok installed$' || \
 | |
| 33 | -      exit_error "package $package is missing"
 | |
| 7 | +    echo "$msg" >&2
 | |
| 34 | 8 |    done
 | 
| 9 | +  exit 1
 | |
| 35 | 10 |  }
 | 
| 36 | 11 | |
| 12 | +if test "$tbb_version_type" != 'release' \
 | |
| 13 | +  && test "$tbb_version_type" != 'alpha'; then
 | |
| 14 | +  exit_error "Unexpected value for tbb_version_type: $tbb_version_type"
 | |
| 15 | +fi
 | |
| 16 | + | |
| 17 | +android_signing_key_dir=/home/signing-apk/keys
 | |
| 18 | +android_signing_key_path="$android_signing_key_dir/tba_$tbb_version_type.p12"
 | |
| 19 | +test -f "$android_signing_key_path" || exit_error "$android_signing_key_path is missing"
 | |
| 20 | + | |
| 37 | 21 |  setup_build_tools() {
 | 
| 38 | -  local rbm="$topdir/rbm/rbm"
 | |
| 39 | -  local build_tools_zipfile="$topdir/out/android-toolchain/$("$rbm" showconf --step get_build_tools android-toolchain filename)"
 | |
| 40 | -  if ! test -f "$build_tools_zipfile"; then
 | |
| 41 | -    "$rbm" build --step get_build_tools android-toolchain
 | |
| 42 | -    test -f "$build_tools_zipfile" || exit_error "$build_tools_zipfile is missing"
 | |
| 43 | -  fi
 | |
| 44 | -  local build_tools_dir=$(mktemp -d)
 | |
| 45 | -  trap "rm -Rf $build_tools_dir" EXIT
 | |
| 46 | -  unzip -d "$build_tools_dir" "$build_tools_zipfile"
 | |
| 22 | +  build_tools_dir=/signing/android-build-tools
 | |
| 47 | 23 |    test -f "$build_tools_dir"/android-12/apksigner || \
 | 
| 48 | 24 |      exit_error "$build_tools_dir/android-12/apksigner is missing"
 | 
| 49 | 25 |    export PATH="$build_tools_dir/android-12:${PATH}"
 | 
| 50 | 26 |  }
 | 
| 51 | 27 | |
| 52 | -download_unsigned_apks() {
 | |
| 53 | -  apks_dir=$(mktemp -d)
 | |
| 54 | -  trap "rm -Rf $apks_dir" EXIT
 | |
| 55 | -  rsync -avH "$ssh_host_pkgstage:$pkgstage_tor_browser_build_dir/$SIGNING_PROJECTNAME/$tbb_version_type/signed/$tbb_version/*-qa.apk" "$apks_dir/"
 | |
| 56 | -}
 | |
| 57 | - | |
| 58 | -upload_signed_apks() {
 | |
| 59 | -  rsync -avH --exclude="*-qa.apk" --exclude="*-unaligned.apk" \
 | |
| 60 | -    --exclude="*-unsigned.apk" "$apks_dir/" \
 | |
| 61 | -    "$ssh_host_pkgstage:$pkgstage_tor_browser_build_dir/$SIGNING_PROJECTNAME/$tbb_version_type/signed/$tbb_version/"
 | |
| 62 | -}
 | |
| 63 | - | |
| 64 | 28 |  # Sign individual apk
 | 
| 65 | 29 |  sign_apk() {
 | 
| 66 | 30 |      INPUTAPK="$1"
 | 
| 31 | +    OUTPUTAPK="$2"
 | |
| 67 | 32 | |
| 68 | 33 |      # https://developer.android.com/studio/publish/app-signing#sign-manually
 | 
| 69 | 34 |      # After running `gradlew assembleRelease`, creates an unsigned-unaligned apk
 | 
| ... | ... | @@ -75,10 +40,11 @@ sign_apk() { | 
| 75 | 40 |      echo Aligning and signing ${INPUTAPK}
 | 
| 76 | 41 | |
| 77 | 42 |      # Append the different stages of signing
 | 
| 78 | -    UNSIGNED_UNALIGNED_APK=`echo "${INPUTAPK}" | sed 's/\.apk/-unsigned-unaligned.apk/'`
 | |
| 43 | +    UNSIGNED_UNALIGNED_APK=`basename "${INPUTAPK}" | sed 's/\.apk/-unsigned-unaligned.apk/'`
 | |
| 79 | 44 |      UNSIGNED_APK=`echo "${UNSIGNED_UNALIGNED_APK}" | sed 's/-unaligned//'`
 | 
| 80 | 45 |      SIGNED_APK=`echo "${UNSIGNED_APK}" | sed 's/-unsigned//'`
 | 
| 81 | 46 | |
| 47 | +    # ${INPUTAPK} is full path. We copy to local tmp directory.
 | |
| 82 | 48 |      cp "${INPUTAPK}" "${UNSIGNED_UNALIGNED_APK}"
 | 
| 83 | 49 | |
| 84 | 50 |      # Step 1: Align
 | 
| ... | ... | @@ -117,67 +83,16 @@ sign_apk() { | 
| 117 | 83 |          exit 1
 | 
| 118 | 84 |      fi
 | 
| 119 | 85 | |
| 86 | +    mv -f "${SIGNED_APK}" "$OUTPUTAPK"
 | |
| 120 | 87 |      echo apksigner verify succeeded
 | 
| 121 | 88 |  }
 | 
| 122 | 89 | |
| 123 | -# Rename and verify signing certificate
 | |
| 124 | -finalize() {
 | |
| 125 | -  for arch in ${ARCHS}; do
 | |
| 126 | -      mv ${projname}-${tbb_version}-android-${arch}-multi{-qa,}.apk
 | |
| 127 | -  done
 | |
| 128 | - | |
| 129 | -  for arch in ${ARCHS}; do
 | |
| 130 | -      verified=`apksigner verify --print-certs --verbose ${projname}-${tbb_version}-android-${arch}-multi.apk`
 | |
| 131 | -      scheme_v1=
 | |
| 132 | -      scheme_v2=
 | |
| 133 | -      cert_digest=
 | |
| 134 | -      pubkey_digest=
 | |
| 135 | - | |
| 136 | -      # Verify the expected signing key was used, Alpha verses Release based on the filename.
 | |
| 137 | -      if test "$tbb_version_type" = "alpha"; then
 | |
| 138 | -          scheme_v1="Verified using v1 scheme (JAR signing): true"
 | |
| 139 | -          scheme_v2="Verified using v2 scheme (APK Signature Scheme v2): true"
 | |
| 140 | -          cert_digest="Signer #1 certificate SHA-256 digest: 15f760b41acbe4783e667102c9f67119be2af62fab07763f9d57f01e5e1074e1"
 | |
| 141 | -          pubkey_digest="Signer #1 public key SHA-256 digest: 4e617e6516f81123ca58e718d617a704ac8365c575bd9e7a731ba5dd0476869d"
 | |
| 142 | -      else
 | |
| 143 | -          scheme_v1="Verified using v1 scheme (JAR signing): true"
 | |
| 144 | -          scheme_v2="Verified using v2 scheme (APK Signature Scheme v2): true"
 | |
| 145 | -          cert_digest="Signer #1 certificate SHA-256 digest: 20061f045e737c67375c17794cfedb436a03cec6bacb7cb9f96642205ca2cec8"
 | |
| 146 | -          pubkey_digest="Signer #1 public key SHA-256 digest: 343ca8a2e5452670bdc335a181a4baed909f868937d68c4653e44ef84de8dfc6"
 | |
| 147 | -      fi
 | |
| 148 | -      for digest in "${scheme_v1}" "${scheme_v2}" "${cert_digest}" "${pubkey_digest}"; do
 | |
| 149 | -          if ! `echo "${verified}" | grep -q "${digest}"`; then
 | |
| 150 | -              echo "Expected digest not found:"
 | |
| 151 | -              echo ${digest}
 | |
| 152 | -              echo "in:"
 | |
| 153 | -              echo ${verified}
 | |
| 154 | -              exit 1
 | |
| 155 | -          fi
 | |
| 156 | -      done
 | |
| 157 | -  done
 | |
| 158 | - | |
| 159 | -  echo Done.
 | |
| 160 | -}
 | |
| 161 | - | |
| 162 | -check_installed_packages
 | |
| 163 | - | |
| 164 | -if [ -z "$KSPASS" ]; then
 | |
| 165 | -    echo "Enter keystore passphrase"
 | |
| 166 | -    stty -echo; read KSPASS; stty echo
 | |
| 167 | -    export KSPASS
 | |
| 168 | -fi
 | |
| 169 | - | |
| 170 | 90 |  setup_build_tools
 | 
| 171 | 91 | |
| 172 | -download_unsigned_apks
 | |
| 173 | - | |
| 174 | -cd $apks_dir
 | |
| 175 | - | |
| 176 | -# Sign all packages
 | |
| 177 | -for arch in ${ARCHS}; do
 | |
| 178 | -    sign_apk ${projname}-${tbb_version}-android-${arch}-multi-qa.apk
 | |
| 179 | -done
 | |
| 92 | +tmpdir=$(mktemp -d)
 | |
| 93 | +cd "$tmpdir"
 | |
| 180 | 94 | |
| 181 | -finalize
 | |
| 95 | +sign_apk "$1" "$2"
 | |
| 182 | 96 | |
| 183 | -upload_signed_apks | |
| 97 | +cd -
 | |
| 98 | +rm -Rf "$tmpdir" | 
| ... | ... | @@ -11,10 +11,12 @@ if test $(whoami) != 'signing-win'; then | 
| 11 | 11 |    exit 2
 | 
| 12 | 12 |  fi
 | 
| 13 | 13 | |
| 14 | -yubipass="$1"
 | |
| 14 | +pass="$1"
 | |
| 15 | 15 |  to_sign_exe="$2"
 | 
| 16 | 16 | |
| 17 | -tpo_cert=/home/signing-win/tpo-cert.crt
 | |
| 17 | +key_dir=/home/signing-win/keys/key-1
 | |
| 18 | +tpo_cert=$key_dir/the_tor_project_inc.crt
 | |
| 19 | +tpo_key=$key_dir/private.pem
 | |
| 18 | 20 | |
| 19 | 21 |  if ! test -f "$tpo_cert"; then
 | 
| 20 | 22 |    echo "File $tpo_cert is missing" >&2
 | 
| ... | ... | @@ -26,12 +28,10 @@ rm -f "$output_signed_exe" | 
| 26 | 28 | |
| 27 | 29 |  export 'YUBIHSM_PKCS11_CONF=/signing/tor-browser-build/tools/signing/machines-setup/etc/yubihsm_pkcs11.conf'
 | 
| 28 | 30 |  /home/signing-win/osslsigncode/bin/osslsigncode \
 | 
| 29 | -  -pkcs11engine /usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so \
 | |
| 30 | -  -pkcs11module /usr/lib/x86_64-linux-gnu/pkcs11/yubihsm_pkcs11.so \
 | |
| 31 | -  -pass "$yubipass" \
 | |
| 31 | +  -pass "$pass" \
 | |
| 32 | 32 |    -h sha256 \
 | 
| 33 | 33 |    -certs "$tpo_cert" \
 | 
| 34 | -  -key 1c40 \
 | |
| 34 | +  -key "$tpo_key" \
 | |
| 35 | 35 |    "$to_sign_exe" "$output_signed_exe"
 | 
| 36 | 36 | |
| 37 | 37 |  chmod 644 "$output_signed_exe" |