Skip to content

Commit 053e570

Browse files
authored
Merge pull request #97 from russhousley/add-rfc9632
Add rfc9632
2 parents a99adb5 + fd29234 commit 053e570

File tree

4 files changed

+123
-1
lines changed

4 files changed

+123
-1
lines changed

CHANGES.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ Revision 0.4.7, released DD-MMM-2025
2121
- Added RFC9883 for An Attribute for Statement of Possession of a Private Key
2222
- Updated the link to the pyasn1 project in README.md
2323
- Correct the URL to the license file in rfc8295.py
24-
24+
- Add RFC9632 providing CMS Content Type for Geofeed Data (replaces RFC9092)
25+
2526
Revision 0.4.6, released 25-MAR-2025
2627
------------------------------------
2728
- Added RFC9688 for SHA3 One-way Hash Functions in the CMS

pyasn1_alt_modules/rfc9632.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#
2+
# This file is part of pyasn1-alt-modules software.
3+
#
4+
# Created by Russ Housley.
5+
#
6+
# Copyright (c) 2021-2025, Vigil Security, LLC
7+
# License: http://vigilsec.com/pyasn1-alt-modules-license.txt
8+
#
9+
# Digital Signatures on geofeed data
10+
#
11+
# ASN.1 source from:
12+
# https://www.rfc-editor.org/rfc/rfc9092.txt
13+
# https://www.rfc-editor.org/rfc/rfc9632.txt
14+
#
15+
16+
from pyasn1_alt_modules import rfc9092
17+
18+
19+
# Imports from RFC 9092
20+
21+
id_ct = rfc9092.id_ct
22+
23+
id_ct_geofeedCSVwithCRLF = rfc9092.id_ct_geofeedCSVwithCRLF
24+
25+
26+
# No need to update the CMS Content Type Map; the import of rfc9092 did it

tests/__main__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@
189189
'tests.test_rfc9598.suite',
190190
'tests.test_rfc9608.suite',
191191
'tests.test_rfc9629.suite',
192+
'tests.test_rfc9632.suite',
192193
'tests.test_rfc9654.suite',
193194
'tests.test_rfc9688.suite',
194195
'tests.test_rfc9690.suite',

