Skip to content

Commit 4ddd086

Browse files
authored
Merge branch 'main' into feat/cycloneddx17_ProtocolPropertiesType
2 parents e02edcb + 788ced1 commit 4ddd086

1 file changed

Lines changed: 55 additions & 1 deletion

File tree

cyclonedx/model/crypto.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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
92145
class 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

Comments
 (0)