function versioning / ABI locks / dependency public keys ======================================================== Alternative 1: combine public keys and ABI locks into one hash -------------------------------------------------------------- "Client" module: \depends some_module 1.0.0 lock 029f87e3d80f8fd9b1be67c7426b4cc1 \depends other_module 1.0.0 lock 26d4e06132b69f18a628a82c165b2027 Library module: \pubkey mykey1.gpg 6bd69125a7bd052366467d3b0d17fef7 \pubkey mykey2.gpg d106e5ca9fcc1fc53b9eace6cc5fffc7 \lock 1.0.0 mykey1.gpg 029f87e3d80f8fd9b1be67c7426b4cc1 The lock hash is based on these things: - module name - module version - public key fingerprint(s) - ABI lock Hashed twice, perhaps using SHA-256. Then truncated to 128 bits (32 bytes) Advantages: - Only one hash - Hash is truncated and quite short Disadvantages: - Only one author key's fingerprint is included in hash - Cannot switch implementation (at least not without added functionality) - Needs a separate key file Alternative 2: Separate public keys and ABI locks ------------------------------------------------- "Client" module: \depends some_module 1.0.0 lock 029f87e3d80f8fd9b1be67c7426b4cc1 pubkey johndoe1 \pubkey johndoe1 19c358d6d876d82e19b4bfc8256ba6c1ef6ba2f71a40f336077039a3ae06fe6f Library module: \pubkey johndoe1 19c358d6d876d82e19b4bfc8256ba6c1ef6ba2f71a40f336077039a3ae06fe6f \lock 1.0.0 johndoe1 029f87e3d80f8fd9b1be67c7426b4cc1 Alternative 3: Only hashes, with pubkeys part of "ABI" ------------------------------------------------------ With this syntax, the \version attribute can occur multiple times. "Client" module: \depends some_module 1.0.0 lock 029f87e3d80f8fd9b1be67c7426b4cc1 Library module: \pubkey johndoe 19c358d6d876d82e19b4bfc8256ba6c1ef6ba2f71a40f336077039a3ae06fe6f since 0.9.2 \pubkey jane 81408cb2b977d38c99de36c08c919f9a3d70aa2ce33561c1ac99da27a94c1f64 since 0.9.1 \version 1.0.0 lock 029f87e3d80f8fd9b1be67c7426b4cc1 \version 0.9.2 lock 6283fec2a4024bbf5d5f076a490d8926 \version 0.9.1 lock d3b4d33a5fe4e6d97bd244e87e9e01c7 \sign 1.0.0 johndoe c7057d1d51bf01f5b79473741ad54741d8f3c94260d812000acf05592efaca10 \sign 0.9.2 johndoe 9b3fb134fb43e5d0050ac2686d32fdbc4016007db675d8e01baaed677a4801ec \sign 0.9.1 jane 240a346171ac4887568219842b42120a699f0771f684738034cef94dd3675a08 Signatures should be on the full 256-bit lock (non-truncated version) The implementation should also be signed, but the signature is not included in the interface file.