scanoss 0.15.6 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/CHANGELOG.md +53 -87
  2. package/LICENSE +20 -20
  3. package/README.md +75 -3
  4. package/assets/ReportHTMLTemplate/index.html +11 -8
  5. package/assets/data/scanoss-crypto-library-rules.json +2930 -0
  6. package/build/main/cli/bin/cli-bin.js +6 -2
  7. package/build/main/cli/commands/crypto.js +14 -7
  8. package/build/main/cli/commands/scan.js +68 -25
  9. package/build/main/sdk/Cryptography/Algorithm/Components/ComponentAlgorithmScanner.d.ts +19 -0
  10. package/build/main/sdk/Cryptography/Algorithm/Components/ComponentAlgorithmScanner.js +27 -0
  11. package/build/main/sdk/Cryptography/Algorithm/Files/AlgorithmProcessor.d.ts +1 -0
  12. package/build/main/sdk/Cryptography/Algorithm/Files/AlgorithmProcessor.js +39 -0
  13. package/build/main/sdk/Cryptography/Algorithm/Files/FileAlgorithmScanner.d.ts +42 -0
  14. package/build/main/sdk/Cryptography/Algorithm/Files/FileAlgorithmScanner.js +87 -0
  15. package/build/main/sdk/Cryptography/{CryptoDef/CryptoDef.d.ts → Algorithm/Files/Helper/Helper.d.ts} +1 -1
  16. package/build/main/sdk/Cryptography/{CryptoDef/CryptoDef.js → Algorithm/Files/Helper/Helper.js} +1 -1
  17. package/build/main/sdk/Cryptography/{Scanneable → Algorithm/Files/Scanneable}/CryptoItem.d.ts +2 -2
  18. package/build/main/sdk/Cryptography/{Scanneable → Algorithm/Files/Scanneable}/CryptoItem.js +1 -1
  19. package/build/main/sdk/Cryptography/BaseCryptographyScanner.d.ts +25 -0
  20. package/build/main/sdk/Cryptography/BaseCryptographyScanner.js +23 -0
  21. package/build/main/sdk/Cryptography/CryptoCfg.d.ts +32 -5
  22. package/build/main/sdk/Cryptography/CryptoCfg.js +35 -5
  23. package/build/main/sdk/Cryptography/CryptographyScanner.d.ts +15 -21
  24. package/build/main/sdk/Cryptography/CryptographyScanner.js +31 -41
  25. package/build/main/sdk/Cryptography/CryptographyTypes.d.ts +47 -3
  26. package/build/main/sdk/Cryptography/Helper/ResultCollector/Component/ComponentCryptographyResultColletor.d.ts +32 -0
  27. package/build/main/sdk/Cryptography/Helper/ResultCollector/Component/ComponentCryptographyResultColletor.js +66 -0
  28. package/build/main/sdk/Cryptography/Helper/ResultCollector/File/FileCryptographyResultCollector.d.ts +36 -0
  29. package/build/main/sdk/Cryptography/Helper/ResultCollector/File/FileCryptographyResultCollector.js +65 -0
  30. package/build/main/sdk/Cryptography/Hint/Components/ComponentHintScanner.d.ts +19 -0
  31. package/build/main/sdk/Cryptography/Hint/Components/ComponentHintScanner.js +27 -0
  32. package/build/main/sdk/Cryptography/Hint/Files/FileHintScanner.d.ts +35 -0
  33. package/build/main/sdk/Cryptography/Hint/Files/FileHintScanner.js +69 -0
  34. package/build/main/sdk/Cryptography/Hint/Files/HintProcessor.d.ts +1 -0
  35. package/build/main/sdk/Cryptography/Hint/Files/HintProcessor.js +34 -0
  36. package/build/main/sdk/Filtering/Filtering.js +1 -2
  37. package/build/main/sdk/Logger.d.ts +2 -0
  38. package/build/main/sdk/Logger.js +7 -2
  39. package/build/main/sdk/Report/DataLayer/DataLayerTypes.d.ts +8 -4
  40. package/build/main/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.d.ts +7 -7
  41. package/build/main/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.js +71 -11
  42. package/build/main/sdk/Services/Grpc/BaseService.js +1 -1
  43. package/build/main/sdk/Services/Grpc/CryptographyService.d.ts +3 -0
  44. package/build/main/sdk/Services/Grpc/CryptographyService.js +16 -1
  45. package/build/main/sdk/Services/Grpc/scanoss/api/cryptography/v2/scanoss-cryptography_grpc_pb.d.ts +72 -0
  46. package/build/main/sdk/Services/Grpc/scanoss/api/cryptography/v2/scanoss-cryptography_grpc_pb.js +87 -3
  47. package/build/main/sdk/Services/Grpc/scanoss/api/cryptography/v2/scanoss-cryptography_pb.js +1987 -127
  48. package/build/main/sdk/Utils/Concurrency/Job.d.ts +8 -0
  49. package/build/main/sdk/Utils/Concurrency/Job.js +17 -0
  50. package/build/main/sdk/Utils/Concurrency/JobProcessor.d.ts +10 -0
  51. package/build/main/sdk/Utils/Concurrency/JobProcessor.js +51 -0
  52. package/build/main/sdk/Utils/Concurrency/WorkerPool.d.ts +14 -0
  53. package/build/main/sdk/Utils/Concurrency/WorkerPool.js +69 -0
  54. package/build/main/sdk/Utils/Concurrency/types.d.ts +18 -0
  55. package/build/main/sdk/Utils/Concurrency/types.js +3 -0
  56. package/build/main/sdk/scanner/Scanner.d.ts +1 -1
  57. package/build/main/sdk/scanner/Scanner.js +16 -6
  58. package/build/main/sdk/scanner/ScannerTypes.js +1 -1
  59. package/build/main/tsconfig.tsbuildinfo +1 -1
  60. package/build/module/cli/bin/cli-bin.js +6 -2
  61. package/build/module/cli/commands/crypto.js +14 -7
  62. package/build/module/cli/commands/scan.js +89 -46
  63. package/build/module/sdk/Cryptography/Algorithm/Components/ComponentAlgorithmScanner.d.ts +19 -0
  64. package/build/module/sdk/Cryptography/Algorithm/Components/ComponentAlgorithmScanner.js +23 -0
  65. package/build/module/sdk/Cryptography/Algorithm/Files/AlgorithmProcessor.d.ts +1 -0
  66. package/build/module/sdk/Cryptography/Algorithm/Files/AlgorithmProcessor.js +36 -0
  67. package/build/module/sdk/Cryptography/Algorithm/Files/FileAlgorithmScanner.d.ts +42 -0
  68. package/build/module/sdk/Cryptography/Algorithm/Files/FileAlgorithmScanner.js +80 -0
  69. package/build/module/sdk/Cryptography/{CryptoDef/CryptoDef.d.ts → Algorithm/Files/Helper/Helper.d.ts} +1 -1
  70. package/build/module/sdk/Cryptography/{CryptoDef/CryptoDef.js → Algorithm/Files/Helper/Helper.js} +1 -1
  71. package/build/module/sdk/Cryptography/{Scanneable → Algorithm/Files/Scanneable}/CryptoItem.d.ts +2 -2
  72. package/build/module/sdk/Cryptography/{Scanneable → Algorithm/Files/Scanneable}/CryptoItem.js +1 -1
  73. package/build/module/sdk/Cryptography/BaseCryptographyScanner.d.ts +25 -0
  74. package/build/module/sdk/Cryptography/BaseCryptographyScanner.js +21 -0
  75. package/build/module/sdk/Cryptography/CryptoCfg.d.ts +32 -5
  76. package/build/module/sdk/Cryptography/CryptoCfg.js +39 -6
  77. package/build/module/sdk/Cryptography/CryptographyScanner.d.ts +15 -21
  78. package/build/module/sdk/Cryptography/CryptographyScanner.js +32 -39
  79. package/build/module/sdk/Cryptography/CryptographyTypes.d.ts +47 -3
  80. package/build/module/sdk/Cryptography/Helper/ResultCollector/Component/ComponentCryptographyResultColletor.d.ts +32 -0
  81. package/build/module/sdk/Cryptography/Helper/ResultCollector/Component/ComponentCryptographyResultColletor.js +60 -0
  82. package/build/module/sdk/Cryptography/Helper/ResultCollector/File/FileCryptographyResultCollector.d.ts +36 -0
  83. package/build/module/sdk/Cryptography/Helper/ResultCollector/File/FileCryptographyResultCollector.js +59 -0
  84. package/build/module/sdk/Cryptography/Hint/Components/ComponentHintScanner.d.ts +19 -0
  85. package/build/module/sdk/Cryptography/Hint/Components/ComponentHintScanner.js +23 -0
  86. package/build/module/sdk/Cryptography/Hint/Files/FileHintScanner.d.ts +35 -0
  87. package/build/module/sdk/Cryptography/Hint/Files/FileHintScanner.js +62 -0
  88. package/build/module/sdk/Cryptography/Hint/Files/HintProcessor.d.ts +1 -0
  89. package/build/module/sdk/Cryptography/Hint/Files/HintProcessor.js +31 -0
  90. package/build/module/sdk/Filtering/Filtering.js +1 -2
  91. package/build/module/sdk/Logger.d.ts +2 -0
  92. package/build/module/sdk/Logger.js +8 -2
  93. package/build/module/sdk/Report/DataLayer/DataLayerTypes.d.ts +8 -4
  94. package/build/module/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.d.ts +7 -7
  95. package/build/module/sdk/Report/DataLayer/DataProviders/CryptographyDataProvider.js +73 -14
  96. package/build/module/sdk/Services/Grpc/BaseService.js +1 -1
  97. package/build/module/sdk/Services/Grpc/CryptographyService.d.ts +3 -0
  98. package/build/module/sdk/Services/Grpc/CryptographyService.js +16 -1
  99. package/build/module/sdk/Services/Grpc/scanoss/api/cryptography/v2/scanoss-cryptography_grpc_pb.d.ts +72 -0
  100. package/build/module/sdk/Services/Grpc/scanoss/api/cryptography/v2/scanoss-cryptography_grpc_pb.js +87 -3
  101. package/build/module/sdk/Services/Grpc/scanoss/api/cryptography/v2/scanoss-cryptography_pb.js +1987 -127
  102. package/build/module/sdk/Utils/Concurrency/Job.d.ts +8 -0
  103. package/build/module/sdk/Utils/Concurrency/Job.js +14 -0
  104. package/build/module/sdk/Utils/Concurrency/JobProcessor.d.ts +10 -0
  105. package/build/module/sdk/Utils/Concurrency/JobProcessor.js +47 -0
  106. package/build/module/sdk/Utils/Concurrency/WorkerPool.d.ts +14 -0
  107. package/build/module/sdk/Utils/Concurrency/WorkerPool.js +65 -0
  108. package/build/module/sdk/Utils/Concurrency/types.d.ts +18 -0
  109. package/build/module/sdk/Utils/Concurrency/types.js +2 -0
  110. package/build/module/sdk/scanner/Scanner.d.ts +1 -1
  111. package/build/module/sdk/scanner/Scanner.js +16 -7
  112. package/build/module/sdk/scanner/ScannerTypes.js +1 -1
  113. package/build/module/tsconfig.module.tsbuildinfo +1 -1
  114. package/package.json +1 -1
  115. package/build/main/sdk/Cryptography/CryptoProvider/LocalCrypto.d.ts +0 -21
  116. package/build/main/sdk/Cryptography/CryptoProvider/LocalCrypto.js +0 -37
  117. package/build/main/sdk/Cryptography/Worker/ThreadPool.d.ts +0 -21
  118. package/build/main/sdk/Cryptography/Worker/ThreadPool.js +0 -87
  119. package/build/main/sdk/Cryptography/Worker/Worker.d.ts +0 -15
  120. package/build/main/sdk/Cryptography/Worker/Worker.js +0 -69
  121. package/build/main/sdk/Cryptography/utils/adapters/cryptoAdapters.d.ts +0 -8
  122. package/build/main/sdk/Cryptography/utils/adapters/cryptoAdapters.js +0 -15
  123. package/build/module/sdk/Cryptography/CryptoProvider/LocalCrypto.d.ts +0 -21
  124. package/build/module/sdk/Cryptography/CryptoProvider/LocalCrypto.js +0 -36
  125. package/build/module/sdk/Cryptography/Worker/ThreadPool.d.ts +0 -21
  126. package/build/module/sdk/Cryptography/Worker/ThreadPool.js +0 -89
  127. package/build/module/sdk/Cryptography/Worker/Worker.d.ts +0 -15
  128. package/build/module/sdk/Cryptography/Worker/Worker.js +0 -66
  129. package/build/module/sdk/Cryptography/utils/adapters/cryptoAdapters.d.ts +0 -8
  130. package/build/module/sdk/Cryptography/utils/adapters/cryptoAdapters.js +0 -12
  131. /package/assets/data/{defaultCryptoRules.json → scanoss-crypto-algorithm-rules.json} +0 -0
