LONGBOW_TEST_CASE(CreateAcquireRelease, CreateRelease)
{
    PARCSymmetricKeySigner *instance = _createSigner();

    assertNotNull(instance, "Expected non-null result from parcSymmetricKeySigner_Create();");

    parcObjectTesting_AssertAcquireReleaseContract(parcSymmetricKeySigner_Acquire, instance);

    parcSymmetricKeySigner_Release(&instance);
    assertNull(instance, "Expected null result from parcSymmetricKeySigner_Release();");
}
PARCSigner *
ccnxValidationHmacSha256_CreateSigner(PARCBuffer *secretKey)
{
    PARCSymmetricKeyStore *keyStore = parcSymmetricKeyStore_Create(secretKey);
    PARCSymmetricKeySigner *symmetricSigner = parcSymmetricKeySigner_Create(keyStore, PARC_HASH_SHA256);
    parcSymmetricKeyStore_Release(&keyStore);

    PARCSigner *signer = parcSigner_Create(symmetricSigner, PARCSymmetricKeySignerAsSigner);
    parcSymmetricKeySigner_Release(&symmetricSigner);

    return signer;
}
PARCSigner *
component_Codec_GetSigner(RtaConnection *conn)
{
    PARCSigner *signer = NULL;

    SignerType signertype = signer_GetImplementationType(rtaConnection_GetParameters(conn));

    switch (signertype) {
    case SignerType_SymmetricKeySigner: {
        struct symmetrickeysigner_params params;
        bool success = symmetricKeySigner_GetConnectionParams(rtaConnection_GetParameters(conn), &params);
        assertTrue(success, "Could not retrieve symmetricKeySigner_GetConnectionParams");

        PARCSymmetricKeyStore *symmetricKeyStore = parcSymmetricKeyStore_OpenFile(params.filename, params.password, PARCCryptoHashType_SHA256);
        PARCSymmetricKeySigner *symmetricKeySigner = parcSymmetricKeySigner_Create(symmetricKeyStore, PARCCryptoHashType_SHA256);
        parcSymmetricKeyStore_Release(&symmetricKeyStore);

        signer = parcSigner_Create(symmetricKeySigner, PARCSymmetricKeySignerAsSigner);
        parcSymmetricKeySigner_Release(&symmetricKeySigner);
        assertNotNull(signer, "got null opening FileKeystore '%s'\n", params.filename);
        break;
    }

    case SignerType_PublicKeySigner: {
        struct publickeysigner_params params;
        bool success = publicKeySigner_GetConnectionParams(rtaConnection_GetParameters(conn), &params);
        assertTrue(success, "Could not retrieve publicKeySigner_GetConnectionParams");

        PARCPkcs12KeyStore *pkcs12KeyStore = parcPkcs12KeyStore_Open(params.filename, params.password, PARCCryptoHashType_SHA256);
        PARCKeyStore *keyStore = parcKeyStore_Create(pkcs12KeyStore, PARCPkcs12KeyStoreAsKeyStore);
        parcPkcs12KeyStore_Release(&pkcs12KeyStore);
        PARCPublicKeySigner *publicKeySigner = parcPublicKeySigner_Create(keyStore, PARCSigningAlgorithm_RSA, PARCCryptoHashType_SHA256);
        parcKeyStore_Release(&keyStore);

        signer = parcSigner_Create(publicKeySigner, PARCPublicKeySignerAsSigner);
        parcPublicKeySigner_Release(&publicKeySigner);
        assertNotNull(signer, "got null opening FileKeystore '%s'\n", params.filename);
        break;
    }

    default:
        assertTrue(0, "Unsupported signer type %d", signertype);
    }

    assertNotNull(signer, "Did not match a known signer");
    return signer;
}