aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2024-02-03 15:41:11 +0100
committerJ08nY2024-02-03 15:41:11 +0100
commitc60fece36b7e7c5300b25cf83b9e34d338675067 (patch)
tree05583aee936bb5d85a2dcbf2afdadcf788f312ff
parent67861ffd16f215f7d476e90bb8e480a5c60dc01b (diff)
downloadsec-certs-c60fece36b7e7c5300b25cf83b9e34d338675067.tar.gz
sec-certs-c60fece36b7e7c5300b25cf83b9e34d338675067.tar.zst
sec-certs-c60fece36b7e7c5300b25cf83b9e34d338675067.zip
Improve US scheme rules.
-rw-r--r--src/sec_certs/rules.yaml7
-rw-r--r--src/sec_certs/sample/cc_certificate_id.py29
-rw-r--r--tests/cc/test_cc_misc.py6
3 files changed, 38 insertions, 4 deletions
diff --git a/src/sec_certs/rules.yaml b/src/sec_certs/rules.yaml
index 5604b709..fa188052 100644
--- a/src/sec_certs/rules.yaml
+++ b/src/sec_certs/rules.yaml
@@ -34,7 +34,12 @@ cc_cert_id:
# Examples:
# SERTIT-101
US:
- - "CCEVS-VR-(?:CC-|VID)?[0-9]+-[0-9]+[a-z]?(?:-[0-9]+)?" # US NSA (CCEVS-VR-10884-2018 CCEVS-VR-VID10877-2018)
+ - "CCEVS-VR-(?:(?P<cc>CC)-)?(?:(?P<VID>VID)-?)?(?P<year>[0-9]{2})-(?P<counter>[0-9]+)"
+ - "CCEVS-VR-(?:(?P<cc>CC)-)?(?:(?P<VID>VID)-?)?(?P<counter>[0-9]{4,5})-(?P<year>[0-9]{4})?"
+ # Examples:
+ # CCEVS-VR-VID10015-2008
+ # CCEVS-VR-10880-2018
+ # CCEVS-VR-04-0082
CA:
# '[0-9][0-9\-]+?-CR', # Canada
- "[0-9][0-9][0-9]-[347]-[0-9][0-9][0-9]?(?:-CR|P)?" # Canada xxx-{347}-xxx (383-4-438, 383-4-82-CR, 383-4-422P)
diff --git a/src/sec_certs/sample/cc_certificate_id.py b/src/sec_certs/sample/cc_certificate_id.py
index 188a2163..e84f6df2 100644
--- a/src/sec_certs/sample/cc_certificate_id.py
+++ b/src/sec_certs/sample/cc_certificate_id.py
@@ -10,7 +10,9 @@ def _parse_year(year: str | None) -> int | None:
if year is None:
return None
y = int(year)
- if y < 100:
+ if y < 50:
+ return y + 2000
+ elif y < 100:
return y + 1900
else:
return y
@@ -39,7 +41,7 @@ class CertificateId:
new_cert_id += f"-{doc}"
if version:
new_cert_id += f"v{version}"
- return new_cert_id
+ break
return new_cert_id
@@ -63,7 +65,27 @@ class CertificateId:
new_cert_id += f"-{year}"
if doc:
new_cert_id += f"-{doc}"
- return new_cert_id
+ break
+
+ return new_cert_id
+
+ def _canonical_us(self) -> str:
+ new_cert_id = self.clean
+ for rule in rules["cc_cert_id"]["US"]:
+ if match := re.match(rule, new_cert_id):
+ groups = match.groupdict()
+ year = _parse_year(groups["year"])
+ counter = groups["counter"]
+ cc = groups.get("cc")
+ vid = groups.get("VID")
+ new_cert_id = "CCEVS-VR"
+ if cc:
+ new_cert_id += f"-{cc}"
+ if vid:
+ new_cert_id += f"-{vid}"
+ new_cert_id += f"-{counter}"
+ new_cert_id += f"-{year}"
+ break
return new_cert_id
@@ -147,6 +169,7 @@ class CertificateId:
schemes = {
"FR": self._canonical_fr,
"DE": self._canonical_de,
+ "US": self._canonical_us,
"ES": self._canonical_es,
"IT": self._canonical_it,
"IN": self._canonical_in,
diff --git a/tests/cc/test_cc_misc.py b/tests/cc/test_cc_misc.py
index b9654c91..6fde3339 100644
--- a/tests/cc/test_cc_misc.py
+++ b/tests/cc/test_cc_misc.py
@@ -13,6 +13,12 @@ def test_canonicalize_de():
assert canonicalize("BSI-DSZ-CC-0837-V2-2014-MA-01", "DE") == "BSI-DSZ-CC-0837-V2-2014-MA-01"
+def test_canonicalize_us():
+ assert canonicalize("CCEVS-VR-VID10015-2008", "US") == "CCEVS-VR-VID-10015-2008"
+ assert canonicalize("CCEVS-VR-10880-2018", "US") == "CCEVS-VR-10880-2018"
+ assert canonicalize("CCEVS-VR-04-0082", "US") == "CCEVS-VR-0082-2004"
+
+
def test_canonicalize_es():
assert canonicalize("2011-14-INF-1095-v1", "ES") == "2011-14-INF-1095"