| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 1 | # | 
|  | 2 | # Copyright (C) 2019 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 | import os | 
|  | 18 | import os.path | 
|  | 19 |  | 
|  | 20 | import apex_utils | 
|  | 21 | import common | 
|  | 22 | import test_utils | 
|  | 23 |  | 
|  | 24 |  | 
|  | 25 | class ApexUtilsTest(test_utils.ReleaseToolsTestCase): | 
|  | 26 |  | 
|  | 27 | # echo "foo" | sha256sum | 
|  | 28 | SALT = 'b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c' | 
|  | 29 |  | 
|  | 30 | def setUp(self): | 
|  | 31 | self.testdata_dir = test_utils.get_testdata_dir() | 
|  | 32 | # The default payload signing key. | 
|  | 33 | self.payload_key = os.path.join(self.testdata_dir, 'testkey.key') | 
|  | 34 |  | 
|  | 35 | @staticmethod | 
|  | 36 | def _GetTestPayload(): | 
|  | 37 | payload_file = common.MakeTempFile(prefix='apex-', suffix='.img') | 
|  | 38 | with open(payload_file, 'wb') as payload_fp: | 
|  | 39 | payload_fp.write(os.urandom(8192)) | 
|  | 40 | return payload_file | 
|  | 41 |  | 
| Tao Bao | 82490d3 | 2019-04-09 00:12:30 -0700 | [diff] [blame] | 42 | @test_utils.SkipIfExternalToolsUnavailable() | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 43 | def test_ParseApexPayloadInfo(self): | 
|  | 44 | payload_file = self._GetTestPayload() | 
|  | 45 | apex_utils.SignApexPayload( | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 46 | 'avbtool', payload_file, self.payload_key, 'testkey', 'SHA256_RSA2048', | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 47 | self.SALT, no_hashtree=True) | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 48 | payload_info = apex_utils.ParseApexPayloadInfo('avbtool', payload_file) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 49 | self.assertEqual('SHA256_RSA2048', payload_info['Algorithm']) | 
|  | 50 | self.assertEqual(self.SALT, payload_info['Salt']) | 
|  | 51 | self.assertEqual('testkey', payload_info['apex.key']) | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 52 | self.assertEqual('0 bytes', payload_info['Tree Size']) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 53 |  | 
| Tao Bao | 82490d3 | 2019-04-09 00:12:30 -0700 | [diff] [blame] | 54 | @test_utils.SkipIfExternalToolsUnavailable() | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 55 | def test_SignApexPayload(self): | 
|  | 56 | payload_file = self._GetTestPayload() | 
|  | 57 | apex_utils.SignApexPayload( | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 58 | 'avbtool', payload_file, self.payload_key, 'testkey', 'SHA256_RSA2048', | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 59 | self.SALT, no_hashtree=True) | 
|  | 60 | apex_utils.VerifyApexPayload( | 
|  | 61 | 'avbtool', payload_file, self.payload_key, True) | 
|  | 62 |  | 
|  | 63 | @test_utils.SkipIfExternalToolsUnavailable() | 
|  | 64 | def test_SignApexPayload_withHashtree(self): | 
|  | 65 | payload_file = self._GetTestPayload() | 
|  | 66 | apex_utils.SignApexPayload( | 
|  | 67 | 'avbtool', payload_file, self.payload_key, 'testkey', 'SHA256_RSA2048', | 
|  | 68 | self.SALT, no_hashtree=False) | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 69 | apex_utils.VerifyApexPayload('avbtool', payload_file, self.payload_key) | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 70 | payload_info = apex_utils.ParseApexPayloadInfo('avbtool', payload_file) | 
|  | 71 | self.assertEqual('4096 bytes', payload_info['Tree Size']) | 
|  | 72 |  | 
|  | 73 | @test_utils.SkipIfExternalToolsUnavailable() | 
|  | 74 | def test_SignApexPayload_noHashtree(self): | 
|  | 75 | payload_file = self._GetTestPayload() | 
|  | 76 | apex_utils.SignApexPayload( | 
|  | 77 | 'avbtool', payload_file, self.payload_key, 'testkey', 'SHA256_RSA2048', | 
|  | 78 | self.SALT, no_hashtree=True) | 
|  | 79 | apex_utils.VerifyApexPayload('avbtool', payload_file, self.payload_key, | 
|  | 80 | no_hashtree=True) | 
|  | 81 | payload_info = apex_utils.ParseApexPayloadInfo('avbtool', payload_file) | 
|  | 82 | self.assertEqual('0 bytes', payload_info['Tree Size']) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 83 |  | 
| Tao Bao | 82490d3 | 2019-04-09 00:12:30 -0700 | [diff] [blame] | 84 | @test_utils.SkipIfExternalToolsUnavailable() | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 85 | def test_SignApexPayload_withSignerHelper(self): | 
|  | 86 | payload_file = self._GetTestPayload() | 
| Tao Bao | 30e3114 | 2019-04-09 00:12:30 -0700 | [diff] [blame] | 87 | signing_helper = os.path.join(self.testdata_dir, 'signing_helper.sh') | 
|  | 88 | os.chmod(signing_helper, 0o700) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 89 | payload_signer_args = '--signing_helper_with_files {}'.format( | 
| Tao Bao | 30e3114 | 2019-04-09 00:12:30 -0700 | [diff] [blame] | 90 | signing_helper) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 91 | apex_utils.SignApexPayload( | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 92 | 'avbtool', | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 93 | payload_file, | 
|  | 94 | self.payload_key, | 
|  | 95 | 'testkey', 'SHA256_RSA2048', self.SALT, | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 96 | True, | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 97 | payload_signer_args) | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 98 | apex_utils.VerifyApexPayload( | 
|  | 99 | 'avbtool', payload_file, self.payload_key, True) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 100 |  | 
| Tao Bao | 82490d3 | 2019-04-09 00:12:30 -0700 | [diff] [blame] | 101 | @test_utils.SkipIfExternalToolsUnavailable() | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 102 | def test_SignApexPayload_invalidKey(self): | 
|  | 103 | self.assertRaises( | 
|  | 104 | apex_utils.ApexSigningError, | 
|  | 105 | apex_utils.SignApexPayload, | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 106 | 'avbtool', | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 107 | self._GetTestPayload(), | 
|  | 108 | os.path.join(self.testdata_dir, 'testkey.x509.pem'), | 
|  | 109 | 'testkey', | 
|  | 110 | 'SHA256_RSA2048', | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 111 | self.SALT, | 
|  | 112 | no_hashtree=True) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 113 |  | 
| Tao Bao | 82490d3 | 2019-04-09 00:12:30 -0700 | [diff] [blame] | 114 | @test_utils.SkipIfExternalToolsUnavailable() | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 115 | def test_VerifyApexPayload_wrongKey(self): | 
|  | 116 | payload_file = self._GetTestPayload() | 
|  | 117 | apex_utils.SignApexPayload( | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 118 | 'avbtool', payload_file, self.payload_key, 'testkey', 'SHA256_RSA2048', | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 119 | self.SALT, True) | 
|  | 120 | apex_utils.VerifyApexPayload( | 
|  | 121 | 'avbtool', payload_file, self.payload_key, True) | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 122 | self.assertRaises( | 
|  | 123 | apex_utils.ApexSigningError, | 
|  | 124 | apex_utils.VerifyApexPayload, | 
| Tao Bao | 1ac886e | 2019-06-26 11:58:22 -0700 | [diff] [blame] | 125 | 'avbtool', | 
| Tao Bao | 1cd59f2 | 2019-03-15 15:13:01 -0700 | [diff] [blame] | 126 | payload_file, | 
| Tao Bao | 448004a | 2019-09-19 07:55:02 -0700 | [diff] [blame] | 127 | os.path.join(self.testdata_dir, 'testkey_with_passwd.key'), | 
|  | 128 | no_hashtree=True) |