aboutsummaryrefslogtreecommitdiffstats
path: root/libparc/parc/security/parc_Signer.c
diff options
context:
space:
mode:
authorLuca Muscariello <lumuscar+fdio@cisco.com>2017-02-23 17:01:02 +0100
committerLuca Muscariello <lumuscar+fdio@cisco.com>2017-02-23 17:21:02 +0100
commitec688b4723a041044226358bcd4dd6e2da39da49 (patch)
tree3a244c48d1eb9e4d90f9050fd1a61ae5c0327526 /libparc/parc/security/parc_Signer.c
parent9b30fc10fb1cbebe651e5a107e8ca5b24de54675 (diff)
Initial commit: cframework. Longbow and Libparc
Change-Id: I90378dbd30da6033b20fb1f829b3b822cf366c59 Signed-off-by: Luca Muscariello <lumuscar+fdio@cisco.com>
Diffstat (limited to 'libparc/parc/security/parc_Signer.c')
-rw-r--r--libparc/parc/security/parc_Signer.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/libparc/parc/security/parc_Signer.c b/libparc/parc/security/parc_Signer.c
new file mode 100644
index 00000000..2135070c
--- /dev/null
+++ b/libparc/parc/security/parc_Signer.c
@@ -0,0 +1,160 @@
+/*
+ * Copyright (c) 2017 Cisco and/or its affiliates.
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ */
+#include <config.h>
+#include <stdio.h>
+
+#include <LongBow/runtime.h>
+
+#include <parc/algol/parc_Memory.h>
+#include <parc/algol/parc_Object.h>
+
+#include <parc/security/parc_Signer.h>
+#include <parc/security/parc_KeyStore.h>
+
+struct parc_signer {
+ PARCObject *instance;
+ PARCSigningInterface *interface;
+};
+
+static bool
+_parcSigner_FinalRelease(PARCSigner **signerPtr)
+{
+ PARCSigner *signer = *signerPtr;
+ if (signer->instance != NULL) {
+ parcObject_Release(&(signer->instance));
+ }
+ return true;
+}
+
+void
+parcSigner_AssertValid(const PARCSigner *signer)
+{
+ assertNotNull(signer, "Parameter must be non-null PARCSigner");
+}
+
+parcObject_ImplementAcquire(parcSigner, PARCSigner);
+parcObject_ImplementRelease(parcSigner, PARCSigner);
+
+parcObject_Override(PARCSigner, PARCObject,
+ .destructor = (PARCObjectDestructor *) _parcSigner_FinalRelease);
+
+PARCSigner *
+parcSigner_Create(PARCObject *instance, PARCSigningInterface *interfaceContext)
+{
+ assertNotNull(interfaceContext, "Parameter must be non-null implementation pointer");
+
+ PARCSigner *signer = parcObject_CreateInstance(PARCSigner);
+ if (signer != NULL) {
+ signer->instance = parcObject_Acquire(instance);
+ signer->interface = interfaceContext;
+ }
+ return signer;
+}
+
+PARCKey *
+parcSigner_CreatePublicKey(PARCSigner *signer)
+{
+ PARCKeyStore *keyStore = parcSigner_GetKeyStore(signer);
+
+ PARCCryptoHash *hash = parcKeyStore_GetVerifierKeyDigest(keyStore);
+
+ PARCKeyId *keyid = parcKeyId_Create(parcCryptoHash_GetDigest(hash));
+ parcCryptoHash_Release(&hash);
+
+ PARCBuffer *derEncodedKey = parcKeyStore_GetDEREncodedPublicKey(keyStore);
+
+ PARCKey *key = parcKey_CreateFromDerEncodedPublicKey(keyid,
+ parcSigner_GetSigningAlgorithm(signer),
+ derEncodedKey);
+
+ parcBuffer_Release(&derEncodedKey);
+ parcKeyId_Release(&keyid);
+
+ return key;
+}
+
+PARCKeyId *
+parcSigner_CreateKeyId(const PARCSigner *signer)
+{
+ PARCCryptoHash *hash = parcKeyStore_GetVerifierKeyDigest(parcSigner_GetKeyStore(signer));
+ PARCBuffer *keyidBytes = parcCryptoHash_GetDigest(hash);
+ PARCKeyId *result = parcKeyId_Create(keyidBytes);
+
+ parcCryptoHash_Release(&hash);
+ return result;
+}
+
+PARCCryptoHasher *
+parcSigner_GetCryptoHasher(const PARCSigner *signer)
+{
+ parcSigner_OptionalAssertValid(signer);
+
+ return signer->interface->GetCryptoHasher(signer->instance);
+}
+
+PARCSignature *
+parcSigner_SignDigest(const PARCSigner *signer, const PARCCryptoHash *parcDigest)
+{
+ parcSigner_OptionalAssertValid(signer);
+
+ assertNotNull(parcDigest, "parcDigest to sign must not be null");
+ return signer->interface->SignDigest(signer->instance, parcDigest);
+}
+
+PARCSignature *
+parcSigner_SignBuffer(const PARCSigner *signer, const PARCBuffer *buffer)
+{
+ parcSigner_OptionalAssertValid(signer);
+ assertNotNull(buffer, "buffer to sign must not be null");
+
+ PARCCryptoHashType hashType = parcSigner_GetCryptoHashType(signer);
+ PARCCryptoHasher *hasher = parcCryptoHasher_Create(hashType);
+ parcCryptoHasher_Init(hasher);
+ parcCryptoHasher_UpdateBuffer(hasher, buffer);
+ PARCCryptoHash *hash = parcCryptoHasher_Finalize(hasher);
+ parcCryptoHasher_Release(&hasher);
+
+ PARCSignature *signature = parcSigner_SignDigest(signer, hash);
+ parcCryptoHash_Release(&hash);
+
+ return signature;
+}
+
+PARCSigningAlgorithm
+parcSigner_GetSigningAlgorithm(PARCSigner *signer)
+{
+ parcSigner_OptionalAssertValid(signer);
+
+ return signer->interface->GetSigningAlgorithm(signer->instance);
+}
+
+PARCCryptoHashType
+parcSigner_GetCryptoHashType(const PARCSigner *signer)
+{
+ parcSigner_OptionalAssertValid(signer);
+
+ return signer->interface->GetCryptoHashType(signer->instance);
+}
+
+PARCKeyStore *
+parcSigner_GetKeyStore(const PARCSigner *signer)
+{
+ parcSigner_OptionalAssertValid(signer);
+
+ return signer->interface->GetKeyStore(signer->instance);
+}