From ad151e39b5d530f17b284a3fff1250ac72c4a11e Mon Sep 17 00:00:00 2001 From: Siebren Weertman Date: Fri, 16 Dec 2022 12:23:34 +0100 Subject: [PATCH] Support fragment encoding for signing data forgot something forgot something add SignedCertificateChain cleanup fix fix --- .../latest_version/xmldsig-core-schema.exig | Bin 0 -> 2599 bytes shared/global_values.py | 2 + shared/message_handling.py | 38 ++++++++++++------ .../v2_g_ci_common_messages.py | 10 +++++ 4 files changed, 37 insertions(+), 13 deletions(-) create mode 100644 shared/exig_files/latest_version/xmldsig-core-schema.exig diff --git a/shared/exig_files/latest_version/xmldsig-core-schema.exig b/shared/exig_files/latest_version/xmldsig-core-schema.exig new file mode 100644 index 0000000000000000000000000000000000000000..90743629a01d91281f34e81a83dfe480b9f0ca4c GIT binary patch literal 2599 zcmZvaaZpoN7RJwec?k&w2oS;}A_fRSQJjYg>QD%N+AR2R;!&S z5D+)kup}51cA$c*j@_xYbedV235XFK=n@L7RNTP@Q97Mj?K;A((cjkWg zeBb%qb8k11=`?ql$L-F><*re4f4_MIKJY7f@6)!u7gNiHr{~=N7@3^=9+loeGQUi? zcJ=ILes{`6zqa=_cJnX)GJhAndPRD#wa4ReJ-IpX;K7`8Zp=9_+Ie%t<#OG0Ee<^F zzur3D*J;61sjBL#iV~`_;uuv|QC*d7tShfB^%2}Fx^Vw|;k_d90Y|a8=zg27SiEL7 zG*TZfU)&yd&L{o3tbHjg&YBdI%}%gC(wVPM+k%w&ioM381yto>qvoi|$Z8eqX7vw3 zR;-9Lz5R%GyK+XG-t;0Z;~Ynw6x7#cANRbqRva|e*1fZ$tp_63-0vvrf^DYEs3f-k z?rG29v?tN-?DBMrRN0EuoWpgd!*yB4s)Kdq-exdK+rHJ>+Ly|nCNV&<&W?fHM}syV z1GJC&*ogjd_P~Be(OR8+@msCEOmwGUzn5V{lG)kUVIQ9e$fl|)$`}N17TTt}UmS!N z<8s@~i;RLhS|Vz9%N6^X34V^@BV)-*4NQR@JB+1=r3;c2YZXCekJ;PLSDm3|T4pL) zwxFrt*#jE9@Wnbo7L%{Ke_$LQdovorcTT5>vEbs)1&qzyQgQs8k%2mu!^cXTw{FG!#fPN z=11LqNAX&HhbH2}T)4hVtkVzLe~Z}fBYVlw#-+Dwlf3iHeix`19T>EadKSapMXGD6 zO~#tKqbpxy>bFquofYhNao(3v=e|qvevXyf^Sv>~(#)!|YD~y@J9NQC9T%oo29_Zc zJx(rrDVx}xJ8E{0cMOd7dk4nX)KFEmWz{tw*J7a&j-t-l3v(CrD;9f0KFgLQb)}J0 zu1Ee1W?x6&8MDXcTbM-bR8n;mtKB~yN!;cGQWLn8e*X(KUkMis^ z_uG65)l^+M%$QD%0EC=O`6~_ZN*H5eHfUoVfIsN~*xJwy@R^7P){`Ru>@Riz#D7i# z{G`C-0COz>KEYW4LGKFyj&76#qI3dqfB6+alw}1d-o{iZ9{?b=763^O0noCCk;eWD zz<2 zrs`*=iZ$2?An;bDtYt7FVgNAf8LkVEP0T6gX=JX|Yz4?$!<-hLVD8exK!yzw02I>+ zIaSNBC~N>?4kJ}YGscl>28Egfh-_kvpGC<5DIjXG}V>R=w1zTI4{9~#{&rzW_s81OrDB` z1cJQQg(LLE!1_f#;$Fud3CE9%Ufr5^(kR!8`2)62VigmF0^Q6*^Dw=@8a;0z$$Cs5 zOml@mXb@L3Epfo0+6RpUR{*vPp}Ao|kjS9Te@C)^J;~xgM7aEi267JO?{YfVa2CD# zh}iTIBbopSh6WmZdZT z9_Db66w=a^p3V>Np5*jgRuU@PV9EmDZ!C)-=;2#2F&zFx1xr0cs2qbSwR~TG)&_#U zd@K5Ej-TLzhnvXO#QMf1T!=gJC?vNjt&A^{^beH}MwhU8W5oJIqIU?r$Ui-XZ&Dm; zd{(b?`-V73wSmfPWT%IRI*7vhzx&2uEf!%M;p!e9YUBD^wrnKG>+HV>-MkQd{XXiX zqQxu|gyN+I*4_+(J1j{Ai%Tm*+~TCDFP}A? zQ5`x?UCd{+GQgwdLEpgEC_;S<9T*W3xe z8zXD4H+}yvOY-lJQ*ypLaOc~T=-sLpaTevVQC!F#JgV`+LllM?NaO>hxK*ytOcbJ;s(YR$cY9-;!^(G3R|s` ztyXy=tp=G$PJhAW2uK38c1r>=6`BHcB-hG;ya)_=LWf7YRB{2!16$JQkrt$}kSAhA ruV;@~!-M3T(_ls7gG5P7NiL}7!(&`3S8$9=e-?>xm1fY+NEZD+m>{MN literal 0 HcmV?d00001 diff --git a/shared/global_values.py b/shared/global_values.py index a43b5b8..344106b 100755 --- a/shared/global_values.py +++ b/shared/global_values.py @@ -25,9 +25,11 @@ APP_PROTOCOL_XSD = "../shared/xsd_files/latest_version/V2G_CI_AppProtocol.xsd" COMMON_MESSAGES_XSD = "../shared/xsd_files/latest_version/V2G_CI_CommonMessages.xsd" DC_MESSAGES_XSD = "../shared/xsd_files/latest_version/V2G_CI_DC.xsd" +XMLDSIG_XSD = "../shared/xsd_files/latest_version/xmldsig-core-schema.xsd" APP_PROTOCOL_EXIG = "../shared/exig_files/latest_version/V2G_CI_AppProtocol.exig" COMMON_MESSAGES_EXIG = "../shared/exig_files/latest_version/V2G_CI_CommonMessages.exig" DC_MESSAGES_EXIG = "../shared/exig_files/latest_version/V2G_CI_DC.exig" +XMLDSIG_EXIG = "../shared/exig_files/latest_version/xmldsig-core-schema.exig" # Passphrase used to access private key. This parameter shall be stored in a secured directory. PASSPHRASE = "123456789abcdefgh" diff --git a/shared/message_handling.py b/shared/message_handling.py index 3d80afb..ccd9cbf 100755 --- a/shared/message_handling.py +++ b/shared/message_handling.py @@ -21,7 +21,7 @@ from shared.log import logger import lxml from shared.global_values import SDP_PAYLOAD_TYPES, MAX_PAYLOAD_LENGTH, APP_PROTOCOL_EXIG, COMMON_MESSAGES_EXIG, \ - DC_MESSAGES_EXIG, APP_PROTOCOL_XSD, COMMON_MESSAGES_XSD, DC_MESSAGES_XSD + DC_MESSAGES_EXIG, APP_PROTOCOL_XSD, COMMON_MESSAGES_XSD, DC_MESSAGES_XSD, XMLDSIG_XSD, XMLDSIG_EXIG import jpype import os @@ -107,10 +107,14 @@ class MessageHandler(metaclass=Singleton): dc_schema = open_exi_schema(DC_MESSAGES_EXIG) dc_grammar_cache = GrammarCache(dc_schema, options) + xmldsig_schema = open_exi_schema(XMLDSIG_EXIG) + xmldsig_grammar_cache = GrammarCache(xmldsig_schema, options) + def __init__(self): self.xml_SAP_validator = lxml.etree.XMLSchema(file=APP_PROTOCOL_XSD) self.xml_Common_validator = lxml.etree.XMLSchema(file=COMMON_MESSAGES_XSD) self.xml_DC_validator = lxml.etree.XMLSchema(file=DC_MESSAGES_XSD) + self.xml_xmldsig_validator = lxml.etree.XMLSchema(file=XMLDSIG_XSD) self.parser = XmlParser(context=XmlContext()) self.config = SerializerConfig(pretty_print=True) self.serializer = XmlSerializer(config=self.config) @@ -170,7 +174,7 @@ def is_payload_length_correct(v2gtp_message: V2GTPMessage) -> bool: # return schema @staticmethod - def encode(xml_contents: str, type_msg: str) -> str: + def encode(xml_contents: str, type_msg: str, fragment: bool = False) -> str: """Turns a human-readable string to an EXI-encoded string. Relies on Java classes. :param xml_contents: The XML string to be encoded. @@ -182,18 +186,21 @@ def encode(xml_contents: str, type_msg: str) -> str: output = None try: t = MessageHandler.transmogrifier - input = ByteArrayInputStream(contents.getBytes(Charset.forName("ASCII"))); - output = ByteArrayOutputStream(); + t.setFragment(fragment) + input = ByteArrayInputStream(contents.getBytes(Charset.forName("ASCII"))) + output = ByteArrayOutputStream() if type_msg == "SAP": - t.setGrammarCache(MessageHandler.ap_grammar_cache); + t.setGrammarCache(MessageHandler.ap_grammar_cache) elif type_msg == "Common": - t.setGrammarCache(MessageHandler.common_grammar_cache); + t.setGrammarCache(MessageHandler.common_grammar_cache) elif type_msg == "DC": - t.setGrammarCache(MessageHandler.dc_grammar_cache); + t.setGrammarCache(MessageHandler.dc_grammar_cache) + elif type_msg == "xmldsig": + t.setGrammarCache(MessageHandler.xmldsig_grammar_cache) else: raise Exception("Unknown message type") - t.setOutputStream(output); - t.encode(InputSource(input)); + t.setOutputStream(output) + t.encode(InputSource(input)) result = output.toByteArray() finally: if input: @@ -203,7 +210,7 @@ def encode(xml_contents: str, type_msg: str) -> str: return result @staticmethod - def decode(exi_contents: bytes, type_msg: str) -> str: + def decode(exi_contents: bytes, type_msg: str, fragment: bool = False) -> str: """Turns encoded EXI bytes to human-readable string. Relies on Java classes. :param exi_contents: The EXI encoded contents. @@ -217,13 +224,16 @@ def decode(exi_contents: bytes, type_msg: str) -> str: try: input = ByteArrayInputStream(exi_contents) r = MessageHandler.reader + r.setFragment(fragment) tf_handler = MessageHandler.transformer_handler if type_msg == "SAP": - r.setGrammarCache(MessageHandler.ap_grammar_cache); + r.setGrammarCache(MessageHandler.ap_grammar_cache) elif type_msg == "Common": - r.setGrammarCache(MessageHandler.common_grammar_cache); + r.setGrammarCache(MessageHandler.common_grammar_cache) elif type_msg == "DC": - r.setGrammarCache(MessageHandler.dc_grammar_cache); + r.setGrammarCache(MessageHandler.dc_grammar_cache) + elif type_msg == "xmldsig": + r.setGrammarCache(MessageHandler.xmldsig_grammar_cache) else: raise Exception("Unknown message type") @@ -309,6 +319,8 @@ def is_xml_valid(self, xml, msg_type): validator = self.xml_Common_validator elif msg_type == 'DC': validator = self.xml_DC_validator + elif msg_type == 'xmldsig': + validator = self.xml_xmldsig_validator try: validator.assertValid(xml_file) is_valid = True diff --git a/shared/xml_classes/common_messages/v2_g_ci_common_messages.py b/shared/xml_classes/common_messages/v2_g_ci_common_messages.py index 7a05cc8..eceb50c 100644 --- a/shared/xml_classes/common_messages/v2_g_ci_common_messages.py +++ b/shared/xml_classes/common_messages/v2_g_ci_common_messages.py @@ -948,6 +948,11 @@ class SignedCertificateChainType: } ) +@dataclass +class OEMProvisioningCertificateChain(SignedCertificateChainType): + class Meta: + name = "OEMProvisioningCertificateChain" + namespace = "urn:iso:std:iso:15118:-20:CommonMessages" @dataclass class SignedMeteringDataType: @@ -1463,6 +1468,11 @@ class Meta: } ) +@dataclass +class PnCAreqAuthorizationMode(PnCAreqAuthorizationModeType): + class Meta: + name = "PnC_AReqAuthorizationMode" + namespace = "urn:iso:std:iso:15118:-20:CommonMessages" @dataclass class PowerDeliveryRes(PowerDeliveryResType):