|
23 | 23 | sys.path.append(SOURCE_PATH) |
24 | 24 |
|
25 | 25 | import c2pa.c2pa as api |
26 | | -#from c2pa import Error, SigningAlg, version, sdk_version |
27 | 26 |
|
28 | 27 | # This module provides a simple Python API for the C2PA library. |
29 | 28 |
|
@@ -134,7 +133,6 @@ def sign_file(self, signer, sourcePath, outputPath): |
134 | 133 | return super().sign_file(signer, sourcePath, outputPath) |
135 | 134 |
|
136 | 135 |
|
137 | | - |
138 | 136 | # Implements a C2paStream given a stream handle |
139 | 137 | # This is used to pass a file handle to the c2pa library |
140 | 138 | # It is used by the Reader and Builder classes internally |
@@ -166,6 +164,7 @@ def flush_stream(self) -> None: |
166 | 164 | def open_file(path: str, mode: str) -> api.Stream: |
167 | 165 | return C2paStream(open(path, mode)) |
168 | 166 |
|
| 167 | + |
169 | 168 | # Internal class to implement signer callbacks |
170 | 169 | # We need this because the callback expects a class with a sign method |
171 | 170 | class SignerCallback(api.SignerCallback): |
@@ -193,7 +192,37 @@ def __init__(self, callback): |
193 | 192 | def create_signer(callback, alg, certs, timestamp_url=None): |
194 | 193 | return api.CallbackSigner(SignerCallback(callback), alg, certs, timestamp_url) |
195 | 194 |
|
196 | | - |
| 195 | +# Because we "share" SigningAlg enum in-between bindings, |
| 196 | +# seems we need to manually coerce the enum types, |
| 197 | +# like unffi itself does too |
| 198 | +def convert_to_alg(alg): |
| 199 | + match str(alg): |
| 200 | + case "SigningAlg.ES256": |
| 201 | + return api.SigningAlg.ES256 |
| 202 | + case "SigningAlg.ES384": |
| 203 | + return api.SigningAlg.ES384 |
| 204 | + case "SigningAlg.ES512": |
| 205 | + return api.SigningAlg.ES512 |
| 206 | + case "SigningAlg.PS256": |
| 207 | + return api.SigningAlg.PS256 |
| 208 | + case "SigningAlg.PS384": |
| 209 | + return api.SigningAlg.PS384 |
| 210 | + case "SigningAlg.PS512": |
| 211 | + return api.SigningAlg.PS512 |
| 212 | + case "SigningAlg.ED25519": |
| 213 | + return api.SigningAlg.ED25519 |
| 214 | + case _: |
| 215 | + raise ValueError("Unsupported signing algorithm: " + str(alg)) |
| 216 | + |
| 217 | +# Creates a special case signer that uses direct COSE handling |
| 218 | +# The callback signer should also define the signing algorithm to use |
| 219 | +# And a way to find out the needed reserve size |
| 220 | +def create_remote_signer(callback): |
| 221 | + return api.CallbackSigner.new_from_signer( |
| 222 | + callback, |
| 223 | + convert_to_alg(callback.alg()), |
| 224 | + callback.reserve_size() |
| 225 | + ) |
197 | 226 |
|
198 | 227 | # Example of using openssl in an os shell to sign data using Ps256 |
199 | 228 | # Note: the openssl command line tool must be installed for this to work |
|
0 commit comments