KUnifiedPush

contentencryptionutils.cpp
1/*
2 SPDX-FileCopyrightText: 2025 Volker Krause <vkrause@kde.org>
3 SPDX-License-Identifier: LGPL-2.0-or-later
4*/
5
6#include "contentencryptionutils_p.h"
7
8#include <QDebug>
9
10#include <openssl/err.h>
11#include <openssl/hmac.h>
12#include <openssl/rand.h>
13
14using namespace KUnifiedPush;
15
16QByteArray ContentEcryptionUtils::random(qsizetype size)
17{
18 QByteArray b(size, Qt::Uninitialized);
19 if (RAND_bytes(reinterpret_cast<uint8_t*>(b.data()), (int)b.size()) != 1) {
20 return {};
21 }
22 return b;
23}
24
25QByteArray ContentEcryptionUtils::ecdhSharedSecret(const openssl::evp_pkey_ptr &key, const openssl::evp_pkey_ptr &peerKey)
26{
27 openssl::evp_pkey_ctx_ptr ctx(EVP_PKEY_CTX_new(key.get(), nullptr));
28 EVP_PKEY_derive_init(ctx.get());
29 EVP_PKEY_derive_set_peer(ctx.get(), peerKey.get());
30 std::size_t secret_len = 0;
31 EVP_PKEY_derive(ctx.get(), nullptr, &secret_len);
32 QByteArray ecdh_secret((qsizetype)secret_len, Qt::Uninitialized);
33 if (const auto res = EVP_PKEY_derive(ctx.get(), reinterpret_cast<uint8_t*>(ecdh_secret.data()), &secret_len); res <= 0) {
34 qWarning() << ERR_error_string(ERR_get_error(), nullptr);
35 return {};
36 }
37 return ecdh_secret;
38}
39
40QByteArray ContentEcryptionUtils::hmacSha256(QByteArrayView key, QByteArrayView data)
41{
42 QByteArray result(32, Qt::Uninitialized);
43 unsigned int resultSize = 0;
44 HMAC(EVP_sha256(), reinterpret_cast<const uint8_t*>(key.constData()), (int)key.size(),
45 reinterpret_cast<const uint8_t*>(data.constData()), data.size(),
46 reinterpret_cast<uint8_t*>(result.data()), &resultSize);
47 return result;
48}
49
50QByteArray ContentEcryptionUtils::cek(QByteArrayView prk)
51{
52 return ContentEcryptionUtils::hmacSha256(prk, QByteArrayView("Content-Encoding: aes128gcm\x00\x01", 29)).left(16);
53}
54
55QByteArray ContentEcryptionUtils::nonce(QByteArrayView prk)
56{
57 return ContentEcryptionUtils::hmacSha256(prk, QByteArrayView("Content-Encoding: nonce\x00\x01", 25)).left(12);
58}
Client-side integration with UnifiedPush.
Definition connector.h:14
QByteArray left(qsizetype len) const const
const_pointer constData() 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.