KUnifiedPush

eckey.cpp
1/*
2 SPDX-FileCopyrightText: 2025 Volker Krause <vkrause@kde.org>
3 SPDX-License-Identifier: LGPL-2.0-or-later
4*/
5
6#include "eckey_p.h"
7
8#include <QDebug>
9
10#include <openssl/err.h>
11
12using namespace KUnifiedPush;
13
14openssl::evp_pkey_ptr ECKey::load(QByteArrayView publicKey, QByteArrayView privateKey)
15{
16 openssl::bn_ptr privBn;
17
18 openssl::ossl_param_bld_ptr param_bld(OSSL_PARAM_BLD_new());
19 OSSL_PARAM_BLD_push_utf8_string(param_bld.get(), "group", "prime256v1", 0);
20 if (!privateKey.isEmpty()) {
21 privBn.reset(BN_bin2bn(reinterpret_cast<const uint8_t*>(privateKey.constData()), (int)privateKey.size(), nullptr));
22 OSSL_PARAM_BLD_push_BN(param_bld.get(), "priv", privBn.get());
23 }
24 OSSL_PARAM_BLD_push_octet_string(param_bld.get(), "pub", reinterpret_cast<const uint8_t*>(publicKey.constData()), publicKey.size());
25
26 openssl::ossl_param_ptr params(OSSL_PARAM_BLD_to_param(param_bld.get()));
27
28 openssl::evp_pkey_ctx_ptr ctx(EVP_PKEY_CTX_new_from_name(nullptr, "EC", nullptr));
29 EVP_PKEY_fromdata_init(ctx.get());
30 EVP_PKEY *pkey = nullptr;
31 if (const auto res = EVP_PKEY_fromdata(ctx.get(), &pkey, EVP_PKEY_KEYPAIR, params.get()); res <= 0) {
32 qWarning() << ERR_error_string(ERR_get_error(), nullptr);
33 return {};
34 }
35
36 return openssl::evp_pkey_ptr(pkey);
37}
38
39ECKeyPair ECKey::store(const openssl::evp_pkey_ptr &key, int selection)
40{
41 ECKeyPair pair;
42
43 OSSL_PARAM *paramPtr = nullptr;
44 EVP_PKEY_todata(key.get(), selection, &paramPtr);
45 openssl::ossl_param_ptr params(paramPtr);
46 for (;paramPtr->key; ++paramPtr) {
47 if (paramPtr->data_type == OSSL_PARAM_OCTET_STRING && std::strcmp(paramPtr->key, "pub") == 0) {
48 pair.publicKey.resize((qsizetype)paramPtr->data_size);
49 std::size_t len = 0;
50 auto data = reinterpret_cast<void*>(pair.publicKey.data());
51 OSSL_PARAM_get_octet_string(paramPtr, &data, paramPtr->data_size, &len);
52 }
53 if (paramPtr->data_type == OSSL_PARAM_UNSIGNED_INTEGER && std::strcmp(paramPtr->key, "priv") == 0) {
54 BIGNUM *valPtr = nullptr;
55 OSSL_PARAM_get_BN(paramPtr, &valPtr);
56 openssl::bn_ptr val(valPtr);
57
58 pair.privateKey.resize(BN_num_bytes(valPtr));
59 BN_bn2bin(valPtr, reinterpret_cast<uint8_t*>(pair.privateKey.data()));
60 }
61 }
62
63
64 return pair;
65}
Client-side integration with UnifiedPush.
Definition connector.h:14
const_pointer constData() const const
bool isEmpty() const const
qsizetype size() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 25 2025 12:05:39 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.