@@ -1,26 +1,29 @@
1
- import fs from 'fs';
2
- import { Scanner } from '../../sdk/scanner/Scanner';
3
- import { SbomMode, ScannerEvents, WinnowingMode, } from '../../sdk/scanner/ScannerTypes';
4
- import { ScannerCfg } from '../../sdk/scanner/ScannerCfg';
5
- import { Tree } from '../../sdk/tree/Tree';
6
- import cliProgress from 'cli-progress';
1
+ import fs from "fs";
2
+ import { Scanner } from "../../sdk/scanner/Scanner";
3
+ import { SbomMode, ScannerEvents, WinnowingMode } from "../../sdk/scanner/ScannerTypes";
4
+ import { ScannerCfg } from "../../sdk/scanner/ScannerCfg";
5
+ import { Tree } from "../../sdk/tree/Tree";
6
+ import cliProgress from "cli-progress";
7
7
  import { getProjectNameFromPath, getSettingsFilePath, isFolder } from "./helpers";
8
- import { DependencyScannerCfg } from '../../sdk/Dependencies/DependencyScannerCfg';
9
- import { DependencyScanner } from '../../sdk/Dependencies/DependencyScanner';
10
- import { ScanFilter } from '../../sdk/tree/Filters/ScanFilter';
11
- import { DependencyFilter } from '../../sdk/tree/Filters/DependencyFilter';
12
- import { Report } from '../../sdk/Report/Report';
13
- import { DataProviderManager } from '../../sdk/Report/DataLayer/DataProviderManager';
14
- import { ComponentDataProvider } from '../../sdk/Report/DataLayer/DataProviders/ComponentDataProvider';
15
- import { DependencyDataProvider } from '../../sdk/Report/DataLayer/DataProviders/DependencyDataProvider';
16
- import { LicenseDataProvider } from '../../sdk/Report/DataLayer/DataProviders/LicenseDataProvider';
17
- import { SummaryDataProvider } from '../../sdk/Report/DataLayer/DataProviders/SummaryDataProvider';
18
- import { DecompressionFilter } from '../../sdk/tree/Filters/DecompressionFilter';
19
- import { DecompressionManager } from '../../sdk/Decompress/DecompressionManager';
20
- import path from 'path';
21
- import { LicenseObligationDataProvider } from '../../sdk/Report/DataLayer/DataProviders/LicenseObligationDataProvider';
22
- import { CryptographyDataProvider } from '../../sdk/Report/DataLayer/DataProviders/CryptographyDataProvider';
8
+ import { DependencyScannerCfg } from "../../sdk/Dependencies/DependencyScannerCfg";
9
+ import { DependencyScanner } from "../../sdk/Dependencies/DependencyScanner";
10
+ import { ScanFilter } from "../../sdk/tree/Filters/ScanFilter";
11
+ import { DependencyFilter } from "../../sdk/tree/Filters/DependencyFilter";
12
+ import { Report } from "../../sdk/Report/Report";
13
+ import { DataProviderManager } from "../../sdk/Report/DataLayer/DataProviderManager";
14
+ import { ComponentDataProvider } from "../../sdk/Report/DataLayer/DataProviders/ComponentDataProvider";
15
+ import { DependencyDataProvider } from "../../sdk/Report/DataLayer/DataProviders/DependencyDataProvider";
16
+ import { LicenseDataProvider } from "../../sdk/Report/DataLayer/DataProviders/LicenseDataProvider";
17
+ import { SummaryDataProvider } from "../../sdk/Report/DataLayer/DataProviders/SummaryDataProvider";
18
+ import { DecompressionFilter } from "../../sdk/tree/Filters/DecompressionFilter";
19
+ import { DecompressionManager } from "../../sdk/Decompress/DecompressionManager";
20
+ import path from "path";
21
+ import { LicenseObligationDataProvider } from "../../sdk/Report/DataLayer/DataProviders/LicenseObligationDataProvider";
22
+ import { CryptographyDataProvider } from "../../sdk/Report/DataLayer/DataProviders/CryptographyDataProvider";
23
+ import { CryptoCfg } from "../../sdk/Cryptography/CryptoCfg";
24
+ import { CryptographyScanner } from "../../sdk/Cryptography/CryptographyScanner";
23
25
  export async function scanHandler(rootPath, options) {
26
+ // TODO: Add flag to enable debug. False by default. logger.enableDebug(options.debug);
24
27
  rootPath = path.resolve(rootPath);
25
28
  const pathIsFolder = await isFolder(rootPath);
26
29
  const projectName = getProjectNameFromPath(rootPath);
@@ -62,7 +65,7 @@ export async function scanHandler(rootPath, options) {
62
65
  let scannerInput = { fileList: [] };
63
66
  // SBOM Ingestion
64
67
  if (options.ignore) {
65
- scannerInput.sbom = fs.readFileSync(options.ignore, 'utf-8');
68
+ scannerInput.sbom = fs.readFileSync(options.ignore, "utf-8");
66
69
  scannerInput.sbomMode = SbomMode.SBOM_IGNORE;
67
70
  }
68
71
  // Settings Ingestion
@@ -70,8 +73,8 @@ export async function scanHandler(rootPath, options) {
70
73
  const settingsFilePath = await getSettingsFilePath(options.settings, rootPath);
71
74
  if (settingsFilePath) {
72
75
  try {
73
- scannerInput.settings = JSON.parse(fs.readFileSync(settingsFilePath, "utf-8"));
74
- scannerInput.sbomMode = SbomMode.SBOM_IDENTIFY;
76
+ const scanossSettings = JSON.parse(fs.readFileSync(settingsFilePath, "utf-8"));
77
+ scannerInput.settings = scanossSettings;
75
78
  }
76
79
  catch (e) {
77
80
  throw new Error(`SCANOSS Settings file cannot be found at: ${settingsFilePath}.`);
@@ -83,30 +86,28 @@ export async function scanHandler(rootPath, options) {
83
86
  scannerInput.engineFlags = options.flags;
84
87
  if (options.wfp)
85
88
  scannerInput.wfpPath = rootPath;
86
- const wfpMode = options.hpsm
87
- ? WinnowingMode.FULL_WINNOWING_HPSM
88
- : WinnowingMode.FULL_WINNOWING;
89
+ const wfpMode = options.hpsm ? WinnowingMode.FULL_WINNOWING_HPSM : WinnowingMode.FULL_WINNOWING;
89
90
  scannerInput.winnowing = { mode: wfpMode };
90
91
  if (!options.wfp) {
91
92
  if (pathIsFolder) {
92
- console.error('\nReading directory... ');
93
+ console.error("\nReading directory... ");
93
94
  const tree = new Tree(rootPath);
94
95
  tree.build();
95
96
  if (options.extract) {
96
- const archives = tree.getFileList(new DecompressionFilter(''));
97
- console.error('Searching archives files...');
97
+ const archives = tree.getFileList(new DecompressionFilter(""));
98
+ console.error("Searching archives files...");
98
99
  if (archives.length) {
99
- console.error('Extracting archives...');
100
+ console.error("Extracting archives...");
100
101
  const decompressionManager = new DecompressionManager(options.extractDeep, options.extractSuffix, options.extractOverwrite);
101
102
  await decompressionManager.decompress(archives);
102
- console.error('Reindexing files...');
103
+ console.error("Reindexing files...");
103
104
  tree.build();
104
105
  }
105
106
  else
106
- console.error('No archives found.');
107
+ console.error("No archives found.");
107
108
  }
108
- scannerInput.fileList = tree.getFileList(new ScanFilter(''));
109
- dependencyInput = tree.getFileList(new DependencyFilter(''));
109
+ scannerInput.fileList = tree.getFileList(new ScanFilter(""));
110
+ dependencyInput = tree.getFileList(new DependencyFilter(""));
110
111
  }
111
112
  else {
112
113
  scannerInput.fileList = [rootPath];
@@ -114,12 +115,12 @@ export async function scanHandler(rootPath, options) {
114
115
  }
115
116
  }
116
117
  else {
117
- const winnowing = fs.readFileSync(rootPath, { encoding: 'utf-8' });
118
+ const winnowing = fs.readFileSync(rootPath, { encoding: "utf-8" });
118
119
  scannerInput.fileList.length = [...winnowing.matchAll(/file=/g)].length;
119
120
  }
120
121
  if (!options.verbose) {
121
122
  const optBar1 = {
122
- format: 'Scan Progress: [{bar}] {percentage}% | Scanned {value} files of {total}',
123
+ format: "Scan Progress: [{bar}] {percentage}% | Scanned {value} files of {total}",
123
124
  };
124
125
  const bar1 = new cliProgress.SingleBar(optBar1, cliProgress.Presets.shades_classic);
125
126
  bar1.start(scannerInput.fileList.length, 0);
@@ -140,25 +141,67 @@ export async function scanHandler(rootPath, options) {
140
141
  }
141
142
  //Launch parallel scanners
142
143
  const pScanner = scanner.scan([scannerInput]);
143
- const [scannerResultPath, depResults] = await Promise.all([
144
- pScanner,
145
- pDependencyScanner,
146
- ]);
147
- let scannerResults = JSON.parse(await fs.promises.readFile(scannerResultPath, 'utf-8'));
144
+ const [scannerResultPath, depResults] = await Promise.all([pScanner, pDependencyScanner]);
145
+ let scannerResults = JSON.parse(await fs.promises.readFile(scannerResultPath, "utf-8"));
148
146
  //TODO Unify results.json and dependency.json. What happens with result.json that includes dependencies?
149
147
  const scannersResults = {
150
148
  scanner: scannerResults,
151
149
  ...(options.dependencies && { dependencies: depResults }),
152
150
  };
153
- let scannerResultsString = JSON.stringify(scannersResults, null, 2);
154
- if (options.format && options.format.toLowerCase() === 'html') {
151
+ let scannerResultsString = JSON.stringify(scannerResults, null, 2);
152
+ // Crypto
153
+ const resultsWithCrypto = {
154
+ scanner: scannerResults,
155
+ ...{
156
+ cryptography: {
157
+ files: [],
158
+ components: [],
159
+ },
160
+ },
161
+ };
162
+ if (options.cryptography) {
163
+ // Load rules
164
+ let algorithmRules = null;
165
+ let libraryRules = null;
166
+ if (options.algorithmRules)
167
+ algorithmRules = options.algorithmRules;
168
+ if (options.libraryRules)
169
+ libraryRules = options.libraryRules;
170
+ // Local Cryptography
171
+ const cryptoCfg = new CryptoCfg({
172
+ threads: 5,
173
+ libraryRulesPath: libraryRules,
174
+ algorithmRulesPath: algorithmRules,
175
+ apiKey: options.key,
176
+ proxy: options.proxy,
177
+ });
178
+ const cryptoScanner = new CryptographyScanner(cryptoCfg);
179
+ let localCrypto = await cryptoScanner.scanFiles(scannerInput.fileList);
180
+ localCrypto.fileList = localCrypto.fileList.map((c) => {
181
+ return { ...c, file: c.file.replace(rootPath, "") };
182
+ });
183
+ resultsWithCrypto.cryptography.files = localCrypto.fileList;
184
+ // Component Cryptography
185
+ if (options.key) {
186
+ let componentList = Object.values(scannersResults.scanner).flat();
187
+ componentList = componentList.filter((component) => component.id !== "none");
188
+ const cryptoRequest = {
189
+ purlsList: componentList.map((c) => {
190
+ return { purl: c.purl[0], requirement: c.version };
191
+ }),
192
+ };
193
+ resultsWithCrypto.cryptography.components = await cryptoScanner.scanComponents(cryptoRequest);
194
+ }
195
+ scannerResultsString = JSON.stringify(resultsWithCrypto, null, 2);
196
+ }
197
+ if (options.format && options.format.toLowerCase() === "html") {
155
198
  const dataProviderManager = new DataProviderManager();
156
199
  dataProviderManager.addDataProvider(new ComponentDataProvider(scannersResults.scanner, scannersResults.dependencies));
157
200
  dataProviderManager.addDataProvider(new DependencyDataProvider(scannersResults.dependencies));
158
201
  dataProviderManager.addDataProvider(new LicenseDataProvider(scannersResults.scanner, scannersResults.dependencies));
159
202
  dataProviderManager.addDataProvider(new SummaryDataProvider(projectName, new Date(), scannersResults.scanner));
160
203
  dataProviderManager.addDataProvider(new LicenseObligationDataProvider(scannersResults.scanner, scannersResults.dependencies));
161
- dataProviderManager.addDataProvider(new CryptographyDataProvider(null, scannersResults.scanner));
204
+ dataProviderManager.addDataProvider(new CryptographyDataProvider(resultsWithCrypto.cryptography.files, resultsWithCrypto.cryptography.components));
162
205
  const report = new Report(dataProviderManager);
163
206
  scannerResultsString = await report.getHTML();
164
207
  }
@@ -167,4 +210,4 @@ export async function scanHandler(rootPath, options) {
167
210
  else
168
211
  console.log(scannerResultsString);
169
212
  }
170
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvc2Nhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFDTCxRQUFRLEVBQ1IsYUFBYSxFQUdiLGFBQWEsR0FDZCxNQUFNLGdDQUFnQyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0MsT0FBTyxXQUFXLE1BQU0sY0FBYyxDQUFDO0FBRXZDLE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsbUJBQW1CLEVBQ25CLFFBQVEsRUFDVCxNQUFNLFdBQVcsQ0FBQztBQUVuQixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSw2Q0FBNkMsQ0FBQztBQUNuRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwQ0FBMEMsQ0FBQztBQUU3RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFDM0UsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGdFQUFnRSxDQUFDO0FBQ3ZHLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBQ3pHLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDhEQUE4RCxDQUFDO0FBQ25HLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ2pGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQ2pGLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUN4QixPQUFPLEVBQUUsNkJBQTZCLEVBQUUsTUFBTSx3RUFBd0UsQ0FBQztBQUN2SCxPQUFPLEVBQ0wsd0JBQXdCLEVBQ3pCLE1BQU0sbUVBQW1FLENBQUM7QUFLM0UsTUFBTSxDQUFDLEtBQUssVUFBVSxXQUFXLENBQy9CLFFBQWdCLEVBQ2hCLE9BQVk7SUFFWixRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNsQyxNQUFNLFlBQVksR0FBRyxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5QyxNQUFNLFdBQVcsR0FBRyxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUlyRCwrQ0FBK0M7SUFDL0MsSUFBSSxlQUFlLEdBQWtCLEVBQUUsQ0FBQztJQUN4QyxNQUFNLG9CQUFvQixHQUFHLElBQUksb0JBQW9CLEVBQUUsQ0FBQztJQUN4RCxJQUFJLE9BQU8sQ0FBQyxPQUFPO1FBQUUsb0JBQW9CLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDcEUsSUFBSSxPQUFPLENBQUMsVUFBVTtRQUFFLG9CQUFvQixDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDO0lBQzdFLE1BQU0sb0JBQW9CLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDdEMsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLGlCQUFpQixDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFdEUsZ0RBQWdEO0lBQ2hELE1BQU0sVUFBVSxHQUFHLElBQUksVUFBVSxFQUFFLENBQUM7SUFDcEMsSUFBSSxPQUFPLENBQUMsV0FBVztRQUNyQixVQUFVLENBQUMsaUJBQWlCLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvRCxJQUFJLE9BQU8sQ0FBQyxRQUFRO1FBQ2xCLFVBQVUsQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUNuRSxJQUFJLE9BQU8sQ0FBQyxNQUFNO1FBQUUsVUFBVSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ3hELElBQUksT0FBTyxDQUFDLEdBQUc7UUFBRSxVQUFVLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDbEQsSUFBSSxPQUFPLENBQUMsT0FBTztRQUFFLFVBQVUsQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUM7SUFDakUsSUFBSSxPQUFPLENBQUMsUUFBUTtRQUNsQixVQUFVLENBQUMsbUNBQW1DLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNO1FBQUUsVUFBVSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQ3hELElBQUksT0FBTyxDQUFDLGdCQUFnQjtRQUFFLFVBQVUsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUM7SUFFbkUsSUFBSSxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDbEIsVUFBVSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3ZDLFVBQVUsQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUN4QyxDQUFDO0lBRUQsSUFBSSxPQUFPLENBQUMsU0FBUztRQUFFLFVBQVUsQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO0lBRXpELE1BQU0sVUFBVSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRXhDLElBQUksWUFBWSxHQUFpQixFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUVsRCxpQkFBaUI7SUFDakIsSUFBSSxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDbkIsWUFBWSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0QsWUFBWSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQy9DLENBQUM7SUFFRCxxQkFBcUI7SUFDckIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQzlCLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9FLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUM7Z0JBQ0gsWUFBWSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLENBQXdCLENBQUM7Z0JBQ3RHLFlBQVksQ0FBQyxRQUFRLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUNqRCxDQUFDO1lBQUMsT0FBTSxDQUFDLEVBQUUsQ0FBQztnQkFDVixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxnQkFBZ0IsR0FBRyxDQUFDLENBQUM7WUFDcEYsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsWUFBWSxDQUFDLFVBQVUsR0FBRyxRQUFRLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLDJEQUEyRDtJQUMxRyxJQUFJLE9BQU8sQ0FBQyxLQUFLO1FBQUUsWUFBWSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQzVELElBQUksT0FBTyxDQUFDLEdBQUc7UUFBRSxZQUFZLENBQUMsT0FBTyxHQUFHLFFBQVEsQ0FBQztJQUVqRCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSTtRQUMxQixDQUFDLENBQUMsYUFBYSxDQUFDLG1CQUFtQjtRQUNuQyxDQUFDLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQztJQUNqQyxZQUFZLENBQUMsU0FBUyxHQUFHLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBRTNDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBSSxZQUFZLEVBQUUsQ0FBQztZQUNqQixPQUFPLENBQUMsS0FBSyxDQUFDLDBCQUEwQixDQUFDLENBQUM7WUFDMUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBRWIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3BCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxtQkFBbUIsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMvRCxPQUFPLENBQUMsS0FBSyxDQUFDLDZCQUE2QixDQUFDLENBQUM7Z0JBQzdDLElBQUksUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUNwQixPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7b0JBQ3hDLE1BQU0sb0JBQW9CLEdBQUcsSUFBSSxvQkFBb0IsQ0FDbkQsT0FBTyxDQUFDLFdBQVcsRUFDbkIsT0FBTyxDQUFDLGFBQWEsRUFDckIsT0FBTyxDQUFDLGdCQUFnQixDQUN6QixDQUFDO29CQUNGLE1BQU0sb0JBQW9CLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUNoRCxPQUFPLENBQUMsS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7b0JBQ3JDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDZixDQUFDOztvQkFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLG9CQUFvQixDQUFDLENBQUM7WUFDN0MsQ0FBQztZQUNELFlBQVksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzdELGVBQWUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMvRCxDQUFDO2FBQU0sQ0FBQztZQUNOLFlBQVksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNuQyxlQUFlLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMvQixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzFFLENBQUM7SUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ3JCLE1BQU0sT0FBTyxHQUFHO1lBQ2QsTUFBTSxFQUNKLHlFQUF5RTtTQUM1RSxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFXLENBQUMsU0FBUyxDQUNwQyxPQUFPLEVBQ1AsV0FBVyxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQ25DLENBQUM7UUFDRixJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTVDLE9BQU8sQ0FBQyxFQUFFLENBQ1IsYUFBYSxDQUFDLG1CQUFtQixFQUNqQyxDQUFDLFFBQTRCLEVBQUUsRUFBRTtZQUMvQixJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVEsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwRCxDQUFDLENBQ0YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLEVBQUU7WUFDdkQsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO1NBQU0sQ0FBQztRQUNOLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFFRCxxQkFBcUI7SUFDckIsSUFBSSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFzQixFQUFFLENBQUMsQ0FBQztJQUNsRSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6QixrQkFBa0IsR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELDBCQUEwQjtJQUMxQixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUU5QyxNQUFNLENBQUMsaUJBQWlCLEVBQUUsVUFBVSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3hELFFBQVE7UUFDUixrQkFBa0I7S0FDbkIsQ0FBQyxDQUFDO0lBQ0gsSUFBSSxjQUFjLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FDN0IsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxPQUFPLENBQUMsQ0FDdkQsQ0FBQztJQUdGLHdHQUF3RztJQUN4RyxNQUFNLGVBQWUsR0FBRztRQUN0QixPQUFPLEVBQUUsY0FBZ0M7UUFDekMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxZQUFZLElBQUksRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLENBQUM7S0FDMUQsQ0FBQztJQUVGLElBQUksb0JBQW9CLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxlQUFlLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXBFLElBQUksT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsRUFBRSxLQUFLLE1BQU0sRUFBRSxDQUFDO1FBQzlELE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsRUFBRSxDQUFDO1FBQ3RELG1CQUFtQixDQUFDLGVBQWUsQ0FDakMsSUFBSSxxQkFBcUIsQ0FDdkIsZUFBZSxDQUFDLE9BQU8sRUFDdkIsZUFBZSxDQUFDLFlBQVksQ0FDN0IsQ0FDRixDQUFDO1FBQ0YsbUJBQW1CLENBQUMsZUFBZSxDQUNqQyxJQUFJLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQUMsQ0FDekQsQ0FBQztRQUNGLG1CQUFtQixDQUFDLGVBQWUsQ0FDakMsSUFBSSxtQkFBbUIsQ0FDckIsZUFBZSxDQUFDLE9BQU8sRUFDdkIsZUFBZSxDQUFDLFlBQVksQ0FDN0IsQ0FDRixDQUFDO1FBQ0YsbUJBQW1CLENBQUMsZUFBZSxDQUNqQyxJQUFJLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxJQUFJLElBQUksRUFBRSxFQUFFLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FDMUUsQ0FBQztRQUVGLG1CQUFtQixDQUFDLGVBQWUsQ0FDakMsSUFBSSw2QkFBNkIsQ0FDL0IsZUFBZSxDQUFDLE9BQU8sRUFDdkIsZUFBZSxDQUFDLFlBQVksQ0FDN0IsQ0FDRixDQUFDO1FBRUYsbUJBQW1CLENBQUMsZUFBZSxDQUFDLElBQUksd0JBQXdCLENBQUMsSUFBSSxFQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBRWhHLE1BQU0sTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDL0Msb0JBQW9CLEdBQUcsTUFBTSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELElBQUksT0FBTyxDQUFDLE1BQU07UUFDaEIsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7O1FBQy9ELE9BQU8sQ0FBQyxHQUFHLENBQUMsb0JBQW9CLENBQUMsQ0FBQztBQUN6QyxDQUFDIn0=
213
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9jbGkvY29tbWFuZHMvc2Nhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxJQUFJLENBQUM7QUFDcEIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQ3BELE9BQU8sRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFnQyxhQUFhLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN0SCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzNDLE9BQU8sV0FBVyxNQUFNLGNBQWMsQ0FBQztBQUV2QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsbUJBQW1CLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRWxGLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLDZDQUE2QyxDQUFDO0FBQ25GLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTdFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUMvRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUMzRSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sZ0RBQWdELENBQUM7QUFDckYsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sZ0VBQWdFLENBQUM7QUFDdkcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0saUVBQWlFLENBQUM7QUFDekcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDbkcsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOERBQThELENBQUM7QUFDbkcsT0FBTyxFQUFF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
@@ -0,0 +1,19 @@
1
+ import { ComponentCryptographyResultCollector } from "../../Helper/ResultCollector/Component/ComponentCryptographyResultColletor";
2
+ import { AlgorithmResponse } from "../../../Services/Grpc/CryptographyService";
3
+ import { PurlRequest } from "../../../Services/Grpc/BaseService";
4
+ import { BaseCryptographyScanner } from "../../BaseCryptographyScanner";
5
+ /**
6
+ * Scanner for detecting cryptographic algorithms in software components.
7
+ * This class extends the base cryptography scanner to specifically handle
8
+ * component-level cryptographic algorithm detection using a remote service.
9
+ */
10
+ export declare class ComponentAlgorithmScanner extends BaseCryptographyScanner<ComponentCryptographyResultCollector, PurlRequest, AlgorithmResponse> {
11
+ /**
12
+ * Scans components identified by PURL for cryptographic algorithms.
13
+ * This method connects to a cryptography service to retrieve algorithm
14
+ * information for the specified components.
15
+ * @param req A request containing PURL (Package URL) identifiers for components to scan.
16
+ * @returns {AlgorithmResponse} A promise that resolves to an AlgorithmResponse containing detected cryptographic algorithms.
17
+ */
18
+ scan(req: PurlRequest): Promise<AlgorithmResponse>;
19
+ }
@@ -0,0 +1,23 @@
1
+ import { CryptographyService } from "../../../Services/Grpc/CryptographyService";
2
+ import { BaseCryptographyScanner } from "../../BaseCryptographyScanner";
3
+ /**
4
+ * Scanner for detecting cryptographic algorithms in software components.
5
+ * This class extends the base cryptography scanner to specifically handle
6
+ * component-level cryptographic algorithm detection using a remote service.
7
+ */
8
+ export class ComponentAlgorithmScanner extends BaseCryptographyScanner {
9
+ /**
10
+ * Scans components identified by PURL for cryptographic algorithms.
11
+ * This method connects to a cryptography service to retrieve algorithm
12
+ * information for the specified components.
13
+ * @param req A request containing PURL (Package URL) identifiers for components to scan.
14
+ * @returns {AlgorithmResponse} A promise that resolves to an AlgorithmResponse containing detected cryptographic algorithms.
15
+ */
16
+ async scan(req) {
17
+ const cryptographyService = new CryptographyService(this.config.getApikey(), this.config.getProxy());
18
+ const results = await cryptographyService.getAlgorithms(req);
19
+ this.resultCollector.collectAlgorithmResults(results);
20
+ return results;
21
+ }
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcG9uZW50QWxnb3JpdGhtU2Nhbm5lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvQ3J5cHRvZ3JhcGh5L0FsZ29yaXRobS9Db21wb25lbnRzL0NvbXBvbmVudEFsZ29yaXRobVNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBR0EsT0FBTyxFQUVMLG1CQUFtQixFQUNwQixNQUFNLDRDQUE0QyxDQUFDO0FBRXBELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXhFOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8seUJBQ1gsU0FBUSx1QkFHWTtJQUVwQjs7Ozs7O09BTUc7SUFDSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQWdCO1FBQ2hDLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxFQUN6RSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDMUIsTUFBTSxPQUFPLEdBQXFCLE1BQU0sbUJBQW1CLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9FLElBQUksQ0FBQyxlQUFlLENBQUMsdUJBQXVCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEQsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGIn0=
@@ -0,0 +1 @@
1
+ export declare const cryptographyAlgorithmProcessor = "\nconst { parentPort } = require('worker_threads');\nconst fs = require('fs');\n\nparentPort.on('message', async (job) => {\n\n const MAX_FILE_SIZE = 2 * 1024 * 1024 * 1024;\n const { data } = job;\n const { file, rules, cryptoMapper } = data;\n\n const cryptoFound = new Array();\n const stats = await fs.promises.stat(file);\n if (stats.size > MAX_FILE_SIZE) {\n parentPort.postMessage({ file, algorithms:[] });\n return;\n }\n\n let content = fs.readFileSync(file, 'utf-8');\n rules.forEach((value, key) => {\n try {\n const matches = content.match(value);\n if (matches) {\n cryptoFound.push(key);\n }\n } catch (e){\n console.error(e);\n }\n });\n const algorithms = [];\n cryptoFound.forEach((cf)=>{\n algorithms.push(cryptoMapper.get(cf));\n });\n parentPort.postMessage({ file, algorithms });\n });\n";
@@ -0,0 +1,36 @@
1
+ export const cryptographyAlgorithmProcessor = `
2
+ const { parentPort } = require('worker_threads');
3
+ const fs = require('fs');
4
+
5
+ parentPort.on('message', async (job) => {
6
+
7
+ const MAX_FILE_SIZE = 2 * 1024 * 1024 * 1024;
8
+ const { data } = job;
9
+ const { file, rules, cryptoMapper } = data;
10
+
11
+ const cryptoFound = new Array();
12
+ const stats = await fs.promises.stat(file);
13
+ if (stats.size > MAX_FILE_SIZE) {
14
+ parentPort.postMessage({ file, algorithms:[] });
15
+ return;
16
+ }
17
+
18
+ let content = fs.readFileSync(file, 'utf-8');
19
+ rules.forEach((value, key) => {
20
+ try {
21
+ const matches = content.match(value);
22
+ if (matches) {
23
+ cryptoFound.push(key);
24
+ }
25
+ } catch (e){
26
+ console.error(e);
27
+ }
28
+ });
29
+ const algorithms = [];
30
+ cryptoFound.forEach((cf)=>{
31
+ algorithms.push(cryptoMapper.get(cf));
32
+ });
33
+ parentPort.postMessage({ file, algorithms });
34
+ });
35
+ `;
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxnb3JpdGhtUHJvY2Vzc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9DcnlwdG9ncmFwaHkvQWxnb3JpdGhtL0ZpbGVzL0FsZ29yaXRobVByb2Nlc3Nvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSw4QkFBOEIsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtDN0MsQ0FBQyJ9
@@ -0,0 +1,42 @@
1
+ import { CryptoCfg } from '../../CryptoCfg';
2
+ import { CryptoAlgorithmJobResponse } from "../../CryptographyTypes";
3
+ import { BaseCryptographyScanner } from "../../BaseCryptographyScanner";
4
+ import { FileCryptographyResultCollector } from "../../Helper/ResultCollector/File/FileCryptographyResultCollector";
5
+ /**
6
+ * A class responsible for scanning files for cryptographic items.
7
+ */
8
+ export declare class FileAlgorithmScanner extends BaseCryptographyScanner<FileCryptographyResultCollector, Array<string>, Array<CryptoAlgorithmJobResponse>> {
9
+ private readonly DEFAULT_CRYPTO_ALGORITHM_RULE_FILENAME;
10
+ /**
11
+ * Constructs a new CryptographyScanner.
12
+ * @param cryptoCfg The cryptographic configuration.
13
+ * @param resultCollector cryptography results collector
14
+ */
15
+ constructor(cryptoCfg: CryptoCfg, resultCollector: FileCryptographyResultCollector);
16
+ /**
17
+ Builds a collection of cryptographic algorithm analysis jobs from an array of files.
18
+ This method loads cryptography rules, creates required mappers, and initializes
19
+ job objects for each file that will be used for crypto pattern detection.
20
+ @param files An array of file paths to analyze for cryptographic algorithm usage.
21
+ @returns A promise that resolves to an array of job objects configured for crypto analysis.
22
+ */
23
+ private buildJobs;
24
+ /**
25
+ * Scans an array of files for cryptographic items.
26
+ * @param files An array of file paths to scan.
27
+ * @returns A promise that resolves to an ILocalCryptographyResponse.
28
+ */
29
+ scan(files: Array<string>): Promise<Array<CryptoAlgorithmJobResponse>>;
30
+ /**
31
+ * Scans a folder for cryptographic items.
32
+ * @param path The path of the folder to scan.
33
+ * @returns A promise that resolves to an ILocalCryptographyResponse.
34
+ * @throws Error if the specified path is not a directory.
35
+ */
36
+ scanFolder(path: string): Promise<Array<CryptoAlgorithmJobResponse>>;
37
+ /**
38
+ * Loads custom cryptographic rules from a file.
39
+ * @returns A promise that resolves to the loaded rules.
40
+ */
41
+ private loadRules;
42
+ }
@@ -0,0 +1,80 @@
1
+ import fs from 'fs';
2
+ import { Tree } from '../../../tree/Tree';
3
+ import path from 'path';
4
+ import { createCryptoKeywordMapper, getCryptoMapper } from "./Helper/Helper";
5
+ import { Job } from "../../../Utils/Concurrency/Job";
6
+ import { WorkerPool } from "../../../Utils/Concurrency/WorkerPool";
7
+ import { cryptographyAlgorithmProcessor } from "./AlgorithmProcessor";
8
+ import { BaseCryptographyScanner } from "../../BaseCryptographyScanner";
9
+ /**
10
+ * A class responsible for scanning files for cryptographic items.
11
+ */
12
+ export class FileAlgorithmScanner extends BaseCryptographyScanner {
13
+ DEFAULT_CRYPTO_ALGORITHM_RULE_FILENAME = 'scanoss-crypto-algorithm-rules.json';
14
+ /**
15
+ * Constructs a new CryptographyScanner.
16
+ * @param cryptoCfg The cryptographic configuration.
17
+ * @param resultCollector cryptography results collector
18
+ */
19
+ constructor(cryptoCfg, resultCollector) {
20
+ super(cryptoCfg, resultCollector);
21
+ }
22
+ /**
23
+ Builds a collection of cryptographic algorithm analysis jobs from an array of files.
24
+ This method loads cryptography rules, creates required mappers, and initializes
25
+ job objects for each file that will be used for crypto pattern detection.
26
+ @param files An array of file paths to analyze for cryptographic algorithm usage.
27
+ @returns A promise that resolves to an array of job objects configured for crypto analysis.
28
+ */
29
+ async buildJobs(files) {
30
+ const cryptographyRules = await this.loadRules(this.config.getAlgorithmRulesPath());
31
+ const rules = createCryptoKeywordMapper(cryptographyRules);
32
+ const cryptoMapper = getCryptoMapper(cryptographyRules);
33
+ const localCryptoJobs = [];
34
+ files.forEach((f) => {
35
+ const newJob = new Job({
36
+ file: f,
37
+ rules,
38
+ cryptoMapper
39
+ });
40
+ localCryptoJobs.push(newJob);
41
+ });
42
+ return localCryptoJobs;
43
+ }
44
+ /**
45
+ * Scans an array of files for cryptographic items.
46
+ * @param files An array of file paths to scan.
47
+ * @returns A promise that resolves to an ILocalCryptographyResponse.
48
+ */
49
+ async scan(files) {
50
+ const workerPool = new WorkerPool(cryptographyAlgorithmProcessor, this.config.getNumberOfThreads());
51
+ const jobs = await this.buildJobs(files);
52
+ workerPool.loadJobs(jobs);
53
+ const results = await workerPool.run();
54
+ this.resultCollector.collectAlgorithmResults(results);
55
+ return results;
56
+ }
57
+ /**
58
+ * Scans a folder for cryptographic items.
59
+ * @param path The path of the folder to scan.
60
+ * @returns A promise that resolves to an ILocalCryptographyResponse.
61
+ * @throws Error if the specified path is not a directory.
62
+ */
63
+ async scanFolder(path) {
64
+ if (!(await fs.promises.lstat(path)).isDirectory())
65
+ throw new Error('Specified path is not a directory');
66
+ const tree = new Tree(path);
67
+ tree.build();
68
+ return await this.scan(tree.getFileList());
69
+ }
70
+ /**
71
+ * Loads custom cryptographic rules from a file.
72
+ * @returns A promise that resolves to the loaded rules.
73
+ */
74
+ async loadRules(rulePath) {
75
+ const cryptoRulePath = rulePath ? rulePath : path.join(__dirname, '../../../../../../assets/data', this.DEFAULT_CRYPTO_ALGORITHM_RULE_FILENAME);
76
+ const rules = await fs.promises.readFile(cryptoRulePath, 'utf-8');
77
+ return JSON.parse(rules);
78
+ }
79
+ }
80
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsZUFsZ29yaXRobVNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvc2RrL0NyeXB0b2dyYXBoeS9BbGdvcml0aG0vRmlsZXMvRmlsZUFsZ29yaXRobVNjYW5uZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBQ3BCLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQVExQyxPQUFPLElBQUksTUFBTSxNQUFNLENBQUM7QUFDeEIsT0FBTyxFQUNMLHlCQUF5QixFQUN6QixlQUFlLEVBQ2hCLE1BQU0saUJBQWlCLENBQUM7QUFDekIsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3JELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx1Q0FBdUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQU14RTs7R0FFRztBQUNILE1BQU0sT0FBTyxvQkFBcUIsU0FBUSx1QkFHTjtJQUVqQixzQ0FBc0MsR0FBRyxxQ0FBcUMsQ0FBQztJQUVoRzs7OztPQUlHO0lBQ0gsWUFBWSxTQUFvQixFQUFFLGVBQWdEO1FBQ2hGLEtBQUssQ0FBQyxTQUFTLEVBQUMsZUFBZSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLEtBQUssQ0FBRSxTQUFTLENBQUMsS0FBZTtRQUN0QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUMsQ0FBQztRQUNwRixNQUFNLEtBQUssR0FBRyx5QkFBeUIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sZUFBZSxHQUF3QyxFQUFFLENBQUM7UUFDaEUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ2xCLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxDQUEwQjtnQkFDOUMsSUFBSSxFQUFDLENBQUM7Z0JBQ04sS0FBSztnQkFDTCxZQUFZO2FBQ2IsQ0FBQyxDQUFDO1lBQ0gsZUFBZSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5QixDQUFDLENBQUMsQ0FBQztRQUNILE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFvQjtRQUNwQyxNQUFNLFVBQVUsR0FBRyxJQUFJLFVBQVUsQ0FBc0QsOEJBQThCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLENBQUM7UUFDekosTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pDLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDekIsTUFBTSxPQUFPLEdBQUcsTUFBTSxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxLQUFLLENBQUMsVUFBVSxDQUFDLElBQVk7UUFDbEMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRTtZQUNoRCxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2IsT0FBTyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVEOzs7T0FHRztJQUNLLEtBQUssQ0FBQyxTQUFTLENBQUMsUUFBaUI7UUFDdkMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFFLElBQUksQ0FBQyxJQUFJLENBQ3JELFNBQVMsRUFDVCwrQkFBK0IsRUFBRSxJQUFJLENBQUMsc0NBQXNDLENBQUMsQ0FBQztRQUNoRixNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBQyxPQUFPLENBQUMsQ0FBQztRQUNqRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQztDQUVGIn0=
@@ -1,4 +1,4 @@
1
- import { CryptoAlgorithm, CryptoAlgorithmRules } from '../CryptographyTypes';
1
+ import { CryptoAlgorithm, CryptoAlgorithmRules } from '../../../CryptographyTypes';
2
2
  /**
3
3
  * Function to create a mapping of regular expressions based on provided crypto definitions.
4
4
  * @param cryptoRulesDefinitions An array of objects containing cryptographic definitions.
@@ -31,4 +31,4 @@ export function getCryptoMapper(cryptoDefinitions) {
31
31
  });
32
32
  return cryptoMapper;
33
33
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3J5cHRvRGVmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9DcnlwdG9ncmFwaHkvQ3J5cHRvRGVmL0NyeXB0b0RlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxzQkFBbUQ7SUFDM0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWlCLENBQUM7SUFDeEMsc0JBQXNCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQSxFQUFFO1FBQ2hDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMscUJBQXFCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDN0QsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUUxQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDN0QsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUFDLGlCQUE4QztJQUMzRSxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0lBRTVDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1FBQy9CLE1BQU0sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLGdEQUFnRDtRQUNoRCxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUN6RCxDQUFDLENBQUMsQ0FBQztJQUNILE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMifQ==
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL3Nkay9DcnlwdG9ncmFwaHkvQWxnb3JpdGhtL0ZpbGVzL0hlbHBlci9IZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUseUJBQXlCLENBQUMsc0JBQW1EO0lBQzNGLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFpQixDQUFDO0lBQ3hDLHNCQUFzQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUEsRUFBRTtRQUNoQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRTtZQUN0QixNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsT0FBTyxDQUFDLHFCQUFxQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzdELEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFFMUIsQ0FBQyxDQUFDLENBQUM7UUFDSCxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxpQkFBOEM7SUFDM0UsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLEVBQTJCLENBQUM7SUFFeEQsaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7UUFDL0IsTUFBTSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbEMsZ0RBQWdEO1FBQ2hELFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUMsQ0FBQyxDQUFDO0lBQ0gsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyJ9
@@ -1,8 +1,8 @@
1
- import { CryptoAlgorithm, ICryptoItem } from '../CryptographyTypes';
1
+ import { CryptoAlgorithm } from '../../../CryptographyTypes';
2
2
  /**
3
3
  * Represents a cryptographic item containing information about a file and cryptographic algorithms found in it.
4
4
  */
5
- export declare class CryptoItem implements ICryptoItem {
5
+ export declare class CryptoItem {
6
6
  file: string;
7
7
  algorithms: Array<CryptoAlgorithm>;
8
8
  /**
@@ -34,4 +34,4 @@ export class CryptoItem {
34
34
  this.algorithms = algorithms;
35
35
  }
36
36
  }
37
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3J5cHRvSXRlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvQ3J5cHRvZ3JhcGh5L1NjYW5uZWFibGUvQ3J5cHRvSXRlbS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBRXJCLElBQUksQ0FBUztJQUNiLFVBQVUsQ0FBeUI7SUFFbkM7OztPQUdHO0lBQ0gsWUFBWSxJQUFZO1FBQ3RCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO0lBQ3ZCLENBQUM7SUFFRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1osT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDO0lBQ25CLENBQUM7SUFFRDs7O09BR0c7SUFDSSxhQUFhO1FBQ2xCLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksYUFBYSxDQUFDLFVBQWtDO1FBQ3JELElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7Q0FFRiJ9
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3J5cHRvSXRlbS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3NyYy9zZGsvQ3J5cHRvZ3JhcGh5L0FsZ29yaXRobS9GaWxlcy9TY2FubmVhYmxlL0NyeXB0b0l0ZW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7O0dBRUc7QUFDSCxNQUFNLE9BQU8sVUFBVTtJQUVyQixJQUFJLENBQVM7SUFDYixVQUFVLENBQXlCO0lBRW5DOzs7T0FHRztJQUNILFlBQVksSUFBWTtRQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQztJQUNuQixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWEsQ0FBQyxVQUFrQztRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsQ0FBQztJQUMvQixDQUFDO0NBRUYifQ==
@@ -0,0 +1,25 @@
1
+ import { CryptoCfg } from "./CryptoCfg";
2
+ /**
3
+ * Abstract base class for cryptography scanners.
4
+ * Provides common functionality for different types of cryptography scanners.
5
+ * @template C Type of result collector
6
+ * @template I Type of input to be scanned
7
+ * @template R Type of returned scan result
8
+ */
9
+ export declare abstract class BaseCryptographyScanner<C, I, R> {
10
+ protected config: CryptoCfg;
11
+ protected resultCollector: C;
12
+ /**
13
+ * Creates a new instance of a cryptography scanner.
14
+ * @param cfg Configuration settings for the scanner.
15
+ * @param cryptoResultCollector Collector for storing scan results.
16
+ */
17
+ constructor(cfg: CryptoCfg, cryptoResultCollector: C);
18
+ /**
19
+ * Scans the provided input for cryptographic items.
20
+ * This method must be implemented by derived classes.
21
+ * @param files Input to be scanned.
22
+ * @returns A promise that resolves to the scan result.
23
+ */
24
+ abstract scan(files: I): Promise<R>;
25
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Abstract base class for cryptography scanners.
3
+ * Provides common functionality for different types of cryptography scanners.
4
+ * @template C Type of result collector
5
+ * @template I Type of input to be scanned
6
+ * @template R Type of returned scan result
7
+ */
8
+ export class BaseCryptographyScanner {
9
+ config;
10
+ resultCollector;
11
+ /**
12
+ * Creates a new instance of a cryptography scanner.
13
+ * @param cfg Configuration settings for the scanner.
14
+ * @param cryptoResultCollector Collector for storing scan results.
15
+ */
16
+ constructor(cfg, cryptoResultCollector) {
17
+ this.config = cfg;
18
+ this.resultCollector = cryptoResultCollector;
19
+ }
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmFzZUNyeXB0b2dyYXBoeVNjYW5uZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2RrL0NyeXB0b2dyYXBoeS9CYXNlQ3J5cHRvZ3JhcGh5U2Nhbm5lci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQWdCLHVCQUF1QjtJQUVqQyxNQUFNLENBQVk7SUFFbEIsZUFBZSxDQUFJO0lBRTdCOzs7O09BSUc7SUFDSCxZQUFZLEdBQWMsRUFBRSxxQkFBd0I7UUFDbEQsSUFBSSxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDbEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxxQkFBcUIsQ0FBQztJQUMvQyxDQUFDO0NBU0YifQ==
@@ -3,22 +3,49 @@
3
3
  */
4
4
  export declare class CryptoCfg {
5
5
  private readonly DEFAULT_THREADS;
6
- private readonly rulesPath;
6
+ private readonly algorithmRulesPath;
7
+ private readonly libraryRulesPath;
7
8
  private readonly threads;
9
+ protected readonly apiKey: string;
10
+ protected readonly proxy: string;
8
11
  /**
9
12
  * Creates an instance of CryptoCfg.
10
13
  * @param {Object} cfg - Configuration object.
11
14
  * @param {number} [cfg.threads=5] - The number of threads to use. Defaults to 5 if not provided.
12
15
  * @param {string} [cfg.rulesPath] - Optional. Path to the cryptography rules file.
16
+ * @param {string} [cfg.apiKey] - Optional. SCANOSS API Key.
17
+ * @param {string} [cfg.proxy] - Optional. proxy.
13
18
  */
14
19
  constructor(cfg: {
15
- threads: number;
16
- rulesPath: string;
20
+ threads?: number;
21
+ algorithmRulesPath?: string;
22
+ libraryRulesPath?: string;
23
+ apiKey?: string;
24
+ proxy?: string;
17
25
  });
18
26
  /**
19
- * Gets the path to the cryptography rules file.
27
+ * Gets the path to the cryptography algorithm rules file.
20
28
  * @returns The path to the cryptography rules file.
21
29
  */
22
- getRulesPath(): string;
30
+ getAlgorithmRulesPath(): string;
31
+ /**
32
+ * Gets the path to the cryptography library rules file.
33
+ * @returns The path to the cryptography rules file.
34
+ */
35
+ getLibraryRulesPath(): string;
36
+ /**
37
+ * Gets the number of threads to use on local crypto detection.
38
+ * @returns The number of threads.
39
+ **/
23
40
  getNumberOfThreads(): number;
41
+ /**
42
+ * Gets the API Key set.
43
+ * @returns The API Key.
44
+ **/
45
+ getApikey(): string;
46
+ /**
47
+ * Gets proxy.
48
+ * @returns proxy.
49
+ **/
50
+ getProxy(): string;
24
51
  }