aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorPetr Svenda2019-12-10 23:25:06 +0100
committerPetr Svenda2019-12-10 23:25:06 +0100
commit4b04c3b340ab2b581aba1f4729aedec79b96b771 (patch)
treecb05194d17e2cfa574858b75e9417f96878a42c5 /src
parentde5355afb51d73ca60618c8a8e55ecd88975342a (diff)
downloadsec-certs-4b04c3b340ab2b581aba1f4729aedec79b96b771.tar.gz
sec-certs-4b04c3b340ab2b581aba1f4729aedec79b96b771.tar.zst
sec-certs-4b04c3b340ab2b581aba1f4729aedec79b96b771.zip
added extraction and analysis of SARs
security assurance components
Diffstat (limited to 'src')
-rw-r--r--src/cert_rules.py16
-rw-r--r--src/search_certificate.py42
2 files changed, 53 insertions, 5 deletions
diff --git a/src/cert_rules.py b/src/cert_rules.py
index fa182697..49fe1cab 100644
--- a/src/cert_rules.py
+++ b/src/cert_rules.py
@@ -87,6 +87,21 @@ rules_security_level = [
'ITSEC[ ]*E[1-9]*.+?',
]
+rules_security_target_class = [
+ 'ACM_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'ADO_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'ADV_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'AGD_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'ALC_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'ATE_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'AVA_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'AMA_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'APE_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ 'ASE_[A-Z][A-Z][A-Z](?: |\.[0-9])',
+ ]
+
+
+
rules_javacard = [
#'(?:Java Card|JavaCard)',
#'(?:Global Platform|GlobalPlatform)',
@@ -165,6 +180,7 @@ rules['rules_device_id'] = rules_device_id
rules['rules_os'] = rules_os
rules['rules_standard_id'] = rules_standard_id
rules['rules_security_level'] = rules_security_level
+rules['rules_security_target_class'] = rules_security_target_class
rules['rules_javacard'] = rules_javacard
rules['rules_crypto_algs'] = rules_crypto_algs
rules['rules_ecc_curves'] = rules_ecc_curves
diff --git a/src/search_certificate.py b/src/search_certificate.py
index 4c1edc16..94e7d63d 100644
--- a/src/search_certificate.py
+++ b/src/search_certificate.py
@@ -65,7 +65,10 @@ def get_line_number(lines, line_length_compensation, match_start_index):
def plot_bar_graph(data, x_data_labels, y_label, title, file_name):
- figure(num=None, figsize=(10, 6), dpi=200, facecolor='w', edgecolor='k')
+ fig_width = round(len(data) / 2)
+ if fig_width < 10:
+ fig_width = 10
+ figure(num=None, figsize=(fig_width, 8), dpi=200, facecolor='w', edgecolor='k')
y_pos = np.arange(len(x_data_labels))
plt.bar(y_pos, data, align='center', alpha=0.5)
plt.xticks(y_pos, x_data_labels)
@@ -471,7 +474,7 @@ def analyze_references_graph(filter_rules_group, all_items_found):
compute_and_plot_hist(indirect_refs, bins, 'Number of certificates', '# certificates with specific number of indirect references', 'cert_indirect_refs_frequency.png')
-def analyze_items_frequency(all_cert_items):
+def analyze_eal_frequency(all_cert_items):
scheme_level = {}
for cert_long_id in all_cert_items.keys():
cert = all_cert_items[cert_long_id]
@@ -531,6 +534,35 @@ def analyze_items_frequency(all_cert_items):
print(tabulate(cc_eal_freq, ['CC scheme'] + eal_headers + ['Total']))
+def analyze_sars_frequency(all_cert_items):
+ sars_freq = {}
+ for cert_long_id in all_cert_items.keys():
+ cert = all_cert_items[cert_long_id]
+ if defaultdict(lambda: defaultdict(lambda: None), cert)['keywords_scan']['rules_security_target_class'] is not None:
+ sars = cert['keywords_scan']['rules_security_target_class']
+ for sar_rule in sars:
+ for sar_hit in sars[sar_rule]:
+ if sar_hit not in sars_freq.keys():
+ sars_freq[sar_hit] = 0
+ sars_freq[sar_hit] += 1
+
+
+ print('\n### CC security assurance components frequency:')
+ sars_labels = sorted(sars_freq.keys())
+ sars_freq_nums = []
+ for sar in sars_labels:
+ print('{:10}: {}x'.format(sar, sars_freq[sar]))
+ sars_freq_nums.append(sars_freq[sar])
+
+ print('\n### CC security assurance components frequency sorted by num occurences:')
+ sorted_by_occurence = sorted(sars_freq.items(), key=operator.itemgetter(1))
+ for sar in sorted_by_occurence:
+ print('{:10}: {}x'.format(sar[0], sar[1]))
+
+ # plot bar graph with frequency of CC SARs
+ plot_bar_graph(sars_freq_nums, sars_labels, 'Number of certificates', 'Number of certificates mentioning specific security assurance component (SAR)\nAll listed SARs occured at least once', 'cert_sars_frequency.png')
+
+
def estimate_cert_id(frontpage_scan, keywords_scan, file_name):
# check if cert id was extracted from frontpage (most priority)
frontpage_cert_id = ''
@@ -1584,7 +1616,7 @@ def main():
cc_html_files_dir = 'c:\\Certs\\web\\'
walk_dir = 'c:\\Certs\\cc_certs_20191208\\cc_certs\\'
- #walk_dir = 'c:\\Certs\\cc_certs_txt_test2\\'
+ #walk_dir = 'c:\\Certs\\cc_certs_test1\\'
fragments_dir = 'c:\\Certs\\cc_certs_20191208\\cc_certs_txt_fragments\\'
generate_basic_download_script()
@@ -1616,10 +1648,10 @@ def main():
with open('certificate_data_complete.json') as json_file:
all_cert_items = json.load(json_file)
analyze_references_graph(['rules_cert_id'], all_cert_items)
- analyze_items_frequency(all_cert_items)
+ analyze_eal_frequency(all_cert_items)
+ analyze_sars_frequency(all_cert_items)
generate_dot_graphs(all_cert_items, walk_dir)
- # extraction of security functions
# analysis of security targets documents
# analysis of big cert clusters