KiCad PCB EDA Suite
Loading...
Searching...
No Matches
test_remote_symbol_download_security.cpp
Go to the documentation of this file.
1/*
2 * This program source code file is part of KiCad, a free EDA CAD application.
3 *
4 * Copyright The KiCad Developers, see AUTHORS.txt for contributors.
5 *
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License as published by the
8 * Free Software Foundation; either version 3 of the License, or (at your
9 * option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License along
17 * with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#include <boost/test/unit_test.hpp>
21
24
25
26namespace
27{
29{
31 metadata.api_base_url = wxString( "https://provider.example.test/api" );
32 metadata.panel_url = wxString( "https://provider.example.test/app" );
33 metadata.max_download_bytes = 4096;
34 return metadata;
35}
36
37
39{
41 asset.asset_type = wxString( "symbol" );
42 asset.name = wxString( "test.kicad_sym" );
43 asset.content_type = wxString( "application/x-kicad-symbol" );
44 asset.size_bytes = 5;
45 asset.sha256 = wxString( "5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5" );
46 asset.download_url = wxString( "https://provider.example.test/downloads/test.kicad_sym" );
47 asset.required = true;
48 asset.target_library = wxString( "Device" );
49 asset.target_name = wxString( "R" );
50 return asset;
51}
52} // namespace
53
54
55BOOST_AUTO_TEST_SUITE( RemoteSymbolDownloadSecurityTests )
56
57BOOST_AUTO_TEST_CASE( DigestMismatchRejected )
58{
60 [&]( const wxString& aUrl, REMOTE_SYMBOL_FETCH_RESPONSE& aResponse, wxString& aError )
61 {
62 wxUnusedVar( aUrl );
63 wxUnusedVar( aError );
64 aResponse.status_code = 200;
65 aResponse.content_type = wxString( "application/x-kicad-symbol" );
66 aResponse.payload = { 'b', 'a', 'd', 'd', '!' };
67 return true;
68 } );
69
71 wxString error;
72 BOOST_CHECK( !manager.DownloadAndVerify( provider(), baseAsset(), 10, fetched, error ) );
73 BOOST_CHECK( error.Contains( wxString( "digest" ) ) );
74}
75
76BOOST_AUTO_TEST_CASE( SizeMismatchRejected )
77{
79 [&]( const wxString& aUrl, REMOTE_SYMBOL_FETCH_RESPONSE& aResponse, wxString& aError )
80 {
81 wxUnusedVar( aUrl );
82 wxUnusedVar( aError );
83 aResponse.status_code = 200;
84 aResponse.content_type = wxString( "application/x-kicad-symbol" );
85 aResponse.payload = { '1', '2', '3', '4' };
86 return true;
87 } );
88
90 wxString error;
91 BOOST_CHECK( !manager.DownloadAndVerify( provider(), baseAsset(), 10, fetched, error ) );
92 BOOST_CHECK( error.Contains( wxString( "size" ) ) );
93}
94
95BOOST_AUTO_TEST_CASE( ContentTypeMismatchRejected )
96{
98 [&]( const wxString& aUrl, REMOTE_SYMBOL_FETCH_RESPONSE& aResponse, wxString& aError )
99 {
100 wxUnusedVar( aUrl );
101 wxUnusedVar( aError );
102 aResponse.status_code = 200;
103 aResponse.content_type = wxString( "text/plain" );
104 aResponse.payload = { '1', '2', '3', '4', '5' };
105 return true;
106 } );
107
109 wxString error;
110 BOOST_CHECK( !manager.DownloadAndVerify( provider(), baseAsset(), 10, fetched, error ) );
111 BOOST_CHECK( error.Contains( wxString( "content type" ) ) );
112}
113
114BOOST_AUTO_TEST_CASE( OversizeAssetRejectedBeforeImport )
115{
116 REMOTE_PROVIDER_PART_ASSET asset = baseAsset();
117 asset.size_bytes = 32;
118
120 [&]( const wxString& aUrl, REMOTE_SYMBOL_FETCH_RESPONSE& aResponse, wxString& aError )
121 {
122 wxUnusedVar( aUrl );
123 wxUnusedVar( aError );
124 aResponse.status_code = 200;
125 aResponse.content_type = wxString( "application/x-kicad-symbol" );
126 aResponse.payload = std::vector<uint8_t>( 32, 'x' );
127 return true;
128 } );
129
131 wxString error;
132 BOOST_CHECK( !manager.DownloadAndVerify( provider(), asset, 16, fetched, error ) );
133 BOOST_CHECK( error.Contains( wxString( "limit" ) ) );
134}
135
136BOOST_AUTO_TEST_CASE( UrlBasedAssetsRequireDigest )
137{
138 REMOTE_PROVIDER_PART_ASSET asset = baseAsset();
139 asset.sha256.clear();
140
142 [&]( const wxString& aUrl, REMOTE_SYMBOL_FETCH_RESPONSE& aResponse, wxString& aError )
143 {
144 wxUnusedVar( aUrl );
145 wxUnusedVar( aResponse );
146 wxUnusedVar( aError );
147 return true;
148 } );
149
151 wxString error;
152 BOOST_CHECK( !manager.DownloadAndVerify( provider(), asset, 10, fetched, error ) );
153 BOOST_CHECK( error.Contains( wxString( "sha256" ) ) );
154}
155
156BOOST_AUTO_TEST_CASE( UrlBasedAssetsMustStayOnProviderOrigin )
157{
158 REMOTE_PROVIDER_PART_ASSET asset = baseAsset();
159 asset.download_url = wxString( "https://evil.example.test/downloads/test.kicad_sym" );
160
162 [&]( const wxString& aUrl, REMOTE_SYMBOL_FETCH_RESPONSE& aResponse, wxString& aError )
163 {
164 wxUnusedVar( aUrl );
165 wxUnusedVar( aResponse );
166 wxUnusedVar( aError );
167 return true;
168 } );
169
171 wxString error;
172 BOOST_CHECK( !manager.DownloadAndVerify( provider(), asset, 10, fetched, error ) );
173 BOOST_CHECK( error.Contains( wxString( "origin" ) ) );
174}
175
BOOST_AUTO_TEST_CASE(HorizontalAlignment)
BOOST_AUTO_TEST_SUITE(CadstarPartParser)
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(DigestMismatchRejected)