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;
}
static PARCSymmetricKeySigner *
_createSigner()
{
    PARCBuffer *secret_key = parcSymmetricKeyStore_CreateKey(256);

    PARCSymmetricKeyStore *symmetricKeyStore = parcSymmetricKeyStore_Create(secret_key);
    parcBuffer_Release(&secret_key);

    PARCSymmetricKeySigner *privateKeySigner = parcSymmetricKeySigner_Create(symmetricKeyStore, PARC_HASH_SHA256);
    parcSymmetricKeyStore_Release(&symmetricKeyStore);

    return privateKeySigner;
}
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;
}
static bool
_parcSymmetricKeySigner_Finalize(PARCSymmetricKeySigner **instancePtr)
{
    assertNotNull(instancePtr, "Parameter must be a non-null pointer to a PARCSymmetricKeySigner pointer.");
    PARCSymmetricKeySigner *signer = (PARCSymmetricKeySigner *) *instancePtr;
    if (signer->secretKeyHash != NULL) {
        parcCryptoHash_Release(&signer->secretKeyHash);
    }
    if (signer->hasher != NULL) {
        parcCryptoHasher_Release(&signer->hasher);
    }

    if (signer->keyStore != NULL) {
        parcSymmetricKeyStore_Release(&signer->keyStore);
    }
    if (signer->generalKeyStore != NULL) {
        parcKeyStore_Release(&signer->generalKeyStore);
    }

    return true;
}