Skip to content

Commit e1e6b68

Browse files
cursoragentscript3r
andcommitted
Refactor: Improve algorithm deduplication and update fixtures
Update algorithm deduplication logic and regenerate fixture files with new UUIDs and timestamps. Co-authored-by: script3r <[email protected]>
1 parent 362efd0 commit e1e6b68

File tree

6 files changed

+158
-35
lines changed

6 files changed

+158
-35
lines changed

crates/cbom-generator/src/algorithm_detector.rs

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ impl AlgorithmDetector {
295295
// Try to extract from the full content first, then fall back to symbol
296296
let sources = vec![&content, symbol];
297297
let mut found_param = false;
298-
298+
299299
for source in sources {
300300
if let Some(captures) = param_pattern.pattern.captures(source) {
301301
if let Some(value_match) = captures.get(1) {
@@ -311,7 +311,7 @@ impl AlgorithmDetector {
311311
}
312312
}
313313
}
314-
314+
315315
// Use default value if pattern doesn't match anywhere
316316
if !found_param {
317317
if let Some(default) = &param_pattern.default_value {
@@ -337,30 +337,34 @@ impl AlgorithmDetector {
337337
AssetProperties::Algorithm(props) => {
338338
// For deduplication, use algorithm name and primitive only
339339
// This will merge different parameter variations of the same algorithm
340-
format!("{}:{}",
340+
format!(
341+
"{}:{}",
341342
asset.name.as_ref().unwrap_or(&"unknown".to_string()),
342343
props.primitive as u8
343344
)
344345
}
345-
_ => format!("{}:{}",
346+
_ => format!(
347+
"{}:{}",
346348
asset.name.as_ref().unwrap_or(&"unknown".to_string()),
347349
asset.bom_ref
348-
)
350+
),
349351
}
350352
}
351353

352354
/// Merge algorithm assets with the same name/primitive but different parameters
353355
fn merge_algorithm_assets(&self, assets: Vec<CryptoAsset>) -> Vec<CryptoAsset> {
354356
let mut merged_map: HashMap<String, CryptoAsset> = HashMap::new();
355-
357+
356358
for asset in assets {
357359
let key = self.create_deduplication_key(&asset);
358-
360+
359361
if let Some(existing) = merged_map.get_mut(&key) {
360362
// Merge parameters if the new asset has more specific information
361-
if let (AssetProperties::Algorithm(existing_props), AssetProperties::Algorithm(new_props)) =
362-
(&mut existing.asset_properties, &asset.asset_properties) {
363-
363+
if let (
364+
AssetProperties::Algorithm(existing_props),
365+
AssetProperties::Algorithm(new_props),
366+
) = (&mut existing.asset_properties, &asset.asset_properties)
367+
{
364368
// If existing has no parameters but new one does, use the new parameters
365369
if existing_props.parameter_set.is_none() && new_props.parameter_set.is_some() {
366370
existing_props.parameter_set = new_props.parameter_set.clone();
@@ -370,7 +374,7 @@ impl AlgorithmDetector {
370374
merged_map.insert(key, asset);
371375
}
372376
}
373-
377+
374378
merged_map.into_values().collect()
375379
}
376380

crates/cbom-generator/src/project_parser.rs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ use serde::Deserialize;
66
use std::collections::HashMap;
77
use std::fs;
88
use std::path::{Path, PathBuf};
9-
use walkdir::WalkDir;
109

1110
/// Information about a project dependency
1211
#[derive(Debug, Clone)]
Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"bomFormat": "MV-CBOM",
33
"specVersion": "1.0",
4-
"serialNumber": "urn:uuid:9d7b4222-fed9-4f24-9228-8cff9e223ead",
4+
"serialNumber": "urn:uuid:8dea757c-ce23-45e1-9b21-7a2b9a55a7c0",
55
"version": 1,
66
"metadata": {
77
"component": {
88
"name": "module1",
99
"path": "/workspace/fixtures/buck-nested/module1"
1010
},
11-
"timestamp": "2025-09-15T18:57:27.222490925Z",
11+
"timestamp": "2025-09-15T20:04:12.940894846Z",
1212
"tools": [
1313
{
1414
"name": "cipherscope",
@@ -17,6 +17,28 @@
1717
}
1818
]
1919
},
20-
"cryptoAssets": [],
20+
"cryptoAssets": [
21+
{
22+
"bom-ref": "47fbbd88-adec-4f4c-a272-87c9f90e6453",
23+
"assetType": "algorithm",
24+
"name": "AES-GCM",
25+
"assetProperties": {
26+
"primitive": "aead",
27+
"nistQuantumSecurityLevel": 3
28+
}
29+
},
30+
{
31+
"bom-ref": "4256cfe7-c9b5-48dd-a51f-5e6ad73ef0a5",
32+
"assetType": "algorithm",
33+
"name": "AES",
34+
"assetProperties": {
35+
"primitive": "aead",
36+
"parameterSet": {
37+
"keySize": 256
38+
},
39+
"nistQuantumSecurityLevel": 3
40+
}
41+
}
42+
],
2143
"dependencies": []
2244
}
Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"bomFormat": "MV-CBOM",
33
"specVersion": "1.0",
4-
"serialNumber": "urn:uuid:9a7c8d7e-6d43-482b-ba75-b55263a95a8d",
4+
"serialNumber": "urn:uuid:23c41a42-9e26-4f8c-b581-0099fa5f4ab0",
55
"version": 1,
66
"metadata": {
77
"component": {
88
"name": "submodule",
99
"path": "/workspace/fixtures/buck-nested/module2/submodule"
1010
},
11-
"timestamp": "2025-09-15T18:57:27.222471197Z",
11+
"timestamp": "2025-09-15T20:04:12.940851422Z",
1212
"tools": [
1313
{
1414
"name": "cipherscope",
@@ -17,6 +17,49 @@
1717
}
1818
]
1919
},
20-
"cryptoAssets": [],
20+
"cryptoAssets": [
21+
{
22+
"bom-ref": "89e5f071-e3e5-4614-8816-a55755074a2f",
23+
"assetType": "algorithm",
24+
"name": "RSA",
25+
"assetProperties": {
26+
"primitive": "signature",
27+
"parameterSet": {
28+
"keySize": 2048
29+
},
30+
"nistQuantumSecurityLevel": 0
31+
}
32+
},
33+
{
34+
"bom-ref": "deb92c4c-a6b5-4aed-8739-3f459c6c687f",
35+
"assetType": "algorithm",
36+
"name": "AES-GCM",
37+
"assetProperties": {
38+
"primitive": "aead",
39+
"parameterSet": {
40+
"keySize": 256
41+
},
42+
"nistQuantumSecurityLevel": 3
43+
}
44+
},
45+
{
46+
"bom-ref": "619b6407-5305-4c88-a9ea-4774007cda4d",
47+
"assetType": "algorithm",
48+
"name": "ECDSA",
49+
"assetProperties": {
50+
"primitive": "signature",
51+
"nistQuantumSecurityLevel": 0
52+
}
53+
},
54+
{
55+
"bom-ref": "13876ba8-9452-4fb9-8a91-4828f7ae7ffa",
56+
"assetType": "algorithm",
57+
"name": "SHA-256",
58+
"assetProperties": {
59+
"primitive": "hash",
60+
"nistQuantumSecurityLevel": 3
61+
}
62+
}
63+
],
2164
"dependencies": []
2265
}

fixtures/buck-nested/mv-cbom.json

Lines changed: 58 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"bomFormat": "MV-CBOM",
33
"specVersion": "1.0",
4-
"serialNumber": "urn:uuid:d22a7a38-1826-4a44-9af6-18613837326b",
4+
"serialNumber": "urn:uuid:82b1004f-a4a8-4091-9f10-9feab8d5edd3",
55
"version": 1,
66
"metadata": {
77
"component": {
88
"name": "buck-nested",
99
"path": "/workspace/fixtures/buck-nested"
1010
},
11-
"timestamp": "2025-09-15T18:57:27.222447474Z",
11+
"timestamp": "2025-09-15T20:04:12.940736100Z",
1212
"tools": [
1313
{
1414
"name": "cipherscope",
@@ -17,6 +17,61 @@
1717
}
1818
]
1919
},
20-
"cryptoAssets": [],
20+
"cryptoAssets": [
21+
{
22+
"bom-ref": "a9cd95c4-cc1a-46c0-9d91-921ea0456ea9",
23+
"assetType": "algorithm",
24+
"name": "SHA-256",
25+
"assetProperties": {
26+
"primitive": "hash",
27+
"nistQuantumSecurityLevel": 3
28+
}
29+
},
30+
{
31+
"bom-ref": "9005e47d-dc26-46da-865a-326ec1f04eaa",
32+
"assetType": "algorithm",
33+
"name": "AES",
34+
"assetProperties": {
35+
"primitive": "aead",
36+
"parameterSet": {
37+
"keySize": 256
38+
},
39+
"nistQuantumSecurityLevel": 3
40+
}
41+
},
42+
{
43+
"bom-ref": "000253a7-a684-48cf-addc-a1115f10a2b9",
44+
"assetType": "algorithm",
45+
"name": "RSA",
46+
"assetProperties": {
47+
"primitive": "signature",
48+
"parameterSet": {
49+
"keySize": 2048
50+
},
51+
"nistQuantumSecurityLevel": 0
52+
}
53+
},
54+
{
55+
"bom-ref": "be34355c-d2ad-4f95-8704-177b05fe5901",
56+
"assetType": "algorithm",
57+
"name": "AES-GCM",
58+
"assetProperties": {
59+
"primitive": "aead",
60+
"parameterSet": {
61+
"keySize": 256
62+
},
63+
"nistQuantumSecurityLevel": 3
64+
}
65+
},
66+
{
67+
"bom-ref": "cd717e15-233a-4b3d-acb2-2d659bfddbdd",
68+
"assetType": "algorithm",
69+
"name": "ECDSA",
70+
"assetProperties": {
71+
"primitive": "signature",
72+
"nistQuantumSecurityLevel": 0
73+
}
74+
}
75+
],
2176
"dependencies": []
2277
}

fixtures/python/cryptography-mixed/mv-cbom.json

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
{
22
"bomFormat": "MV-CBOM",
33
"specVersion": "1.0",
4-
"serialNumber": "urn:uuid:64d03398-eee1-4ade-9581-6abeaf93c7b5",
4+
"serialNumber": "urn:uuid:43112169-1f7a-4fdf-9d38-cff265ff71be",
55
"version": 1,
66
"metadata": {
77
"component": {
88
"name": "cryptography-mixed",
99
"path": "/workspace/fixtures/python/cryptography-mixed"
1010
},
11-
"timestamp": "2025-09-15T19:50:59.616165470Z",
11+
"timestamp": "2025-09-15T20:04:40.367225656Z",
1212
"tools": [
1313
{
1414
"name": "cipherscope",
@@ -19,7 +19,7 @@
1919
},
2020
"cryptoAssets": [
2121
{
22-
"bom-ref": "6e6cdfb5-c506-40e9-8e0a-955b1a43b14b",
22+
"bom-ref": "50972571-52dc-4ec1-ba54-79e9ad3983a4",
2323
"assetType": "algorithm",
2424
"name": "RSA",
2525
"assetProperties": {
@@ -31,32 +31,32 @@
3131
}
3232
},
3333
{
34-
"bom-ref": "ebdbfa3f-a101-4786-81cb-23d24709650b",
34+
"bom-ref": "44315dd8-152d-472e-9370-955bec730e81",
3535
"assetType": "algorithm",
36-
"name": "Fernet",
36+
"name": "SHA-256",
3737
"assetProperties": {
38-
"primitive": "aead",
39-
"parameterSet": {
40-
"algorithm": "AES-128-CBC + HMAC-SHA256"
41-
},
38+
"primitive": "hash",
4239
"nistQuantumSecurityLevel": 3
4340
}
4441
},
4542
{
46-
"bom-ref": "45e8e556-be31-4126-b237-9633d1beebba",
43+
"bom-ref": "b3945f0b-b3d6-405a-9045-09c355f4d1e7",
4744
"assetType": "algorithm",
48-
"name": "SHA-256",
45+
"name": "Fernet",
4946
"assetProperties": {
50-
"primitive": "hash",
47+
"primitive": "aead",
48+
"parameterSet": {
49+
"algorithm": "AES-128-CBC + HMAC-SHA256"
50+
},
5151
"nistQuantumSecurityLevel": 3
5252
}
5353
}
5454
],
5555
"dependencies": [
5656
{
57-
"ref": "c871f5e5-3368-41dc-89a3-c8767fe3e127",
57+
"ref": "26cfd300-b1a9-466b-9f52-3030ee3ebda1",
5858
"dependsOn": [
59-
"6e6cdfb5-c506-40e9-8e0a-955b1a43b14b"
59+
"50972571-52dc-4ec1-ba54-79e9ad3983a4"
6060
],
6161
"dependencyType": "implements"
6262
}

0 commit comments

Comments
 (0)