Cipherpack v1.2.0-dirty
A Cryprographic Stream Processor
CipherpackHelper.cxx
Go to the documentation of this file.
1/*
2 * Author: Sven Gothel <sgothel@jausoft.com>
3 * Copyright (c) 2022 Gothel Software e.K.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be
14 * included in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25// #define VERBOSE_ON 1
26#include <jau/debug.hpp>
27#include "helper_base.hpp"
28
29#include "CipherpackHelper.hpp"
30
31static const std::string _cryptoConfigClassName("org/cipherpack/CryptoConfig");
32static const std::string _cryptoConfigClazzCtorArgs("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V");
33
34static const std::string _packHeaderClassName("org/cipherpack/PackHeader");
35static const std::string _packHeaderClazzCtorArgs("(Ljava/lang/String;JJJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/cipherpack/CryptoConfig;[BLjava/util/List;ILjava/lang/String;[BZ)V");
36
38 std::string pk_type_ = jau::jni::getStringFieldValue(env, jccfg, "pk_type");
39 std::string pk_fingerprt_hash_algo_ = jau::jni::getStringFieldValue(env, jccfg, "pk_fingerprt_hash_algo");
40 std::string pk_enc_padding_algo_ = jau::jni::getStringFieldValue(env, jccfg, "pk_enc_padding_algo");
41 std::string pk_enc_hash_algo_ = jau::jni::getStringFieldValue(env, jccfg, "pk_enc_hash_algo");
42 std::string pk_sign_algo_ = jau::jni::getStringFieldValue(env, jccfg, "pk_sign_algo");
43 std::string sym_enc_algo_ = jau::jni::getStringFieldValue(env, jccfg, "sym_enc_algo");
44 size_t sym_enc_nonce_bytes_ = jau::jni::getLongFieldValue(env, jccfg, "sym_enc_nonce_bytes");
45
46 return cipherpack::CryptoConfig(pk_type_,
47 pk_fingerprt_hash_algo_,
48 pk_enc_padding_algo_,
49 pk_enc_hash_algo_,
50 pk_sign_algo_,
51 sym_enc_algo_,
52 sym_enc_nonce_bytes_);
53}
54
56 jstring jpk_type = jau::jni::from_string_to_jstring(env, ccfg.pk_type);
57 jstring jpk_fingerprt_hash_algo = jau::jni::from_string_to_jstring(env, ccfg.pk_fingerprt_hash_algo);
58 jstring jpk_enc_padding_algo = jau::jni::from_string_to_jstring(env, ccfg.pk_enc_padding_algo);
59 jstring jpk_enc_hash_algo = jau::jni::from_string_to_jstring(env, ccfg.pk_enc_hash_algo);
60 jstring jpk_sign_algo = jau::jni::from_string_to_jstring(env, ccfg.pk_sign_algo);
61 jstring jsym_enc_algo = jau::jni::from_string_to_jstring(env, ccfg.sym_enc_algo);
62 jau::jni::java_exception_check_and_throw(env, E_FILE_LINE);
63
64 jclass cryptoConfigClazz = jau::jni::search_class(env, _cryptoConfigClassName.c_str());
65 jmethodID cryptoConfigClazzCtor = jau::jni::search_method(env, cryptoConfigClazz, "<init>", _cryptoConfigClazzCtorArgs.c_str(), false);
66
67 jobject jccfg = env->NewObject(cryptoConfigClazz, cryptoConfigClazzCtor,
68 jpk_type, jpk_fingerprt_hash_algo, jpk_enc_padding_algo, jpk_enc_hash_algo,
69 jpk_sign_algo, jsym_enc_algo, static_cast<jlong>(ccfg.sym_enc_nonce_bytes));
70 jau::jni::java_exception_check_and_throw(env, E_FILE_LINE);
71
72 env->DeleteLocalRef(cryptoConfigClazz);
73
74 env->DeleteLocalRef(jpk_type);
75 env->DeleteLocalRef(jpk_fingerprt_hash_algo);
76 env->DeleteLocalRef(jpk_enc_padding_algo);
77 env->DeleteLocalRef(jpk_enc_hash_algo);
78 env->DeleteLocalRef(jpk_sign_algo);
79 env->DeleteLocalRef(jsym_enc_algo);
80 jau::jni::java_exception_check_and_throw(env, E_FILE_LINE);
81 return jccfg;
82}
83
84jobject jcipherpack::to_jPackHeader(JNIEnv *env, const cipherpack::PackHeader& ph) {
85 jstring jtarget_path = jau::jni::from_string_to_jstring(env, ph.target_path());
86 jstring jsubject = jau::jni::from_string_to_jstring(env, ph.subject());
87 jstring jpversion = jau::jni::from_string_to_jstring(env, ph.plaintext_version());
88 jstring jpversion_parent = jau::jni::from_string_to_jstring(env, ph.plaintext_version_parent());
89
90 const cipherpack::CryptoConfig& ccfg = ph.crypto_config();
91 jobject jccfg = to_jCryptoConfig(env, ccfg);
92
93 jbyteArray jsender_fprint = jau::jni::convert_bytes_to_jbytearray(env, ph.sender_fingerprint());
94 const std::vector<std::vector<uint8_t>>& recevr_fprints = ph.receiver_fingerprints();
95 jobject jrecevr_fprints = jau::jni::convert_vector_bytes_to_jarraylist(env, recevr_fprints);
96 jstring jplaintext_hash_algo = jau::jni::from_string_to_jstring(env, ph.plaintext_hash_algo());
97 jbyteArray jplaintext_hash = jau::jni::convert_bytes_to_jbytearray(env, ph.plaintext_hash());
98
99 jclass packHeaderClazz = jau::jni::search_class(env, _packHeaderClassName.c_str());
100 jmethodID packHeaderClazzCtor = jau::jni::search_method(env, packHeaderClazz, "<init>", _packHeaderClazzCtorArgs.c_str(), false);
101
102 jobject jph = env->NewObject(packHeaderClazz, packHeaderClazzCtor,
103 jtarget_path,
104 static_cast<jlong>(ph.plaintext_size()),
105 static_cast<jlong>(ph.creation_time().tv_sec),
106 static_cast<jlong>(ph.creation_time().tv_nsec),
107 jsubject,
108 jpversion, jpversion_parent,
109 jccfg,
110 jsender_fprint,
111 jrecevr_fprints,
113 jplaintext_hash_algo,
114 jplaintext_hash,
115 ph.isValid());
116 jau::jni::java_exception_check_and_throw(env, E_FILE_LINE);
117
118 env->DeleteLocalRef(packHeaderClazz);
119
120 env->DeleteLocalRef(jtarget_path);
121 env->DeleteLocalRef(jsubject);
122 env->DeleteLocalRef(jpversion);
123 env->DeleteLocalRef(jpversion_parent);
124 env->DeleteLocalRef(jccfg);
125 env->DeleteLocalRef(jsender_fprint);
126 env->DeleteLocalRef(jrecevr_fprints);
127 return jph;
128}
129
130
static const std::string _packHeaderClazzCtorArgs("(Ljava/lang/String;JJJLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lorg/cipherpack/CryptoConfig;[BLjava/util/List;ILjava/lang/String;[BZ)V")
static const std::string _cryptoConfigClassName("org/cipherpack/CryptoConfig")
static const std::string _cryptoConfigClazzCtorArgs("(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V")
static const std::string _packHeaderClassName("org/cipherpack/PackHeader")
Cipherpack header less encrypted keys or signatures as described in Cipherpack Data Stream.
Definition: cipherpack.hpp:275
const std::vector< uint8_t > & sender_fingerprint() const noexcept
Return the sender's public-key fingerprint used to sign, see Cipherpack Data Stream.
Definition: cipherpack.hpp:376
constexpr const std::string & plaintext_version() const noexcept
Returns version of this plaintext message, user semantic, see Cipherpack Data Stream.
Definition: cipherpack.hpp:366
const std::vector< uint8_t > & plaintext_hash() const noexcept
Return optional hash value of the plaintext message, produced for convenience and not wired.
Definition: cipherpack.hpp:408
const std::string & plaintext_hash_algo() const noexcept
Return optional hash algorithm for the plaintext message, produced for convenience and not wired.
Definition: cipherpack.hpp:398
constexpr const CryptoConfig & crypto_config() const noexcept
Definition: cipherpack.hpp:371
uint64_t plaintext_size() const noexcept
Returns the plaintext message size in bytes, zero if not determined yet.
Definition: cipherpack.hpp:355
constexpr const std::string & subject() const noexcept
Returns the designated subject of message, see Cipherpack Data Stream.
Definition: cipherpack.hpp:363
constexpr const std::string & plaintext_version_parent() const noexcept
Returns version of this plaintext message's preceding message, user semantic, see Cipherpack Data Str...
Definition: cipherpack.hpp:369
const std::vector< std::vector< uint8_t > > & receiver_fingerprints() const noexcept
Return the list of receiver's public-keys fingerprints used to encrypt the symmetric-key,...
Definition: cipherpack.hpp:381
bool isValid() const noexcept
Definition: cipherpack.hpp:429
ssize_t receiver_key_index() const noexcept
Return the index of the matching receiver's public-key fingerprint used to decrypt the symmetric-key,...
Definition: cipherpack.hpp:388
const std::string & target_path() const noexcept
Returns the designated target path for this plaintext message, see Cipherpack Data Stream.
Definition: cipherpack.hpp:352
constexpr const jau::fraction_timespec & creation_time() const noexcept
Returns the creation time since Unix epoch, see Cipherpack Data Stream.
Definition: cipherpack.hpp:360
jobject to_jPackHeader(JNIEnv *env, const cipherpack::PackHeader &ph)
cipherpack::CryptoConfig to_CryptoConfig(JNIEnv *env, jobject jccfg)
jobject to_jCryptoConfig(JNIEnv *env, const cipherpack::CryptoConfig &ccfg)
CryptoConfig, contains crypto algorithms settings given at encryption wired via the Cipherpack Data S...
Definition: cipherpack.hpp:205
std::string pk_enc_padding_algo
Definition: cipherpack.hpp:208
std::string pk_fingerprt_hash_algo
Definition: cipherpack.hpp:207
std::string pk_enc_hash_algo
Definition: cipherpack.hpp:209