@@ -78,16 +78,69 @@ class CryptoPrimitive(str, Enum):
7878 KDF = 'kdf'
7979 KEM = 'kem'
8080 KEY_AGREE = 'key-agree'
81+ KEY_WRAP = 'key-wrap' # since CDX1.7
8182 MAC = 'mac'
8283 PKE = 'pke'
8384 SIGNATURE = 'signature'
8485 STREAM_CIPHER = 'stream-cipher'
8586 XOF = 'xof'
86-
87+ # --
8788 OTHER = 'other'
8889 UNKNOWN = 'unknown'
8990
9091
92+ class _CryptoPrimitiveSerializationHelper (serializable .helpers .BaseHelper ):
93+ """ THIS CLASS IS NON-PUBLIC API """
94+
95+ __CASES : dict [type [serializable .ViewType ], frozenset [CryptoPrimitive ]] = dict ()
96+ __CASES [SchemaVersion1Dot6 ] = frozenset ({
97+ CryptoPrimitive .AE ,
98+ CryptoPrimitive .BLOCK_CIPHER ,
99+ CryptoPrimitive .COMBINER ,
100+ CryptoPrimitive .DRBG ,
101+ CryptoPrimitive .HASH ,
102+ CryptoPrimitive .KDF ,
103+ CryptoPrimitive .KEM ,
104+ CryptoPrimitive .KEY_AGREE ,
105+ CryptoPrimitive .MAC ,
106+ CryptoPrimitive .PKE ,
107+ CryptoPrimitive .SIGNATURE ,
108+ CryptoPrimitive .STREAM_CIPHER ,
109+ CryptoPrimitive .XOF ,
110+ CryptoPrimitive .OTHER ,
111+ CryptoPrimitive .UNKNOWN ,
112+ })
113+ __CASES [SchemaVersion1Dot7 ] = __CASES [SchemaVersion1Dot6 ] | {
114+ CryptoPrimitive .KEY_WRAP ,
115+ }
116+
117+ @classmethod
118+ def __normalize (cls , cp : CryptoPrimitive , view : type [serializable .ViewType ]) -> str :
119+ return (
120+ cp
121+ if cp in cls .__CASES .get (view , ())
122+ else CryptoPrimitive .OTHER
123+ ).value
124+
125+ @classmethod
126+ def json_normalize (cls , o : Any , * ,
127+ view : Optional [type [serializable .ViewType ]],
128+ ** __ : Any ) -> str :
129+ assert view is not None
130+ return cls .__normalize (o , view )
131+
132+ @classmethod
133+ def xml_normalize (cls , o : Any , * ,
134+ view : Optional [type [serializable .ViewType ]],
135+ ** __ : Any ) -> str :
136+ assert view is not None
137+ return cls .__normalize (o , view )
138+
139+ @classmethod
140+ def deserialize (cls , o : Any ) -> CryptoPrimitive :
141+ return CryptoPrimitive (o )
142+
143+
91144@serializable .serializable_enum
92145class CryptoExecutionEnvironment (str , Enum ):
93146 """
@@ -303,6 +356,7 @@ def __init__(
303356 self .nist_quantum_security_level = nist_quantum_security_level
304357
305358 @property
359+ @serializable .type_mapping (_CryptoPrimitiveSerializationHelper )
306360 @serializable .xml_sequence (1 )
307361 def primitive (self ) -> Optional [CryptoPrimitive ]:
308362 """
0 commit comments