1 /*
2  * Copyright (C) 2008 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include <errno.h>
18 #include <malloc.h>
19 #include <stdio.h>
20 #include <string.h>
21 
22 #include <algorithm>
23 #include <memory>
24 
25 #include <openssl/ecdsa.h>
26 #include <openssl/obj_mac.h>
27 
28 #include "asn1_decoder.h"
29 #include "common.h"
30 #include "print_sha1.h"
31 #include "ui.h"
32 #include "verifier.h"
33 
34 extern RecoveryUI* ui;
35 
36 static constexpr size_t MiB = 1024 * 1024;
37 
38 /*
39  * Simple version of PKCS#7 SignedData extraction. This extracts the
40  * signature OCTET STRING to be used for signature verification.
41  *
42  * For full details, see http://www.ietf.org/rfc/rfc3852.txt
43  *
44  * The PKCS#7 structure looks like:
45  *
46  *   SEQUENCE (ContentInfo)
47  *     OID (ContentType)
48  *     [0] (content)
49  *       SEQUENCE (SignedData)
50  *         INTEGER (version CMSVersion)
51  *         SET (DigestAlgorithmIdentifiers)
52  *         SEQUENCE (EncapsulatedContentInfo)
53  *         [0] (CertificateSet OPTIONAL)
54  *         [1] (RevocationInfoChoices OPTIONAL)
55  *         SET (SignerInfos)
56  *           SEQUENCE (SignerInfo)
57  *             INTEGER (CMSVersion)
58  *             SEQUENCE (SignerIdentifier)
59  *             SEQUENCE (DigestAlgorithmIdentifier)
60  *             SEQUENCE (SignatureAlgorithmIdentifier)
61  *             OCTET STRING (SignatureValue)
62  */
read_pkcs7(uint8_t * pkcs7_der,size_t pkcs7_der_len,uint8_t ** sig_der,size_t * sig_der_length)63 static bool read_pkcs7(uint8_t* pkcs7_der, size_t pkcs7_der_len, uint8_t** sig_der,
64         size_t* sig_der_length) {
65     asn1_context_t* ctx = asn1_context_new(pkcs7_der, pkcs7_der_len);
66     if (ctx == NULL) {
67         return false;
68     }
69 
70     asn1_context_t* pkcs7_seq = asn1_sequence_get(ctx);
71     if (pkcs7_seq != NULL && asn1_sequence_next(pkcs7_seq)) {
72         asn1_context_t *signed_data_app = asn1_constructed_get(pkcs7_seq);
73         if (signed_data_app != NULL) {
74             asn1_context_t* signed_data_seq = asn1_sequence_get(signed_data_app);
75             if (signed_data_seq != NULL
76                     && asn1_sequence_next(signed_data_seq)
77                     && asn1_sequence_next(signed_data_seq)
78                     && asn1_sequence_next(signed_data_seq)
79                     && asn1_constructed_skip_all(signed_data_seq)) {
80                 asn1_context_t *sig_set = asn1_set_get(signed_data_seq);
81                 if (sig_set != NULL) {
82                     asn1_context_t* sig_seq = asn1_sequence_get(sig_set);
83                     if (sig_seq != NULL
84                             && asn1_sequence_next(sig_seq)
85                             && asn1_sequence_next(sig_seq)
86                             && asn1_sequence_next(sig_seq)
87                             && asn1_sequence_next(sig_seq)) {
88                         uint8_t* sig_der_ptr;
89                         if (asn1_octet_string_get(sig_seq, &sig_der_ptr, sig_der_length)) {
90                             *sig_der = (uint8_t*) malloc(*sig_der_length);
91                             if (*sig_der != NULL) {
92                                 memcpy(*sig_der, sig_der_ptr, *sig_der_length);
93                             }
94                         }
95                         asn1_context_free(sig_seq);
96                     }
97                     asn1_context_free(sig_set);
98                 }
99                 asn1_context_free(signed_data_seq);
100             }
101             asn1_context_free(signed_data_app);
102         }
103         asn1_context_free(pkcs7_seq);
104     }
105     asn1_context_free(ctx);
106 
107     return *sig_der != NULL;
108 }
109 
110 // Look for an RSA signature embedded in the .ZIP file comment given
111 // the path to the zip.  Verify it matches one of the given public
112 // keys.
113 //
114 // Return VERIFY_SUCCESS, VERIFY_FAILURE (if any error is encountered
115 // or no key matches the signature).
116 
verify_file(unsigned char * addr,size_t length,const std::vector<Certificate> & keys)117 int verify_file(unsigned char* addr, size_t length,
118                 const std::vector<Certificate>& keys) {
119     ui->SetProgress(0.0);
120 
121     // An archive with a whole-file signature will end in six bytes:
122     //
123     //   (2-byte signature start) $ff $ff (2-byte comment size)
124     //
125     // (As far as the ZIP format is concerned, these are part of the
126     // archive comment.)  We start by reading this footer, this tells
127     // us how far back from the end we have to start reading to find
128     // the whole comment.
129 
130 #define FOOTER_SIZE 6
131 
132     if (length < FOOTER_SIZE) {
133         LOGE("not big enough to contain footer\n");
134         return VERIFY_FAILURE;
135     }
136 
137     unsigned char* footer = addr + length - FOOTER_SIZE;
138 
139     if (footer[2] != 0xff || footer[3] != 0xff) {
140         LOGE("footer is wrong\n");
141         return VERIFY_FAILURE;
142     }
143 
144     size_t comment_size = footer[4] + (footer[5] << 8);
145     size_t signature_start = footer[0] + (footer[1] << 8);
146     LOGI("comment is %zu bytes; signature %zu bytes from end\n",
147          comment_size, signature_start);
148 
149     if (signature_start <= FOOTER_SIZE) {
150         LOGE("Signature start is in the footer");
151         return VERIFY_FAILURE;
152     }
153 
154 #define EOCD_HEADER_SIZE 22
155 
156     // The end-of-central-directory record is 22 bytes plus any
157     // comment length.
158     size_t eocd_size = comment_size + EOCD_HEADER_SIZE;
159 
160     if (length < eocd_size) {
161         LOGE("not big enough to contain EOCD\n");
162         return VERIFY_FAILURE;
163     }
164 
165     // Determine how much of the file is covered by the signature.
166     // This is everything except the signature data and length, which
167     // includes all of the EOCD except for the comment length field (2
168     // bytes) and the comment data.
169     size_t signed_len = length - eocd_size + EOCD_HEADER_SIZE - 2;
170 
171     unsigned char* eocd = addr + length - eocd_size;
172 
173     // If this is really is the EOCD record, it will begin with the
174     // magic number $50 $4b $05 $06.
175     if (eocd[0] != 0x50 || eocd[1] != 0x4b ||
176         eocd[2] != 0x05 || eocd[3] != 0x06) {
177         LOGE("signature length doesn't match EOCD marker\n");
178         return VERIFY_FAILURE;
179     }
180 
181     for (size_t i = 4; i < eocd_size-3; ++i) {
182         if (eocd[i  ] == 0x50 && eocd[i+1] == 0x4b &&
183             eocd[i+2] == 0x05 && eocd[i+3] == 0x06) {
184             // if the sequence $50 $4b $05 $06 appears anywhere after
185             // the real one, minzip will find the later (wrong) one,
186             // which could be exploitable.  Fail verification if
187             // this sequence occurs anywhere after the real one.
188             LOGE("EOCD marker occurs after start of EOCD\n");
189             return VERIFY_FAILURE;
190         }
191     }
192 
193     bool need_sha1 = false;
194     bool need_sha256 = false;
195     for (const auto& key : keys) {
196         switch (key.hash_len) {
197             case SHA_DIGEST_LENGTH: need_sha1 = true; break;
198             case SHA256_DIGEST_LENGTH: need_sha256 = true; break;
199         }
200     }
201 
202     SHA_CTX sha1_ctx;
203     SHA256_CTX sha256_ctx;
204     SHA1_Init(&sha1_ctx);
205     SHA256_Init(&sha256_ctx);
206 
207     double frac = -1.0;
208     size_t so_far = 0;
209     while (so_far < signed_len) {
210         // On a Nexus 5X, experiment showed 16MiB beat 1MiB by 6% faster for a
211         // 1196MiB full OTA and 60% for an 89MiB incremental OTA.
212         // http://b/28135231.
213         size_t size = std::min(signed_len - so_far, 16 * MiB);
214 
215         if (need_sha1) SHA1_Update(&sha1_ctx, addr + so_far, size);
216         if (need_sha256) SHA256_Update(&sha256_ctx, addr + so_far, size);
217         so_far += size;
218 
219         double f = so_far / (double)signed_len;
220         if (f > frac + 0.02 || size == so_far) {
221             ui->SetProgress(f);
222             frac = f;
223         }
224     }
225 
226     uint8_t sha1[SHA_DIGEST_LENGTH];
227     SHA1_Final(sha1, &sha1_ctx);
228     uint8_t sha256[SHA256_DIGEST_LENGTH];
229     SHA256_Final(sha256, &sha256_ctx);
230 
231     uint8_t* sig_der = nullptr;
232     size_t sig_der_length = 0;
233 
234     uint8_t* signature = eocd + eocd_size - signature_start;
235     size_t signature_size = signature_start - FOOTER_SIZE;
236 
237     LOGI("signature (offset: 0x%zx, length: %zu): %s\n",
238             length - signature_start, signature_size,
239             print_hex(signature, signature_size).c_str());
240 
241     if (!read_pkcs7(signature, signature_size, &sig_der, &sig_der_length)) {
242         LOGE("Could not find signature DER block\n");
243         return VERIFY_FAILURE;
244     }
245 
246     /*
247      * Check to make sure at least one of the keys matches the signature. Since
248      * any key can match, we need to try each before determining a verification
249      * failure has happened.
250      */
251     size_t i = 0;
252     for (const auto& key : keys) {
253         const uint8_t* hash;
254         int hash_nid;
255         switch (key.hash_len) {
256             case SHA_DIGEST_LENGTH:
257                 hash = sha1;
258                 hash_nid = NID_sha1;
259                 break;
260             case SHA256_DIGEST_LENGTH:
261                 hash = sha256;
262                 hash_nid = NID_sha256;
263                 break;
264             default:
265                 continue;
266         }
267 
268         // The 6 bytes is the "(signature_start) $ff $ff (comment_size)" that
269         // the signing tool appends after the signature itself.
270         if (key.key_type == Certificate::KEY_TYPE_RSA) {
271             if (!RSA_verify(hash_nid, hash, key.hash_len, sig_der,
272                             sig_der_length, key.rsa.get())) {
273                 LOGI("failed to verify against RSA key %zu\n", i);
274                 continue;
275             }
276 
277             LOGI("whole-file signature verified against RSA key %zu\n", i);
278             free(sig_der);
279             return VERIFY_SUCCESS;
280         } else if (key.key_type == Certificate::KEY_TYPE_EC
281                 && key.hash_len == SHA256_DIGEST_LENGTH) {
282             if (!ECDSA_verify(0, hash, key.hash_len, sig_der,
283                               sig_der_length, key.ec.get())) {
284                 LOGI("failed to verify against EC key %zu\n", i);
285                 continue;
286             }
287 
288             LOGI("whole-file signature verified against EC key %zu\n", i);
289             free(sig_der);
290             return VERIFY_SUCCESS;
291         } else {
292             LOGI("Unknown key type %d\n", key.key_type);
293         }
294         i++;
295     }
296 
297     if (need_sha1) {
298         LOGI("SHA-1 digest: %s\n", print_hex(sha1, SHA_DIGEST_LENGTH).c_str());
299     }
300     if (need_sha256) {
301         LOGI("SHA-256 digest: %s\n", print_hex(sha256, SHA256_DIGEST_LENGTH).c_str());
302     }
303     free(sig_der);
304     LOGE("failed to verify whole-file signature\n");
305     return VERIFY_FAILURE;
306 }
307 
parse_rsa_key(FILE * file,uint32_t exponent)308 std::unique_ptr<RSA, RSADeleter> parse_rsa_key(FILE* file, uint32_t exponent) {
309     // Read key length in words and n0inv. n0inv is a precomputed montgomery
310     // parameter derived from the modulus and can be used to speed up
311     // verification. n0inv is 32 bits wide here, assuming the verification logic
312     // uses 32 bit arithmetic. However, BoringSSL may use a word size of 64 bits
313     // internally, in which case we don't have a valid n0inv. Thus, we just
314     // ignore the montgomery parameters and have BoringSSL recompute them
315     // internally. If/When the speedup from using the montgomery parameters
316     // becomes relevant, we can add more sophisticated code here to obtain a
317     // 64-bit n0inv and initialize the montgomery parameters in the key object.
318     uint32_t key_len_words = 0;
319     uint32_t n0inv = 0;
320     if (fscanf(file, " %i , 0x%x", &key_len_words, &n0inv) != 2) {
321         return nullptr;
322     }
323 
324     if (key_len_words > 8192 / 32) {
325         LOGE("key length (%d) too large\n", key_len_words);
326         return nullptr;
327     }
328 
329     // Read the modulus.
330     std::unique_ptr<uint32_t[]> modulus(new uint32_t[key_len_words]);
331     if (fscanf(file, " , { %u", &modulus[0]) != 1) {
332         return nullptr;
333     }
334     for (uint32_t i = 1; i < key_len_words; ++i) {
335         if (fscanf(file, " , %u", &modulus[i]) != 1) {
336             return nullptr;
337         }
338     }
339 
340     // Cconvert from little-endian array of little-endian words to big-endian
341     // byte array suitable as input for BN_bin2bn.
342     std::reverse((uint8_t*)modulus.get(),
343                  (uint8_t*)(modulus.get() + key_len_words));
344 
345     // The next sequence of values is the montgomery parameter R^2. Since we
346     // generally don't have a valid |n0inv|, we ignore this (see comment above).
347     uint32_t rr_value;
348     if (fscanf(file, " } , { %u", &rr_value) != 1) {
349         return nullptr;
350     }
351     for (uint32_t i = 1; i < key_len_words; ++i) {
352         if (fscanf(file, " , %u", &rr_value) != 1) {
353             return nullptr;
354         }
355     }
356     if (fscanf(file, " } } ") != 0) {
357         return nullptr;
358     }
359 
360     // Initialize the key.
361     std::unique_ptr<RSA, RSADeleter> key(RSA_new());
362     if (!key) {
363       return nullptr;
364     }
365 
366     key->n = BN_bin2bn((uint8_t*)modulus.get(),
367                        key_len_words * sizeof(uint32_t), NULL);
368     if (!key->n) {
369       return nullptr;
370     }
371 
372     key->e = BN_new();
373     if (!key->e || !BN_set_word(key->e, exponent)) {
374       return nullptr;
375     }
376 
377     return key;
378 }
379 
380 struct BNDeleter {
operator ()BNDeleter381   void operator()(BIGNUM* bn) {
382     BN_free(bn);
383   }
384 };
385 
parse_ec_key(FILE * file)386 std::unique_ptr<EC_KEY, ECKEYDeleter> parse_ec_key(FILE* file) {
387     uint32_t key_len_bytes = 0;
388     if (fscanf(file, " %i", &key_len_bytes) != 1) {
389         return nullptr;
390     }
391 
392     std::unique_ptr<EC_GROUP, void (*)(EC_GROUP*)> group(
393         EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1), EC_GROUP_free);
394     if (!group) {
395         return nullptr;
396     }
397 
398     // Verify that |key_len| matches the group order.
399     if (key_len_bytes != BN_num_bytes(EC_GROUP_get0_order(group.get()))) {
400         return nullptr;
401     }
402 
403     // Read the public key coordinates. Note that the byte order in the file is
404     // little-endian, so we convert to big-endian here.
405     std::unique_ptr<uint8_t[]> bytes(new uint8_t[key_len_bytes]);
406     std::unique_ptr<BIGNUM, BNDeleter> point[2];
407     for (int i = 0; i < 2; ++i) {
408         unsigned int byte = 0;
409         if (fscanf(file, " , { %u", &byte) != 1) {
410             return nullptr;
411         }
412         bytes[key_len_bytes - 1] = byte;
413 
414         for (size_t i = 1; i < key_len_bytes; ++i) {
415             if (fscanf(file, " , %u", &byte) != 1) {
416                 return nullptr;
417             }
418             bytes[key_len_bytes - i - 1] = byte;
419         }
420 
421         point[i].reset(BN_bin2bn(bytes.get(), key_len_bytes, nullptr));
422         if (!point[i]) {
423             return nullptr;
424         }
425 
426         if (fscanf(file, " }") != 0) {
427             return nullptr;
428         }
429     }
430 
431     if (fscanf(file, " } ") != 0) {
432         return nullptr;
433     }
434 
435     // Create and initialize the key.
436     std::unique_ptr<EC_KEY, ECKEYDeleter> key(EC_KEY_new());
437     if (!key || !EC_KEY_set_group(key.get(), group.get()) ||
438         !EC_KEY_set_public_key_affine_coordinates(key.get(), point[0].get(),
439                                                   point[1].get())) {
440         return nullptr;
441     }
442 
443     return key;
444 }
445 
446 // Reads a file containing one or more public keys as produced by
447 // DumpPublicKey:  this is an RSAPublicKey struct as it would appear
448 // as a C source literal, eg:
449 //
450 //  "{64,0xc926ad21,{1795090719,...,-695002876},{-857949815,...,1175080310}}"
451 //
452 // For key versions newer than the original 2048-bit e=3 keys
453 // supported by Android, the string is preceded by a version
454 // identifier, eg:
455 //
456 //  "v2 {64,0xc926ad21,{1795090719,...,-695002876},{-857949815,...,1175080310}}"
457 //
458 // (Note that the braces and commas in this example are actual
459 // characters the parser expects to find in the file; the ellipses
460 // indicate more numbers omitted from this example.)
461 //
462 // The file may contain multiple keys in this format, separated by
463 // commas.  The last key must not be followed by a comma.
464 //
465 // A Certificate is a pair of an RSAPublicKey and a particular hash
466 // (we support SHA-1 and SHA-256; we store the hash length to signify
467 // which is being used).  The hash used is implied by the version number.
468 //
469 //       1: 2048-bit RSA key with e=3 and SHA-1 hash
470 //       2: 2048-bit RSA key with e=65537 and SHA-1 hash
471 //       3: 2048-bit RSA key with e=3 and SHA-256 hash
472 //       4: 2048-bit RSA key with e=65537 and SHA-256 hash
473 //       5: 256-bit EC key using the NIST P-256 curve parameters and SHA-256 hash
474 //
475 // Returns true on success, and appends the found keys (at least one) to certs.
476 // Otherwise returns false if the file failed to parse, or if it contains zero
477 // keys. The contents in certs would be unspecified on failure.
load_keys(const char * filename,std::vector<Certificate> & certs)478 bool load_keys(const char* filename, std::vector<Certificate>& certs) {
479     std::unique_ptr<FILE, decltype(&fclose)> f(fopen(filename, "r"), fclose);
480     if (!f) {
481         LOGE("opening %s: %s\n", filename, strerror(errno));
482         return false;
483     }
484 
485     while (true) {
486         certs.emplace_back(0, Certificate::KEY_TYPE_RSA, nullptr, nullptr);
487         Certificate& cert = certs.back();
488         uint32_t exponent = 0;
489 
490         char start_char;
491         if (fscanf(f.get(), " %c", &start_char) != 1) return false;
492         if (start_char == '{') {
493             // a version 1 key has no version specifier.
494             cert.key_type = Certificate::KEY_TYPE_RSA;
495             exponent = 3;
496             cert.hash_len = SHA_DIGEST_LENGTH;
497         } else if (start_char == 'v') {
498             int version;
499             if (fscanf(f.get(), "%d {", &version) != 1) return false;
500             switch (version) {
501                 case 2:
502                     cert.key_type = Certificate::KEY_TYPE_RSA;
503                     exponent = 65537;
504                     cert.hash_len = SHA_DIGEST_LENGTH;
505                     break;
506                 case 3:
507                     cert.key_type = Certificate::KEY_TYPE_RSA;
508                     exponent = 3;
509                     cert.hash_len = SHA256_DIGEST_LENGTH;
510                     break;
511                 case 4:
512                     cert.key_type = Certificate::KEY_TYPE_RSA;
513                     exponent = 65537;
514                     cert.hash_len = SHA256_DIGEST_LENGTH;
515                     break;
516                 case 5:
517                     cert.key_type = Certificate::KEY_TYPE_EC;
518                     cert.hash_len = SHA256_DIGEST_LENGTH;
519                     break;
520                 default:
521                     return false;
522             }
523         }
524 
525         if (cert.key_type == Certificate::KEY_TYPE_RSA) {
526             cert.rsa = parse_rsa_key(f.get(), exponent);
527             if (!cert.rsa) {
528               return false;
529             }
530 
531             LOGI("read key e=%d hash=%d\n", exponent, cert.hash_len);
532         } else if (cert.key_type == Certificate::KEY_TYPE_EC) {
533             cert.ec = parse_ec_key(f.get());
534             if (!cert.ec) {
535               return false;
536             }
537         } else {
538             LOGE("Unknown key type %d\n", cert.key_type);
539             return false;
540         }
541 
542         // if the line ends in a comma, this file has more keys.
543         int ch = fgetc(f.get());
544         if (ch == ',') {
545             // more keys to come.
546             continue;
547         } else if (ch == EOF) {
548             break;
549         } else {
550             LOGE("unexpected character between keys\n");
551             return false;
552         }
553     }
554 
555     return true;
556 }
557