1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
/**
* Copyright (C) 2021-2024 Saturneric <[email protected]>
*
* This file is part of GpgFrontend.
*
* GpgFrontend is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* GpgFrontend is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with GpgFrontend. If not, see <https://www.gnu.org/licenses/>.
*
* The initial version of the source code is inherited from
* the gpg4usb project, which is under GPL-3.0-or-later.
*
* All the source code of GpgFrontend was modified and released by
* Saturneric <[email protected]> starting on May 12, 2021.
*
* SPDX-License-Identifier: GPL-3.0-or-later
*
*/
#include "GFSDKGpg.h"
#include "GFSDKBasic.h"
#include "core/function/gpg/GpgBasicOperator.h"
#include "core/function/gpg/GpgKeyGetter.h"
#include "core/function/gpg/GpgKeyImportExporter.h"
#include "core/model/DataObject.h"
#include "core/model/GpgSignResult.h"
#include "core/typedef/GpgTypedef.h"
//
#include "core/utils/GpgUtils.h"
#include "private/GFSDKPrivat.h"
auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgSignData(int channel, char** key_ids,
int key_ids_size, char* data,
int sign_mode, int ascii,
GFGpgSignResult** ps) -> int {
auto singer_ids = CharArrayToQList(key_ids, key_ids_size);
GpgFrontend::KeyArgsList signer_keys;
for (const auto& signer_id : singer_ids) {
auto key =
GpgFrontend::GpgKeyGetter::GetInstance(channel).GetKey(signer_id);
if (key.IsGood()) signer_keys.push_back(key);
}
if (signer_keys.empty()) return -1;
auto in_buffer = GpgFrontend::GFBuffer(GFUnStrDup(data).toUtf8());
auto gpg_sign_mode =
sign_mode == 0 ? GPGME_SIG_MODE_NORMAL : GPGME_SIG_MODE_DETACH;
auto [err, data_object] =
GpgFrontend::GpgBasicOperator::GetInstance(channel).SignSync(
signer_keys, in_buffer, gpg_sign_mode, ascii != 0);
if (GpgFrontend::CheckGpgError(err) != GPG_ERR_NO_ERROR) return -1;
auto result =
GpgFrontend::ExtractParams<GpgFrontend::GpgSignResult>(data_object, 0);
auto out_buffer =
GpgFrontend::ExtractParams<GpgFrontend::GFBuffer>(data_object, 1);
*ps =
static_cast<GFGpgSignResult*>(GFAllocateMemory(sizeof(GFGpgSignResult)));
auto* s = *ps;
s->signature = GFStrDup(out_buffer.ConvertToQByteArray());
s->hash_algo = GFStrDup(result.HashAlgo());
return 0;
}
auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgPublicKey(int channel, char* key_id,
int ascii) -> char* {
auto key = GpgFrontend::GpgKeyGetter::GetInstance(channel).GetKey(
GFUnStrDup(key_id));
if (!key.IsGood()) return nullptr;
auto [err, buffer] =
GpgFrontend::GpgKeyImportExporter::GetInstance(channel).ExportKey(
key, false, ascii != 0, true);
if (GpgFrontend::CheckGpgError(err) != GPG_ERR_NO_ERROR) return nullptr;
return GFStrDup(buffer.ConvertToQByteArray());
}
auto GPGFRONTEND_MODULE_SDK_EXPORT GFGpgKeyPrimaryUID(int channel, char* key_id,
GFGpgKeyUID** ps) -> int {
auto key = GpgFrontend::GpgKeyGetter::GetInstance(channel).GetKey(
GFUnStrDup(key_id));
if (!key.IsGood()) return -1;
auto uids = key.GetUIDs();
auto& primary_uid = uids->front();
*ps = static_cast<GFGpgKeyUID*>(GFAllocateMemory(sizeof(GFGpgKeyUID)));
auto* s = *ps;
s->name = GFStrDup(primary_uid.GetName());
s->email = GFStrDup(primary_uid.GetEmail());
s->comment = GFStrDup(primary_uid.GetComment());
return 0;
}
|