@@ -176,6 +176,7 @@ def unit_tests():
176176 "cpe" : "cpe:2.3:a:wolfssl:wolfssl:5.9.1:*:*:*:*:*:*:*" ,
177177 "components" : [{
178178 "name" : "wolfcrypt" , "version" : "5.9.1" ,
179+ "purl" : "pkg:github/wolfssl/wolfssl@v5.9.1-stable#wolfcrypt" ,
179180 }],
180181 }],
181182 }, f )
@@ -185,6 +186,44 @@ def unit_tests():
185186 stdout = subprocess .DEVNULL )
186187 check (rc == 0 , "validator finds a nested dependency component" )
187188
189+ no_purl = os .path .join (d , "no-purl.cdx.json" )
190+ with open (no_purl , "w" ) as f :
191+ json .dump ({
192+ "bomFormat" : "CycloneDX" , "specVersion" : "1.6" ,
193+ "metadata" : {"component" : {"name" : "wolfboot" ,
194+ "version" : "2.9.0" ,
195+ "properties" : [{"a" : "b" }]}},
196+ "components" : [{
197+ "name" : "wolfssl" , "version" : "5.9.1" ,
198+ "cpe" : "cpe:2.3:a:wolfssl:wolfssl:5.9.1:*:*:*:*:*:*:*" ,
199+ "components" : [{
200+ "name" : "wolfcrypt" , "version" : "5.9.1" ,
201+ }],
202+ }],
203+ }, f )
204+ rc = subprocess .call ([sys .executable , VALIDATE ,
205+ "--require-dep-version" , "wolfcrypt" , no_purl ],
206+ stdout = subprocess .DEVNULL ,
207+ stderr = subprocess .DEVNULL )
208+ check (rc != 0 , "validator rejects nested wolfcrypt without a PURL" )
209+
210+ no_cpe = os .path .join (d , "no-cpe.cdx.json" )
211+ with open (no_cpe , "w" ) as f :
212+ json .dump ({
213+ "bomFormat" : "CycloneDX" , "specVersion" : "1.6" ,
214+ "metadata" : {"component" : {"name" : "wolfboot" ,
215+ "version" : "2.9.0" ,
216+ "properties" : [{"a" : "b" }]}},
217+ "components" : [{
218+ "name" : "wolfssl" , "version" : "5.9.1" ,
219+ }],
220+ }, f )
221+ rc = subprocess .call ([sys .executable , VALIDATE ,
222+ "--require-dep-version" , "wolfssl" , no_cpe ],
223+ stdout = subprocess .DEVNULL ,
224+ stderr = subprocess .DEVNULL )
225+ check (rc != 0 , "validator still requires a CPE on wolfssl" )
226+
188227
189228def find_gen_sbom (explicit ):
190229 if explicit and os .path .isfile (explicit ):
0 commit comments