2424)
2525
2626from ..const import (
27- COSE_ALGORITHMS_CKDM_KEY_AGREEMENT ,
2827 COSE_ALGORITHMS_CKDM_KEY_AGREEMENT_ES ,
2928 COSE_ALGORITHMS_HPKE ,
3029 COSE_ALGORITHMS_SIG_OKP ,
@@ -65,8 +64,6 @@ def __init__(self, params: Dict[int, Any]):
6564 self ._crv = params [- 1 ]
6665 if not isinstance (self ._crv , int ):
6766 raise ValueError ("crv(-1) should be int." )
68- if self ._crv not in [4 , 5 , 6 , 7 ]:
69- raise ValueError (f"Unsupported or unknown crv(-1) for OKP: { self ._crv } ." )
7067 if self ._crv in [4 , 5 ]:
7168 # if not self._alg:
7269 # raise ValueError("X25519/X448 needs alg explicitly.")
@@ -78,6 +75,11 @@ def __init__(self, params: Dict[int, Any]):
7875 self ._hash_alg = hashes .SHA256 if self ._crv == 4 else hashes .SHA512
7976 elif self ._alg is not None :
8077 raise ValueError (f"Unsupported or unknown alg used with X25519/X448: { self ._alg } ." )
78+ elif self ._crv in [6 , 7 ]:
79+ if self ._alg is not None and self ._alg != - 8 :
80+ raise ValueError (f"Unsupported or unknown alg used with Ed25519/Ed448: { self ._alg } ." )
81+ else :
82+ raise ValueError (f"Unsupported or unknown crv(-1) for OKP: { self ._crv } ." )
8183
8284 # Check the existence of the key.
8385 if - 2 not in params and - 4 not in params :
@@ -87,55 +89,82 @@ def __init__(self, params: Dict[int, Any]):
8789 if self ._key_ops :
8890 if set (self ._key_ops ) & set ([3 , 4 , 5 , 6 , 9 , 10 ]):
8991 raise ValueError ("Unknown or not permissible key_ops(4) for OKP." )
90- else :
91- if self ._crv in [4 , 5 ]:
92- self ._key_ops = [7 , 8 ] if - 4 in params else []
93- else : # self._crv in [6, 7]
94- self ._key_ops = [1 , 2 ] if - 4 in params else [2 ]
9592 if self ._alg :
9693 if self ._alg in COSE_ALGORITHMS_SIG_OKP .values ():
97- if - 4 in params :
98- # private key for signing.
99- if not (set (self ._key_ops ) & set ([1 , 2 ])):
100- raise ValueError ("Invalid key_ops for signing key." )
101- if set (self ._key_ops ) & set ([7 , 8 ]):
102- raise ValueError ("Signing key should not be used for key derivation." )
94+ if self ._key_ops :
95+ if - 4 in params :
96+ # private key for signing.
97+ if not (set (self ._key_ops ) & set ([1 , 2 ])):
98+ raise ValueError ("Invalid key_ops for signing key." )
99+ if set (self ._key_ops ) & set ([7 , 8 ]):
100+ raise ValueError ("Signing key should not be used for key derivation." )
101+ else :
102+ # public key for signing.
103+ if 2 not in self ._key_ops or len (self ._key_ops ) != 1 :
104+ raise ValueError ("Invalid key_ops for public key." )
103105 else :
104- # public key for signing.
105- if 2 not in self ._key_ops or len (self ._key_ops ) != 1 :
106- raise ValueError ("Invalid key_ops for public key." )
107- elif self ._alg in COSE_ALGORITHMS_CKDM_KEY_AGREEMENT .values ():
108- if - 4 in params :
109- # private key for key derivation.
110- if not (set (self ._key_ops ) & set ([7 , 8 ])):
111- raise ValueError ("Invalid key_ops for key derivation." )
112- if set (self ._key_ops ) & set ([1 , 2 ]):
113- raise ValueError ("Private key for ECDHE should not be used for signing." )
114- else :
115- # public key for key derivation.
116- if self ._key_ops :
117- raise ValueError ("Public key for ECDHE should not have key_ops." )
106+ self ._key_ops = [1 , 2 ] if - 4 in params else [2 ]
118107 elif self ._alg in COSE_ALGORITHMS_HPKE .values ():
119- if not (set (self ._key_ops ) & set ([7 , 8 ])):
120- raise ValueError ("Invalid key_ops for HPKE." )
108+ if self ._key_ops :
109+ if - 4 in params :
110+ # private key for key derivation.
111+ if len (self ._key_ops ) != 1 or self ._key_ops [0 ] != 8 :
112+ raise ValueError ("Invalid key_ops for HPKE private key." )
113+ else :
114+ # public key for key derivation.
115+ if len (self ._key_ops ) > 0 :
116+ raise ValueError ("Invalid key_ops for HPKE public key." )
117+ else :
118+ if - 4 in params and isinstance (self ._key_ops , list ) and len (self ._key_ops ) == 0 :
119+ raise ValueError ("Invalid key_ops for HPKE private key." )
120+ self ._key_ops = [8 ] if - 4 in params else []
121121 else :
122- raise ValueError (f"Unsupported or unknown alg(3) for OKP: { self ._alg } ." )
122+ # self._alg in COSE_ALGORITHMS_CKDM_KEY_AGREEMENT.values():
123+ if self ._key_ops :
124+ if - 4 in params :
125+ # private key for key derivation.
126+ if not (set (self ._key_ops ) & set ([7 , 8 ])):
127+ raise ValueError ("Invalid key_ops for key derivation." )
128+ if set (self ._key_ops ) & set ([1 , 2 ]):
129+ raise ValueError ("Private key for ECDHE should not be used for signing." )
130+ else :
131+ # public key for key derivation.
132+ if self ._key_ops :
133+ raise ValueError ("Public key for ECDHE should not have key_ops." )
134+ else :
135+ self ._key_ops = [7 , 8 ] if - 4 in params else []
123136 else :
124137 if - 4 in params :
125138 # private key.
126- if set (self ._key_ops ) & set ([1 , 2 ]):
127- # private key for signing.
128- if set (self ._key_ops ) & set ([7 , 8 ]):
129- raise ValueError ("OKP private key should not be used for both signing and key derivation." )
139+ if self ._crv in [4 , 5 ]: # X25519/X448
140+ if self ._key_ops :
141+ # private key for key derivation.
142+ if not (set (self ._key_ops ) & set ([7 , 8 ])):
143+ raise ValueError ("Invalid key_ops for X25519/448 private key." )
144+ if set (self ._key_ops ) & set ([1 , 2 ]):
145+ raise ValueError ("Invalid key_ops for X25519/448 private key." )
146+ else :
147+ self ._key_ops = [7 , 8 ]
148+ else : # Ed25519/Ed448
149+ if self ._key_ops :
150+ if not (set (self ._key_ops ) & set ([1 , 2 ])):
151+ raise ValueError ("Invalid key_ops for Ed25519/448 private key." )
152+ if set (self ._key_ops ) & set ([7 , 8 ]):
153+ raise ValueError ("Invalid key_ops for Ed25519/448 private key." )
154+ else :
155+ self ._key_ops = [1 , 2 ]
130156 self ._alg = - 8 # EdDSA
131157 else :
132158 # public key.
133159 if self ._crv in [4 , 5 ]: # X25519/X448
134- if len ( self ._key_ops ) != 0 and not ( set ( self ._key_ops ) & set ([ 7 , 8 ])) :
135- raise ValueError ("Invalid key_ops for public key." )
160+ if self ._key_ops is not None and len ( self ._key_ops ) != 0 :
161+ raise ValueError ("Invalid key_ops for X25519/448 public key." )
136162 else : # Ed25519/Ed448
137- if len (self ._key_ops ) != 1 or self ._key_ops [0 ] != 2 :
138- raise ValueError ("Invalid key_ops for public key." )
163+ if self ._key_ops :
164+ if len (self ._key_ops ) != 1 or self ._key_ops [0 ] != 2 :
165+ raise ValueError ("Invalid key_ops for Ed25519/448 public key." )
166+ else :
167+ self ._key_ops = [2 ]
139168 self ._alg = - 8 # EdDSA
140169
141170 if self ._alg in COSE_ALGORITHMS_CKDM_KEY_AGREEMENT_ES .values ():
0 commit comments