|
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