tests/test_rfc9632.py

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
#
2+
# This file is part of pyasn1-alt-modules software.
3+
#
4+
# Created by Russ Housley
5+
# Copyright (c) 2020-2025, Vigil Security, LLC
6+
# License: http://vigilsec.com/pyasn1-alt-modules-license.txt
7+
#
8+
import sys
9+
import unittest
10+
11+
from pyasn1.codec.der.decoder import decode as der_decoder
12+
from pyasn1.codec.der.encoder import encode as der_encoder
13+
from pyasn1.type import univ
14+
15+
from pyasn1_alt_modules import pem
16+
from pyasn1_alt_modules import rfc5652
17+
from pyasn1_alt_modules import rfc9632
18+
19+
20+
class GeofeedCSVTestCase(unittest.TestCase):
21+
pem_text = """\
22+
MIIGlwYJKoZIhvcNAQcCoIIGiDCCBoQCAQMxDTALBglghkgBZQMEAgEwDQYLKoZ
23+
IhvcNAQkQAS+gggSxMIIErTCCA5WgAwIBAgIUJ605QIPX8rW5m4Zwx3WyuW7hZu
24+
MwDQYJKoZIhvcNAQELBQAwMzExMC8GA1UEAxMoM0FDRTJDRUY0RkIyMUI3RDExR
25+
TNFMTg0RUZDMUUyOTdCMzc3ODY0MjAeFw0yMDA5MDMxOTA1MTdaFw0yMTA2MzAx
26+
OTA1MTdaMDMxMTAvBgNVBAMTKDkxNDY1MkEzQkQ1MUMxNDQyNjAxOTg4ODlGNUM
27+
0NUFCRjA1M0ExODcwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCycT
28+
QrOb/qB2W3i3Ki8PhA/DEWyii2TgGo9pgCwO9lsIRI6Zb/k+aSiWWP9kSczlcQg
29+
tPCVwr62hTQZCIowBN0BL0cK0/5k1imJdi5qdM3nvKswM8CnoR11vB8pQFwruZm
30+
r5xphXRvE+mzuJVLgu2V1upmBXuWloeymudh6WWJ+GDjwPXO3RiXBejBrOFNXha
31+
FLe08y4DPfr/S/tXJOBm7QzQptmbPLYtGfprYu45liFFqqP94UeLpISfXd36AKG
32+
zqTFCcc3EW9l5UFE1MFLlnoEogqtoLoKABt0IkOFGKeC/EgeaBdWLe469ddC9rQ
33+
ft5w6g6cmxG+aYDdIEB34zrAgMBAAGjggG3MIIBszAdBgNVHQ4EFgQUkUZSo71R
34+
wUQmAZiIn1xFq/BToYcwHwYDVR0jBBgwFoAUOs4s70+yG30R4+GE78Hil7N3hkI
35+
wDAYDVR0TAQH/BAIwADAOBgNVHQ8BAf8EBAMCB4AwGAYDVR0gAQH/BA4wDDAKBg
36+
grBgEFBQcOAjBhBgNVHR8EWjBYMFagVKBShlByc3luYzovL3Jwa2kuZXhhbXBsZ
37+
S5uZXQvcmVwb3NpdG9yeS8zQUNFMkNFRjRGQjIxQjdEMTFFM0UxODRFRkMxRTI5
38+
N0IzNzc4NjQyLmNybDBsBggrBgEFBQcBAQRgMF4wXAYIKwYBBQUHMAKGUHJzeW5
39+
jOi8vcnBraS5leGFtcGxlLm5ldC9yZXBvc2l0b3J5LzNBQ0UyQ0VGNEZCMjFCN0
40+
QxMUUzRTE4NEVGQzFFMjk3QjM3Nzg2NDIuY2VyMCEGCCsGAQUFBwEHAQH/BBIwE
41+
DAGBAIAAQUAMAYEAgACBQAwRQYIKwYBBQUHAQsEOTA3MDUGCCsGAQUFBzANhilo
42+
dHRwczovL3JyZHAuZXhhbXBsZS5uZXQvbm90aWZpY2F0aW9uLnhtbDANBgkqhki
43+
G9w0BAQsFAAOCAQEABR2T0qT2V1ZlsZjj+yHPTArIVBECZFSCdP+bJTse85TqYi
44+
blMsNS9yEu2SNbaZMNLuSSiAffYooh4nIYq/Rh6+xGs1n427JZUokoeLtY0UUb2
45+
fIsua9JFo8YGTnpqDMGe+xnpbJ0SCSoBlJCIj+b+YS8WXjEHt2KW6wyA/BcNS8a
46+
dS2pEUwC2cs/WcwzgbttnkcnG7/wkrQ3oqzpC1arKelyz7PGIIXJGy9nF8C3/aa
47+
aEpHd7UgIyvXYuCY/lqWTm97jDxgGIYGC7660mtfOMkB8YF6kUU+td2dDQsMztc
48+
OxbzqiGnicmeJfBwG2li6O0vorW4d5iIOTKpQyqfh45TGCAaowggGmAgEDgBSRR
49+
lKjvVHBRCYBmIifXEWr8FOhhzALBglghkgBZQMEAgGgazAaBgkqhkiG9w0BCQMx
50+
DQYLKoZIhvcNAQkQAS8wHAYJKoZIhvcNAQkFMQ8XDTIwMDkxMzE4NDUxMFowLwY
51+
JKoZIhvcNAQkEMSIEICvi8p5S8ckg2wTRhDBQzGijjyqs5T6I+4VtBHypfcEWMA
52+
0GCSqGSIb3DQEBAQUABIIBAHUrA4PaJG42BD3hpF8U0usnV3Dg5NQh97SfyKTk7
53+
YHhhwu/936gkmAew8ODRTCddMvMObWkjj7/XeR+WKffaTF1EAdZ1L6REV+GlV91
54+
cYnFkT9ldn4wHQnNNncfAehk5PClYUUQ0gqjdJT1hdaolT83b3ttekyYIiwPmHE
55+
xRaNkSvKenlNqcriaaf3rbQy9dc2d1KxrL2429n134ICqjKeRnHkXXrCWDmyv/3
56+
imwYkXpiMxw44EZqDjl36MiWsRDLdgoijBBcGbibwyAfGeR46k5raZCGvxG+4xa
57+
O8PDTxTfIYwAnBjRBKAqAZ7yX5xHfm58jUXsZJ7Ileq1S7G6Kk=
58+
"""
59+
60+
def setUp(self):
61+
self.asn1Spec = rfc5652.ContentInfo()
62+
63+
def testDerCodec(self):
64+
substrate = pem.readBase64fromText(self.pem_text)
65+
asn1Object, rest = der_decoder(substrate, asn1Spec=self.asn1Spec)
66+
self.assertFalse(rest)
67+
self.assertTrue(asn1Object.prettyPrint())
68+
self.assertEqual(substrate, der_encoder(asn1Object))
69+
70+
assert asn1Object['contentType'] == rfc5652.id_signedData
71+
sd, rest = der_decoder(asn1Object['content'],
72+
asn1Spec=rfc5652.SignedData())
73+
self.assertFalse(rest)
74+
self.assertTrue(sd.prettyPrint())
75+
self.assertEqual(asn1Object['content'], der_encoder(sd))
76+
77+
found = False
78+
for sa in sd['signerInfos'][0]['signedAttrs']:
79+
if sa['attrType'] == rfc5652.id_contentType:
80+
ct, rest = der_decoder(sa['attrValues'][0],
81+
asn1Spec=rfc5652.ContentType())
82+
self.assertFalse(rest)
83+
self.assertTrue(ct.prettyPrint())
84+
self.assertEqual(sa['attrValues'][0], der_encoder(ct))
85+
self.assertEqual(rfc9632.id_ct_geofeedCSVwithCRLF, ct)
86+
found = True
87+
88+
assert found
89+
90+
91+
suite = unittest.TestLoader().loadTestsFromModule(sys.modules[__name__])
92+
93+
if __name__ == '__main__':
94+
unittest.TextTestRunner(verbosity=2).run(suite)

0 commit comments

Comments
 (0)