-
-/* Accelerate private key */
-
-SILC_PKCS_ALG_IMPORT_PRIVATE_KEY(silc_softacc_acc_private_key)
-{
- SilcSoftaccPrivateKey privkey;
-
- if (!sa) {
- SILC_LOG_ERROR(("Software accelerator not initialized"));
- return FALSE;
- }
-
- privkey = silc_calloc(1, sizeof(*privkey));
- if (!privkey)
- return FALSE;
- privkey->key = key;
-
- *ret_private_key = privkey;
-
- return TRUE;
-}
-
-/* Free public key */
-
-SILC_PKCS_ALG_PUBLIC_KEY_FREE(silc_softacc_free_public_key)
-{
- silc_free(public_key);
-}
-
-/* Free private key */
-
-SILC_PKCS_ALG_PRIVATE_KEY_FREE(silc_softacc_free_private_key)
-{
- silc_free(private_key);
-}
-
-/* Accelerated encrypt */
-
-SILC_PKCS_ALG_ENCRYPT(silc_softacc_encrypt)
-{
- SilcSoftaccPublicKey pubkey = public_key;
- SilcStack stack;
- SilcSoftaccExec e;
-
- SILC_LOG_DEBUG(("Encrypt"));
-
- if (!sa) {
- SILC_LOG_ERROR(("Software accelerator not initialized"));
- encrypt_cb(FALSE, NULL, 0, context);
- return NULL;
- }
-
- stack = silc_stack_alloc(2048, silc_crypto_stack());
-
- e = silc_scalloc(stack, 1, sizeof(*e));
- if (!e) {
- silc_stack_free(stack);
- encrypt_cb(FALSE, NULL, 0, context);
- return NULL;
- }
-
- silc_stack_push(stack, NULL);
-
- e->stack = stack;
- e->type = SILC_SOFTACC_ENCRYPT;
- e->src = silc_smemdup(stack, src, src_len);
- e->src_len = src_len;
- e->rng = rng;
- e->key.public_key = pubkey->key;
- e->cb.encrypt_cb = encrypt_cb;
- e->context = context;
- silc_async_init(&e->op, silc_softacc_abort, NULL, e);
-
- /* Run */
- silc_thread_pool_run(sa->tp, TRUE, sa->schedule, silc_softacc_thread, e,
- silc_softacc_completion, e);
-
- return &e->op;
-}
-
-/* Acceleted decrypt */
-
-SILC_PKCS_ALG_DECRYPT(silc_softacc_decrypt)
-{
- SilcSoftaccPrivateKey privkey = private_key;
- SilcStack stack;
- SilcSoftaccExec e;
-
- SILC_LOG_DEBUG(("Decrypt"));
-
- if (!sa) {
- SILC_LOG_ERROR(("Software accelerator not initialized"));
- decrypt_cb(FALSE, NULL, 0, context);
- return NULL;
- }
-
- stack = silc_stack_alloc(2048, silc_crypto_stack());
-
- e = silc_scalloc(stack, 1, sizeof(*e));
- if (!e) {
- silc_stack_free(stack);
- decrypt_cb(FALSE, NULL, 0, context);
- return NULL;
- }
-
- silc_stack_push(stack, NULL);
-
- e->stack = stack;
- e->type = SILC_SOFTACC_DECRYPT;
- e->src = silc_smemdup(stack, src, src_len);
- e->src_len = src_len;
- e->key.private_key = privkey->key;
- e->cb.decrypt_cb = decrypt_cb;
- e->context = context;
- silc_async_init(&e->op, silc_softacc_abort, NULL, e);
-
- /* Run */
- silc_thread_pool_run(sa->tp, TRUE, sa->schedule, silc_softacc_thread, e,
- silc_softacc_completion, e);
-
- return &e->op;
-}
-
-/* Accelerated signature */
-
-SILC_PKCS_ALG_SIGN(silc_softacc_sign)
-{
- SilcSoftaccPrivateKey privkey = private_key;
- SilcStack stack;
- SilcSoftaccExec e;
-
- SILC_LOG_DEBUG(("Sign"));
-
- if (!sa) {
- SILC_LOG_ERROR(("Software accelerator not initialized"));
- sign_cb(FALSE, NULL, 0, context);
- return NULL;
- }
-
- stack = silc_stack_alloc(2048, silc_crypto_stack());
-
- e = silc_scalloc(stack, 1, sizeof(*e));
- if (!e) {
- silc_stack_free(stack);
- sign_cb(FALSE, NULL, 0, context);
- return NULL;
- }
-
- silc_stack_push(stack, NULL);
-
- e->stack = stack;
- e->type = SILC_SOFTACC_SIGN;
- e->rng = rng;
- e->src = silc_smemdup(stack, src, src_len);
- e->src_len = src_len;
- e->compute_hash = compute_hash;
- e->hash = hash;
- e->key.private_key = privkey->key;
- e->cb.sign_cb = sign_cb;
- e->context = context;
- silc_async_init(&e->op, silc_softacc_abort, NULL, e);
-
- /* Run */
- silc_thread_pool_run(sa->tp, TRUE, sa->schedule, silc_softacc_thread, e,
- silc_softacc_completion, e);
-
- return &e->op;
-}
-
-/* Accelerated verification */
-
-SILC_PKCS_ALG_VERIFY(silc_softacc_verify)
-{
- SilcSoftaccPublicKey pubkey = public_key;
- SilcStack stack;
- SilcSoftaccExec e;
-
- SILC_LOG_DEBUG(("Verify"));
-
- if (!sa) {
- SILC_LOG_ERROR(("Software accelerator not initialized"));
- verify_cb(FALSE, context);
- return NULL;
- }
-
- stack = silc_stack_alloc(2048, silc_crypto_stack());
-
- e = silc_scalloc(stack, 1, sizeof(*e));
- if (!e) {
- silc_stack_free(stack);
- verify_cb(FALSE, context);
- return NULL;
- }
-
- silc_stack_push(stack, NULL);
-
- e->stack = stack;
- e->type = SILC_SOFTACC_VERIFY;
- e->src = silc_smemdup(stack, signature, signature_len);
- e->src_len = signature_len;
- e->data = silc_smemdup(stack, data, data_len);
- e->data_len = data_len;
- e->hash = hash;
- e->key.public_key = pubkey->key;
- e->cb.verify_cb = verify_cb;
- e->context = context;
- silc_async_init(&e->op, silc_softacc_abort, NULL, e);
-
- /* Run */
- silc_thread_pool_run(sa->tp, TRUE, sa->schedule, silc_softacc_thread, e,
- silc_softacc_completion, e);
-
- return &e->op;
-}