+ private_key->pkcs->private_key_free(private_key->private_key);
+}
+
+/* Encrypts */
+
+SilcBool silc_pkcs_encrypt(SilcPublicKey public_key,
+ unsigned char *src, SilcUInt32 src_len,
+ unsigned char *dst, SilcUInt32 dst_size,
+ SilcUInt32 *dst_len, SilcRng rng)
+{
+ return public_key->pkcs->encrypt(public_key->public_key, src, src_len,
+ dst, dst_size, dst_len, rng);
+}
+
+/* Decrypts */
+
+SilcBool silc_pkcs_decrypt(SilcPrivateKey private_key,
+ unsigned char *src, SilcUInt32 src_len,
+ unsigned char *dst, SilcUInt32 dst_size,
+ SilcUInt32 *dst_len)
+{
+ return private_key->pkcs->decrypt(private_key->private_key, src, src_len,
+ dst, dst_size, dst_len);
+}
+
+/* Generates signature */
+
+SilcBool silc_pkcs_sign(SilcPrivateKey private_key,
+ unsigned char *src, SilcUInt32 src_len,
+ unsigned char *dst, SilcUInt32 dst_size,
+ SilcUInt32 *dst_len, SilcHash hash)
+{
+ return private_key->pkcs->sign(private_key->private_key, src, src_len,
+ dst, dst_size, dst_len, hash);
+}
+
+/* Verifies signature */
+
+SilcBool silc_pkcs_verify(SilcPublicKey public_key,
+ unsigned char *signature,
+ SilcUInt32 signature_len,
+ unsigned char *data,
+ SilcUInt32 data_len, SilcHash hash)
+{
+ return public_key->pkcs->verify(public_key->public_key, signature,
+ signature_len, data, data_len, hash);
+}
+
+/* Compares two public keys and returns TRUE if they are same key, and
+ FALSE if they are not same. */
+
+SilcBool silc_pkcs_public_key_compare(SilcPublicKey key1, SilcPublicKey key2)
+{
+ if (key1->pkcs->type != key2->pkcs->type)
+ return FALSE;
+
+ return key1->pkcs->public_key_compare(key1->public_key, key2->public_key);
+}
+
+/* Copies the public key indicated by `public_key' and returns new allocated
+ public key which is indentical to the `public_key'. */
+
+SilcPublicKey silc_pkcs_public_key_copy(SilcPublicKey public_key)
+{
+ SilcPublicKey key = silc_calloc(1, sizeof(*key));
+ if (!key)
+ return NULL;
+
+ key->pkcs = public_key->pkcs;
+ key->public_key = public_key->pkcs->public_key_copy(public_key->public_key);
+ if (!key->public_key) {
+ silc_free(key);
+ return NULL;
+ }
+
+ return key;
+}
+
+/* Loads any kind of public key */
+
+SilcBool silc_pkcs_load_public_key(const char *filename,
+ SilcPublicKey *ret_public_key)
+{
+ unsigned char *data;
+ SilcUInt32 data_len;
+ SilcPublicKey public_key;
+ SilcPKCSType type;
+
+ SILC_LOG_DEBUG(("Loading public key file '%s'", filename));
+
+ if (!ret_public_key)
+ return FALSE;