Merge branch 'tizen' into security-manager 66/88366/1
authorZbigniew Jasinski <z.jasinski@samsung.com>
Fri, 16 Sep 2016 12:13:07 +0000 (14:13 +0200)
committerZbigniew Jasinski <z.jasinski@samsung.com>
Fri, 16 Sep 2016 12:20:13 +0000 (14:20 +0200)
Signed-off-by: Zbigniew Jasinski <z.jasinski@samsung.com>
Conflicts:
src/common/tests_common.cpp
src/common/tests_common.h

Change-Id: Ic2301d3414aad2be4488eb04c59e217e184037ca

75 files changed:
.gitignore [new file with mode: 0644]
CMakeLists.txt
packaging/security-tests.spec
src/CMakeLists.txt
src/ckm/ckm-common.cpp
src/ckm/ckm-common.h
src/common/CMakeLists.txt
src/common/access_provider.cpp
src/common/access_provider.h
src/common/cynara_helpers_creds.cpp [new file with mode: 0644]
src/common/cynara_helpers_creds.h [moved from src/cynara-tests/common/cynara_test_helpers.h with 54% similarity]
src/common/cynara_helpers_dbus.h [new file with mode: 0644]
src/common/memory.h
src/common/security-tests.conf
src/common/tests_common.cpp
src/common/tests_common.h
src/cynara-tests/CMakeLists.txt
src/cynara-tests/common/cynara_test_client_async_client.cpp
src/cynara-tests/common/cynara_test_client_async_client.h
src/cynara-tests/common/cynara_test_client_async_request_monitor.cpp
src/cynara-tests/common/cynara_test_client_async_request_monitor.h
src/cynara-tests/common/cynara_test_cynara_mask.cpp
src/cynara-tests/common/cynara_test_cynara_mask.h
src/cynara-tests/common/cynara_test_helpers.cpp [deleted file]
src/cynara-tests/db_patterns/default/checksum
src/cynara-tests/db_patterns/defaultAllowed/checksum
src/cynara-tests/db_patterns/nonEmptyDatabase/checksum
src/cynara-tests/test_cases_agent.cpp
src/cynara-tests/test_cases_helpers.cpp
src/framework/include/dpl/test/test_runner.h
src/framework/src/test_runner.cpp
src/security-tests-all.sh
src/security-tests.sh
src/yaca/CMakeLists.txt [new file with mode: 0644]
src/yaca/debug.h [new file with mode: 0644]
src/yaca/lorem.cpp [new file with mode: 0644]
src/yaca/lorem.h [new file with mode: 0644]
src/yaca/test-vectors/digest_ascii.txt [new file with mode: 0644]
src/yaca/test-vectors/digest_binary.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_aes_ccm_tag_len.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_aes_gcm_tag_len.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_output_comparison.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_output_comparison_aes_gcm_ccm.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_output_comparison_rc2_cast5_nopad.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_output_comparison_rc4.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_output_comparison_wrap.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_param_comb.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_valid_param.txt [new file with mode: 0644]
src/yaca/test-vectors/encrypt_valid_param_wrap.txt [new file with mode: 0644]
src/yaca/test-vectors/key.txt [new file with mode: 0644]
src/yaca/test-vectors/key_derive_dh.txt [new file with mode: 0644]
src/yaca/test-vectors/key_derive_kdf.txt [new file with mode: 0644]
src/yaca/test-vectors/key_pbkdf2.txt [new file with mode: 0644]
src/yaca/test-vectors/key_x509.txt [new file with mode: 0644]
src/yaca/test-vectors/sign_ascii.txt [new file with mode: 0644]
src/yaca/test-vectors/sign_cmac_ascii.txt [new file with mode: 0644]
src/yaca/test-vectors/sign_hmac_ascii.txt [new file with mode: 0644]
src/yaca/test-vectors/sign_verify_ascii.txt [new file with mode: 0644]
src/yaca/tools/containers.py [new file with mode: 0644]
src/yaca/tools/encrypt_output_comparison.py [new file with mode: 0755]
src/yaca/tools/encrypt_param_combinations.py [new file with mode: 0755]
src/yaca/yaca-test-common.cpp [new file with mode: 0644]
src/yaca/yaca-test-common.h [new file with mode: 0644]
src/yaca/yaca-test-crypto.cpp [new file with mode: 0644]
src/yaca/yaca-test-digest.cpp [new file with mode: 0644]
src/yaca/yaca-test-encrypt.cpp [new file with mode: 0644]
src/yaca/yaca-test-key.cpp [new file with mode: 0644]
src/yaca/yaca-test-rsa.cpp [new file with mode: 0644]
src/yaca/yaca-test-seal.cpp [new file with mode: 0644]
src/yaca/yaca-test-sign.cpp [new file with mode: 0644]
src/yaca/yaca-test-simple.cpp [new file with mode: 0644]
src/yaca/yaca-test-stress.cpp [new file with mode: 0644]
src/yaca/yaca-test-vector.cpp [new file with mode: 0644]
src/yaca/yaca-test-vector.h [new file with mode: 0644]
src/yaca/yaca-test.cpp [new file with mode: 0644]

diff --git a/.gitignore b/.gitignore
new file mode 100644 (file)
index 0000000..b529165
--- /dev/null
@@ -0,0 +1,5 @@
+build
+GPATH
+GRTAGS
+GTAGS
+.dir-locals.el
index 3571d97..1c898a3 100644 (file)
@@ -63,6 +63,7 @@ IF(BUILD_ALL_TESTS)
     SET(BUILD_SM ON)
     SET(BUILD_CYNARA ON)
     SET(BUILD_WEB ON)
+    SET(BUILD_YACA ON)
 ENDIF(BUILD_ALL_TESTS)
 
 # If supported for the target machine, emit position-independent code,suitable
@@ -89,6 +90,10 @@ IF(SMACK_ENABLE)
     ADD_DEFINITIONS("-DWRT_SMACK_ENABLED")
 ENDIF(SMACK_ENABLE)
 
+IF(NOT DEFINED SHARE_INSTALL_PREFIX)
+       SET(SHARE_INSTALL_PREFIX "${CMAKE_INSTALL_PREFIX}/share")
+ENDIF(NOT DEFINED SHARE_INSTALL_PREFIX)
+
 ############################# Targets names ###################################
 
 SET(TARGET_CKM_TESTS "ckm-tests")
index 2e724a2..4be1f8d 100644 (file)
@@ -13,6 +13,7 @@ BuildRequires: pkgconfig(libcap)
 BuildRequires: pkgconfig(libsmack)
 BuildRequires: pkgconfig(security-manager)
 BuildRequires: pkgconfig(key-manager)
+BuildRequires: pkgconfig(yaca)
 BuildRequires: pkgconfig(dlog)
 BuildRequires: pkgconfig(glib-2.0)
 BuildRequires: pkgconfig(dbus-1)
@@ -21,6 +22,8 @@ BuildRequires: pkgconfig(libxml-2.0)
 BuildRequires: pkgconfig(sqlite3)
 BuildRequires: pkgconfig(libwebappenc)
 BuildRequires: cynara-devel
+BuildRequires: libcynara-creds-dbus-devel
+BuildRequires: libcynara-creds-gdbus-devel
 BuildRequires: pkgconfig(libtzplatform-config)
 BuildRequires: boost-devel
 BuildRequires: pkgconfig(vconf)
@@ -65,6 +68,9 @@ ln -sf /etc/smack/test_smack_rules %{buildroot}/etc/smack/test_smack_rules_lnk
 id -u  security_test_user 1>/dev/null 2>&1 || \
     useradd -r -g users -s /sbin/nologin -c "for tests only" security_test_user
 
+# Reload dbus daemon to apply newly installed configuration
+systemctl reload dbus
+
 echo "security-tests postinst done ..."
 
 %files
@@ -88,6 +94,7 @@ echo "security-tests postinst done ..."
 /usr/bin/cynara-test
 /usr/bin/ckm-tests
 /usr/bin/ckm-integration-tests
+/usr/bin/yaca-test
 %{ckm_test_dir}/*
 /etc/security-tests
 /usr/lib/security-tests/cynara-tests/plugins/single-policy/*
@@ -95,6 +102,7 @@ echo "security-tests postinst done ..."
 /usr/lib/security-tests/cynara-tests/plugins/test-agent/*
 /usr/bin/security-tests-inner-test
 /usr/bin/libwebappenc-tests
+%{_prefix}/share/yaca-test
 
 %postun
 id -u security_test_user  1>/dev/null 2>&1 && userdel security_test_user
index 9bba81d..471c28e 100644 (file)
@@ -106,3 +106,7 @@ ENDIF(BUILD_CYNARA)
 IF(BUILD_WEB)
     ADD_SUBDIRECTORY(libwebappenc-tests)
 ENDIF(BUILD_WEB)
+
+IF(BUILD_YACA)
+    ADD_SUBDIRECTORY(yaca)
+ENDIF(BUILD_YACA)
index 4f6880d..a1144c1 100644 (file)
@@ -95,13 +95,6 @@ std::string aliasWithLabel(const char *label, const char *alias)
     return std::string(alias);
 }
 
-// changes process label
-void change_label(const char* label)
-{
-    int ret = smack_set_label_for_self(label);
-    RUNNER_ASSERT_MSG(0 == ret, "Error in smack_set_label_for_self("<<label<<"). Error: " << ret);
-}
-
 ScopedLabel::ScopedLabel(const char* label) : m_original_label(getLabel())
 {
     change_label(label);
index 9bfebe0..c3908ca 100644 (file)
@@ -90,9 +90,6 @@ std::string getOwnerIdFromSelf();
 
 std::string aliasWithLabel(const char *label, const char *alias);
 
-// changes process label
-void change_label(const char* label);
-
 // changes process label upon construction and restores it upon destruction
 class ScopedLabel
 {
index 994fee1..4e1055f 100644 (file)
@@ -8,6 +8,9 @@ PKG_CHECK_MODULES(COMMON_TARGET_DEP
     sqlite3
     libgum
     glib-2.0
+    cynara-creds-socket
+    cynara-creds-dbus
+    cynara-creds-gdbus
     REQUIRED
     )
 
@@ -28,6 +31,7 @@ SET(COMMON_TARGET_TEST_SOURCES
     ${PROJECT_SOURCE_DIR}/src/common/synchronization_pipe.cpp
     ${PROJECT_SOURCE_DIR}/src/common/timeout.cpp
     ${PROJECT_SOURCE_DIR}/src/common/temp_test_user.cpp
+    ${PROJECT_SOURCE_DIR}/src/common/cynara_helpers_creds.cpp
     )
 
 #system and local includes
index e9f91dc..1d3257a 100644 (file)
 
 namespace SecurityServer {
 
-AccessProvider::AccessProvider(const std::string &mySubject)
-  : m_mySubject(mySubject)
+AccessProvider::AccessProvider(const std::string &myLabel)
+  : m_myLabel(myLabel)
 {}
 
 void AccessProvider::allowSS() {
-    m_smackAccess.add(m_mySubject, "System::Run", "x");
+    m_smackAccess.add(m_myLabel, "System::Run", "x");
+}
+
+void AccessProvider::addSubjectRule(const std::string &subject, const std::string &rule) {
+    m_smackAccess.add(subject, m_myLabel, rule);
 }
 
 void AccessProvider::addObjectRule(const std::string &object, const std::string &rule) {
-    m_smackAccess.add(m_mySubject, object, rule);
+    m_smackAccess.add(m_myLabel, object, rule);
 }
 
 void AccessProvider::apply() {
@@ -48,10 +52,10 @@ void AccessProvider::apply() {
 }
 
 void AccessProvider::applyAndSwithToUser(int uid, int gid) {
-    RUNNER_ASSERT_MSG(0 == smack_revoke_subject(m_mySubject.c_str()),
-        "Error in smack_revoke_subject(" << m_mySubject << ")");
+    RUNNER_ASSERT_MSG(0 == smack_revoke_subject(m_myLabel.c_str()),
+        "Error in smack_revoke_subject(" << m_myLabel << ")");
     apply();
-    RUNNER_ASSERT_MSG(0 == smack_set_label_for_self(m_mySubject.c_str()),
+    RUNNER_ASSERT_MSG(0 == smack_set_label_for_self(m_myLabel.c_str()),
         "Error in smack_set_label_for_self.");
     RUNNER_ASSERT_MSG(0 == setgid(gid),
         "Error in setgid.");
index 452d418..26124b4 100644 (file)
@@ -30,11 +30,12 @@ namespace SecurityServer {
 
 class AccessProvider {
 public:
-    AccessProvider(const std::string &mySubject);
+    AccessProvider(const std::string &myLabel);
 
     AccessProvider(const AccessProvider &second) = delete;
     AccessProvider& operator=(const AccessProvider &second) = delete;
 
+    void addSubjectRule(const std::string &subject, const std::string &rule);
     void addObjectRule(const std::string &object, const std::string &rule);
     void allowSS();
     void apply();
@@ -42,7 +43,7 @@ public:
 
     virtual ~AccessProvider(){}
 private:
-    std::string m_mySubject;
+    std::string m_myLabel;;
     SmackAccess m_smackAccess;
 };
 
diff --git a/src/common/cynara_helpers_creds.cpp b/src/common/cynara_helpers_creds.cpp
new file mode 100644 (file)
index 0000000..dc1c904
--- /dev/null
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2015-2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/**
+ * @file        cynara_helper_credentials.cpp
+ * @author      Aleksander Zdyb <a.zdyb@samsung.com>
+ * @version     1.0
+ * @brief       Helpers for cynara-helpers
+ */
+
+#include <dpl/test/test_runner.h>
+
+#include <cynara-creds-dbus.h>
+#include <cynara-creds-socket.h>
+#include <cynara-creds-gdbus.h>
+
+#include "cynara_helpers_creds.h"
+
+namespace CynaraHelperCredentials {
+
+char *socketGetClient(int sock, cynara_client_creds method, int expectedResult) {
+    char *buff = nullptr;
+    auto ret = cynara_creds_socket_get_client(sock, method, &buff);
+    RUNNER_ASSERT_MSG(ret == expectedResult,
+                      "cynara_creds_socket_get_client failed, ret = " << ret
+                      << "; expected = " << expectedResult);
+    return buff;
+}
+
+char *socketGetUser(int sock, cynara_user_creds method, int expectedResult) {
+    char *buff = nullptr;
+    auto ret = cynara_creds_socket_get_user(sock, method, &buff);
+    RUNNER_ASSERT_MSG(ret == expectedResult,
+                      "cynara_creds_socket_get_user failed, ret = " << ret
+                      << "; expected = " << expectedResult);
+    return buff;
+}
+
+pid_t socketGetPid(int sock, int expectedResult) {
+    pid_t pid = -1;
+    auto ret = cynara_creds_socket_get_pid(sock, &pid);
+    RUNNER_ASSERT_MSG(ret == expectedResult,
+                      "cynara_creds_socket_get_pid failed, ret = " << ret << "; expected = "
+                      << expectedResult);
+    return pid;
+}
+
+char *dbusGetClient(DBusConnectionPtr connection, const char *uniqueName,
+                    cynara_client_creds method, int expectedResult) {
+    char *buff = nullptr;
+    auto ret = cynara_creds_dbus_get_client(connection.get(), uniqueName, method, &buff);
+    RUNNER_ASSERT_MSG(ret == expectedResult,
+                      "cynara_creds_dbus_get_client failed, ret = " << ret
+                      << "; expected = " << expectedResult);
+    return buff;
+}
+
+char *dbusGetUser(DBusConnectionPtr connection, const char *uniqueName, cynara_user_creds method,
+                  int expectedResult) {
+    char *buff = nullptr;
+    auto ret = cynara_creds_dbus_get_user(connection.get(), uniqueName, method, &buff);
+    RUNNER_ASSERT_MSG(ret == expectedResult,
+                      "cynara_creds_dbus_get_user failed, ret = " << ret
+                      << "; expected = " << expectedResult);
+    return buff;
+}
+
+pid_t dbusGetPid(DBusConnectionPtr connection, const char *uniqueName, int expectedResult) {
+    pid_t pid = -1;
+    auto ret = cynara_creds_dbus_get_pid(connection.get(), uniqueName, &pid);
+    RUNNER_ASSERT_MSG(ret == expectedResult, "cynara_creds_dbus_get_pid failed, ret = " << ret
+                                             << "; expected = " << expectedResult);
+    return pid;
+}
+
+char *gdbusGetClient(GDBusConnectionPtr connection, const char *uniqueName,
+                     cynara_client_creds method, int expectedResult) {
+    char *buff = nullptr;
+    auto ret = cynara_creds_gdbus_get_client(connection.get(), uniqueName, method, &buff);
+    RUNNER_ASSERT_MSG(ret == expectedResult,
+                      "cynara_creds_gdbus_get_client failed, ret = " << ret
+                      << "; expected = " << expectedResult);
+    return buff;
+}
+
+char *gdbusGetUser(GDBusConnectionPtr connection, const char *uniqueName, cynara_user_creds method,
+                   int expectedResult) {
+    char *buff = nullptr;
+    auto ret = cynara_creds_gdbus_get_user(connection.get(), uniqueName, method, &buff);
+    RUNNER_ASSERT_MSG(ret == expectedResult,
+                      "cynara_creds_gdbus_get_user failed, ret = " << ret
+                      << "; expected = " << expectedResult);
+    return buff;
+}
+
+pid_t gdbusGetPid(GDBusConnectionPtr connection, const char *uniqueName) {
+    pid_t pid = -1;
+    auto ret = cynara_creds_gdbus_get_pid(connection.get(), uniqueName, &pid);
+    RUNNER_ASSERT_MSG(ret == CYNARA_API_SUCCESS,
+                      "cynara_creds_gdbus_get_pid failed, ret = " << ret);
+    return pid;
+}
+
+} //namespace CynaraHelperCredentials
similarity index 54%
rename from src/cynara-tests/common/cynara_test_helpers.h
rename to src/common/cynara_helpers_creds.h
index 1acd6f8..cafe423 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2015-2016 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
  *    you may not use this file except in compliance with the License.
@@ -14,7 +14,7 @@
  *    limitations under the License.
  */
 /**
- * @file        cynara_test_helpers.h
+ * @file        cynara_helper_credentials.h
  * @author      Aleksander Zdyb <a.zdyb@samsung.com>
  * @version     1.0
  * @brief       Helpers for cynara-helpers
 #ifndef CYNARA_TEST_HELPERS_H_
 #define CYNARA_TEST_HELPERS_H_
 
+#include <string>
 #include <sys/types.h>
 
 #include <cynara-creds-commons.h>
 #include <cynara-error.h>
+#include <cynara_helpers_dbus.h>
 
 namespace CynaraHelperCredentials {
 
@@ -38,7 +40,27 @@ char *socketGetUser(int sock, cynara_user_creds method,
 
 pid_t socketGetPid(int sock, int expectedResult = CYNARA_API_SUCCESS);
 
-} // namespace CynaraHelperCredentials
+DBusConnectionPtr createDBusConnection(const std::string &name);
+
+char *dbusGetClient(DBusConnectionPtr connection, const char *uniqueName,
+                    cynara_client_creds method, int expectedResult = CYNARA_API_SUCCESS);
+
+
+char *dbusGetUser(DBusConnectionPtr connection, const char *uniqueName, cynara_user_creds method,
+                  int expectedResult = CYNARA_API_SUCCESS);
+
+pid_t dbusGetPid(DBusConnectionPtr connection, const char *uniqueName,
+                 int expectedResult = CYNARA_API_SUCCESS);
 
+char *gdbusGetClient(GDBusConnectionPtr connection, const char *uniqueName,
+                     cynara_client_creds method, int expectedResult = CYNARA_API_SUCCESS);
+
+
+char *gdbusGetUser(GDBusConnectionPtr connection, const char *uniqueName, cynara_user_creds method,
+                   int expectedResult = CYNARA_API_SUCCESS);
+
+pid_t gdbusGetPid(GDBusConnectionPtr connection, const char *uniqueName);
+
+} // namespace CynaraHelperCredentials
 
 #endif // CYNARA_TEST_HELPERS_H_
diff --git a/src/common/cynara_helpers_dbus.h b/src/common/cynara_helpers_dbus.h
new file mode 100644 (file)
index 0000000..19c1b24
--- /dev/null
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2015-2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
+/**
+ * @file        cynara_helpers_dbus.h
+ * @author      Aleksander Zdyb <a.zdyb@samsung.com>
+ * @version     1.0
+ */
+#ifndef CYNARA_TEST_HELPERS_DBUS_H_
+#define CYNARA_TEST_HELPERS_DBUS_H_
+
+#include <dbus/dbus.h>
+#include <functional>
+#include <gio/gio.h>
+#include <memory>
+
+typedef std::function<void(DBusConnection *)> DBusConnectionCloseAndUnref;
+typedef std::function<void(GDBusConnection *)> GDBusConnectionCloseAndUnref;
+typedef std::unique_ptr<DBusConnection, DBusConnectionCloseAndUnref> DBusConnectionPtr;
+typedef std::unique_ptr<GDBusConnection, GDBusConnectionCloseAndUnref> GDBusConnectionPtr;
+
+
+#endif // CYNARA_TEST_HELPERS_DBUS_H_
index 4ed2407..1ee120b 100644 (file)
@@ -1,3 +1,18 @@
+/*
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *    Licensed under the Apache License, Version 2.0 (the "License");
+ *    you may not use this file except in compliance with the License.
+ *    You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *    Unless required by applicable law or agreed to in writing, software
+ *    distributed under the License is distributed on an "AS IS" BASIS,
+ *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *    See the License for the specific language governing permissions and
+ *    limitations under the License.
+ */
 #ifndef MEMORY_H
 #define MEMORY_H
 
@@ -5,6 +20,7 @@
 #include <sys/smack.h>
 #include <dirent.h>
 #include <glob.h>
+#include <glib.h>
 
 #define DEFINE_SMARTPTR(func, type, name) \
     struct deleter_##func { \
@@ -22,6 +38,7 @@ void closePtr(int *fd);
 // Defining specializations of unique_ptr
 
 DEFINE_SMARTPTR(free, char, CStringPtr);
+DEFINE_SMARTPTR(g_free, gchar, GStringPtr);
 DEFINE_SMARTPTR(closePtr, int, FdUniquePtr);
 DEFINE_SMARTPTR(smack_accesses_free, smack_accesses, SmackAccessesPtr);
 DEFINE_SMARTPTR(closedir, DIR, DirPtr);
index 0ae6722..f3cc851 100644 (file)
@@ -3,8 +3,11 @@
 <busconfig>
   <!-- Only root can own this service -->
   <policy user="root">
-       <allow own="tests.dbus.client"/>
-       <allow own="test.method.caller"/>
-       <allow own="test.method.server"/>
+    <allow own="tests.dbus.client"/>
+    <allow own="test.method.caller"/>
+    <allow own="test.method.server"/>
+  </policy>
+  <policy user="security_test_user">
+    <allow own="tests.dbus.cynara"/>
   </policy>
 </busconfig>
index 52ef252..d08893c 100644 (file)
@@ -240,3 +240,9 @@ void waitPid(pid_t pid)
         "Child process exited abnormally" <<
         ": ret=" << ret << ", errno=" << errno << ", status=" << status);
 }
+// changes process label
+void change_label(const char* label)
+{
+    int ret = smack_set_label_for_self(label);
+    RUNNER_ASSERT_MSG(0 == ret, "Error in smack_set_label_for_self("<<label<<"). Error: " << ret);
+}
index faf0890..251e111 100644 (file)
@@ -57,7 +57,7 @@ void creatSafe(const std::string &path, mode_t mode);
 void symlinkSafe(const std::string &targetPath, const std::string &linkPath);
 void removeDir(const std::string &path);
 void waitPid(pid_t pid);
-
+void change_label(const char* label);
 
 #define RUNNER_TEST_SMACK(Proc, ...)                                                        \
     void Proc(std::tuple<__VA_ARGS__> &optionalArgsTuple);                                  \
index 98dcde1..7a42d65 100644 (file)
@@ -24,9 +24,13 @@ PKG_CHECK_MODULES(CYNARA_TARGET_DEP
     cynara-agent
     cynara-client
     cynara-client-async
+    cynara-creds-dbus
+    cynara-creds-gdbus
+    cynara-creds-self
     cynara-creds-socket
     cynara-plugin
     dbus-1
+    glib-2.0
     )
 
 #files to compile
@@ -43,7 +47,6 @@ SET(CYNARA_TARGET_TEST_SOURCES
     ${PROJECT_SOURCE_DIR}/src/cynara-tests/common/cynara_test_cynara_mask.cpp
     ${PROJECT_SOURCE_DIR}/src/cynara-tests/common/cynara_test_env.cpp
     ${PROJECT_SOURCE_DIR}/src/cynara-tests/common/cynara_test_file_operations.cpp
-    ${PROJECT_SOURCE_DIR}/src/cynara-tests/common/cynara_test_helpers.cpp
     ${PROJECT_SOURCE_DIR}/src/cynara-tests/plugins/plugins.cpp
     ${PROJECT_SOURCE_DIR}/src/cynara-tests/cynara-test.cpp
     ${PROJECT_SOURCE_DIR}/src/cynara-tests/test_cases.cpp
@@ -71,8 +74,10 @@ ADD_EXECUTABLE(${CYNARA_TARGET_TEST} ${CYNARA_TARGET_TEST_SOURCES})
 #linker directories
 TARGET_LINK_LIBRARIES(${CYNARA_TARGET_TEST}
     ${CYNARA_TARGET_DEP_LIBRARIES}
-    dpl-test-framework
     tests-common
+    dpl-test-framework
+    gobject-2.0
+    gio-2.0
     )
 
 #place for output file
index 6c70813..57fc289 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
  *    you may not use this file except in compliance with the License.
@@ -35,7 +35,7 @@ static std::string suffix(const std::string &major, const std::string &minor)
 CheckData::CheckData(const std::string &major, const std::string &minor) :
     m_client("client" + suffix(major, minor)),
     m_session("session" + suffix(major, minor)),
-    m_user("user" + suffix(major, minor)),
+    m_user("user" + suffix(major, std::string())),
     m_privilege("privilege" + suffix(major, minor))
 {
 }
@@ -63,15 +63,12 @@ Client::Client(const StatusFunction &userFunction)
     assertStatus(DISCONNECTED);
 }
 
-Client::~Client() noexcept(false)
+Client::~Client()
 {
-    bool oops = std::uncaught_exception();
     try {
         RUNNER_DEFER_SCOPE(cynara_async_finish(m_cynara););
         assertStatus(DISCONNECTED);
     } catch (...) {
-        if (!oops)
-            throw;
         RUNNER_ERROR_MSG("Error: more exceptions thrown while releasing CynaraTestAsync::Client.");
     }
 }
index 37abdc5..425e8a7 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
  *    you may not use this file except in compliance with the License.
@@ -51,7 +51,7 @@ public:
     };
 
     Client(const StatusFunction &userFunction = StatusFunction());
-    ~Client() noexcept(false);
+    ~Client();
 
     void assertStatus(enum SocketStatus expectedStatus);
     void checkCache(const CheckData &checkData, int expectedResult);
index 33244d0..da05fbd 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
  *    you may not use this file except in compliance with the License.
 
 namespace CynaraTestClientAsync {
 
-RequestMonitor::~RequestMonitor() noexcept(false)
+RequestMonitor::~RequestMonitor()
 {
-    bool oops = std::uncaught_exception();
     try {
         for (auto ent : m_requests)
         {
-            RUNNER_ERROR_MSG("There was no callback for request with:"
-                          << "id = " << ent.first << ","
-                          << "expectedResponse = " << ent.second.m_expectedResponse << ","
+            RUNNER_ERROR_MSG("There was no callback for request with: "
+                          << "id = " << ent.first << ", "
+                          << "expectedResponse = " << ent.second.m_expectedResponse << ", "
                           << "expectedCause = " << ent.second.m_expectedCause << ".");
         }
-        RUNNER_ASSERT_MSG(m_requests.empty(),
-                             m_requests.size() << "requests does not receive callback.");
+        if (!m_requests.empty())
+            RUNNER_ERROR_MSG(m_requests.size() << " requests did not receive callback.");
     } catch (...) {
-        if (!oops)
-            throw;
         RUNNER_ERROR_MSG("Error: more exceptions thrown while releasing"
                              " CynaraTestAsync::RequestMonitor.");
     }
index 16d4926..98f7f55 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2014-2015 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
  *    you may not use this file except in compliance with the License.
@@ -36,7 +36,7 @@ struct RequestEntity
 class RequestMonitor
 {
 public:
-    ~RequestMonitor() noexcept(false);
+    ~RequestMonitor();
 
     void registerRequest(cynara_check_id id, const RequestEntity &request);
 
index 7044895..1394761 100644 (file)
@@ -33,15 +33,12 @@ CynaraMask::CynaraMask() : m_serviceManager(CynaraTestConsts::SERVICE)
     m_serviceManager.stopService();
 }
 
-CynaraMask::~CynaraMask() noexcept(false)
+CynaraMask::~CynaraMask()
 {
-    bool oops = std::uncaught_exception();
     try {
         m_serviceManager.unmaskService();
         m_serviceManager.startService();
     } catch (...) {
-        if (!oops)
-            throw;
         RUNNER_ERROR_MSG("Error: more exceptions thrown while releasing CynaraMask.");
     }
 }
index fee1e66..f8f1724 100644 (file)
@@ -29,7 +29,7 @@ class CynaraMask
 {
 public:
     CynaraMask();
-    ~CynaraMask() noexcept(false);
+    ~CynaraMask();
 
 private:
     ServiceManager m_serviceManager;
diff --git a/src/cynara-tests/common/cynara_test_helpers.cpp b/src/cynara-tests/common/cynara_test_helpers.cpp
deleted file mode 100644 (file)
index 033fbec..0000000
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
- *
- *    Licensed under the Apache License, Version 2.0 (the "License");
- *    you may not use this file except in compliance with the License.
- *    You may obtain a copy of the License at
- *
- *        http://www.apache.org/licenses/LICENSE-2.0
- *
- *    Unless required by applicable law or agreed to in writing, software
- *    distributed under the License is distributed on an "AS IS" BASIS,
- *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *    See the License for the specific language governing permissions and
- *    limitations under the License.
- */
-/**
- * @file        cynara_test_helpers.cpp
- * @author      Aleksander Zdyb <a.zdyb@samsung.com>
- * @version     1.0
- * @brief       Helpers for cynara-helpers
- */
-
-#include <dpl/test/test_runner.h>
-
-#include <cynara-creds-socket.h>
-
-#include "cynara_test_helpers.h"
-
-namespace CynaraHelperCredentials {
-
-char *socketGetClient(int sock, cynara_client_creds method, int expectedResult) {
-    char *buff;
-    auto ret = cynara_creds_socket_get_client(sock, method, &buff);
-    RUNNER_ASSERT_MSG(ret == expectedResult,
-                      "cynara_creds_socket_get_client failed, ret = " << ret
-                      << "; expected = " << expectedResult);
-    return buff;
-}
-
-char *socketGetUser(int sock, cynara_user_creds method, int expectedResult) {
-    char *buff;
-    auto ret = cynara_creds_socket_get_user(sock, method, &buff);
-    RUNNER_ASSERT_MSG(ret == expectedResult,
-                      "cynara_creds_socket_get_user failed, ret = " << ret
-                      << "; expected = " << expectedResult);
-    return buff;
-}
-
-pid_t socketGetPid(int sock, int expectedResult) {
-    pid_t pid;
-    auto ret = cynara_creds_socket_get_pid(sock, &pid);
-    RUNNER_ASSERT_MSG(ret == expectedResult,
-                      "cynara_creds_socket_get_pid failed, ret = " << ret << "; expected = "
-                      << expectedResult);
-    return pid;
-}
-
-} //namespace CynaraHelperCredentials
index 9998a60..119fc0e 100644 (file)
@@ -1,2 +1,2 @@
-buckets;$1$$6ZlVs5lw2nZgVmiw0BdY21
-_;$1$$qRPK7m23GJusamGpoGLby/
+buckets;4f15a73541bf5a52e25ef4c2b990d224
+_;d41d8cd98f00b204e9800998ecf8427e
index 90c581c..b3101f7 100644 (file)
@@ -1,2 +1,2 @@
-buckets;$1$$UYHKvrIkGoSTO5hIgvCLg0
-_;$1$$qRPK7m23GJusamGpoGLby/
+buckets;c79674219909ebad81c33b580c70e31b
+_;d41d8cd98f00b204e9800998ecf8427e
index ebaaf4c..0a16164 100644 (file)
@@ -1,2 +1,2 @@
-buckets;$1$$6ZlVs5lw2nZgVmiw0BdY21
-_;$1$$nssatAXP6yl4N8gjldhxf0
+buckets;4f15a73541bf5a52e25ef4c2b990d224
+_;4e1fa590dd3adf658786e376962bd124
index a8c74ae..6d90e67 100644 (file)
@@ -52,7 +52,7 @@ void loadAgentPlugin()
     loadServicePlugins(paths);
 }
 
-void setAgentPolicy(int expectedResult = CYNARA_API_SUCCESS)
+void setAgentPolicy(const std::string &user, int expectedResult = CYNARA_API_SUCCESS)
 {
     const char *bucket = CYNARA_ADMIN_DEFAULT_BUCKET;
     const char *wildcard = CYNARA_ADMIN_WILDCARD;
@@ -63,7 +63,7 @@ void setAgentPolicy(int expectedResult = CYNARA_API_SUCCESS)
     auto policyType = testAgentPolicies[0].type;
 
     CynaraPoliciesContainer cp;
-    cp.add(bucket, wildcard, wildcard, wildcard, policyType, extra);
+    cp.add(bucket, wildcard, user.c_str(), wildcard, policyType, extra);
 
     Admin admin;
     admin.setPolicies(cp, expectedResult);
@@ -89,28 +89,31 @@ void getAgentRequest(Agent &agent, AgentRequest &request, Client &client,
 void tcag01_set_agent_type_policy_without_plugin_func()
 {
     loadServicePlugins(DirectoryPaths());
-    setAgentPolicy(CYNARA_API_INVALID_PARAM);
+    // user in setAgentPolicy can be empty here, it does not matter in this test
+    setAgentPolicy(std::string(), CYNARA_API_INVALID_PARAM);
 }
 
 void tcag02_set_agent_type_policy_with_plugin_loaded_func()
 {
     loadAgentPlugin();
-    setAgentPolicy();
+    // user in setAgentPolicy can be empty here, it does not matter in this test
+    setAgentPolicy(std::string());
 }
 
 void tcag03_check_with_no_agent_func()
 {
     std::string testNo("03");
+    CheckData data(testNo);
     cynara_check_id id;
     RequestEntity callbackData = {RequestFunction(),
                                   CYNARA_API_ACCESS_DENIED,
                                   CYNARA_CALL_CAUSE_ANSWER};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
 
     Client client;
-    client.createRequest({testNo}, id, callbackData);
+    client.createRequest(data, id, callbackData);
     client.assertStatus(READWRITE);
 
     //send requests
@@ -140,18 +143,19 @@ void tcag05_agent_request_timeout_func()
 void tcag06_check_with_unregistered_agent_func()
 {
     std::string testNo("06");
+    CheckData data(testNo);
     cynara_check_id id;
     RequestEntity callbackData = {RequestFunction(),
                                   CYNARA_API_ACCESS_DENIED,
                                   CYNARA_CALL_CAUSE_ANSWER};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
 
     Agent agent;
 
     Client client;
-    client.createRequest({testNo}, id, callbackData);
+    client.createRequest(data, id, callbackData);
     client.assertStatus(READWRITE);
 
     //send requests
@@ -169,7 +173,7 @@ void tcag07_get_request_func()
                                   CYNARA_CALL_CAUSE_ANSWER};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
 
     Agent agent;
     AgentRequest agentRequest;
@@ -198,7 +202,7 @@ void tcag08_get_request_and_respond_with_wrong_id_func()
                                   CYNARA_CALL_CAUSE_FINISH};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
 
     Agent agent;
     AgentRequest agentRequest;
@@ -226,7 +230,7 @@ void tcag09_get_request_and_correct_responded_id_func()
                                   CYNARA_CALL_CAUSE_ANSWER};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
 
     Agent agent;
     AgentRequest agentRequest;
@@ -256,7 +260,7 @@ void tcag10_cancel_request_func()
                                   CYNARA_CALL_CAUSE_CANCEL};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
 
     Agent agent;
     AgentRequest agentRequest;
@@ -272,7 +276,8 @@ void tcag10_cancel_request_func()
                          CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
     agentRequest.assertAction(data.m_client, data.m_user, data.m_privilege);
     client.cancel(id);
-    Timeout::callAndWait(testTimeLimit, Timeout::ExpectMode::FINISHED,
+    auto testTimeLimit2 = std::chrono::seconds(8);
+    Timeout::callAndWait(testTimeLimit2, Timeout::ExpectMode::FINISHED,
                          restartCynaraServiceAndSockets, getAgentRequest,
                          std::ref(agent), std::ref(agentRequest), std::ref(client),
                          CYNARA_API_SUCCESS, Timeout::ExpectMode::TIMEOUT);
@@ -291,7 +296,7 @@ void tcag11_cancel_processed_request_func()
                                   CYNARA_CALL_CAUSE_CANCEL};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
 
     Agent agent;
     AgentRequest agentRequest;
@@ -329,7 +334,8 @@ void tcag12_create_two_requests_func()
                                    CYNARA_CALL_CAUSE_CANCEL};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    // both data1 and data2 have the same user, so it does not matter which one will be used
+    setAgentPolicy(data1.m_user);
 
     Agent agent;
     AgentRequest agentRequest1, agentRequest2, agentRequest3;
@@ -369,12 +375,13 @@ void tcag13_create_many_requests_func()
 {
     const int numberOfRequests = 4;
     std::string testNo("13");
+    CheckData policyData(testNo);
     cynara_check_id ids[numberOfRequests];
     RequestEntity callbackData = {RequestFunction(),
                                   CYNARA_API_ACCESS_DENIED,
                                   CYNARA_CALL_CAUSE_ANSWER};
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(policyData.m_user);
 
     Agent agent;
     AgentRequest agentRequests[numberOfRequests];
@@ -406,7 +413,7 @@ void tcag14_client_disconnects_func()
                                   CYNARA_CALL_CAUSE_FINISH};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
     Agent agent;
     AgentRequest agentRequest;
     auto testTimeLimit = std::chrono::seconds(5);
@@ -437,7 +444,7 @@ void tcag15_agent_disconnects_func()
                                   CYNARA_CALL_CAUSE_ANSWER};
 
     loadAgentPlugin();
-    setAgentPolicy();
+    setAgentPolicy(data.m_user);
     Client client;
     client.createRequest(data, id, callbackData);
     client.assertStatus(READWRITE);
index 43a73f4..06aa14d 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
+ * Copyright (c) 2015-2016 Samsung Electronics Co., Ltd All Rights Reserved
  *
  *    Licensed under the Apache License, Version 2.0 (the "License");
  *    you may not use this file except in compliance with the License.
@@ -17,7 +17,7 @@
  * @file        test_cases_helpers.cpp
  * @author      Aleksander Zdyb <a.zdyb@samsung.com>
  * @version     1.0
- * @brief       Tests for cynara-helper-credentials-socket
+ * @brief       Tests for cynara-helper-credentials-socket and cynara-helper-credentials-dbus
  */
 
 #include <cstdlib>
 #include <sys/types.h>
 #include <sys/un.h>
 #include <unistd.h>
+#include <utility>
 
+#include <dbus/dbus.h>
+#include <glib-object.h>
+#include <gio/gio.h>
+
+#include <tests_common.h>
 #include <access_provider.h>
 #include <dpl/test/test_runner.h>
 #include <memory.h>
 #include <tests_common.h>
 #include <uds.h>
 #include <passwd_access.h>
+#include <cynara_helpers_creds.h>
+#include <cynara_helpers_dbus.h>
 
-#include <cynara_test_helpers.h>
+#include <cynara-creds-gdbus.h>
+#include <cynara-creds-self.h>
 
 class ProcessCredentials {
 public:
@@ -69,6 +78,23 @@ pid_t runInChild(const std::function<void(void)> &process) {
     return pid;
 }
 
+cynara_client_creds getClientDefaultMethod() {
+    cynara_client_creds def;
+    int ret = cynara_creds_get_default_client_method(&def);
+    RUNNER_ASSERT_MSG(ret == CYNARA_API_SUCCESS,
+                      "cynara_creds_get_default_client_method failed with " << ret);
+    return def;
+}
+
+cynara_user_creds getUserDefaultMethod() {
+    cynara_user_creds def;
+    int ret = cynara_creds_get_default_user_method(&def);
+    RUNNER_ASSERT_MSG(ret == CYNARA_API_SUCCESS,
+                      "cynara_creds_get_default_user_method failed with " << ret);
+    return def;
+}
+
+
 void udsServer(SynchronizationPipe &pipe, const struct sockaddr_un &sockaddr,
                const struct ProcessCredentials &peerCredentials) {
     SecurityServer::AccessProvider ap(peerCredentials.label());
@@ -105,61 +131,493 @@ void socketTestTemplate(SocketAssertionFn assertion, const std::string &scope) {
 
 RUNNER_TEST_GROUP_INIT(cynara_creds_socket)
 
-RUNNER_CHILD_TEST_SMACK(tccs01_socket_credentials_client_smack)
-{
-    socketTestTemplate([] (int sock, pid_t, const ProcessCredentials &peerCredentials) {
-        CStringPtr label(CynaraHelperCredentials::socketGetClient(sock, CLIENT_METHOD_SMACK));
+void testSocketClientSmack(cynara_client_creds method = CLIENT_METHOD_SMACK) {
+    socketTestTemplate([method] (int sock, pid_t, const ProcessCredentials &peerCredentials) {
+        CStringPtr label(CynaraHelperCredentials::socketGetClient(sock, method));
         RUNNER_ASSERT_MSG(peerCredentials.label() == label.get(),
                           "Labels don't match ret = " << label.get()
                           << "; expected = " << peerCredentials.label());
     }, "tccs01");
 }
 
-RUNNER_CHILD_TEST_SMACK(tccs02_socket_credentials_client_pid)
-{
-    socketTestTemplate([] (int sock, pid_t pid, const ProcessCredentials &) {
-        CStringPtr clientPidStr(CynaraHelperCredentials::socketGetClient(sock, CLIENT_METHOD_PID));
+void testSocketClientPid(cynara_client_creds method = CLIENT_METHOD_PID) {
+    socketTestTemplate([method] (int sock, pid_t pid, const ProcessCredentials &) {
+        CStringPtr clientPidStr(CynaraHelperCredentials::socketGetClient(sock, method));
         pid_t clientPid = std::stoi(clientPidStr.get());
         RUNNER_ASSERT_MSG(pid == clientPid, "PIDs don't match ret = " << clientPid
                           << "; expected = " << pid);
     }, "tccs02");
 }
 
-RUNNER_CHILD_TEST_SMACK(tccs03_socket_credentials_user_uid)
+RUNNER_MULTIPROCESS_TEST_SMACK(tccs01_socket_credentials_client_smack)
+{
+    testSocketClientSmack();
+}
+
+RUNNER_MULTIPROCESS_TEST(tccs02_socket_credentials_client_pid)
+{
+    testSocketClientPid();
+}
+
+RUNNER_MULTIPROCESS_TEST_SMACK(tccs03_socket_credentials_client_default)
 {
-    socketTestTemplate([] (int sock, pid_t, const ProcessCredentials &peerCredentials) {
-        CStringPtr uidStr(CynaraHelperCredentials::socketGetUser(sock, USER_METHOD_UID));
+    auto method = getClientDefaultMethod();
+    switch(method) {
+    case CLIENT_METHOD_SMACK:
+        testSocketClientSmack(CLIENT_METHOD_DEFAULT);
+        break;
+    case CLIENT_METHOD_PID:
+        testSocketClientPid(CLIENT_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_client_method returned unexpected value "
+                        << method);
+    }
+}
+
+void testSocketUserUid(cynara_user_creds method = USER_METHOD_UID) {
+    socketTestTemplate([method] (int sock, pid_t, const ProcessCredentials &peerCredentials) {
+        CStringPtr uidStr(CynaraHelperCredentials::socketGetUser(sock, method));
         uid_t uid = std::stoul(uidStr.get());
         RUNNER_ASSERT_MSG(peerCredentials.uid() == uid, "UIDs don't match ret = " << uid
                           << "; expected = "<< peerCredentials.uid());
-    }, "tccs03");
+    }, "tccs04");
 }
 
-RUNNER_CHILD_TEST_SMACK(tccs04_socket_credentials_user_gid)
-{
-    socketTestTemplate([] (int sock, pid_t, const ProcessCredentials &peerCredentials) {
-        CStringPtr gidStr(CynaraHelperCredentials::socketGetUser(sock, USER_METHOD_GID));
+void testSocketUserGid(cynara_user_creds method = USER_METHOD_GID) {
+    socketTestTemplate([method] (int sock, pid_t, const ProcessCredentials &peerCredentials) {
+        CStringPtr gidStr(CynaraHelperCredentials::socketGetUser(sock, method));
         gid_t gid = std::stoul(gidStr.get());
         RUNNER_ASSERT_MSG(peerCredentials.gid() == gid, "GIDs don't match ret = " << gid
                           << "; expected = "<< peerCredentials.gid());
-    }, "tccs04");
+    }, "tccs05");
+}
+
+RUNNER_MULTIPROCESS_TEST(tccs04_socket_credentials_user_uid)
+{
+    testSocketUserUid();
+}
+
+RUNNER_MULTIPROCESS_TEST(tccs05_socket_credentials_user_gid)
+{
+    testSocketUserGid();
 }
 
-RUNNER_CHILD_TEST_SMACK(tccs05_cynara_creds_socket_pid)
+RUNNER_MULTIPROCESS_TEST(tccs06_socket_credentials_user_default)
 {
-    const auto sockaddr = UDSHelpers::makeAbstractAddress("helper_tccs05.socket");
+    auto method = getUserDefaultMethod();
+    switch(method) {
+    case USER_METHOD_UID:
+        testSocketUserUid(USER_METHOD_DEFAULT);
+        break;
+    case USER_METHOD_GID:
+        testSocketUserGid(USER_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_user_method returned unexpected value "
+                 << method);
+    }
+}
+
+RUNNER_MULTIPROCESS_TEST(tccs07_socket_credentials_pid)
+{
+    socketTestTemplate([] (int sock, pid_t expectedPid, const ProcessCredentials &) {
+        pid_t peerPid(CynaraHelperCredentials::socketGetPid(sock));
+        RUNNER_ASSERT_MSG(peerPid == expectedPid, "Pids don't match ret = " << peerPid
+                          << "; expected = "<< expectedPid);
+    }, "tccs05");
+}
+
+// TODO: Create utility namespace for DBus, maybe?
+DBusConnectionPtr createDBusConnection(const std::string &name) {
+    DBusError err;
+
+    dbus_error_init(&err);
+    DBusConnection *conn = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
+    RUNNER_ASSERT_MSG(dbus_error_is_set(&err) != 1, "Error in dbus_bus_get: " << err.message);
+    dbus_connection_set_exit_on_disconnect(conn, FALSE);
+
+    DBusConnectionPtr ret(conn, [] (DBusConnection *conn) {
+        dbus_connection_close(conn);
+        dbus_connection_unref(conn);
+    });
+
+    if (name.empty() == false) {
+        dbus_bus_request_name(conn, name.c_str(), DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
+        RUNNER_ASSERT_MSG(dbus_error_is_set(&err) != TRUE,
+                          "Error in dbus_bus_request_name: " << err.message);
+    }
+
+    return ret;
+}
+
+void dbusServer(SynchronizationPipe &pipe, const std::string &requestedName,
+                const ProcessCredentials &peerCredentials) {
+    // for DBus connection, System must have access to our peer creds as well.
+    SecurityServer::AccessProvider systemAp("System");
+    systemAp.addObjectRule(peerCredentials.label(), "rwx");
+    systemAp.apply();
+
+    SecurityServer::AccessProvider ap(peerCredentials.label());
+    ap.addObjectRule("System", "w");
+    ap.addObjectRule("System::Run", "x");
+    ap.addObjectRule("System::Shared", "rwx"); // for GDB
+    ap.addSubjectRule("System::Privileged", "rwx"); // for piping
+    ap.addObjectRule("System::Privileged", "rwx"); // for GDB and piping
+    ap.addObjectRule("User", "r"); // for /usr/lib/debug access
+    ap.applyAndSwithToUser(peerCredentials.uid(), peerCredentials.gid());
+    pipe.claimChildEp();
+
+    auto conn = createDBusConnection(requestedName);
+    pipe.post();
+    pipe.wait();
+}
+
+typedef std::function<void(DBusConnectionPtr conn, pid_t pid,
+                           const std::string &requestedName,
+                           const ProcessCredentials &peerCredentials)> DBusAssertionFn;
+
+void dbusTestTemplate(DBusAssertionFn assertion, const std::string &/*scope*/) {
+    std::string requestedName = "tests.dbus.cynara";
     const ProcessCredentials peerCredentials;
 
     SynchronizationPipe pipe;
-    pid_t expectedPid = runInChild(std::bind(udsServer, std::ref(pipe), std::cref(sockaddr),
-                                   std::cref(peerCredentials)));
+    pid_t pid = runInChild(std::bind(dbusServer, std::ref(pipe), std::cref(requestedName),
+                           std::cref(peerCredentials)));
 
     pipe.claimParentEp();
     pipe.wait();
-    int sock = UDSHelpers::createClient(&sockaddr);
-    SockUniquePtr sockPtr(&sock);
 
-    pid_t helperPid = CynaraHelperCredentials::socketGetPid(sock);
-    RUNNER_ASSERT_MSG(helperPid == expectedPid, "PIDs don't match ret = " << helperPid
-                      << "; expected = " << expectedPid);
+    auto conn = createDBusConnection("");
+    assertion(std::move(conn), pid, requestedName, peerCredentials);
+    pipe.post();
+}
+
+RUNNER_TEST_GROUP_INIT(cynara_creds_dbus)
+
+void testDbusClientPid(cynara_client_creds method = CLIENT_METHOD_PID) {
+    dbusTestTemplate([method] (DBusConnectionPtr conn, pid_t pid, const std::string &requestedName,
+                         const ProcessCredentials &) {
+        CStringPtr clientPidStr(CynaraHelperCredentials::dbusGetClient(std::move(conn),
+            requestedName.c_str(), method, CYNARA_API_SUCCESS));
+        pid_t clientPid = std::stoi(clientPidStr.get());
+        RUNNER_ASSERT_MSG(pid == clientPid, "PIDs don't match ret = " << clientPid
+                          << "; expected = " << pid);
+    }, "tccd01");
+}
+
+void testDbusClientSmack(cynara_client_creds method = CLIENT_METHOD_SMACK) {
+    dbusTestTemplate([method] (DBusConnectionPtr conn, pid_t, const std::string &requestedName,
+                         const ProcessCredentials &peerCredentials) {
+        CStringPtr label(CynaraHelperCredentials::dbusGetClient(std::move(conn),
+            requestedName.c_str(), method, CYNARA_API_SUCCESS));
+        RUNNER_ASSERT_MSG(peerCredentials.label() == label.get(),
+                          "Labels don't match ret = " << label.get()
+                          << "; expected = " << peerCredentials.label());
+    }, "tccd02");
+}
+
+RUNNER_MULTIPROCESS_TEST(tccd01_dbus_credentials_client_pid)
+{
+    testDbusClientPid();
+}
+
+RUNNER_MULTIPROCESS_TEST_SMACK(tccd02_dbus_credentials_client_smack)
+{
+    testDbusClientSmack();
+}
+
+RUNNER_MULTIPROCESS_TEST_SMACK(tccd03_dbus_credentials_client_default)
+{
+    auto method = getClientDefaultMethod();
+    switch(method) {
+    case CLIENT_METHOD_SMACK:
+        testDbusClientSmack(CLIENT_METHOD_DEFAULT);
+        break;
+    case CLIENT_METHOD_PID:
+        testDbusClientPid(CLIENT_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_client_method returned unexpected value "
+                        << method);
+    }
+}
+
+void testDbusUserUid(cynara_user_creds method = USER_METHOD_UID) {
+    dbusTestTemplate([method] (DBusConnectionPtr conn, pid_t, const std::string &requestedName,
+                         const ProcessCredentials &peerCredentials) {
+        CStringPtr uidStr(CynaraHelperCredentials::dbusGetUser(std::move(conn),
+            requestedName.c_str(), method, CYNARA_API_SUCCESS));
+        uid_t uid = std::stoul(uidStr.get());
+        RUNNER_ASSERT_MSG(peerCredentials.uid() == uid, "UIDs don't match ret = " << uid
+                          << "; expected = "<< peerCredentials.uid());
+    }, "tccd04");
+}
+
+void testDbusUserGid(cynara_user_creds method = USER_METHOD_GID) {
+    // Acquiring gid from dbus connection is not yet implemented for cynara helpers
+    dbusTestTemplate([method] (DBusConnectionPtr conn, pid_t, const std::string &requestedName,
+                         const ProcessCredentials &) {
+        CStringPtr gidStr(CynaraHelperCredentials::dbusGetUser(std::move(conn),
+            requestedName.c_str(), method, CYNARA_API_METHOD_NOT_SUPPORTED));
+    }, "tccd04");
+}
+
+RUNNER_MULTIPROCESS_TEST(tccd04_dbus_credentials_user_uid)
+{
+    testDbusUserUid();
+}
+
+RUNNER_MULTIPROCESS_TEST(tccd05_dbus_credentials_user_gid)
+{
+    testDbusUserGid();
+}
+
+RUNNER_MULTIPROCESS_TEST(tccd06_dbus_credentials_user_default) {
+    auto method = getUserDefaultMethod();
+    switch(method) {
+    case USER_METHOD_UID:
+        testDbusUserUid(USER_METHOD_DEFAULT);
+        break;
+    case USER_METHOD_GID:
+        testDbusUserGid(USER_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_user_method returned unexpected value "
+                        << method);
+    }
+}
+
+RUNNER_TEST_SMACK(tccd06_dbus_credentials_pid) {
+    dbusTestTemplate([] (DBusConnectionPtr conn, pid_t expectedPid,
+                         const std::string &requestedName, const ProcessCredentials &) {
+        auto helperPid = CynaraHelperCredentials::dbusGetPid(std::move(conn),
+            requestedName.c_str(), CYNARA_API_SUCCESS);
+        RUNNER_ASSERT_MSG(helperPid == expectedPid, "PIDs don't match ret = " << helperPid
+                          << "; expected = " << expectedPid);
+    }, "tccd06");
+}
+
+GDBusConnectionPtr createGDBusConnection() {
+    GDBusConnection *conn = g_bus_get_sync(G_BUS_TYPE_SYSTEM, NULL, NULL);
+
+    return GDBusConnectionPtr(conn, [] (GDBusConnection *conn) {
+        g_object_unref(G_OBJECT(conn));
+    });
+}
+
+
+typedef std::function<void(GDBusConnectionPtr conn, pid_t pid,
+                           const std::string &requestedName,
+                           const ProcessCredentials &peerCredentials)> GDBusAssertionFn;
+
+void gdbusTestTemplate(GDBusAssertionFn assertion, const std::string &/*scope*/) {
+    std::string requestedName = "tests.dbus.cynara";
+    const ProcessCredentials peerCredentials;
+
+    SynchronizationPipe pipe;
+    pid_t pid = runInChild(std::bind(dbusServer, std::ref(pipe), std::cref(requestedName),
+                           std::cref(peerCredentials)));
+
+    pipe.claimParentEp();
+    pipe.wait();
+
+    auto conn = createGDBusConnection();
+    assertion(std::move(conn), pid, requestedName, peerCredentials);
+    pipe.post();
+}
+
+
+RUNNER_TEST_GROUP_INIT(cynara_creds_gdbus)
+
+void testGdbusClientPid(cynara_client_creds method = CLIENT_METHOD_PID) {
+    gdbusTestTemplate([method] (GDBusConnectionPtr conn, pid_t pid,
+                                const std::string &requestedName,
+                                const ProcessCredentials &) {
+        GStringPtr clientPidStr(CynaraHelperCredentials::gdbusGetClient(std::move(conn),
+                                requestedName.c_str(), method));
+        pid_t clientPid = std::stoi(clientPidStr.get());
+        RUNNER_ASSERT_MSG(pid == clientPid, "PIDs don't match ret = " << clientPid
+                          << "; expected = " << pid);
+    }, "tccgd01");
+}
+
+void testGdbusClientSmack(cynara_client_creds method = CLIENT_METHOD_SMACK) {
+    gdbusTestTemplate([method] (GDBusConnectionPtr conn, pid_t,
+                                const std::string &requestedName,
+                                const ProcessCredentials &peerCredentials) {
+        GStringPtr label(CynaraHelperCredentials::gdbusGetClient(std::move(conn),
+                         requestedName.c_str(), method));
+        RUNNER_ASSERT_MSG(peerCredentials.label() == label.get(),
+                          "Labels don't match ret = " << label.get()
+                          << "; expected = " << peerCredentials.label());
+    }, "tccgd02");
+}
+
+RUNNER_MULTIPROCESS_TEST(tccgd01_gdbus_credentials_client_pid)
+{
+    testGdbusClientPid();
+}
+
+RUNNER_MULTIPROCESS_TEST_SMACK(tccgd02_gdbus_credentials_client_smack)
+{
+    testGdbusClientSmack();
+}
+
+RUNNER_MULTIPROCESS_TEST_SMACK(tccgd03_gdbus_credentials_client_default)
+{
+    auto method = getClientDefaultMethod();
+    switch(method) {
+    case CLIENT_METHOD_SMACK:
+        testGdbusClientSmack(CLIENT_METHOD_DEFAULT);
+        break;
+    case CLIENT_METHOD_PID:
+        testGdbusClientPid(CLIENT_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_client_method returned unexpected value "
+                        << method);
+    }
+}
+
+void testGdbusUserUid(cynara_user_creds method = USER_METHOD_UID) {
+    gdbusTestTemplate([method] (GDBusConnectionPtr conn, pid_t,
+                                const std::string &requestedName,
+                                const ProcessCredentials &peerCredentials) {
+        GStringPtr uidStr(CynaraHelperCredentials::gdbusGetUser(std::move(conn),
+                          requestedName.c_str(), method));
+        uid_t uid = std::stoul(uidStr.get());
+        RUNNER_ASSERT_MSG(peerCredentials.uid() == uid, "UIDs don't match ret = " << uid
+                          << "; expected = "<< peerCredentials.uid());
+    }, "tccgd04");
+}
+
+void testGdbusUserGid(cynara_user_creds method = USER_METHOD_GID) {
+    // Getting gid for gdbus connection is not yet implemented in cynara helpers
+    gdbusTestTemplate([method] (GDBusConnectionPtr conn, pid_t,
+                                const std::string &requestedName,
+                                const ProcessCredentials &) {
+        GStringPtr gidStr(CynaraHelperCredentials::gdbusGetUser(std::move(conn),
+                          requestedName.c_str(), method, CYNARA_API_METHOD_NOT_SUPPORTED));
+    }, "tccgd04");
+}
+
+RUNNER_MULTIPROCESS_TEST(tccgd04_gdbus_credentials_user_uid)
+{
+    testGdbusUserUid();
+}
+
+RUNNER_MULTIPROCESS_TEST(tccgd05_gdbus_credentials_user_gid)
+{
+    testGdbusUserGid();
+}
+
+RUNNER_MULTIPROCESS_TEST(tccgd06_gdbus_credentials_user_default) {
+    auto method = getUserDefaultMethod();
+    switch(method) {
+    case USER_METHOD_UID:
+        testGdbusUserUid(USER_METHOD_DEFAULT);
+        break;
+    case USER_METHOD_GID:
+        testGdbusUserGid(USER_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_user_method returned unexpected value "
+                        << method);
+    }
+}
+
+RUNNER_MULTIPROCESS_TEST(tccgd06_gdbus_credentials_pid) {
+    gdbusTestTemplate([] (GDBusConnectionPtr conn, pid_t expectedPid,
+                          const std::string &requestedName, const ProcessCredentials &) {
+        auto helperPid = CynaraHelperCredentials::gdbusGetPid(std::move(conn),
+                         requestedName.c_str());
+        RUNNER_ASSERT_MSG(helperPid == expectedPid, "PIDs don't match ret = " << helperPid
+                          << "; expected = " << expectedPid);
+    }, "tccgd06");
+}
+
+RUNNER_TEST_GROUP_INIT(cynara_creds_self)
+
+void testCredsClientSelf(cynara_client_creds method, const std::string &expected) {
+    char *client;
+    int ret = cynara_creds_self_get_client(method, &client);
+    CStringPtr clientPtr(client);
+    RUNNER_ASSERT_MSG(ret == CYNARA_API_SUCCESS, "cynara_creds_self_get_client failed with " << ret);
+    RUNNER_ASSERT_MSG(expected == client, "expected client doesn't match, expected: " << expected
+                                          << ", got : " << client);
+}
+
+void testCredsUserSelf(cynara_user_creds method, const std::string &expected) {
+    char *user;
+    int ret = cynara_creds_self_get_user(method, &user);
+    CStringPtr clientPtr(user);
+    RUNNER_ASSERT_MSG(ret == CYNARA_API_SUCCESS, "cynara_creds_self_get_user failed with " << ret);
+    RUNNER_ASSERT_MSG(expected == user, "expected user doesn't match, expected: " << expected
+                                          << ", got : " << user);
+}
+
+void testSelfClientSmack(cynara_client_creds method = CLIENT_METHOD_SMACK) {
+    std::string label = "test-label";
+    change_label(label.c_str());
+    testCredsClientSelf(method, label);
+}
+
+void testSelfClientPid(cynara_client_creds method = CLIENT_METHOD_PID) {
+    pid_t pid = getpid();
+    testCredsClientSelf(method, std::to_string(pid));
+}
+
+void testSelfUserUid(cynara_user_creds method = USER_METHOD_UID) {
+    uid_t uid = getuid();
+    testCredsUserSelf(method, std::to_string(uid));
+}
+
+void testSelfUserGid(cynara_user_creds method = USER_METHOD_GID) {
+    gid_t gid = getgid();
+    testCredsUserSelf(method, std::to_string(gid));
+}
+
+RUNNER_CHILD_TEST_SMACK(tccsl01_self_credentials_client_smack) {
+    testSelfClientSmack();
+}
+
+RUNNER_CHILD_TEST_SMACK(tccsl02_self_credentials_client_pid) {
+    testSelfClientPid();
+}
+
+RUNNER_CHILD_TEST_SMACK(tccsl03_self_credentials_user_uid) {
+    testSelfUserUid();
+}
+
+RUNNER_CHILD_TEST_SMACK(tccsl04_self_credentials_user_gid) {
+    testSelfUserGid();
+}
+
+RUNNER_CHILD_TEST_SMACK(tccsl05_self_credentials_client_default) {
+    auto method = getClientDefaultMethod();
+    switch(method) {
+    case CLIENT_METHOD_SMACK:
+        testSelfClientSmack(CLIENT_METHOD_DEFAULT);
+        break;
+    case CLIENT_METHOD_PID:
+        testSelfClientPid(CLIENT_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_client_method returned unexpected value " << method);
+    }
+}
+
+RUNNER_CHILD_TEST_SMACK(tccsl06_self_credentials_user_default) {
+    auto method = getUserDefaultMethod();
+    switch(method) {
+    case USER_METHOD_UID:
+        testSelfUserUid(USER_METHOD_DEFAULT);
+        break;
+    case USER_METHOD_GID:
+        testSelfUserGid(USER_METHOD_DEFAULT);
+        break;
+    default:
+        RUNNER_FAIL_MSG("cynara_creds_get_default_user_method returned unexpected value " << method);
+    }
 }
index 4f01833..c8fbdcb 100644 (file)
@@ -246,9 +246,7 @@ protected:
                                     __FILE__,                                         \
                                     __LINE__,                                         \
                                     assertMsg.str());                                 \
-            if (!std::uncaught_exception())                                           \
-                throw e;                                                              \
-            DPL::Test::TestRunnerSingleton::Instance().addFailReason(e.GetMessage()); \
+            throw e;                                                                  \
         }                                                                             \
     } while (0)
 
@@ -267,9 +265,7 @@ protected:
                                     __FILE__,                                         \
                                     __LINE__,                                         \
                                     assertMsg.str());                                 \
-            if (!std::uncaught_exception())                                           \
-                throw e;                                                              \
-            DPL::Test::TestRunnerSingleton::Instance().addFailReason(e.GetMessage()); \
+            throw e;                                                                  \
         }                                                                             \
     } while (0)
 
index 33a4ef7..f4a625f 100644 (file)
@@ -454,10 +454,11 @@ void TestRunner::Usage()
     fprintf(stderr,
             "    test-binary --output=text --output=xml --file=output.xml\n\n");
     fprintf(stderr, "Other parameters:\n");
+    fprintf(stderr, "  --test=<test name> Run only one test\n");
     fprintf(stderr,
             "  --regexp='regexp'\t Only selected tests"
             " which names match regexp run\n\n");
-    fprintf(stderr, "  --start=<test id>\tStart from concrete test id");
+    fprintf(stderr, "  --start=<test id>\tStart from concrete test id\n");
     fprintf(stderr, "  --group=<group name>\t Run tests only from one group\n");
     fprintf(stderr, "  --runignored\t Run also ignored tests\n");
     fprintf(stderr, "  --list\t Show a list of Test IDs\n");
@@ -514,6 +515,7 @@ int TestRunner::ExecTestRunner(ArgsList args)
     // Parse each argument
     for(std::string &arg : args)
     {
+        const std::string test = "--test=";
         const std::string regexp = "--regexp=";
         const std::string output = "--output=";
         const std::string groupId = "--group=";
@@ -630,6 +632,36 @@ int TestRunner::ExecTestRunner(ArgsList args)
                 }
                 group.second = newList;
             }
+        } else if (arg.find(test) == 0) {
+            arg.erase(0, test.length());
+            if (arg.length() == 0) {
+                InvalidArgs();
+                Usage();
+                return -1;
+            }
+
+            if (arg[0] == '\'' && arg[arg.length() - 1] == '\'') {
+                arg.erase(0);
+                arg.erase(arg.length() - 1);
+            }
+
+            if (arg.length() == 0) {
+                InvalidArgs();
+                Usage();
+                return -1;
+            }
+
+            pcrecpp::RE re(arg.c_str());
+            for (auto &group : m_testGroups) {
+                TestCaseList newList;
+                for (auto &tc : group.second)
+                {
+                    if (re.FullMatch(tc->GetName())) {
+                        newList.push_back(tc);
+                    }
+                }
+                group.second = newList;
+            }
         } else if(arg.find(onlyFromXML) == 0) {
             arg.erase(0, onlyFromXML.length());
             if (arg.length() == 0) {
@@ -750,12 +782,11 @@ void TestRunner::deferEnd()
     if (m_deferDeepness > 0)
         return;
 
-    bool oops = std::uncaught_exception();
-    size_t additionalExceptions = oops ? 0 : 1;
-    for (size_t i = additionalExceptions; i < m_deferredExceptionsMessages.size(); ++i)
+    for (size_t i = 0; i < m_deferredExceptionsMessages.size(); ++i) {
         addFailReason(m_deferredExceptionsMessages[i]);
+    }
 
-    if (!oops && !m_deferredExceptionsMessages.empty())
+    if (!m_deferredExceptionsMessages.empty())
     {
         m_deferredExceptionsMessages.clear();
         switch (m_firstDeferredExceptionType) {
index da97c64..9ab5b5c 100644 (file)
@@ -56,6 +56,7 @@ runTest smack
 runTest security-manager
 runTest cynara
 runTest ckm
+runTest yaca
 
 printSummary
 
index 9115beb..3956258 100644 (file)
@@ -46,11 +46,17 @@ case $1 in
     echo
     ckm-tests "${@:2}"
     ;;
+"yaca")
+    echo "========================================================================="
+    echo "YACA TESTS"
+    echo
+    yaca-test "${@:2}"
+    ;;
 *)
     echo "Correct using:"
     echo "    security_test.sh <module> <args_for_module>"
     echo
-    echo "modules: smack, security-manager, cynara, ckm"
+    echo "modules: smack, security-manager, cynara, ckm, yaca"
     ;;
 
 esac
diff --git a/src/yaca/CMakeLists.txt b/src/yaca/CMakeLists.txt
new file mode 100644 (file)
index 0000000..290a4ca
--- /dev/null
@@ -0,0 +1,56 @@
+#
+#    Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+#
+#    Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+#
+#    Licensed under the Apache License, Version 2.0 (the "License");
+#    you may not use this file except in compliance with the License.
+#    You may obtain a copy of the License at
+#
+#        http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS,
+#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#    See the License for the specific language governing permissions and
+#    limitations under the License.
+#
+#
+# @file   CMakeLists.txt
+# @author Dariusz Michaluk (d.michaluk@samsung.com)
+#
+
+MESSAGE(STATUS "")
+MESSAGE(STATUS "Generating makefile for the Yaca system tests...")
+
+FILE(GLOB  yaca_test_SRCS *.cpp)
+
+## Setup target ################################################################
+SET(YACA_TEST "yaca-test")
+ADD_EXECUTABLE(${YACA_TEST} ${yaca_test_SRCS})
+
+ADD_CUSTOM_TARGET(copy-test-vectors ALL
+                  COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/test-vectors ${CMAKE_CURRENT_BINARY_DIR}/test-vectors
+                  DEPENDS ${YACA_TEST})
+
+IF(NOT DEFINED YACA_TEST_DIR)
+       SET(YACA_TEST_DIR "${SHARE_INSTALL_PREFIX}/${YACA_TEST}")
+ENDIF(NOT DEFINED YACA_TEST_DIR)
+ADD_DEFINITIONS("-DYACA_TEST_DIR=\"${YACA_TEST_DIR}\"")
+MESSAGE(STATUS "YACA_TEST_DIR: ${YACA_TEST_DIR}")
+
+## Link libraries ##############################################################
+PKG_CHECK_MODULES(YACA_TEST_DEPS REQUIRED yaca)
+
+FIND_PACKAGE (Threads)
+
+INCLUDE_DIRECTORIES(SYSTEM ${YACA_TEST_DEPS_INCLUDE_DIRS})
+TARGET_LINK_LIBRARIES(${YACA_TEST}
+                      ${YACA_TEST_DEPS_LIBRARIES}
+                      dpl-test-framework
+                      ${CMAKE_THREAD_LIBS_INIT})
+
+## Install #####################################################################
+INSTALL(TARGETS ${YACA_TEST} DESTINATION bin)
+
+INSTALL(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test-vectors DESTINATION ${YACA_TEST_DIR})
diff --git a/src/yaca/debug.h b/src/yaca/debug.h
new file mode 100644 (file)
index 0000000..149e2ba
--- /dev/null
@@ -0,0 +1,34 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Krzysztof Jackiewicz <k.jackiewicz@samsung.com>
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file debug.h
+ * @brief
+ */
+
+#pragma once
+
+extern "C" {
+
+typedef void (*yaca_error_cb)(const char*);
+
+void yaca_debug_set_error_cb(yaca_error_cb cb);
+
+char *yaca_debug_translate_error(yaca_error_e err);
+
+} /* extern */
diff --git a/src/yaca/lorem.cpp b/src/yaca/lorem.cpp
new file mode 100644 (file)
index 0000000..b2ddeff
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Krzysztof Jackiewicz <k.jackiewicz@samsung.com>
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file lorem.cpp
+ * @brief Lorem Ipsum
+ */
+
+#include "lorem.h"
+
+const char lorem8[LOREM8_SIZE] = "Lorem i";
+const char lorem16[LOREM16_SIZE] = "Lorem ipsum dol";
+const char lorem1024[LOREM1024_SIZE] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec non dolor tincidunt, vehicula erat non, pulvinar nisl. Suspendisse gravida commodo hendrerit. Sed ex magna, aliquet malesuada lectus ut, porttitor tincidunt ante. Nulla facilisi. Morbi nec scelerisque risus. Sed a gravida sapien. Cras sed neque bibendum, dapibus lectus sed, porta nulla. Morbi tristique velit lacus, at luctus turpis mollis sed. Nam quis sapien eu magna cursus venenatis. Phasellus et vestibulum urna, non pellentesque ex. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam pretium aliquam porta.\
+Morbi magna metus, commodo in fermentum id, mattis pretium mauris. Donec sed rhoncus justo. Duis fringilla sem quis velit dignissim bibendum. Sed porta efficitur ipsum, in dignissim magna molestie eu. Sed elementum maximus risus. Quisque cursus urna lectus, sit amet fringilla purus tempor eu. Praesent tincidunt dolor sit amet dolor vulputate, et molestie tellus euismod. Proin suscipit dictum amet.";
+
+const char lorem4096[LOREM4096_SIZE] = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus congue semper ipsum, ac convallis magna rhoncus sit amet. Donec pellentesque maximus convallis. Mauris ut egestas sem. Maecenas efficitur suscipit auctor. Nunc malesuada laoreet porttitor. Donec gravida tortor nisi, in mattis lectus porta ut. Integer vehicula eros et tellus placerat, nec fermentum justo aliquet.\
+Maecenas metus massa, ultrices et ultricies sed, imperdiet nec dolor. Nam eget massa eros. Proin vitae laoreet metus, at scelerisque massa. Nullam convallis dolor id nisl iaculis, a gravida risus pretium. Proin non nunc eget nibh fermentum dignissim. Nullam tristique, odio eget rutrum sagittis, tortor purus cursus nunc, nec iaculis quam nunc ac metus. Cras ut tortor a eros porta vehicula non at lectus. Aliquam volutpat quis nisi ut mattis. Curabitur semper vehicula ultrices. Aenean cursus laoreet venenatis. Aenean vulputate, nisl id facilisis fringilla, neque velit posuere libero, et viverra tortor felis vitae urna. Sed in congue nunc. Fusce molestie tempor pharetra. Cras sodales pulvinar nunc non sollicitudin.\
+Maecenas vehicula metus ac tristique ultricies. Suspendisse potenti. Pellentesque suscipit egestas augue, sed dictum orci. Pellentesque eu lorem ultricies, vestibulum est in, bibendum turpis. Proin placerat tincidunt metus, eget volutpat dolor. Pellentesque varius leo eget velit lobortis, sit amet congue orci bibendum. Aliquam vitae posuere lorem. Donec sed convallis diam. Quisque aliquam interdum purus, eu ornare ex ullamcorper iaculis. In sit amet nisl eu nisl ultricies dapibus. Aenean finibus efficitur elit ut sodales. Nam sit amet auctor sem, eu iaculis nunc. Vivamus mattis arcu a viverra faucibus. In dignissim, nisi sit amet consectetur tempus, lorem dui fringilla augue, sit amet lacinia lectus sapien efficitur odio.\
+Nullam et egestas enim. Nam sit amet mi malesuada, dapibus felis quis, viverra mauris. Ut quis enim eu neque porta vehicula. Etiam ullamcorper vitae turpis vehicula blandit. Maecenas blandit tristique semper. Aliquam at sagittis enim. Donec quis molestie urna. Duis ut urna blandit, pellentesque magna ultrices, dignissim mi. Morbi fermentum ex massa, ut facilisis est tincidunt vel. Nam sed erat in lacus molestie mattis quis ut leo. Phasellus tempus elit urna, eget sagittis purus volutpat sed. Suspendisse aliquam, sem vel gravida lobortis, tortor orci ornare nisi, sed mollis ligula sem nec risus. In a ex nibh. Praesent odio est, molestie sed vestibulum id, varius sit amet lectus. Donec vel diam efficitur, tristique ligula a, aliquet felis. Nullam sit amet neque tellus.\
+Phasellus aliquet non libero non aliquet. Aliquam efficitur ultrices tortor vitae lobortis. Pellentesque sed dolor quis nisl faucibus eleifend vitae ultrices est. Integer et libero quis nisl sollicitudin volutpat sit amet a quam. Vivamus commodo dolor augue, volutpat dapibus odio dapibus et. Nulla sed congue nisl. Duis nunc sem, condimentum nec neque ac, blandit blandit quam. Integer tincidunt ipsum nec risus viverra mollis. In porta porttitor mattis. Nulla ac eleifend nibh. Vivamus suscipit at nunc ac interdum. In fermentum fringilla odio.\
+Sed nec erat eget mauris varius pulvinar. Ut fermentum ante non erat elementum, vitae tempor velit blandit. Curabitur turpis tellus, sodales sit amet mattis nec, volutpat ac magna. Nulla quam orci, rutrum sit amet imperdiet ut, iaculis in nisl. Donec semper vitae tellus nec bibendum. Nam pharetra hendrerit sapien quis rutrum. Morbi tincidunt justo ut sodales ullamcorper. Suspendisse eget pellentesque nulla, non placerat purus. Donec placerat id turpis in interdum. Curabitur lobortis risus et placerat commodo. Morbi pulvinar eros leo, scelerisque rutrum arcu pretium at. Quisque eget diam dui. Quisque bibendum luctus arcu quis semper. Nullam erat lacus, lacinia sit amet neque aliquam, lacinia maximus lorem.\
+Nunc ac purus vel sem laoreet interdum quis eget ligula. Aenean id nisl ut quam vehicula pretium sed sit amet urna. Aenean diam lorem, vehicula et sapien nec, pellentesque consectetur libero. Cras fringilla nibh eu libero nullam.";
diff --git a/src/yaca/lorem.h b/src/yaca/lorem.h
new file mode 100644 (file)
index 0000000..8d1ad45
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Krzysztof Jackiewicz <k.jackiewicz@samsung.com>
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file lorem.h
+ * @brief
+ */
+
+#ifndef LOREM_H
+#define LOREM_H
+
+#include <stddef.h>
+
+/**
+ * Test strings, sizes include null-termination
+ */
+extern const char lorem8[];
+extern const char lorem16[];
+extern const char lorem1024[];
+extern const char lorem4096[];
+
+/**
+ * Sizes of test strings
+ */
+#define LOREM8_SIZE ((size_t)8)
+#define LOREM16_SIZE ((size_t)16)
+#define LOREM1024_SIZE ((size_t)1024)
+#define LOREM4096_SIZE ((size_t)4096)
+
+#endif
diff --git a/src/yaca/test-vectors/digest_ascii.txt b/src/yaca/test-vectors/digest_ascii.txt
new file mode 100644 (file)
index 0000000..dc955e1
--- /dev/null
@@ -0,0 +1,160 @@
+############### MD5 ###############
+algo=MD5
+repeats=1
+input=
+output=d41d8cd98f00b204e9800998ecf8427e
+
+algo=MD5
+repeats=1
+input=a
+output=0cc175b9c0f1b6a831c399e269772661
+
+algo=MD5
+repeats=1
+input=abc
+output=900150983cd24fb0d6963f7d28e17f72
+
+algo=MD5
+repeats=1
+input=message digest
+output=f96b697d7cb7938d525a2f31aaf161d0
+
+algo=MD5
+repeats=1
+input=abcdefghijklmnopqrstuvwxyz
+output=c3fcd3d76192e4007dfb496cca67e13b
+
+algo=MD5
+repeats=1
+input=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789
+output=d174ab98d277d9f5a5611c2c9f419d9f
+
+algo=MD5
+repeats=1
+input=12345678901234567890123456789012345678901234567890123456789012345678901234567890
+output=57edf4a22be3c955ac49da2e2107b67a
+
+############### SHA1 ###############
+algo=SHA1
+repeats=1
+input=
+output=da39a3ee5e6b4b0d3255bfef95601890afd80709
+
+algo=SHA1
+repeats=1
+input=abc
+output=a9993e364706816aba3e25717850c26c9cd0d89d
+
+algo=SHA1
+repeats=1
+input=abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq
+output=84983e441c3bd26ebaae4aa1f95129e5e54670f1
+
+algo=SHA1
+repeats=1000000
+input=a
+output=34aa973cd4c4daa4f61eeb2bdbad27316534016f
+
+algo=SHA1
+repeats=10
+input=0123456701234567012345670123456701234567012345670123456701234567
+output=dea356a2cddd90c7a7ecedc5ebb563934f460452
+
+############### SHA224 ###############
+algo=SHA224
+repeats=1
+input=
+output=d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f
+
+algo=SHA224
+repeats=1
+input=abc
+output=23097d223405d8228642a477bda255b32aadbce4bda0b3f7e36c9da7
+
+algo=SHA224
+repeats=1
+input=abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq
+output=75388b16512776cc5dba5da1fd890150b0c6455cb4f58b1952522525
+
+algo=SHA224
+repeats=1000000
+input=a
+output=20794655980c91d8bbb4c1ea97618a4bf03f42581948b2ee4ee7ad67
+
+############### SHA256 ###############
+algo=SHA256
+repeats=1
+input=
+output=e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855
+
+algo=SHA256
+repeats=1
+input=abc
+output=ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad
+
+algo=SHA256
+repeats=1
+input=abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq
+output=248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1
+
+algo=SHA256
+repeats=1000000
+input=a
+output=cdc76e5c9914fb9281a1c7e284d73e67f1809a48a497200e046d39ccc7112cd0
+
+algo=SHA256
+repeats=10
+input=0123456701234567012345670123456701234567012345670123456701234567
+output=594847328451bdfa85056225462cc1d867d877fb388df0ce35f25ab5562bfbb5
+
+############### SHA384 ###############
+algo=SHA384
+repeats=1
+input=
+output=38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b
+
+algo=SHA384
+repeats=1
+input=abc
+output=cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7
+
+algo=SHA384
+repeats=1
+input=abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu
+output=09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039
+
+algo=SHA384
+repeats=1000000
+input=a
+output=9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985
+
+algo=SHA384
+repeats=10
+input=0123456701234567012345670123456701234567012345670123456701234567
+output=2fc64a4f500ddb6828f6a3430b8dd72a368eb7f3a8322a70bc84275b9c0b3ab00d27a5cc3c2d224aa6b61a0d79fb4596
+
+############### SHA512 ###############
+algo=SHA512
+repeats=1
+input=
+output=cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e
+
+algo=SHA512
+repeats=1
+input=abc
+output=ddaf35a193617abacc417349ae20413112e6fa4e89a97ea20a9eeee64b55d39a2192992a274fc1a836ba3c23a3feebbd454d4423643ce80e2a9ac94fa54ca49f
+
+algo=SHA512
+repeats=1
+input=abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu
+output=8e959b75dae313da8cf4f72814fc143f8f7779c6eb9f7fa17299aeadb6889018501d289e4900f7e4331b99dec4b5433ac7d329eeb6dd26545e96e55b874be909
+
+algo=SHA512
+repeats=1000000
+input=a
+output=e718483d0ce769644e2e42c7bc15b4638e1f98b13b2044285632a803afa973ebde0ff244877ea60a4cb0432ce577c31beb009c5c2c49aa2e4eadb217ad8cc09b
+
+algo=SHA512
+repeats=10
+input=0123456701234567012345670123456701234567012345670123456701234567
+output=89d05ba632c699c31231ded4ffc127d5a894dad412c0e024db872d1abd2ba8141a0f85072a9be1e2aa04cf33c765cb510813a39cd5a84c4acaa64d3f3fb7bae9
\ No newline at end of file
diff --git a/src/yaca/test-vectors/digest_binary.txt b/src/yaca/test-vectors/digest_binary.txt
new file mode 100644 (file)
index 0000000..8e4cd7b
--- /dev/null
@@ -0,0 +1,74 @@
+############### SHA1 ###############
+algo=SHA1
+repeats=1
+input=5e
+output=5e6f80a34a9798cafc6a5db96cc57ba4c4db59c2
+
+algo=SHA1
+repeats=1
+input=9a7dfdf1ecead06ed646aa55fe757146
+output=82abff6605dbe1c17def12a394fa22a82b544a35
+
+algo=SHA1
+repeats=1
+input=f78f92141bcd170ae89b4fba15a1d59f3fd84d223c9251bdacbbae61d05ed115a06a7ce117b7beead24421ded9c32592bd57edeae39c39fa1fe8946a84d0cf1f7beead1713e2e0959897347f67c80b0400c209815d6b10a683836fd5562a56cab1a28e81b6576654631cf16566b86e3b33a108b05307c00aff14a768ed7350606a0f85e6a91d396f5b5cbe577f9b38807c7d523d6d792f6ebc24a4ecf2b3a427cdbbfb
+output=cb0082c8f197d260991ba6a460e76e202bad27b3
+
+############### SHA224 ###############
+algo=SHA224
+repeats=1
+input=07
+output=00ecd5f138422b8ad74c9799fd826c531bad2fcabc7450bee2aa8c2a
+
+algo=SHA224
+repeats=1
+input=18804005dd4fbd1556299d6f9d93df62
+output=df90d78aa78821c99b40ba4c966921accd8ffb1e98ac388e56191db1
+
+############### SHA256 ###############
+algo=SHA256
+repeats=1
+input=19
+output=68aa2e2ee5dff96e3355e6c7ee373e3d6a4e17f75f9518d843709c0c9bc3e3d4
+
+algo=SHA256
+repeats=1
+input=e3d72570dcdd787ce3887ab2cd684652
+output=175ee69b02ba9b58e2b0a5fd13819cea573f3940a94f825128cf4209beabb4e8
+
+algo=SHA256
+repeats=1
+input=8326754e2277372f4fc12b20527afef04d8a056971b11ad57123a7c137760000d7bef6f3c1f7a9083aa39d810db310777dab8b1e7f02b84a26c773325f8b2374de7a4b5a58cb5c5cf35bcee6fb946e5bd694fa593a8beb3f9d6592ecedaa66ca82a29d0c51bcf9336230e5d784e4c0a43f8d79a30a165cbabe452b774b9c7109a97d138f129228966f6c0adc106aad5a9fdd30825769b2c671af6759df28eb393d54d6
+output=97dbca7df46d62c8a422c941dd7e835b8ad3361763f7e9b2d95f4f0da6e1ccbc
+
+############### SHA384 ###############
+algo=SHA384
+repeats=1
+input=b9
+output=bc8089a19007c0b14195f4ecc74094fec64f01f90929282c2fb392881578208ad466828b1c6c283d2722cf0ad1ab6938
+
+algo=SHA384
+repeats=1
+input=a41c497779c0375ff10a7f4e08591739
+output=c9a68443a005812256b8ec76b00516f0dbb74fab26d665913f194b6ffb0e91ea9967566b58109cbc675cc208e4c823f7
+
+algo=SHA384
+repeats=1
+input=399669e28f6b9c6dbcbb6912ec10ffcf74790349b7dc8fbe4a8e7b3b5621db0f3e7dc87f823264bbe40d1811c9ea2061e1c84ad10a23fac1727e7202fc3f5042e6bf58cba8a2746e1f64f9b9ea352c711507053cf4e5339d52865f25cc22b5e87784a12fc961d66cb6e89573199a2ce6565cbdf13dca403832cfcb0e8b7211e83af32a11ac17929ff1c073a51cc027aaedeff85aad7c2b7c5a803e2404d96d2a77357bda1a6daeed17151cb9bc5125a422e941de0ca0fc5011c23ecffefdd09676711cf3db0a3440720e1615c1f22fbc3c721de521e1b99ba1bd5577408642147ed096
+output=4f440db1e6edd2899fa335f09515aa025ee177a79f4b4aaf38e42b5c4de660f5de8fb2a5b2fbd2a3cbffd20cff1288c0
+
+############### SHA512 ###############
+algo=SHA512
+repeats=1
+input=d0
+output=9992202938e882e73e20f6b69e68a0a7149090423d93c81bab3f21678d4aceeee50e4e8cafada4c85a54ea8306826c4ad6e74cece9631bfa8a549b4ab3fbba15
+
+algo=SHA512
+repeats=1
+input=8d4e3c0e3889191491816e9d98bff0a0
+output=cb0b67a4b8712cd73c9aabc0b199e9269b20844afb75acbdd1c153c9828924c3ddedaafe669c5fdd0bc66f630f6773988213eb1b16f517ad0de4b2f0c95c90f8
+
+algo=SHA512
+repeats=1
+input=a55f20c411aad132807a502d65824e31a2305432aa3d06d3e282a8d84e0de1de6974bf495469fc7f338f8054d58c26c49360c3e87af56523acf6d89d03e56ff2f868002bc3e431edc44df2f0223d4bb3b243586e1a7d924936694fcbbaf88d9519e4eb50a644f8e4f95eb0ea95bc4465c8821aacd2fe15ab4981164bbb6dc32f969087a145b0d9cc9c67c22b763299419cc4128be9a077b3ace634064e6d99283513dc06e7515d0d73132e9a0dc6d3b1f8b246f1a98a3fc72941b1e3bb2098e8bf16f268d64f0b0f4707fe1ea1a1791ba2f3c0c758e5f551863a96c949ad47d7fb40d2
+output=c665befb36da189d78822d10528cbf3b12b3eef726039909c1a16a270d48719377966b957a878e720584779a62825c18da26415e49a7176a894e7510fd1451f5
\ No newline at end of file
diff --git a/src/yaca/test-vectors/encrypt_aes_ccm_tag_len.txt b/src/yaca/test-vectors/encrypt_aes_ccm_tag_len.txt
new file mode 100644 (file)
index 0000000..a8d8bcf
--- /dev/null
@@ -0,0 +1,118 @@
+################## Check tag_len for algo and bcm ##################
+
+################## AES ##################
+
+################## CCM ##################
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=3
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=4
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=5
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=6
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=7
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=8
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=9
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=10
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=11
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=12
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=13
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=14
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=15
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=16
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=17
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+tag_len=18
+valid=0
+
diff --git a/src/yaca/test-vectors/encrypt_aes_gcm_tag_len.txt b/src/yaca/test-vectors/encrypt_aes_gcm_tag_len.txt
new file mode 100644 (file)
index 0000000..c67b9f9
--- /dev/null
@@ -0,0 +1,118 @@
+################## Check tag_len for algo and bcm ##################
+
+################## AES ##################
+
+################## GCM ##################
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=3
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=4
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=5
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=6
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=7
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=8
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=9
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=10
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=11
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=12
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=13
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=14
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=15
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=16
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=17
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+tag_len=18
+valid=0
+
diff --git a/src/yaca/test-vectors/encrypt_output_comparison.txt b/src/yaca/test-vectors/encrypt_output_comparison.txt
new file mode 100644 (file)
index 0000000..31d11d3
--- /dev/null
@@ -0,0 +1,936 @@
+################## aes-128-ecb ##################
+
+input=
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=
+repeats=1
+output=0bce65135a39af2f64f34141a1f99277
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=
+repeats=3
+output=b26f6243edaf374ec162433f9603d07d00b5379cbd36588619b1d1b1feb7eed392c9ad278832e15447f6ca61ecd84c8a41e196a47457362506c5b351fdff121d8fc9bc1dfea710c641ae089f86d9e063e1da0b704e499aae95718502bb9da3e6adc51954632be6d18facaeed7c5da54245cbab9b6eba7796d80a1b69c5bdff7b4e7a0438755dda8d9e14a725078dc3018df7f61adaa23f92648b37ada089868d1f5296cc9da758e6d6c38675cad9afe1492204341af55b9c9addbd57003383aa
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=
+repeats=5
+output=b26f6243edaf374ec162433f9603d07d00b5379cbd36588619b1d1b1feb7eed392c9ad278832e15447f6ca61ecd84c8a41e196a47457362506c5b351fdff121d8fc9bc1dfea710c641ae089f86d9e063e1da0b704e499aae95718502bb9da3e6adc51954632be6d18facaeed7c5da54245cbab9b6eba7796d80a1b69c5bdff7b4e7a0438755dda8d9e14a725078dc3018df7f61adaa23f92648b37ada089868d1f5296cc9da758e6d6c38675cad9afe1a698b0c99e1217330b68646c8a6085d7902f80dc5a0c47060ee2821f05badf8604a10db9992bc37b6222d1783740471ad657c7b718e3632e4cd95c2680d80467b26f6243edaf374ec162433f9603d07d00b5379cbd36588619b1d1b1feb7eed392c9ad278832e15447f6ca61ecd84c8a2ea4320f9b7a803353bb99fe880addb7
+
+################## aes-192-ecb ##################
+
+input=
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=
+repeats=1
+output=06efdd781f55819dbd6ea0e08aa15df2
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=
+repeats=3
+output=515813a74bbff08222a858245ce3ada9052cc2d9aa9deba0b62a3c5dc0a7f3595fc967ffe09a6fa38f1a60eccdee0795ec8d5e947a643a77fa77b93a6e48310b6d3aae66351e1c19a72f438d9398f5321d6c4232d506324130a5809129aaaa476fdd3966c65ae7ee1481c98061cc9d1edcefc48f0a31fb9ac2296744c9a3676d2a459cbcc1b08db75a741267a4afba1442eb72c6f1212677a38088a0a62d810571f36bc4d392e09e5192b1a9b97fe70988270a41caa0d1c1dc530669c11b34f8
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=
+repeats=5
+output=515813a74bbff08222a858245ce3ada9052cc2d9aa9deba0b62a3c5dc0a7f3595fc967ffe09a6fa38f1a60eccdee0795ec8d5e947a643a77fa77b93a6e48310b6d3aae66351e1c19a72f438d9398f5321d6c4232d506324130a5809129aaaa476fdd3966c65ae7ee1481c98061cc9d1edcefc48f0a31fb9ac2296744c9a3676d2a459cbcc1b08db75a741267a4afba1442eb72c6f1212677a38088a0a62d810571f36bc4d392e09e5192b1a9b97fe709ddb8d160b2cedb14fbf42a3147e0079c03df2873bf4a78afcbed4fb5657647d2a72f513fc84da6fc2ee4f9a14bb702ef98838f7fb69a47a50c08a6fc1fa59383515813a74bbff08222a858245ce3ada9052cc2d9aa9deba0b62a3c5dc0a7f3595fc967ffe09a6fa38f1a60eccdee0795e153971476d40cf6fcf4887f33d40f45
+
+################## aes-256-ecb ##################
+
+input=
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=
+repeats=1
+output=d271a4b58aed74a00db620a588cf3010
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=
+repeats=3
+output=cd10b1b8aa7c1863a08ac062bd22731ff9cb33b0e59cd67cf448445078e7c7618d04bcb9ae2fcd069f28e215fef2c1a0465d0a2d41ca3f5f7bfc1d8c589c80a3ce783a000914af6d72cc2af98fb9377072d22489fb6d1ddc99ed33efef2cb0062f47ae5616c5b0c59cdd58320bb9a59685bc00b3fe0efc75d4ec33427057833ae6cb640175b54ebd8de40f36d1ee93b4f0084be7f5dfb7e942b8de562799493c3b132dba162a316f5bb91a12dbbabe77ba52c7b567e7b995f8c206aab140adcb
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=
+repeats=5
+output=cd10b1b8aa7c1863a08ac062bd22731ff9cb33b0e59cd67cf448445078e7c7618d04bcb9ae2fcd069f28e215fef2c1a0465d0a2d41ca3f5f7bfc1d8c589c80a3ce783a000914af6d72cc2af98fb9377072d22489fb6d1ddc99ed33efef2cb0062f47ae5616c5b0c59cdd58320bb9a59685bc00b3fe0efc75d4ec33427057833ae6cb640175b54ebd8de40f36d1ee93b4f0084be7f5dfb7e942b8de562799493c3b132dba162a316f5bb91a12dbbabe771028d8180e543cdfb16832cbc630b92ef19f594046a996689aad42ef67500f11e6867a9b43e7152c140dfdcb7f4b47e3559e606068b21aa63f8e3feaf0a14604cd10b1b8aa7c1863a08ac062bd22731ff9cb33b0e59cd67cf448445078e7c7618d04bcb9ae2fcd069f28e215fef2c1a09dbeeb2ee3f2f8d69e94d15876c52829
+
+################## aes-128-ctr ##################
+
+input=
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=5cf24721870d1369430f8eef2a976d35052739b52b53d3e0e75f919b8cf6057b7af6f7bd80a00a988d14754ea66aae6ac01273eefd0d6c49ac15c36fed18b0cf25ea237f8f48210f73dc2b866cd31a0bdedd9eed5d908161bc1f456ece5378ec11cebae7144e4988eab26566287cadcadaad0b1e2f1f3f35af3a2c4d357ac73cf0290e5997c27b2fc05bb391dafa6358d3d2370d76b68a13b307048c26d083fff7218710aa8c4b1b86e060a37ea566f6682b2a1d
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=5cf24721870d1369430f8eef2a976d35052739b52b53d3e0e75f919b8cf6057b7af6f7bd80a00a988d14754ea66aae6ac01273eefd0d6c49ac15c36fed18b0cf25ea237f8f48210f73dc2b866cd31a0bdedd9eed5d908161bc1f456ece5378ec11cebae7144e4988eab26566287cadcadaad0b1e2f1f3f35af3a2c4d357ac73cf0290e5997c27b2fc05bb391dafa6358d3d2370d76b68a13b307048c26d083fff7218710aa8c4b1b86e060a37ea566f6682b2a1df34be0b0771c1156d0f5a5cd2b72eefe6b0c2e49b4d00a23ebb6f8eb89ba818d8d0d2d5be451b636575ae5fd6133b33c3a45b33141589e5f4e548bddb9719c03cf687dfa95388c64cc740771386d413629f4372fbad0c9f0864d20ffcbd35456f05183e2e64c3efaa92b9d2e7315fcdb0c9e9084018602d6
+
+################## aes-192-ctr ##################
+
+input=
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=4c7378c5ef87efa312f796b450e1466e98466833a568a88adaf5c721a0a1c6268e84f25e0cd7aeac210d77395be7e6222c3febd84067a73814086363ab936202cac7f8ab2b586381185b510c6c0cea5fd839fa19e6caa1ea74d90ad7f9411f93e0051e45e6c6f2544020ce670091bc3fc01cd0b897f1f3cd463f6b89bcc647616e0455501efa575abda2e1a0646266c14023213cb8ed13700e6c62b61ca62ad72a147dd66f698648e6a4ed7e9998e6616c04dd98
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=4c7378c5ef87efa312f796b450e1466e98466833a568a88adaf5c721a0a1c6268e84f25e0cd7aeac210d77395be7e6222c3febd84067a73814086363ab936202cac7f8ab2b586381185b510c6c0cea5fd839fa19e6caa1ea74d90ad7f9411f93e0051e45e6c6f2544020ce670091bc3fc01cd0b897f1f3cd463f6b89bcc647616e0455501efa575abda2e1a0646266c14023213cb8ed13700e6c62b61ca62ad72a147dd66f698648e6a4ed7e9998e6616c04dd98ded26a7e0da8ab2094a7c7a868d459fd000f4d13fc580517a9d4d2bfdbe921a6074b1d5b75d124c26fcf4fc4f80c4218b9d5064c9c66fc9d1368b03c9e004639d1490e59d4c1ad19692c023561ff4b9c64ac591bec1564b594b267b33d4af136b11c612443cb87b72edc94c58ba52d34939ff135b970da56
+
+################## aes-256-ctr ##################
+
+input=
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=6182193f7f4b00beb039d295f22e31cb657134cfe9d2e72d741ce95767fa5d68871d21d426a9361577b141717c63eac903b378d19813ab095d9138f90e07a0011682b6a3a3a5b3f1af58801e2d57dd4c08656d525242dfdb10bc5339b7e56a6c7d3743f41daebcab9dfe2127f744da03b0e6bab864bf113069cdac50b5d622a5a821ca737b5c7851ce12cfa8e9f5dc6313410a45a24bfc41bb4609d01fa331f145e2355d90d21be63c8b8cf4eaf4b350d4d1d177
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CTR
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=6182193f7f4b00beb039d295f22e31cb657134cfe9d2e72d741ce95767fa5d68871d21d426a9361577b141717c63eac903b378d19813ab095d9138f90e07a0011682b6a3a3a5b3f1af58801e2d57dd4c08656d525242dfdb10bc5339b7e56a6c7d3743f41daebcab9dfe2127f744da03b0e6bab864bf113069cdac50b5d622a5a821ca737b5c7851ce12cfa8e9f5dc6313410a45a24bfc41bb4609d01fa331f145e2355d90d21be63c8b8cf4eaf4b350d4d1d17701b5ee46c11acb49492d2f350aa114534670199be96a0cdef775ecc0fadd48bcee3414c9f62002bc9466512a4071f8d454252b57c25fe077e7191a01e958f0bae7cfae2a711ca67ae515f44dd173a79e3739e0f561cafb55fedc9d14671b6ade215c72d66fc70ea17b2f3b619d8a90604e14190945e5e940
+
+################## aes-128-cbc ##################
+
+input=
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=9c1d49e60010dd1f97b512c0f0f5a252
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=74c9c1ab4704b94a1cd05d3881437baca3bf07aaabf7709bb0f4a7bdc348e525477294b070e941125d835ee63b954812e97acacd6a8061070b0a96d66f534252bf354ef942ff406c07dbb921f52bcf1cbd71398b6c2898d7f012d28901cb0f32efce967144282d7c49e77902de1c74f36bed092d8312078df9f360e3aa6680a1dbc52dadbc827fe625298eb1457993f973ed7c83873d0fc543cdec908f7d1c3b4e5d0c84c543c598fec0dbea2aad96a953eae9c80fa910b3262732ccd1d7a397
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=74c9c1ab4704b94a1cd05d3881437baca3bf07aaabf7709bb0f4a7bdc348e525477294b070e941125d835ee63b954812e97acacd6a8061070b0a96d66f534252bf354ef942ff406c07dbb921f52bcf1cbd71398b6c2898d7f012d28901cb0f32efce967144282d7c49e77902de1c74f36bed092d8312078df9f360e3aa6680a1dbc52dadbc827fe625298eb1457993f973ed7c83873d0fc543cdec908f7d1c3b4e5d0c84c543c598fec0dbea2aad96a90a4198a12d1938b76bbbd9b21715da05a02e621deab20c271d54c021b0a549c02a2a50936aae060f30e3c1440904e868127e30ff51f4246a2eac7306fe5a77b1d8f9cbf2fe96091b7c561a28f833b549db10f1474109c6cc38ecebb5aed688963e2f15f000ba6be330871c4bd0e7629b4228d92a3b14112548526030ad9bfc7f
+
+################## aes-192-cbc ##################
+
+input=
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=0b960d7be25c2cc67338260e7eb82ef2
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=89f63174960614f0f42ec9612d396c8739461880971ebbf71d622a00342e3c50a10bfceebc79a253d2268318f27128e68555e64ba02a9584b1fdc8e5555dba60cecc931ec9aaf38dfbd753ca9c3b9ac6db4bbde3677689f9db2abd5a58251b5b07ac73b3fbda556ee0632a92eb520fc1ec3c30559c0ba858212b328ee3bcdcdf08137f34af70cd3f03cb1fd3068cfa397325e174161610e836d18ef02f529d08da030480664a99672816aaa9bfb9424ff0a78c0cbeab04b3419dcfd69ae765a3
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=89f63174960614f0f42ec9612d396c8739461880971ebbf71d622a00342e3c50a10bfceebc79a253d2268318f27128e68555e64ba02a9584b1fdc8e5555dba60cecc931ec9aaf38dfbd753ca9c3b9ac6db4bbde3677689f9db2abd5a58251b5b07ac73b3fbda556ee0632a92eb520fc1ec3c30559c0ba858212b328ee3bcdcdf08137f34af70cd3f03cb1fd3068cfa397325e174161610e836d18ef02f529d08da030480664a99672816aaa9bfb9424f7a213e25c28e7ae9cda71c34cd1bc6850ec83475363fcd1ea216d6b02658ebcc19bf63c2bd2862f38196efc51992d9b018a509470824fc5cd1a21041db2b1292569113536dd5152d8e749e36d787ca2fc0f9aef5ed837174a31c9edfaa82daeb3a964bfb1fb5ffe2e31bc6b82681ebb04a8563d8251c20a7a4a6e09c31fa5594
+
+################## aes-256-cbc ##################
+
+input=
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=345837a81eba39a78c4a16f303fdc6dc
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=2877a1b4d9f3fb10e1f603730fac250a874af27a4c19253c5040fc2aca1c321d778d458b10210132f29e95c3377ade3cf02876da86b5481d60081b25ffd38db331266fa98659d4c40ba4d17d4d2ef559c23663b55b71e01bcb74e30547dc3f7ea3e2ba2452ef84b0d78fc2d33a8c864781719b10fd3fdd32dd9d534c9cf49b2ca864e62a7d7c0f499f319778541cbdaa411d128fd85415f5e95e721ce47215881aa849290cf37ffe351f1a14dba0e85e3389176d137f5e50750c1c62100c07f5
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=2877a1b4d9f3fb10e1f603730fac250a874af27a4c19253c5040fc2aca1c321d778d458b10210132f29e95c3377ade3cf02876da86b5481d60081b25ffd38db331266fa98659d4c40ba4d17d4d2ef559c23663b55b71e01bcb74e30547dc3f7ea3e2ba2452ef84b0d78fc2d33a8c864781719b10fd3fdd32dd9d534c9cf49b2ca864e62a7d7c0f499f319778541cbdaa411d128fd85415f5e95e721ce47215881aa849290cf37ffe351f1a14dba0e85e87bfdf6e113556008df58f9548219d7c696a581af0febe8d6572d3f2c1547b2c3f7117772a1ff302d19c9ac678a340ce77df8ce548414b17ef9744828d27fe529982f32d7e27c21f981b722639b631dbbbbf072b66e0af8dc9c0effce69a5249ba4b06b35f8204a29dde01a9f120e95ea4ac3c1599b4a5037309daf53c4a57a7
+
+################## aes-128-cfb ##################
+
+input=
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=5cf24721870d1369430f8eef2a976d35ddd941bdcd761ab069286748a6498104d49a262f6361cca55cca901b6ccaaa9bef2b2f411e5e1702b1b4b37e95fd6e36c12bebea9f68af271c19a87465417d074dc440ba612f18453227f6d240d1cecccaafc09da57df2dc8b45aedb16c80da594880968e7aaf829aff3508f8ba29ea75f0641ee87b22b07daa88eafcabe6169ad630ad0615c575a8b654cbae23b5ea53318c5f98069d6148e978cf57d7b95563fc6c3bd
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=5cf24721870d1369430f8eef2a976d35ddd941bdcd761ab069286748a6498104d49a262f6361cca55cca901b6ccaaa9bef2b2f411e5e1702b1b4b37e95fd6e36c12bebea9f68af271c19a87465417d074dc440ba612f18453227f6d240d1cecccaafc09da57df2dc8b45aedb16c80da594880968e7aaf829aff3508f8ba29ea75f0641ee87b22b07daa88eafcabe6169ad630ad0615c575a8b654cbae23b5ea53318c5f98069d6148e978cf57d7b95563fc6c3bd18605f8fb7f2eea38e79c7f4471f6483e008a9459c06c0ae71f3576855714f7b97f60a285b82b36b7948c424f7c8f7cf2fce258bf9bfc5a1e48a27b676bc2548e2f242dd0b19bf171207059e7f4a46ec79ba2bcdceb49d8d42de5d3c77ac4d22d3cfea939a33d7b0b69201b4dd9217f8001412842791ae5a
+
+################## aes-192-cfb ##################
+
+input=
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=4c7378c5ef87efa312f796b450e1466e3ca3e8d16a701068c6deea35570485b87c03b5aa8b7b642aeeff5bc5180f36fef2b6a15d26bab364d029e33c0d666f0a4de785f36b4b60f0908cff7ee48e5a8045a9b42f35cf9f34fbe4ab535ba0b725ec2f44693f3c491efbcda2cc62471a7d944d89bb00a80e8070422ad8d25aab00ca06189a582ca469461fa262014752fb3f1bcae29a5b3aec62f82e60b80e701d1aada51c662d9f5d6c7faa71a2d03da8b275b2ea
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=4c7378c5ef87efa312f796b450e1466e3ca3e8d16a701068c6deea35570485b87c03b5aa8b7b642aeeff5bc5180f36fef2b6a15d26bab364d029e33c0d666f0a4de785f36b4b60f0908cff7ee48e5a8045a9b42f35cf9f34fbe4ab535ba0b725ec2f44693f3c491efbcda2cc62471a7d944d89bb00a80e8070422ad8d25aab00ca06189a582ca469461fa262014752fb3f1bcae29a5b3aec62f82e60b80e701d1aada51c662d9f5d6c7faa71a2d03da8b275b2ea1974bb73c3ccb28d518fc740749016b8787a9a0d41ec8f7614be094ef38f9b6163ac293422a77e954a02c1739275cf34dd8f379332db2b10ad0b8c859be3d6ae896cfb92faffe7bf0823963238f9feb1eab4a05371c2bcc68771512d58ea7ee6a66ec7ba3c3f60dc09c98acf44f39a64178fd9b02ba6b5a0
+
+################## aes-256-cfb ##################
+
+input=
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=6182193f7f4b00beb039d295f22e31cb5cef56ce92d1f0049266c8176afb79bf64b8eb711d66d0f91a34f98315775a45cdd23895129d7e7d51883f94e85dda59e2a77af16e6a1fd4cbca725768f75dfdc59c587ee843dd63d60784975d9eaa8b5241bf65a6cec58ae8b5a030b831c6612cae7930952e6e0b941602f8505bf1cc105d5c826c0099966bfd9ac90fab69bbed84980836f8448558f67770d6251bff94a436ef3663babff1090d4ac8757ec634795949
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=6182193f7f4b00beb039d295f22e31cb5cef56ce92d1f0049266c8176afb79bf64b8eb711d66d0f91a34f98315775a45cdd23895129d7e7d51883f94e85dda59e2a77af16e6a1fd4cbca725768f75dfdc59c587ee843dd63d60784975d9eaa8b5241bf65a6cec58ae8b5a030b831c6612cae7930952e6e0b941602f8505bf1cc105d5c826c0099966bfd9ac90fab69bbed84980836f8448558f67770d6251bff94a436ef3663babff1090d4ac8757ec63479594997c5d659d14f206de716bb06c7a6f7c4cae48fe39d7bcd215418123a946c49c607c6e5d9cfee73ae5140d2b271b5c7de38dd81e7fbb6e650c5afe8c3c3ae29e97f8211d0820ba4ab8f55d167eeeb28a9c78046f5b14fa5be9027cc66ba9381fd06e777bc5a84a52af0965ed9d8aa4dae8b05e5389479b388
+
+################## aes-128-cfb1 ##################
+
+input=
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=3b0c4a5f4cda151fc7dd751f18f79cf97ef7a0500ba26931a56531b92b00a710363904c458d845ddb965353818460e2cc39b970993dffc63ba7394484141cca718285e5a964918b528136290c48eb97aefa2b668fd0be6846313ac22d02a98ba46fe3aa21fce0fbac5601feebb7038ec20e63626fd632f1371f92d1e074c70ef3a543c7842a5a26c9b820f705c78073d17ea6dd5768e2cddd472e2a1b9de3d21dcaf40db5d12c4b1acfcc8f013c75b2744bd0907
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=3b0c4a5f4cda151fc7dd751f18f79cf97ef7a0500ba26931a56531b92b00a710363904c458d845ddb965353818460e2cc39b970993dffc63ba7394484141cca718285e5a964918b528136290c48eb97aefa2b668fd0be6846313ac22d02a98ba46fe3aa21fce0fbac5601feebb7038ec20e63626fd632f1371f92d1e074c70ef3a543c7842a5a26c9b820f705c78073d17ea6dd5768e2cddd472e2a1b9de3d21dcaf40db5d12c4b1acfcc8f013c75b2744bd090736944095ca57ef72000d041f7b67b12c6c2d46ae29e4973bc30f2914000c8daa06f72cc532c5263dd57ff6e8e8b6aca9712217135681911e0700466c3cb7d9476b630f2ad7747bf278ff232b196e43f0a2d353e6aff42916cb7e0645f2d8b2f182b77d233e62380b03ec607fae1b5e1312397c9e29f94dce
+
+################## aes-192-cfb1 ##################
+
+input=
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=164a6a6b917c2bac83f2993987ee14a28983679fd266821299092654d35cbddeb7db4ca07a40fb181de59bcb6c2960f4715a99087146bf527dc79d647559a7bc8af4fae44fca4b0fd6c6bcfc806cce92c4d29c801c7ce4b0d1acb4a3b5f0079f328d5569a7747ea149a881acb9ddbe036978087306e4f078dff3664e028b2aa2a22097493204c12bea745ea9ef92437e8014d6051afb572bad9cae4ab59181d18fe73d26f6c68699fa284722d8120b9a065ad8d5
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=164a6a6b917c2bac83f2993987ee14a28983679fd266821299092654d35cbddeb7db4ca07a40fb181de59bcb6c2960f4715a99087146bf527dc79d647559a7bc8af4fae44fca4b0fd6c6bcfc806cce92c4d29c801c7ce4b0d1acb4a3b5f0079f328d5569a7747ea149a881acb9ddbe036978087306e4f078dff3664e028b2aa2a22097493204c12bea745ea9ef92437e8014d6051afb572bad9cae4ab59181d18fe73d26f6c68699fa284722d8120b9a065ad8d5002d280e3909d8cf479388de7f6e03d649f0680bdd6949bb4c9875ce6cb82b2989e98c51c7535cf94d3a41e8e996e58d576530767628668e33af731be807dcad90e7d5bf9691d8e01430390e1c09c6aca57768e147a7719619c2171d60f66f3a59383da8503ce8c950df42427bacf257fadb2a21e2f70fc6
+
+################## aes-256-cfb1 ##################
+
+input=
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=4fdc73387bc9d83fd26ab4dbf3df78ded25528cc8f2cd612da1b6b100f055b2f48a49257c59716f38f7fad920599fb642a9993773ca886b427bc970c1907c00334a94a4e21ad47ea253273edb06a55f6c7be2c1814537af42aabfa9fffb48fc2bd86341f38fb0f63b50b95e7b064672baac1e08365f8d7396c8adba2b54f2a655fe5d253f6a7a1ba352c59bd49985d2e4ca850a0799140585f4291d8652acb0f861025295d0383978eea9a605c8efd12bcb53b02
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB1
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=4fdc73387bc9d83fd26ab4dbf3df78ded25528cc8f2cd612da1b6b100f055b2f48a49257c59716f38f7fad920599fb642a9993773ca886b427bc970c1907c00334a94a4e21ad47ea253273edb06a55f6c7be2c1814537af42aabfa9fffb48fc2bd86341f38fb0f63b50b95e7b064672baac1e08365f8d7396c8adba2b54f2a655fe5d253f6a7a1ba352c59bd49985d2e4ca850a0799140585f4291d8652acb0f861025295d0383978eea9a605c8efd12bcb53b02907c3d42d2c706bb74aa6a6b6d9d5c7dfafe0c32a65ba7e0a5401f222b7a6e0160bb34c9b5e6ab361b0061299e2bed16e36b1ac80d52f4988c8e0ac3b880838798d5ec547dbd1a3b4e01acf451c37f4a856d7f425a6a6bfc56ec390e3e97417f038cbeaea9876b630bf1f301ed68dfaae33135fccdbaef93
+
+################## aes-128-cfb8 ##################
+
+input=
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=5c315197d40814c6e6d0bd049e67eb8bbe6f9a32d578f2d69d41988787f275610304a7d86fc11b3142d72debf4275c61e8eb7076f018a6b7c483aa5a673a7d5e4a5cf34668a799b3d729b9375f49151825695790f343ff4bad00744494c0968b19904c30c2ba02fc692155908da4ef3125d1d5a6112d7ab0dbdee6674bc12896741cc8248b1c836f46fc2adadc1ed687aebfe68f9ed9d269f9682d07eed206fcb000bbc8263eb59933b30cf5fd03f06802f0c7cf
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=5c315197d40814c6e6d0bd049e67eb8bbe6f9a32d578f2d69d41988787f275610304a7d86fc11b3142d72debf4275c61e8eb7076f018a6b7c483aa5a673a7d5e4a5cf34668a799b3d729b9375f49151825695790f343ff4bad00744494c0968b19904c30c2ba02fc692155908da4ef3125d1d5a6112d7ab0dbdee6674bc12896741cc8248b1c836f46fc2adadc1ed687aebfe68f9ed9d269f9682d07eed206fcb000bbc8263eb59933b30cf5fd03f06802f0c7cfeadb6edadee39bb31b9fdcae657226541729ae0bf68e13937a284aa8f236bac18bc217dd53f474a7625eb7e747233ebda12700b339fa881dd7eb29166981de869cf6e66911e6f83bdfc663c6bbc7ed171914ab96c24ec6f76f1a78424950fe7e48dee73de8ab299147d62e1b4ec7a07e1b4eba8c85af8add
+
+################## aes-192-cfb8 ##################
+
+input=
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=4cef8cd697a9c30110c546b6e1ae9c6db16e2294498956ee8bd32fc262301e1833a8779b4cf55247aff155dca9fcb770f0fddc7f7ee9f0f5bd8658cfccede94fececbcebcadc58de1559a65f34c8737b7dbcb2a49e20eb491e574ea4fe17514f9156b27f89e21910b6f8e51faed11f0ca186297f88181afe042d367a6534dd6f7664d8c43edca4cc454d490e95953bd838f9fde48dddbc11a78e541e87c1616c9f340d23f215e68ed9a36e55bc90d978a24eb47a
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=4cef8cd697a9c30110c546b6e1ae9c6db16e2294498956ee8bd32fc262301e1833a8779b4cf55247aff155dca9fcb770f0fddc7f7ee9f0f5bd8658cfccede94fececbcebcadc58de1559a65f34c8737b7dbcb2a49e20eb491e574ea4fe17514f9156b27f89e21910b6f8e51faed11f0ca186297f88181afe042d367a6534dd6f7664d8c43edca4cc454d490e95953bd838f9fde48dddbc11a78e541e87c1616c9f340d23f215e68ed9a36e55bc90d978a24eb47a57745c0d3b86d33b7eed8504675961a5089d44f0d8f2cf0ae04b4fcac33dd4ac330281896ebbdb8180df1ec69e9d3ed8e118c35cec66ece7e2907676fbe0c2a66f7c7e69bd0edcc66d062f188381aff94d7b7ffe395501f308b549c02cdf0bb2b74b4f3cf1e1f30d7cb10321fb14b6ef5dd1d5019e4e4e02
+
+################## aes-256-cfb8 ##################
+
+input=
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=6141ea2eb83b1807eb47da228a9644178c0ea69964156de9e78a7664b32f2fbb3922b1329a02330ff63b8388edfb95cc0e66cf5dd3cffdc53830a29810c92ad1e19f06addfca4e68600742c041b2d36baab6ec07f5f7806a2261f463d34a0022ba0b106ce1bff1321ec7f8647a66705e84d046edaaba1a345a1dd336a1cf133729459b616d885f84b812aa9d66211545c3b0df510e2a9328cd3404fa7e338c55b90f15a0c24a34907cd64b0a3a43fc8b097d6700
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=6141ea2eb83b1807eb47da228a9644178c0ea69964156de9e78a7664b32f2fbb3922b1329a02330ff63b8388edfb95cc0e66cf5dd3cffdc53830a29810c92ad1e19f06addfca4e68600742c041b2d36baab6ec07f5f7806a2261f463d34a0022ba0b106ce1bff1321ec7f8647a66705e84d046edaaba1a345a1dd336a1cf133729459b616d885f84b812aa9d66211545c3b0df510e2a9328cd3404fa7e338c55b90f15a0c24a34907cd64b0a3a43fc8b097d6700eb3cce18fc269afaf54aba3f7731b9b4e57018a7b7218aa049f70ec13d81c914a0a0e8095d2eadac01fdc60a6f90e6fa78785b52abdf98988c3fe44f22ff0168ee1859ef7345601997eb816037418d710d86ae062bd1a906f0345ec1480aea05b8fb994ff2cf39b50518484e620136fd1cc449f52f5561a7
+
+################## aes-128-ofb ##################
+
+input=
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=5cf24721870d1369430f8eef2a976d35328cd58c6252c16776b817207c54ccfeb19b98c8c9b675524a3aafdc83af9b350722d263eeabf2e60839382cb9179ee003b8c919049c20a4983825faa6d82b94c373ba1d8bbe3b883c66f3fd21d082874b7e94a8f59566181cd93003a30f95e896b5d6ef37789d29944872797cd23ab8b48a274a4352c960333aed6e6501af79d79a67748f4a1ce7f4539878d74c55f9e784e161579697249873e06cc20b074ac2da1206
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=5cf24721870d1369430f8eef2a976d35328cd58c6252c16776b817207c54ccfeb19b98c8c9b675524a3aafdc83af9b350722d263eeabf2e60839382cb9179ee003b8c919049c20a4983825faa6d82b94c373ba1d8bbe3b883c66f3fd21d082874b7e94a8f59566181cd93003a30f95e896b5d6ef37789d29944872797cd23ab8b48a274a4352c960333aed6e6501af79d79a67748f4a1ce7f4539878d74c55f9e784e161579697249873e06cc20b074ac2da12061918ca18a8f2ad4bc2bfb3a2a4b7e36294f008d40970cf96160529eee8932516be9b6a69aeaa57f7af48c0b01917855b49ea7841dacd77a999040763ba411be50f25ac911d0c6ecd4ff82ff486b6920932d12b8c90ee2761925f9294e9e06df475d69676e53f26404e1781eb0fbe458a2d3da020efd927d4
+
+################## aes-192-ofb ##################
+
+input=
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=4c7378c5ef87efa312f796b450e1466e5c3a510a3bb10ade24fd10014eddee75faaf9d5f2fff44c281ca102ffac4832d1e1f4a497e5e8b26ef4bd4f9b9e21a5a50b6cbed8b28e3740bd59331b488a560a0162d0ddac3cb17a68d92c089e6069875afbc72d38112de7bf37a42c61f3236e7f07b471fdce35fad025291a707dab1e69ef1fed9a72aa8edcdd4a3747a08186088414cf4290121eb9dd72c30dec12e09cdb7e756b79c27c48fb7b980e13a23324e5712
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=4c7378c5ef87efa312f796b450e1466e5c3a510a3bb10ade24fd10014eddee75faaf9d5f2fff44c281ca102ffac4832d1e1f4a497e5e8b26ef4bd4f9b9e21a5a50b6cbed8b28e3740bd59331b488a560a0162d0ddac3cb17a68d92c089e6069875afbc72d38112de7bf37a42c61f3236e7f07b471fdce35fad025291a707dab1e69ef1fed9a72aa8edcdd4a3747a08186088414cf4290121eb9dd72c30dec12e09cdb7e756b79c27c48fb7b980e13a23324e5712ff32ba24f0f2ae6b875fcca67c9efa7acd0082e1198615dead0fa90bdde3c49f065304507098c6a275536868a725245843a969708c587ad924409f106bcef68149ef91b0804cdea8bf84fb3f54e1d138b4953932b11a0a86770343a41733b601b6e07913ae164ee59ec2d20c96621ef342034b5f41e56e2c
+
+################## aes-256-ofb ##################
+
+input=
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=3
+output=6182193f7f4b00beb039d295f22e31cbc0f59c4626eba3da962ad3ba5c2a1023d6032cca1563a67aa7a5afa2d4344fe25479feedc0470ff1123c53d03f7bcda70525caf574739f869e8d6a67cab7934f984a4e818dc7e7f85bb887cfb04d161c76baa78f0cd170dcfa65daab8d5be900ea085025d1d647b0971190441de71ecd8951716a993baa835dc14f26475c23901daec47189b60a257a5bcfce8a22ed69603f4a856aec3fca58477e095112977741f2c486
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=AES
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd
+iv=d17d7ace9acea556527b1037ee3aa824
+repeats=5
+output=6182193f7f4b00beb039d295f22e31cbc0f59c4626eba3da962ad3ba5c2a1023d6032cca1563a67aa7a5afa2d4344fe25479feedc0470ff1123c53d03f7bcda70525caf574739f869e8d6a67cab7934f984a4e818dc7e7f85bb887cfb04d161c76baa78f0cd170dcfa65daab8d5be900ea085025d1d647b0971190441de71ecd8951716a993baa835dc14f26475c23901daec47189b60a257a5bcfce8a22ed69603f4a856aec3fca58477e095112977741f2c4869cd3bd724541d99c95faff8e78bbbbf164b6c65d5fa90d35340d3c0130a2c86798ea6ae3502fc4cd4b127e1c28cbe4c57e68a4be0ced801b6e13f7357d34bd4ec4b1db2f8ad43beb43f6982ed4a4ef5b3eb81419697f48f251d4fddb001bedbff0da5da2e9fb17ab774dadccfb688337b9741822fe82d011
+
+################## des-ecb ##################
+
+input=
+algo=DES
+bcm=ECB
+key=534c1dd926ffc55d
+iv=
+repeats=1
+output=133b6b1ae7b46468
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=ECB
+key=534c1dd926ffc55d
+iv=
+repeats=3
+output=399faa1b762f443f0602ccf9c43ffa9c7041ce7f1e25842ce05d845e51cfc6cda7132c757d7dc6ed32fed2f4b5f089449f823f881ab04e0747639545eb1f2829e41d2dd2a54fd1dbaee20af269a678c2e30a2c58879d32fe3bc5ef733e4dd36332b69e39e7de67f09c2200fc5eb068b69bab95599d1e85cf399faa1b762f443f0602ccf9c43ffa9c7041ce7f1e25842ce05d845e51cfc6cda7132c757d7dc6ed32fed2f4b5f089449f823f881ab04e078a3d15e6b523378c
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=ECB
+key=534c1dd926ffc55d
+iv=
+repeats=5
+output=399faa1b762f443f0602ccf9c43ffa9c7041ce7f1e25842ce05d845e51cfc6cda7132c757d7dc6ed32fed2f4b5f089449f823f881ab04e0747639545eb1f2829e41d2dd2a54fd1dbaee20af269a678c2e30a2c58879d32fe3bc5ef733e4dd36332b69e39e7de67f09c2200fc5eb068b69bab95599d1e85cf399faa1b762f443f0602ccf9c43ffa9c7041ce7f1e25842ce05d845e51cfc6cda7132c757d7dc6ed32fed2f4b5f089449f823f881ab04e0747639545eb1f2829e41d2dd2a54fd1dbaee20af269a678c2e30a2c58879d32fe3bc5ef733e4dd36332b69e39e7de67f09c2200fc5eb068b69bab95599d1e85cf399faa1b762f443f0602ccf9c43ffa9c7041ce7f1e25842ce05d845e51cfc6cda7132c757d7dc6ed32fed2f4b5f089449f823f881ab04e078a3d15e6b523378c
+
+################## des-cbc ##################
+
+input=
+algo=DES
+bcm=CBC
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=1
+output=8d8550414f2af8ca
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CBC
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=3
+output=47cba9bc1a8cb4b9bfd746e67cd0bcc065e59f3e3ed1798c42f4d286249059ed19b3ae3abbea43df5685fb5aaf0e37cc7bf98cbcb856a56135b4df0bd740dde7976be8c3346b45c15783fa5f38a3d584b3ea212efceebad4500c384e1b7a5575a262679081126910674295db3a71914f4c6d310a84cdfa3cf65ddd638c200a441e716725ac1ac2a179a68376f8e24d7c778c77e8e376acd80c9043ad098deff28afb33bb904f75dba8d4f066c71e45015edb98071c834c47
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CBC
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=5
+output=47cba9bc1a8cb4b9bfd746e67cd0bcc065e59f3e3ed1798c42f4d286249059ed19b3ae3abbea43df5685fb5aaf0e37cc7bf98cbcb856a56135b4df0bd740dde7976be8c3346b45c15783fa5f38a3d584b3ea212efceebad4500c384e1b7a5575a262679081126910674295db3a71914f4c6d310a84cdfa3cf65ddd638c200a441e716725ac1ac2a179a68376f8e24d7c778c77e8e376acd80c9043ad098deff28afb33bb904f75dba8d4f066c71e4501cf9110f9263af5b00f21a996d5fca31e04b197c2cda50251a7f2ac5b48f77b9d640e2421d73967a92e6c756c53f007eb9a6b44a825e2707a10c2f938ddb21d4b162d61098645ab17b806139fa2395aeb30cc6068f948b4e9e7581f6f45f6738ae15346da8267ba3d6c25777991939540906b940b0bdb84464f67b090c8f7f31f
+
+################## des-cfb ##################
+
+input=
+algo=DES
+bcm=CFB
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CFB
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=3
+output=9d4ea383787c2f7322c057cc1f6cd89340415437224ac095d08f4652fff5bbf80a0618bd53a919da70710f21c5c0268bd88c1afab734187568f33e2ef8b438051473c41325bedadb8850d88b8103fb92046ba1dff5f60c66f955e36acce7797fb7be11db42ab637edab7964774c2aba626cbc9adc9696c34cd809e2404c71c97a80ff4848f3ca35bffa97fda013589c98fef8f682e26bc020a2c47a66d5f47602657755950ff943f17192a5b783f4201f86fe584
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CFB
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=5
+output=9d4ea383787c2f7322c057cc1f6cd89340415437224ac095d08f4652fff5bbf80a0618bd53a919da70710f21c5c0268bd88c1afab734187568f33e2ef8b438051473c41325bedadb8850d88b8103fb92046ba1dff5f60c66f955e36acce7797fb7be11db42ab637edab7964774c2aba626cbc9adc9696c34cd809e2404c71c97a80ff4848f3ca35bffa97fda013589c98fef8f682e26bc020a2c47a66d5f47602657755950ff943f17192a5b783f4201f86fe584b2e67d119d1cf68d2d4dcff37486dd8f328c32ead8e49379411b6b6d80b90d740751b53e28b46f5e0779b395745e2355f0ef2c64d3556ef739f0a7322b1b62f753c55f626fdd51594dcf271f911b33d01cfca30c684cf3180a1656747125a789532131afed17f3f8df5188bd6a88c296ed16c6918dc77b4a
+
+################## des-cfb1 ##################
+
+input=
+algo=DES
+bcm=CFB1
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CFB1
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=3
+output=ec7ff2c3ebcbc17b46252f75983724993214baac310686b227626d142f0c8bdab068cf3c3b350bf314e8c5fb2756f5314bb7790972e127322471129fba70f160b546e9ffb606d71b8e3575d84dfa2c372aeb0b92db71817988b0feeb618960f7e340942beed4f56c56841dc052caa4ae54d02d0b5db542e742adfedc65cdce2569a6ab798b75fbfa2cf939ae9f0184d3cf3f890de284f0ad53f366b892bc6cfe64cfd5b26495137f55b5912d344628e248c6c0da
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CFB1
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=5
+output=ec7ff2c3ebcbc17b46252f75983724993214baac310686b227626d142f0c8bdab068cf3c3b350bf314e8c5fb2756f5314bb7790972e127322471129fba70f160b546e9ffb606d71b8e3575d84dfa2c372aeb0b92db71817988b0feeb618960f7e340942beed4f56c56841dc052caa4ae54d02d0b5db542e742adfedc65cdce2569a6ab798b75fbfa2cf939ae9f0184d3cf3f890de284f0ad53f366b892bc6cfe64cfd5b26495137f55b5912d344628e248c6c0da6efc5b4a5fbd5d3902bb142b14b15521726e872fca3287f39e0b163e53301ff2cc2603aa58cf1423034606e5db2712dab31b644647a6a4fd32ef4b50299c1e523ef312dcf555514e62da26811ca3fa8c0e6680f68264a87e43d472882aac73a682fb1190a5f6c7c83da09322fc84af77cc93da9aea435a23
+
+################## des-cfb8 ##################
+
+input=
+algo=DES
+bcm=CFB8
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CFB8
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=3
+output=9d4e6b53ad2322bd4e2909e0ac767c0d51a9f481dd6edbe76c0a691066ea3deeebfc26085318faf698064909fb9ee342b73a8698f931cb74d1ff1bb8753837210f6f6f67eb33d9117ebed0fc3a4a2781e65a7db8ff49825290ab7aa4ea7b5817e2345b92d6475b6553d68b9fbf6c57e469b193c666e6b3ec2f44497c61cf4814e92ab0873f4fd45166f2f74a09e1ab96d705588d191c53b8d8c1945d61f71d24c61571dea6ddde78a4ff016a697f20cb63f17fdb
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=CFB8
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=5
+output=9d4e6b53ad2322bd4e2909e0ac767c0d51a9f481dd6edbe76c0a691066ea3deeebfc26085318faf698064909fb9ee342b73a8698f931cb74d1ff1bb8753837210f6f6f67eb33d9117ebed0fc3a4a2781e65a7db8ff49825290ab7aa4ea7b5817e2345b92d6475b6553d68b9fbf6c57e469b193c666e6b3ec2f44497c61cf4814e92ab0873f4fd45166f2f74a09e1ab96d705588d191c53b8d8c1945d61f71d24c61571dea6ddde78a4ff016a697f20cb63f17fdb7d71bfce85f7f734e4c734899becb0ea49d4bd3f436a073862975173624019c3f735ac1a11321d887952f5914e78dcb2a34c99315e278a21f65dfca12de09e4b4056aa8f02253dafe15da25822f92619d12a996faf8f2db62719013d91a69c8a44f6882c364c377431b5c09b755eca74132e67c58fdacb9b
+
+################## des-ofb ##################
+
+input=
+algo=DES
+bcm=OFB
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=OFB
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=3
+output=9d4ea383787c2f73ba28ad7b346ad29f55e5baae4a1cc751be9e64e6af6148d2686fa54df3d71712fd4f644e28df796fe5ee068b0e0c7dc307795aec44cc2121a336b46dd6a3907848a5639a38549a7ee7e3690d22d75cdf4964b82015bf7a2b534d68a1015c11d513c2a9c6a7b57526693cd6741811a163d5ad51ef4e243293c710fe69d2a9e3807e706bca974ab8d4297a2bc6d6bc58a4a08323c839c30c42b9fd308aafb5b6dad63ee7e7268c160cb5e5f2ff
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=DES
+bcm=OFB
+key=534c1dd926ffc55d
+iv=d17d7ace9acea556
+repeats=5
+output=9d4ea383787c2f73ba28ad7b346ad29f55e5baae4a1cc751be9e64e6af6148d2686fa54df3d71712fd4f644e28df796fe5ee068b0e0c7dc307795aec44cc2121a336b46dd6a3907848a5639a38549a7ee7e3690d22d75cdf4964b82015bf7a2b534d68a1015c11d513c2a9c6a7b57526693cd6741811a163d5ad51ef4e243293c710fe69d2a9e3807e706bca974ab8d4297a2bc6d6bc58a4a08323c839c30c42b9fd308aafb5b6dad63ee7e7268c160cb5e5f2ffb36e374ad313fd1f66244210a1edafb73e69df9c7c98cadc31e4ee16323670f0c67c2d3d932894e7aa826a77fe236c7352c672a7a689ac447549b0ca6863d0462d5759428f8b8df43f9c9a67c3c06809d55ee329a59bba84fb3f0243254e46a0278fc6dbce320d5ec1abf571819f9fc3a81ce5f8f3544087
+
+################## des-ede ##################
+
+input=
+algo=3DES_2TDEA
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=
+repeats=1
+output=c33c4d1dbc389370
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=
+repeats=3
+output=381eb6ab3ff11ce097eb8e17d7eb9f9498bd7023532f0cc5a09afff53fa80c6adb0c86704ff2abd2262daab412293789595139f5158987e2a9fbe219595023a8bf060828ec63fa2310d8144af69483e9be3903a61894a751a4c81566978f732f90647a392677a9a0f81500a51d22a0ede792d1a8578d1385381eb6ab3ff11ce097eb8e17d7eb9f9498bd7023532f0cc5a09afff53fa80c6adb0c86704ff2abd2262daab412293789595139f5158987e2a4019c56bf26334b
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=
+repeats=5
+output=381eb6ab3ff11ce097eb8e17d7eb9f9498bd7023532f0cc5a09afff53fa80c6adb0c86704ff2abd2262daab412293789595139f5158987e2a9fbe219595023a8bf060828ec63fa2310d8144af69483e9be3903a61894a751a4c81566978f732f90647a392677a9a0f81500a51d22a0ede792d1a8578d1385381eb6ab3ff11ce097eb8e17d7eb9f9498bd7023532f0cc5a09afff53fa80c6adb0c86704ff2abd2262daab412293789595139f5158987e2a9fbe219595023a8bf060828ec63fa2310d8144af69483e9be3903a61894a751a4c81566978f732f90647a392677a9a0f81500a51d22a0ede792d1a8578d1385381eb6ab3ff11ce097eb8e17d7eb9f9498bd7023532f0cc5a09afff53fa80c6adb0c86704ff2abd2262daab412293789595139f5158987e2a4019c56bf26334b
+
+################## des-ede-cbc ##################
+
+input=
+algo=3DES_2TDEA
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=1
+output=e59f1d2f8a0d4fa0
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=3
+output=73d81545807df2c1bd84c387a8f8f542afb655595e61b663defda33eec3e0d83553c231d026198f0c3bf7576b09c60bad3d12fb057bc3539f3f47ba03eac9eb9d26c611d874ea3ec2d000b89700c475c1d52afa51643b2fa4efbe032a1818809ae6e9790b1c7f9ccadc28f75f830f4c851f1813497e6a4ee8327055875b355a9f88cd5ab6fb581d5922472b6f09cf8209382d0a9b6929c5bf431e035ef20cf21ae9ac5b16a22c93bc2fe020ada666ddea04e8553558919fb
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=5
+output=73d81545807df2c1bd84c387a8f8f542afb655595e61b663defda33eec3e0d83553c231d026198f0c3bf7576b09c60bad3d12fb057bc3539f3f47ba03eac9eb9d26c611d874ea3ec2d000b89700c475c1d52afa51643b2fa4efbe032a1818809ae6e9790b1c7f9ccadc28f75f830f4c851f1813497e6a4ee8327055875b355a9f88cd5ab6fb581d5922472b6f09cf8209382d0a9b6929c5bf431e035ef20cf21ae9ac5b16a22c93bc2fe020ada666ddec144bbcce4f8df30fa04fd4848eb889c59ce71163c2fd0150a5c5ae60dd3fa353e4f5ef8b32ca78faf1617ca2cc297af2f247a56acbc39cfd42588ca7749ceb1ecd8fce0d51a1391cac556ee5ebbb6dea0f5a039e6abdcb629cfba4585d7b017b58449a732311b638e9bd342ac1674a4ed52a638c8c0315f7bf9d725a1454b64
+
+################## des-ede-cfb ##################
+
+input=
+algo=3DES_2TDEA
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=3
+output=c039f6940284fae5e22f3abed59876ab6f9f69ee4e5667c4a8b4e38a84d86688f3d9493f6164ea055a5f6d1b46e1827abb5ed03606362429e9fdcf09f2dcb672a9aed581545cf2f77ef814e3fa50bf11544047556c65a36bfcf0e2f022a8a31d1eda3dace65a966597b83fdc06597cbd2218cbe5ba9d4ad3ecf407646a53dce42ca5764f9bdc5ddb42e41115dbaccdb18e2f1ae217d24312797434ab0e36e1fa4ccdbc777d09ad33d2a773aeb2af98f543586f49
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=5
+output=c039f6940284fae5e22f3abed59876ab6f9f69ee4e5667c4a8b4e38a84d86688f3d9493f6164ea055a5f6d1b46e1827abb5ed03606362429e9fdcf09f2dcb672a9aed581545cf2f77ef814e3fa50bf11544047556c65a36bfcf0e2f022a8a31d1eda3dace65a966597b83fdc06597cbd2218cbe5ba9d4ad3ecf407646a53dce42ca5764f9bdc5ddb42e41115dbaccdb18e2f1ae217d24312797434ab0e36e1fa4ccdbc777d09ad33d2a773aeb2af98f543586f499e59f6a0020db5722f938d2d261526071cd1b97096969f32a8033757ecf0fbf3b7a4d7d5f4a377660660488964d487c211b1c84695e5c8b3ca9627a878ba7024f738b956d7a04624e15d24e7ec3bb9ca6ff7e37af2d0a2a0cf0330ba372bce45ccc1254f7c472f6c24bac239af9e7d9846382becd731c6fd
+
+################## des-ede-ofb ##################
+
+input=
+algo=3DES_2TDEA
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=3
+output=c039f6940284fae578251bd5464906011330794ab478e6ea408824a9530bd3b6db7f737c743cb01aa97ff924bd55cc8fea7889b9b1e42f167386ca01bf8c3e24452d8641a4270c695eb68e9bd4e572c82777fc0456a3cd348e125b89d83b6dd8bdb5ed2589b1cb80790a178d434a9b4ee4a08922a8125eb77b9fc0bf41c54f37f44a1b6093440561c7030c3d32bccfab3633ab63ab019658db2db8bc76669a1113f9b1096a3fefa5c8d6972d992f05e93e38e3a6
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_2TDEA
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4a
+iv=d17d7ace9acea556
+repeats=5
+output=c039f6940284fae578251bd5464906011330794ab478e6ea408824a9530bd3b6db7f737c743cb01aa97ff924bd55cc8fea7889b9b1e42f167386ca01bf8c3e24452d8641a4270c695eb68e9bd4e572c82777fc0456a3cd348e125b89d83b6dd8bdb5ed2589b1cb80790a178d434a9b4ee4a08922a8125eb77b9fc0bf41c54f37f44a1b6093440561c7030c3d32bccfab3633ab63ab019658db2db8bc76669a1113f9b1096a3fefa5c8d6972d992f05e93e38e3a6349952dfcce033bc8b6c4c8675d7b1843be48892a45abeb5bd250d7e7fb82b67d2f21674ca6d206643a18edc64b0ce35f18821dba4ff4270ed804ba1d708c6653d559fe917bccc540edbaa1b59f845451821fc1e6e40e0571eae5cd4629062996fea3b0b5b6dcd2fb3e5727da3587ed7baf9e26f078ae968
+
+################## des-ede3 ##################
+
+input=
+algo=3DES_3TDEA
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=
+repeats=1
+output=9da313f00aa0b58c
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=
+repeats=3
+output=72089521688fb47738a9e9e23c5de3a3b6775cf0ab900e9aa38964be92b0b14911f9de4e2be62c930654e46494c3f024d33e5c00fe45deb876e4f8c65987049f6d46c4b6d6646e5f80a9ebfc047b53f3df428826dd6a095c7e1aee5ba15f4538cd24682dfde575edf7c9928d10d7bd9afa13c860bf8e3f5372089521688fb47738a9e9e23c5de3a3b6775cf0ab900e9aa38964be92b0b14911f9de4e2be62c930654e46494c3f024d33e5c00fe45deb87305f3b43e02260f
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=ECB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=
+repeats=5
+output=72089521688fb47738a9e9e23c5de3a3b6775cf0ab900e9aa38964be92b0b14911f9de4e2be62c930654e46494c3f024d33e5c00fe45deb876e4f8c65987049f6d46c4b6d6646e5f80a9ebfc047b53f3df428826dd6a095c7e1aee5ba15f4538cd24682dfde575edf7c9928d10d7bd9afa13c860bf8e3f5372089521688fb47738a9e9e23c5de3a3b6775cf0ab900e9aa38964be92b0b14911f9de4e2be62c930654e46494c3f024d33e5c00fe45deb876e4f8c65987049f6d46c4b6d6646e5f80a9ebfc047b53f3df428826dd6a095c7e1aee5ba15f4538cd24682dfde575edf7c9928d10d7bd9afa13c860bf8e3f5372089521688fb47738a9e9e23c5de3a3b6775cf0ab900e9aa38964be92b0b14911f9de4e2be62c930654e46494c3f024d33e5c00fe45deb87305f3b43e02260f
+
+################## des-ede3-cbc ##################
+
+input=
+algo=3DES_3TDEA
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=1
+output=85e05db82feebc37
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=3
+output=90a946db0bbfc11fb934eb03dff37c0e309cc356e215f885e1825078b9e36dcf569ed831e3b84e237fcaa7b7e6b31d7c77c218c1f2685ca091389a4027e43087ca044de861ebc6670106289e78ede0891edec214b578630c30366c580ee02063bccafdb749ea0b8ea4793bd139fac068ff964cf5cd6ab55205d52212b0ebb040e347473778dfe223941ba181b7a51f74739858a1857b48af2b7c88a01c0e0bea104d287c73f383393f3072194c6561ecbfc7aab041cdd23c
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=CBC
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=5
+output=90a946db0bbfc11fb934eb03dff37c0e309cc356e215f885e1825078b9e36dcf569ed831e3b84e237fcaa7b7e6b31d7c77c218c1f2685ca091389a4027e43087ca044de861ebc6670106289e78ede0891edec214b578630c30366c580ee02063bccafdb749ea0b8ea4793bd139fac068ff964cf5cd6ab55205d52212b0ebb040e347473778dfe223941ba181b7a51f74739858a1857b48af2b7c88a01c0e0bea104d287c73f383393f3072194c6561ec597b5f021c29ddd86c165dd6a8eca4ccbcfc0a26430ef8af95f891b628144103ab6e50a497bcd42ab1e97222b985c21a515b02a56f0a58af1d622fddf85a3562251a5bf63437573751a87704adca9b9013b753a36a00e8ac5abcf2823514760aed4b771ac5ecf3bfd3cc8b65146a7838e58d58010ed2617ab872e82f4b56a702
+
+################## des-ede3-cfb ##################
+
+input=
+algo=3DES_3TDEA
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=3
+output=c485c82346f13367115370229c4c284f73ffe845f627ea9832efab6b0a4813444d418e7d99e94734c2a0f885497b248786b07073507a9ff29a4085d86f143e628dd34b9c37e467413c0586e993ad19080e40727ef5f1f6a9a0e91cd42588d8ffa5c473815449cf55e9ace785940999812b0544bb1c92253aa4687be657eb5943e612605096afefcb5a346114082c44f96a2399d4c266770268deee13892ab01641be92ece12b720c32261ae89ee3c71fc8c417f0
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=CFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=5
+output=c485c82346f13367115370229c4c284f73ffe845f627ea9832efab6b0a4813444d418e7d99e94734c2a0f885497b248786b07073507a9ff29a4085d86f143e628dd34b9c37e467413c0586e993ad19080e40727ef5f1f6a9a0e91cd42588d8ffa5c473815449cf55e9ace785940999812b0544bb1c92253aa4687be657eb5943e612605096afefcb5a346114082c44f96a2399d4c266770268deee13892ab01641be92ece12b720c32261ae89ee3c71fc8c417f0267a841fc32251eb1da3cfb3f574f5ac76415186ae3ef292ba7b6c09b820b454095d2f329312a5d1bdfc56f7a3a25664b4dda243385d3f58aefc098d07f10387b6378a76c4d5f33d6e0a268c3499bbee6339a26ef3cbf915b70cbd645c2f1cb2f8fecfe1e803ce0c7a144e694a59021e96cbaf4d6597d32b
+
+################## des-ede3-cfb8 ##################
+
+input=
+algo=3DES_3TDEA
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=3
+output=c48ab6538fb107139b31230694cc4b7be66e950b2ee3d208c4cb42e73d42c361294bcd68639a518ff5a6658cf4bbf574f2d9a30de303b1a5ce7b552cb894f920803af231835d45181bba004f18dd88457471e76b90e2f3cfc466a7e5eff28256a5da1448a73c0f4edf7b9ae8f6c168ca6a790267c113a21352075ca283a6adcd88e77ad73b4dcd2da6a6f88c08e9254154dc2546f37fb9e73ff2d8ca6c9d10ef7daa0cdfcc31d72e41768defe8c1191045f29352
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=CFB8
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=5
+output=c48ab6538fb107139b31230694cc4b7be66e950b2ee3d208c4cb42e73d42c361294bcd68639a518ff5a6658cf4bbf574f2d9a30de303b1a5ce7b552cb894f920803af231835d45181bba004f18dd88457471e76b90e2f3cfc466a7e5eff28256a5da1448a73c0f4edf7b9ae8f6c168ca6a790267c113a21352075ca283a6adcd88e77ad73b4dcd2da6a6f88c08e9254154dc2546f37fb9e73ff2d8ca6c9d10ef7daa0cdfcc31d72e41768defe8c1191045f293520d25ddd069cee8db22966d84849228f981c88d9e855787dc9517c96f37cf35e430049db8b10bfba602803cbce89a792a7c8dac02c925575708e423264b125a38ff0e616ffeabee16691e580fcd9d3654a9c1a855bd62d887100d557cbb40895bef5450bb29cb03d6fc2a6d46d5369d20100d6628fbc5754c
+
+################## des-ede3-ofb ##################
+
+input=
+algo=3DES_3TDEA
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=1
+output=
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=3
+output=c485c82346f13367a4ea1151b15867d11da001f78e04f31b7f14683342c7ca34986d90c68ea3a5b2e105f8df0081ebdb9310ea454b23b1f6c32bd25a2dd3d7a4109d21ead9b419728a8f05bc2409997bdb25f73f4d218f72ef33271afce6ca1b98d1a66d5621e13bdd2dfdc710764674cd444386933f77abe0b0dc979305a26fc778f5462ca1fef0b28fca51ab6ca65ef8636cd48600f511a12e1cd348cf7476fd48577bdebf8e402b85d39592e70d8367e2db56
+
+input=6162636465666768696a6b6c6d6e6f7072737475767778797a303132333435363738394142434445464748494a4b4c4d4e4f5052535455565758595a
+algo=3DES_3TDEA
+bcm=OFB
+key=534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae38
+iv=d17d7ace9acea556
+repeats=5
+output=c485c82346f13367a4ea1151b15867d11da001f78e04f31b7f14683342c7ca34986d90c68ea3a5b2e105f8df0081ebdb9310ea454b23b1f6c32bd25a2dd3d7a4109d21ead9b419728a8f05bc2409997bdb25f73f4d218f72ef33271afce6ca1b98d1a66d5621e13bdd2dfdc710764674cd444386933f77abe0b0dc979305a26fc778f5462ca1fef0b28fca51ab6ca65ef8636cd48600f511a12e1cd348cf7476fd48577bdebf8e402b85d39592e70d8367e2db561c944183d43ffb4989e0eb8b47f8ccbb31c2945c5d10fcc42c78ca3ded322fe6cbc8dd7643e6e8129f6d7ee18939ba3b1cbeaa96ed88648ea31db38aeab389b81b6daffc508ff461be4aad223c6d869d710f8d6f6b28080b14d811f5d59b8d8fa2542822bd1ef803f2a205a73f057a02c5e28b9d1fbbb874
+
diff --git a/src/yaca/test-vectors/encrypt_output_comparison_aes_gcm_ccm.txt b/src/yaca/test-vectors/encrypt_output_comparison_aes_gcm_ccm.txt
new file mode 100644 (file)
index 0000000..bd94e35
--- /dev/null
@@ -0,0 +1,242 @@
+input=
+algo=AES
+bcm=GCM
+key=00000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=58e2fccefa7e3061367f1d57a4e7455a
+output=
+
+input=00000000000000000000000000000000
+algo=AES
+bcm=GCM
+key=00000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=ab6e47d42cec13bdf53a67b21257bddf
+output=0388dace60b6a392f328c2b971b2fe78
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=
+tag=4d5c2af327cd64a62cf35abd2ba6fab4
+output=42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091473f5985
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=5bc94fbc3221a5db94fae95ae7121a47
+output=42831ec2217774244b7221b784d0d49ce3aa212f2c02a4e035c17e2329aca12e21d514b25466931c7d8f6a5aac84aa051ba30b396a0aac973d58e091
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbad
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=3612d2e79e3b0785561be14aaca2fccb
+output=61353b4c2806934a777ff51fa22a4755699b2a714fcdc6f83766e5f97b6c742373806900e49f24b22b097544d4896b424989b5e1ebac0f07c23f4598
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308
+iv=9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=619cc5aefffe0bfa462af43c1699d050
+output=8ce24998625615b603a033aca13fb894be9112a5c3a211a8ba262a3cca7e2ca701e4a9a4fba43c90ccdcb281d48c7c6fd62875d2aca417034c34aee5
+
+input=
+algo=AES
+bcm=GCM
+key=000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=cd33b28ac773f74ba00ed1f312572435
+output=
+
+input=00000000000000000000000000000000
+algo=AES
+bcm=GCM
+key=000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=2ff58d80033927ab8ef4d4587514f0fb
+output=98e7247c07f0fe411c267e4384b0f600
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=cafebabefacedbaddecaf888
+aad=
+tag=9924a7c8587336bfb118024db8674a14
+output=3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710acade256
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=cafebabefacedbaddecaf888
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=2519498e80f1478f37ba55bd6d27618c
+output=3980ca0b3c00e841eb06fac4872a2757859e1ceaa6efd984628593b40ca1e19c7d773d00c144c525ac619d18c84a3f4718e2448b2fe324d9ccda2710
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=cafebabefacedbad
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=65dcc57fcf623a24094fcca40d3533f8
+output=0f10f599ae14a154ed24b36e25324db8c566632ef2bbb34f8347280fc4507057fddc29df9a471f75c66541d4d4dad1c9e93a19a58e8b473fa0f062f7
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c
+iv=9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=dcf566ff291c25bbb8568fc3d376a6d9
+output=d27e88681ce3243c4830165a8fdcf9ff1de9a1d8e6b447ef6ef7b79828666e4581e79012af34ddd9e2f037589b292db3e67c036745fa22e7e9b7373b
+
+input=
+algo=AES
+bcm=GCM
+key=0000000000000000000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=530f8afbc74536b9a963b4f1c4cb738b
+output=
+
+input=00000000000000000000000000000000
+algo=AES
+bcm=GCM
+key=0000000000000000000000000000000000000000000000000000000000000000
+iv=000000000000000000000000
+aad=
+tag=d0d1c8a799996bf0265b98b5d48ab919
+output=cea7403d4d606b6e074ec5d3baf39d18
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b391aafd255
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=
+tag=b094dac5d93471bdec1a502270e3cc6c
+output=522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662898015ad
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbaddecaf888
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=76fc6ece0f4e1768cddf8853bb2d551b
+output=522dc1f099567d07f47f37a32a84427d643a8cdcbfe5c0c97598a2bd2555d1aa8cb08e48590dbb3da7b08b1056828838c5f61e6393ba7a0abcc9f662
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=cafebabefacedbad
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=3a337dbf46a792c45e454913fe2ea8f2
+output=c3762df1ca787d32ae47c13bf19844cbaf1ae14d0b976afac52ff7d79bba9de0feb582d33934a4f0954cc2363bc73f7862ac430e64abe499f47c9b1f
+
+input=d9313225f88406e5a55909c5aff5269a86a7a9531534f7da2e4c303d8a318a721c3c0c95956809532fcf0e2449a6b525b16aedf5aa0de657ba637b39
+algo=AES
+bcm=GCM
+key=feffe9928665731c6d6a8f9467308308feffe9928665731c6d6a8f9467308308
+iv=9313225df88406e555909c5aff5269aa6a7a9538534f7da1e4c303d2a318a728c3c0c95156809539fcf0e2429a6b525416aedbf5a0de6a57a637b39b
+aad=feedfacedeadbeeffeedfacedeadbeefabaddad2
+tag=a44a8266ee1c8eb0c8b5d4cf5ae9f19a
+output=5a8def2f0c9e53f1f75d7853659e2a20eeb2b22aafde6419a058ab4f6f746bf40fc0c3b780f244452da3ebf1c5d82cdea2418997200ef82e44ae7e3f
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000003020100A0A1A2A3A4A5
+aad=0001020304050607
+tag=17E8D12CFDF926E0
+output=588C979A61C663D2F066D0C2C0F989806D5F6B61DAC384
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000004030201A0A1A2A3A4A5
+aad=0001020304050607
+tag=A091D56E10400916
+output=72C91A36E135F8CF291CA894085C87E3CC15C439C9E43A3B
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F20
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000005040302A0A1A2A3A4A5
+aad=0001020304050607
+tag=4ADAA76FBD9FB0C5
+output=51B1E5F44A197D1DA46B0F8E2D282AE871E838BB64DA859657
+
+input=0C0D0E0F101112131415161718191A1B1C1D1E
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000006050403A0A1A2A3A4A5
+aad=000102030405060708090A0B
+tag=96C861B9C9E61EF1
+output=A28C6865939A9A79FAAA5C4C2A9D4A91CDAC8C
+
+input=0C0D0E0F101112131415161718191A1B1C1D1E1F
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000007060504A0A1A2A3A4A5
+aad=000102030405060708090A0B
+tag=51E83F077D9C2D93
+output=DCF1FB7B5D9E23FB9D4E131253658AD86EBDCA3E
+
+input=0C0D0E0F101112131415161718191A1B1C1D1E1F20
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000008070605A0A1A2A3A4A5
+aad=000102030405060708090A0B
+tag=405A0443AC91CB94
+output=6FC1B011F006568B5171A42D953D469B2570A4BD87
+
+input=08090A0B0C0D0E0F101112131415161718191A1B1C1D1E
+algo=AES
+bcm=CCM
+key=C0C1C2C3C4C5C6C7C8C9CACBCCCDCECF
+iv=00000009080706A0A1A2A3A4A5
+aad=0001020304050607
+tag=048C56602C97ACBB7490
+output=0135D1B2C95F41D5D1D4FEC185D166B8094E999DFED96C
+
+input=20212223
+algo=AES
+bcm=CCM
+key=404142434445464748494a4b4c4d4e4f
+iv=10111213141516
+aad=0001020304050607
+tag=4dac255d
+output=7162015b
+
+input=202122232425262728292a2b2c2d2e2f
+algo=AES
+bcm=CCM
+key=404142434445464748494a4b4c4d4e4f
+iv=1011121314151617
+aad=000102030405060708090a0b0c0d0e0f
+tag=1fc64fbfaccd
+output=d2a1f0e051ea5f62081a7792073d593d
diff --git a/src/yaca/test-vectors/encrypt_output_comparison_rc2_cast5_nopad.txt b/src/yaca/test-vectors/encrypt_output_comparison_rc2_cast5_nopad.txt
new file mode 100644 (file)
index 0000000..ae5ae00
--- /dev/null
@@ -0,0 +1,99 @@
+################## rc2-ecb ##################
+
+input=0000000000000000
+algo=RC2
+bcm=ECB
+key=0000000000000000
+effective_key_bits=63
+iv=
+repeats=1
+output=ebb773f993278eff
+
+input=ffffffffffffffff
+algo=RC2
+bcm=ECB
+key=ffffffffffffffff
+effective_key_bits=64
+iv=
+repeats=1
+output=278b27e42e2f0d49
+
+input=1000000000000001
+algo=RC2
+bcm=ECB
+key=3000000000000000
+effective_key_bits=64
+iv=
+repeats=1
+output=30649edf9be7d2c2
+
+input=0000000000000000
+algo=RC2
+bcm=ECB
+key=88
+effective_key_bits=64
+iv=
+repeats=1
+output=61a8a244adacccf0
+
+input=0000000000000000
+algo=RC2
+bcm=ECB
+key=88bca90e90875a
+effective_key_bits=64
+iv=
+repeats=1
+output=6ccf4308974c267f
+
+input=0000000000000000
+algo=RC2
+bcm=ECB
+key=88bca90e90875a7f0f79c384627bafb2
+effective_key_bits=64
+iv=
+repeats=1
+output=1a807d272bbe5db1
+
+input=0000000000000000
+algo=RC2
+bcm=ECB
+key=88bca90e90875a7f0f79c384627bafb2
+effective_key_bits=128
+iv=
+repeats=1
+output=2269552ab0f85ca6
+
+input=0000000000000000
+algo=RC2
+bcm=ECB
+key=88bca90e90875a7f0f79c384627bafb216f80a6f85920584c42fceb0be255daf1e
+effective_key_bits=129
+iv=
+repeats=1
+output=5b78d3a43dfff1f1
+
+################## cast5-ecb ##################
+
+input=0123456789abcdef
+algo=CAST5
+bcm=ECB
+key=0123456712345678234567893456789a
+iv=
+repeats=1
+output=238b4fe5847e44b2
+
+input=0123456789abcdef
+algo=CAST5
+bcm=ECB
+key=01234567123456782345
+iv=
+repeats=1
+output=eb6a711a2c02271b
+
+input=0123456789abcdef
+algo=CAST5
+bcm=ECB
+key=0123456712
+iv=
+repeats=1
+output=7ac816d16e9b302e
diff --git a/src/yaca/test-vectors/encrypt_output_comparison_rc4.txt b/src/yaca/test-vectors/encrypt_output_comparison_rc4.txt
new file mode 100644 (file)
index 0000000..d40c12f
--- /dev/null
@@ -0,0 +1,57 @@
+################## rc4 ##################
+
+input=00000000000000000000000000000000
+algo=RC4
+bcm=NONE
+key=0102030405
+iv=
+repeats=1
+output=b2396305f03dc027ccc3524a0a1118a8
+
+input=00000000000000000000000000000000
+algo=RC4
+bcm=NONE
+key=01020304050607
+iv=
+repeats=1
+output=293f02d47f37c9b633f2af5285feb46b
+
+input=00000000000000000000000000000000
+algo=RC4
+bcm=NONE
+key=0102030405060708
+iv=
+repeats=1
+output=97ab8a1bf0afb96132f2f67258da15a8
+
+input=00000000000000000000000000000000
+algo=RC4
+bcm=NONE
+key=0102030405060708090a
+iv=
+repeats=1
+output=ede3b04643e586cc907dc21851709902
+
+input=00000000000000000000000000000000
+algo=RC4
+bcm=NONE
+key=0102030405060708090a0b0c0d0e0f10
+iv=
+repeats=1
+output=9ac7cc9a609d1ef7b2932899cde41b97
+
+input=00000000000000000000000000000000
+algo=RC4
+bcm=NONE
+key=0102030405060708090a0b0c0d0e0f101112131415161718
+iv=
+repeats=1
+output=0595e57fe5f0bb3c706edac8a4b2db11
+
+input=00000000000000000000000000000000
+algo=RC4
+bcm=NONE
+key=0102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20
+iv=
+repeats=1
+output=eaa6bd25880bf93d3f5d1e4ca2611d91
diff --git a/src/yaca/test-vectors/encrypt_output_comparison_wrap.txt b/src/yaca/test-vectors/encrypt_output_comparison_wrap.txt
new file mode 100644 (file)
index 0000000..ca63b04
--- /dev/null
@@ -0,0 +1,47 @@
+input=00112233445566778899aabbccddeeff
+algo=AES
+bcm=WRAP
+key=000102030405060708090a0b0c0d0e0f
+iv=a6a6a6a6a6a6a6a6
+repeats=1
+output=1fa68b0a8112b447aef34bd8fb5a7b829d3e862371d2cfe5
+
+input=00112233445566778899aabbccddeeff
+algo=AES
+bcm=WRAP
+key=000102030405060708090a0b0c0d0e0f1011121314151617
+iv=a6a6a6a6a6a6a6a6
+repeats=1
+output=96778b25ae6ca435f92b5b97c050aed2468ab8a17ad84e5d
+
+input=00112233445566778899aabbccddeeff
+algo=AES
+bcm=WRAP
+key=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
+iv=a6a6a6a6a6a6a6a6
+repeats=1
+output=64e8c3f9ce0f5ba263e9777905818a2a93c8191e7d6e8ae7
+
+input=00112233445566778899aabbccddeeff0001020304050607
+algo=AES
+bcm=WRAP
+key=000102030405060708090a0b0c0d0e0f1011121314151617
+iv=a6a6a6a6a6a6a6a6
+repeats=1
+output=031d33264e15d33268f24ec260743edce1c6c7ddee725a936ba814915c6762d2
+
+input=00112233445566778899aabbccddeeff0001020304050607
+algo=AES
+bcm=WRAP
+key=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
+iv=a6a6a6a6a6a6a6a6
+repeats=1
+output=a8f9bc1612c68b3ff6e6f4fbe30e71e4769c8b80a32cb8958cd5d17d6b254da1
+
+input=00112233445566778899aabbccddeeff000102030405060708090a0b0c0d0e0f
+algo=AES
+bcm=WRAP
+key=000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f
+iv=a6a6a6a6a6a6a6a6
+repeats=1
+output=28c9f404c4b810f4cbccb35cfb87f8263f5786e2d80ed326cbc7f0e71a99f43bfb988b9b7a02dd21
diff --git a/src/yaca/test-vectors/encrypt_param_comb.txt b/src/yaca/test-vectors/encrypt_param_comb.txt
new file mode 100644 (file)
index 0000000..fb1b0aa
--- /dev/null
@@ -0,0 +1,2484 @@
+################## check bcm for algorithm ##################
+
+################## AES ##################
+
+algo=AES
+bcm=NONE
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+valid=1
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=64
+valid=1
+
+################## DES ##################
+
+algo=DES
+bcm=NONE
+key_len=64
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=0
+valid=1
+
+algo=DES
+bcm=CTR
+key_len=64
+iv_len=64
+valid=0
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=GCM
+key_len=64
+iv_len=64
+valid=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=CCM
+key_len=64
+iv_len=64
+valid=0
+
+algo=DES
+bcm=WRAP
+key_len=64
+iv_len=64
+valid=0
+
+################## 3DES_2TDEA ##################
+
+algo=3DES_2TDEA
+bcm=NONE
+key_len=128
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=3DES_2TDEA
+bcm=CTR
+key_len=128
+iv_len=64
+valid=0
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=64
+valid=1
+
+algo=3DES_2TDEA
+bcm=GCM
+key_len=128
+iv_len=64
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=64
+valid=1
+
+algo=3DES_2TDEA
+bcm=CFB1
+key_len=128
+iv_len=64
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB8
+key_len=128
+iv_len=64
+valid=0
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=64
+valid=1
+
+algo=3DES_2TDEA
+bcm=CCM
+key_len=128
+iv_len=64
+valid=0
+
+algo=3DES_2TDEA
+bcm=WRAP
+key_len=128
+iv_len=64
+valid=0
+
+################## 3DES_3TDEA ##################
+
+algo=3DES_3TDEA
+bcm=NONE
+key_len=192
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=0
+valid=1
+
+algo=3DES_3TDEA
+bcm=CTR
+key_len=192
+iv_len=64
+valid=0
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=GCM
+key_len=192
+iv_len=64
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=CCM
+key_len=192
+iv_len=64
+valid=0
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=0
+valid=1
+
+################## RC2 ##################
+
+algo=RC2
+bcm=NONE
+key_len=8
+iv_len=0
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=CTR
+key_len=8
+iv_len=64
+valid=0
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=64
+valid=1
+
+algo=RC2
+bcm=GCM
+key_len=8
+iv_len=64
+valid=0
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=64
+valid=1
+
+algo=RC2
+bcm=CFB1
+key_len=8
+iv_len=64
+valid=0
+
+algo=RC2
+bcm=CFB8
+key_len=8
+iv_len=64
+valid=0
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=64
+valid=1
+
+algo=RC2
+bcm=CCM
+key_len=8
+iv_len=64
+valid=0
+
+algo=RC2
+bcm=WRAP
+key_len=8
+iv_len=64
+valid=0
+
+################## RC4 ##################
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=ECB
+key_len=40
+iv_len=0
+valid=0
+
+algo=RC4
+bcm=CTR
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=CBC
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=GCM
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=CFB
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=CFB1
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=CFB8
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=OFB
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=CCM
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=WRAP
+key_len=40
+iv_len=64
+valid=0
+
+################## CAST5 ##################
+
+algo=CAST5
+bcm=NONE
+key_len=40
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=0
+valid=1
+
+algo=CAST5
+bcm=CTR
+key_len=40
+iv_len=64
+valid=0
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=64
+valid=1
+
+algo=CAST5
+bcm=GCM
+key_len=40
+iv_len=64
+valid=0
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=64
+valid=1
+
+algo=CAST5
+bcm=CFB1
+key_len=40
+iv_len=64
+valid=0
+
+algo=CAST5
+bcm=CFB8
+key_len=40
+iv_len=64
+valid=0
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=64
+valid=1
+
+algo=CAST5
+bcm=CCM
+key_len=40
+iv_len=64
+valid=0
+
+algo=CAST5
+bcm=WRAP
+key_len=40
+iv_len=64
+valid=0
+
+################## check key_len for algorithm ##################
+
+################## AES ##################
+
+algo=AES
+bcm=ECB
+key_len=8
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=40
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=64
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=80
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=AES
+bcm=ECB
+key_len=192
+iv_len=0
+valid=1
+
+algo=AES
+bcm=ECB
+key_len=256
+iv_len=0
+valid=1
+
+algo=AES
+bcm=ECB
+key_len=512
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=1024
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=2048
+iv_len=0
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=4096
+iv_len=0
+valid=0
+
+################## DES ##################
+
+algo=DES
+bcm=ECB
+key_len=8
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=40
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=0
+valid=1
+
+algo=DES
+bcm=ECB
+key_len=80
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=128
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=192
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=256
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=512
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=1024
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=2048
+iv_len=0
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=4096
+iv_len=0
+valid=0
+
+################## 3DES_2TDEA ##################
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=8
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=40
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=64
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=80
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=192
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=256
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=512
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=1024
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=2048
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=4096
+iv_len=0
+valid=0
+
+################## 3DES_3TDEA ##################
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=8
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=40
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=64
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=80
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=128
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=0
+valid=1
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=256
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=512
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=1024
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=2048
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=4096
+iv_len=0
+valid=0
+
+################## RC2 ##################
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=40
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=64
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=80
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=192
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=256
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=512
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=1024
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=2048
+iv_len=0
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=4096
+iv_len=0
+valid=0
+
+################## RC4 ##################
+
+algo=RC4
+bcm=NONE
+key_len=8
+iv_len=0
+valid=0
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=64
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=80
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=128
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=192
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=256
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=512
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=1024
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=2048
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=4096
+iv_len=0
+valid=0
+
+################## CAST5 ##################
+
+algo=CAST5
+bcm=ECB
+key_len=8
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=0
+valid=1
+
+algo=CAST5
+bcm=ECB
+key_len=64
+iv_len=0
+valid=1
+
+algo=CAST5
+bcm=ECB
+key_len=80
+iv_len=0
+valid=1
+
+algo=CAST5
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=CAST5
+bcm=ECB
+key_len=192
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=256
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=512
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=1024
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=2048
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=4096
+iv_len=0
+valid=0
+
+################## check iv_len for algorithm and bcm ##################
+
+################## AES ##################
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=64
+valid=0
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=64
+valid=0
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=64
+valid=0
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=64
+valid=0
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=64
+valid=0
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=64
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=128
+valid=0
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=56
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=64
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=96
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=104
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=GCM
+key_len=128
+iv_len=256
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=56
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=64
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=96
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=104
+valid=1
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=128
+valid=0
+
+algo=AES
+bcm=CCM
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=64
+valid=0
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=128
+valid=1
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=256
+valid=0
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=0
+valid=0
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=56
+valid=0
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=64
+valid=1
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=96
+valid=0
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=104
+valid=0
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=128
+valid=0
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=256
+valid=0
+
+################## DES ##################
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=0
+valid=0
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=56
+valid=0
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=96
+valid=0
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=104
+valid=0
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=128
+valid=0
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=256
+valid=0
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=0
+valid=0
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=56
+valid=0
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=96
+valid=0
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=104
+valid=0
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=128
+valid=0
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=256
+valid=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=0
+valid=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=56
+valid=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=96
+valid=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=104
+valid=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=128
+valid=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=256
+valid=0
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=0
+valid=0
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=56
+valid=0
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=96
+valid=0
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=104
+valid=0
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=128
+valid=0
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=256
+valid=0
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=0
+valid=0
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=56
+valid=0
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=64
+valid=1
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=96
+valid=0
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=104
+valid=0
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=128
+valid=0
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=256
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=0
+valid=1
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=56
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=64
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=96
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=104
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=128
+valid=0
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=256
+valid=0
+
+################## 3DES_2TDEA ##################
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=56
+valid=0
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=64
+valid=1
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=96
+valid=0
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=104
+valid=0
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=128
+valid=0
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=256
+valid=0
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=56
+valid=0
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=64
+valid=1
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=96
+valid=0
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=104
+valid=0
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=128
+valid=0
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=256
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=0
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=56
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=64
+valid=1
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=96
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=104
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=128
+valid=0
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=256
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=0
+valid=1
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=56
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=64
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=96
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=104
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=128
+valid=0
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=256
+valid=0
+
+################## 3DES_3TDEA ##################
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=56
+valid=0
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=96
+valid=0
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=104
+valid=0
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=128
+valid=0
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=256
+valid=0
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=56
+valid=0
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=96
+valid=0
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=104
+valid=0
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=128
+valid=0
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=256
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=56
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=96
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=104
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=128
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=256
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=56
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=96
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=104
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=128
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=256
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=0
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=56
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=64
+valid=1
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=96
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=104
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=128
+valid=0
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=256
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=0
+valid=1
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=56
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=64
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=96
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=104
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=128
+valid=0
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=256
+valid=0
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=0
+valid=1
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=56
+valid=0
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=64
+valid=0
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=96
+valid=0
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=104
+valid=0
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=128
+valid=0
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=256
+valid=0
+
+################## RC2 ##################
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=0
+valid=0
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=56
+valid=0
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=64
+valid=1
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=96
+valid=0
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=104
+valid=0
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=128
+valid=0
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=256
+valid=0
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=0
+valid=0
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=56
+valid=0
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=64
+valid=1
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=96
+valid=0
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=104
+valid=0
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=128
+valid=0
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=256
+valid=0
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=0
+valid=0
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=56
+valid=0
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=64
+valid=1
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=96
+valid=0
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=104
+valid=0
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=128
+valid=0
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=256
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=0
+valid=1
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=56
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=64
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=96
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=104
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=128
+valid=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=256
+valid=0
+
+################## RC4 ##################
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=0
+valid=1
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=56
+valid=0
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=64
+valid=0
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=96
+valid=0
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=104
+valid=0
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=128
+valid=0
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=256
+valid=0
+
+################## CAST5 ##################
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=56
+valid=0
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=64
+valid=1
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=96
+valid=0
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=104
+valid=0
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=128
+valid=0
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=256
+valid=0
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=56
+valid=0
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=64
+valid=1
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=96
+valid=0
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=104
+valid=0
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=128
+valid=0
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=256
+valid=0
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=0
+valid=0
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=56
+valid=0
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=64
+valid=1
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=96
+valid=0
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=104
+valid=0
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=128
+valid=0
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=256
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=0
+valid=1
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=56
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=64
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=96
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=104
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=128
+valid=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=256
+valid=0
+
diff --git a/src/yaca/test-vectors/encrypt_valid_param.txt b/src/yaca/test-vectors/encrypt_valid_param.txt
new file mode 100644 (file)
index 0000000..0192e98
--- /dev/null
@@ -0,0 +1,506 @@
+################## Proper sets for encrypt-decrypt comparison ##################
+
+################## AES ##################
+
+algo=AES
+bcm=OFB
+key_len=128
+iv_len=128
+
+algo=AES
+bcm=OFB
+key_len=192
+iv_len=128
+
+algo=AES
+bcm=OFB
+key_len=256
+iv_len=128
+
+algo=AES
+bcm=CBC
+key_len=128
+iv_len=128
+
+algo=AES
+bcm=CBC
+key_len=192
+iv_len=128
+
+algo=AES
+bcm=CBC
+key_len=256
+iv_len=128
+
+algo=AES
+bcm=ECB
+key_len=128
+iv_len=0
+
+algo=AES
+bcm=ECB
+key_len=192
+iv_len=0
+
+algo=AES
+bcm=ECB
+key_len=256
+iv_len=0
+
+algo=AES
+bcm=CTR
+key_len=128
+iv_len=128
+
+algo=AES
+bcm=CTR
+key_len=192
+iv_len=128
+
+algo=AES
+bcm=CTR
+key_len=256
+iv_len=128
+
+algo=AES
+bcm=CFB
+key_len=128
+iv_len=128
+
+algo=AES
+bcm=CFB
+key_len=192
+iv_len=128
+
+algo=AES
+bcm=CFB
+key_len=256
+iv_len=128
+
+algo=AES
+bcm=CFB8
+key_len=128
+iv_len=128
+
+algo=AES
+bcm=CFB8
+key_len=192
+iv_len=128
+
+algo=AES
+bcm=CFB8
+key_len=256
+iv_len=128
+
+algo=AES
+bcm=CFB1
+key_len=128
+iv_len=128
+
+algo=AES
+bcm=CFB1
+key_len=192
+iv_len=128
+
+algo=AES
+bcm=CFB1
+key_len=256
+iv_len=128
+
+################## DES ##################
+
+algo=DES
+bcm=OFB
+key_len=64
+iv_len=64
+
+algo=DES
+bcm=CBC
+key_len=64
+iv_len=64
+
+algo=DES
+bcm=ECB
+key_len=64
+iv_len=0
+
+algo=DES
+bcm=CFB
+key_len=64
+iv_len=64
+
+algo=DES
+bcm=CFB8
+key_len=64
+iv_len=64
+
+algo=DES
+bcm=CFB1
+key_len=64
+iv_len=64
+
+################## 3DES_2TDEA ##################
+
+algo=3DES_2TDEA
+bcm=OFB
+key_len=128
+iv_len=64
+
+algo=3DES_2TDEA
+bcm=CBC
+key_len=128
+iv_len=64
+
+algo=3DES_2TDEA
+bcm=CFB
+key_len=128
+iv_len=64
+
+algo=3DES_2TDEA
+bcm=ECB
+key_len=128
+iv_len=0
+
+################## 3DES_3TDEA ##################
+
+algo=3DES_3TDEA
+bcm=OFB
+key_len=192
+iv_len=64
+
+algo=3DES_3TDEA
+bcm=CBC
+key_len=192
+iv_len=64
+
+algo=3DES_3TDEA
+bcm=ECB
+key_len=192
+iv_len=0
+
+algo=3DES_3TDEA
+bcm=CFB
+key_len=192
+iv_len=64
+
+algo=3DES_3TDEA
+bcm=CFB8
+key_len=192
+iv_len=64
+
+algo=3DES_3TDEA
+bcm=CFB1
+key_len=192
+iv_len=64
+
+################## RC2 ##################
+
+algo=RC2
+bcm=OFB
+key_len=128
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=192
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=1024
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=64
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=256
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=80
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=8
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=512
+iv_len=64
+
+algo=RC2
+bcm=OFB
+key_len=40
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=128
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=192
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=1024
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=64
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=256
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=80
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=8
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=512
+iv_len=64
+
+algo=RC2
+bcm=CBC
+key_len=40
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=128
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=192
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=1024
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=64
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=256
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=80
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=8
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=512
+iv_len=64
+
+algo=RC2
+bcm=CFB
+key_len=40
+iv_len=64
+
+algo=RC2
+bcm=ECB
+key_len=128
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=192
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=1024
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=64
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=256
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=80
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=8
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=512
+iv_len=0
+
+algo=RC2
+bcm=ECB
+key_len=40
+iv_len=0
+
+################## RC4 ##################
+
+algo=RC4
+bcm=NONE
+key_len=128
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=192
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=1024
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=64
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=256
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=80
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=40
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=512
+iv_len=0
+
+algo=RC4
+bcm=NONE
+key_len=2048
+iv_len=0
+
+################## CAST5 ##################
+
+algo=CAST5
+bcm=OFB
+key_len=128
+iv_len=64
+
+algo=CAST5
+bcm=OFB
+key_len=64
+iv_len=64
+
+algo=CAST5
+bcm=OFB
+key_len=80
+iv_len=64
+
+algo=CAST5
+bcm=OFB
+key_len=40
+iv_len=64
+
+algo=CAST5
+bcm=CBC
+key_len=128
+iv_len=64
+
+algo=CAST5
+bcm=CBC
+key_len=64
+iv_len=64
+
+algo=CAST5
+bcm=CBC
+key_len=80
+iv_len=64
+
+algo=CAST5
+bcm=CBC
+key_len=40
+iv_len=64
+
+algo=CAST5
+bcm=CFB
+key_len=128
+iv_len=64
+
+algo=CAST5
+bcm=CFB
+key_len=64
+iv_len=64
+
+algo=CAST5
+bcm=CFB
+key_len=80
+iv_len=64
+
+algo=CAST5
+bcm=CFB
+key_len=40
+iv_len=64
+
+algo=CAST5
+bcm=ECB
+key_len=128
+iv_len=0
+
+algo=CAST5
+bcm=ECB
+key_len=64
+iv_len=0
+
+algo=CAST5
+bcm=ECB
+key_len=80
+iv_len=0
+
+algo=CAST5
+bcm=ECB
+key_len=40
+iv_len=0
+
diff --git a/src/yaca/test-vectors/encrypt_valid_param_wrap.txt b/src/yaca/test-vectors/encrypt_valid_param_wrap.txt
new file mode 100644 (file)
index 0000000..741577c
--- /dev/null
@@ -0,0 +1,101 @@
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=64
+key_data_len=128
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=64
+key_data_len=192
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=64
+key_data_len=256
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=64
+key_data_len=512
+
+algo=AES
+bcm=WRAP
+key_len=128
+iv_len=64
+key_data_len=1024
+
+algo=AES
+bcm=WRAP
+key_len=192
+iv_len=64
+key_data_len=128
+
+algo=AES
+bcm=WRAP
+key_len=192
+iv_len=64
+key_data_len=192
+
+algo=AES
+bcm=WRAP
+key_len=192
+iv_len=64
+key_data_len=256
+
+algo=AES
+bcm=WRAP
+key_len=192
+iv_len=64
+key_data_len=512
+
+algo=AES
+bcm=WRAP
+key_len=192
+iv_len=64
+key_data_len=1024
+
+algo=AES
+bcm=WRAP
+key_len=256
+iv_len=64
+key_data_len=128
+
+algo=AES
+bcm=WRAP
+key_len=256
+iv_len=64
+key_data_len=192
+
+algo=AES
+bcm=WRAP
+key_len=256
+iv_len=64
+key_data_len=256
+
+algo=AES
+bcm=WRAP
+key_len=256
+iv_len=64
+key_data_len=512
+
+algo=AES
+bcm=WRAP
+key_len=256
+iv_len=64
+key_data_len=1024
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=0
+key_data_len=128
+
+algo=3DES_3TDEA
+bcm=WRAP
+key_len=192
+iv_len=0
+key_data_len=192
diff --git a/src/yaca/test-vectors/key.txt b/src/yaca/test-vectors/key.txt
new file mode 100644 (file)
index 0000000..81b0528
--- /dev/null
@@ -0,0 +1,329 @@
+########################### SYMMETRIC ###########################
+key_type=SYMMETRIC
+key_len_bits=128
+key_format=DEFAULT
+key_file_format=RAW
+password=
+
+key_type=SYMMETRIC
+key_len_bits=192
+key_format=DEFAULT
+key_file_format=RAW
+password=
+
+key_type=SYMMETRIC
+key_len_bits=256
+key_format=DEFAULT
+key_file_format=RAW
+password=
+
+key_type=SYMMETRIC
+key_len_bits=128
+key_format=DEFAULT
+key_file_format=BASE64
+password=
+
+key_type=SYMMETRIC
+key_len_bits=192
+key_format=DEFAULT
+key_file_format=BASE64
+password=
+
+key_type=SYMMETRIC
+key_len_bits=256
+key_format=DEFAULT
+key_file_format=BASE64
+password=
+
+########################### DES ###########################
+key_type=DES
+key_len_bits=64
+key_format=DEFAULT
+key_file_format=RAW
+password=
+
+key_type=DES
+key_len_bits=128
+key_format=DEFAULT
+key_file_format=RAW
+password=
+
+key_type=DES
+key_len_bits=192
+key_format=DEFAULT
+key_file_format=RAW
+password=
+
+key_type=DES
+key_len_bits=64
+key_format=DEFAULT
+key_file_format=BASE64
+password=
+
+key_type=DES
+key_len_bits=128
+key_format=DEFAULT
+key_file_format=BASE64
+password=
+
+key_type=DES
+key_len_bits=192
+key_format=DEFAULT
+key_file_format=BASE64
+password=
+
+########################### RSA DEFAULT ###########################
+key_type=RSA_PRIV
+key_len_bits=512
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=RSA_PRIV
+key_len_bits=1024
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=RSA_PRIV
+key_len_bits=512
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=RSA_PRIV
+key_len_bits=1024
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=RSA_PRIV
+key_len_bits=512
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+key_type=RSA_PRIV
+key_len_bits=1024
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+########################### RSA PKCS8 ###########################
+key_type=RSA_PRIV
+key_len_bits=512
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=RSA_PRIV
+key_len_bits=1024
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=RSA_PRIV
+key_len_bits=512
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
+
+key_type=RSA_PRIV
+key_len_bits=1024
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
+
+########################### DSA DEFAULT ###########################
+key_type=DSA_PRIV
+key_len_bits=512
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=DSA_PRIV
+key_len_bits=1024
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=DSA_PRIV
+key_len_bits=512
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DSA_PRIV
+key_len_bits=1024
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DSA_PRIV
+key_len_bits=512
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+key_type=DSA_PRIV
+key_len_bits=1024
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+########################### DSA PKCS8 ###########################
+key_type=DSA_PRIV
+key_len_bits=512
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DSA_PRIV
+key_len_bits=1024
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DSA_PRIV
+key_len_bits=512
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
+
+key_type=DSA_PRIV
+key_len_bits=1024
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
+
+### DH key_len_bits explained:
+# YACA_KEY_LENGTH_DH_RFC_2048_256      - 570427392
+# YACA_KEY_LENGTH_DH_GENERATOR_2 | 333 - 268435789
+
+########################### DH DEFAULT ###########################
+key_type=DH_PRIV
+key_len_bits=268435789
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=DH_PRIV
+key_len_bits=570427392
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=DH_PRIV
+key_len_bits=268435789
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DH_PRIV
+key_len_bits=570427392
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DH_PRIV
+key_len_bits=268435789
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+key_type=DH_PRIV
+key_len_bits=570427392
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+########################### DH PKCS8 ###########################
+key_type=DH_PRIV
+key_len_bits=268435789
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DH_PRIV
+key_len_bits=570427392
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=DH_PRIV
+key_len_bits=268435789
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
+
+key_type=DH_PRIV
+key_len_bits=570427392
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
+
+### EC key_len_bits explained:
+# YACA_KEY_LENGTH_EC_PRIME256V1 - 805306624
+# YACA_KEY_LENGTH_EC_SECP521R1  - 823132681
+
+########################### EC DEFAULT ###########################
+key_type=EC_PRIV
+key_len_bits=805306624
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=EC_PRIV
+key_len_bits=823132681
+key_format=DEFAULT
+key_file_format=PEM
+password=
+
+key_type=EC_PRIV
+key_len_bits=805306624
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=EC_PRIV
+key_len_bits=823132681
+key_format=DEFAULT
+key_file_format=PEM
+password=123456qwerty
+
+key_type=EC_PRIV
+key_len_bits=805306624
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+key_type=EC_PRIV
+key_len_bits=823132681
+key_format=DEFAULT
+key_file_format=DER
+password=
+
+########################### EC PKCS8 ###########################
+key_type=EC_PRIV
+key_len_bits=805306624
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=EC_PRIV
+key_len_bits=823132681
+key_format=PKCS8
+key_file_format=PEM
+password=123456qwerty
+
+key_type=EC_PRIV
+key_len_bits=805306624
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
+
+key_type=EC_PRIV
+key_len_bits=823132681
+key_format=PKCS8
+key_file_format=DER
+password=123456qwerty
diff --git a/src/yaca/test-vectors/key_derive_dh.txt b/src/yaca/test-vectors/key_derive_dh.txt
new file mode 100644 (file)
index 0000000..83035c7
--- /dev/null
@@ -0,0 +1,42 @@
+prv_key_type=EC_PRIV
+prv_key=3077020101042054416922f17990cac5dc1fa3addeceb499986218b17305b514f68a341c592052a00a06082a8648ce3d030107a14403420004d9b80c99e26a0400f9d59128658723ac9e8bc5521a739bd2291045f080f16ae5075a467531aeae3e09dc789e77e16738fa74a7eedfb99bfec62300665d24ac9c
+pub_key_type=EC_PUB
+pub_key=2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d466b77457759484b6f5a497a6a3043415159494b6f5a497a6a30444151634451674145616e39553970742f3249783643716f4b77714b49664c6941646c33680a5935495a4b627478766235327435422f6e58776c344358795a61517243575762366c616d6d4f485634446a327865712b6f5a6c3047334d424f513d3d0a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a
+secret=31f51c5456ce1ceb8c7e5cb9b7a9cd9e5f1d9330775f010843464bbbf05a5f06
+
+prv_key_type=EC_PRIV
+prv_key=307402010104201301254092b3d581a88729fa2c642017059869b6c09c381564d731300bd4d3d9a00706052b8104000aa144034200041eb1f657d03dc01360c3b93e912c8db3ac8ddaa26bbe0b06782ba39c94f445704aacbf37b1a2c315ddf0c078a51984106218b38a391e6d819e4b6c4be5f5adb7
+pub_key_type=EC_PUB
+pub_key=2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d465977454159484b6f5a497a6a3043415159464b34454541416f44516741455368355874535865356b4761736d49694a4e3969534d38755a746168594a65480a76572b4e5162623132686b784e4d435244346e7059625a524e6f6a786454774234563473757175565232454a35376b5043634a4d30673d3d0a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a
+secret=80fe279345aef9ce96ec8656751ac6fafcf72e1670923d29855355360aa54a36
+
+prv_key_type=EC_PRIV
+prv_key=3081a4020101043064b0194fa4868d61bc8f2594458799c4bada257d101971ff9f98ac3dfca73492f6a475afbcc68d43d439bf4fa36af4dca00706052b81040022a16403620004bad07cb6e419285aca783117ec62422a16d440fbdfd04b632139d2c895c5bcae7b94cb15a9e9b802dc2a985252eebdd1764a92f5ec5d60c2e08194455c6eefed6b8d5fea1c9d33253846e998672aa848a7976918ee33793985a7de74dfe10d4d
+pub_key_type=EC_PUB
+pub_key=2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d485977454159484b6f5a497a6a3043415159464b34454541434944596741454c533468346d4b67422b374b6e726f7768413236705a4b6d6958534e504258760a52724a6a772b4d7154655244777436624f466163376b6d6b57627655775436514773636130697a48696e494c617a4a4f3731744c644c6e5a43743572657363470a45384c78484c523841473651626c4d316a49364b506e79354274524332504d320a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a
+secret=7983baa7270e2941b0fa138296ee595be28e4cc2967230fe9b28902cbcb390f01121362cc005b58026c80361e33dbf48
+
+prv_key_type=EC_PRIV
+prv_key=3081dc020101044200e62cf1d6d24844010d4efa483d6252b890de0338974894d2d27810f9b7d17c36f7d5a05682bbe0b3bd056a0f935cb7182f7af8ebefe2b19dc4f872ef00d149d19da00706052b81040023a18189038186000401a222fcc388de7f8c6eb6a6dba8b4ce2c305417068e3efc62d0e0f093d58d86e292bfb79d65ed74a336af8eee04aca058bc8bad20f29ba8e0b2a6c58b8987c2bc0901868051171bb334da4729376aab6d163e0ae02ec0fe3d89f1341d113ff65760fecb49f04e9cfa2fec7571b0ae3380964c90181a8df629c221a29a34722416379608
+pub_key_type=EC_PUB
+pub_key=2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d4947624d42414742797147534d343941674547425375424241416a41344747414151424949556245474f4f516c7631716d41676c72797a53556f6d685a74570a4a353439316a5658324f74614e756f4b4e476572636f34686744332f38417536584970686f54524a4e64764f5a2b7a4567536d675432384878574d416d474a550a3365753255336558686c634f68556b5666705a7276577653395a30767a764f797131385966494663486148483138646d437131764845506e2b4c7a34544c2b710a30337a344c705a7a7543326b5a744f6767396b3d0a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a
+secret=003fd7740ffa65986a59d9623918f2946bfad7c234f30fdf6d0db8cc21bd3a48aca01df27b9f58ffc9da0d86984f4d251759ec9ebcb626dcf16bcd50ad5ff4abbe47
+
+prv_key_type=DH_PRIV
+prv_key=3082014b0201003082012c06072a8648ce3e02013082011f02818100b10b8f96a080e01dde92de5eae5d54ec52c99fbcfb06a3c69a6a9dca52d23b616073e28675a23d189838ef1e2ee652c013ecb4aea906112324975c3cd49b83bfaccbdd7d90c4bd7098488e9c219a73724effd6fae5644738faa31a4ff55bccc0a151af5f0dc8b4bd45bf37df365c1a65e68cfda76d4da708df1fb2bc2e4a437102818100a4d1cbd5c3fd34126765a442efb99905f8104dd258ac507fd6406cff14266d31266fea1e5c41564b777e690f5504f213160217b4b01b886a5e91547f9e2749f4d7fbd7d3b9a92ee1909d0d2263f80a76a6a24c087a091f531dbf0a0169b6a28ad662a4d18e73afa32d779d5918d08bc8858f4dcef97c2a24855e6eeb22b3b2e5021500f518aa8781a8df278aba4e7d64b7cb9d494623530416021474451e912e31a153923bb508c1ed934cc1abc673
+pub_key_type=DH_PUB
+pub_key=2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d494942747a43434153774742797147534d342b4167457767674566416f4742414c454c6a356167674f416433704c6558713564564f7853795a2b382b77616a0a787070716e637053306a746859485069686e5769505269594f4f38654c755a5377425073744b36704268456a4a4a6463504e536267372b73793931396b4d53390a634a68496a7077686d6e4e7954762f572b75566b527a6a366f7870503956764d774b46527231384e794c533952623833337a5a63476d586d6a50326e6255326e0a434e386673727775536b4e78416f4742414b5452793958442f5451535a32576b51752b356d51583445453353574b785166395a41625038554a6d30784a6d2f710a486c7842566b7433666d6b5056515479457859434637537747346871587046556635346e536654582b39665475616b75345a436444534a6a2b41703270714a4d0a43486f4a48314d6476776f426162616969745a69704e474f63362b6a4c58656457526a51693869466a30334f2b5877714a4956656275736973374c6c416855410a395269716834476f3379654b756b35395a4c664c6e556c4749314d4467595141416f474152626365524f4471555762373855665137485849617038727362536f0a46495a56353770664c6b375763477663474965706b694554746a6362305578627934445571435a41443735757078484c43676e5a5841542b714f394736374f330a5a755068374564386a3651705950365461525036704b426d5852536e522b4736427268464e3233744e4655337570663238496b53424a3250713668416f6f77320a514472355231444e79544963674d343d0a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a
+secret=639400312876b08c4e4e4663dc1d5182b0880240ce8a4b17f1b083793e96a3931df22209acdeb9df2503b1c8c4764c1ba187aa029e164315fdc25c987e4fec4be2750a591218892ac7c72d6e7756aedc1f753c3dc692e5b6f9bf46c4e6362269a4036db2108ca76270abb2ebde35b331901efc84b9d46af0bf984db80c0daf30
+
+prv_key_type=DH_PRIV
+prv_key=3082025d0201003082023606072a8648ce3e0201308202290282010100ad107e1e9123a9d0d660faa79559c51fa20d64e5683b9fd1b54b1597b61d0a75e6fa141df95a56dbaf9a3c407ba1df15eb3d688a309c180e1de6b85a1274a0a66d3f8152ad6ac2129037c9edefda4df8d91e8fef55b7394b7ad5b7d0b6c12207c9f98d11ed34dbf6c6ba0b2c8bbc27be6a00e0a0b9c49708b3bf8a317091883681286130bc8985db1602e714415d9330278273c7de31efdc7310f7121fd5a07415987d9adc0a486dcdf93acc44328387315d75e198c641a480cd86a1b9e587e8be60e69cc928b2b9c52172e413042e9b23f10b0e16e79763c9b53dcf4ba80a29e3fb73c16b8e75b97ef363e2ffa31f71cf9de5384e71b81c0ac4dffe0c10e64f0282010100ac4032ef4f2d9ae39df30b5c8ffdac506cdebe7b89998caf74866a08cfe4ffe3a6824a4e10b9a6f0dd921f01a70c4afaab739d7700c29f52c57db17c620a8652be5e9001a8d66ad7c17669101999024af4d027275ac1348bb8a762d0521bc98ae247150422ea1ed409939d54da7460cdb5f6c6b250717cbef180eb34118e98d119529a45d6f834566e3025e316a330efbb77a86f0c1ab15b051ae3d428c8f8acb70a8137150b8eeb10e183edd19963ddd9e263e4770589ef6aa21e7f5f2ff381b539cce3409d13cd566afbb48d6c019181e1bcfe94b30269edfe72fe9b6aa4bd7b5a0f1c71cfff4c19c418e1f6ec017981bc087f2a7065b384b890d3191f2bfa021d00801c0d34c58d93fe997177101f80535a4738cebcbf389a99b36371eb041e021c7b0394e5069fb96a8714f1f97d8de99245b5bdef5d33ba9d0b8b9f25
+pub_key_type=DH_PUB
+pub_key=2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d494944517a4343416a594742797147534d342b4167457767674970416f494241514374454834656b534f70304e5a672b716556576355666f67316b355767370a6e394731537857587468304b6465623646423335576c626272356f3851487568337858725057694b4d4a77594468336d75466f53644b436d62542b42557131710a77684b514e386e743739704e2b4e6b656a2b3956747a6c4c65745733304c62424967664a2b59305237545462397361364379794c7643652b616744676f4c6e450a6c77697a76346f78634a47494e6f456f595443386959586246674c6e464546646b7a416e676e5048336a487633484d513978496631614230465a68396d74774b0a5347334e2b54724d52444b44687a466464654759786b476b674d32476f626e6c682b692b594f616379536979756355686375515442433662492f454c4468626e0a6c32504a745433505336674b4b655037633846726a6e573566764e6a34762b6a483348506e655534546e473448417245332f344d454f5a50416f4942415143730a51444c76547932613435337a433179502f617851624e362b65346d5a6a4b3930686d6f497a2b542f34366143536b345175616277335a49664161634d537671720a63353133414d4b665573563973587869436f5a53766c365141616a5761746642646d6b51475a6b43537654514a7964617754534c754b646930464962795972690a5278554549756f6531416d546e5654616447444e74666247736c4278664c3778674f73304559365930526c536d6b58572b445257626a416c3478616a4d4f2b370a6436687644427178577755613439516f79506973747771424e78554c6a75735134595074305a6c6a33646e69592b523342596e766171496566313876383447310a4f637a6a514a30547a565a712b37534e62414752676547382f70537a416d6e742f6e4c2b6d32716b76587461447878787a2f394d476351593466627341586d420a7641682f4b6e426c733453346b4e4d5a48797636416830416742774e4e4d574e6b2f365a6358635148344254576b63347a72792f4f4a715a73324e7836774f430a41515541416f49424141326e6d646c6274526f6168772f795a616e6a51695948386a587a5a445249765655596b5775694b6f59373472784e342b7934543573610a35317a706d4e4f705166514f744c6d6a686236723377577859315555577651345532467736436b4f3275506e334b434d38517a36726d672b6e414b6c4a3071500a345258706552524e7a583049435a472b56504f534e796d72304631796b56346e526772787143624c59546a4b4e784f5a35757a37594843586a694d68576673760a48304a4357454833593675334e772b63396b734f44747a38643966317a4b36446e5365302b75747250324b6d62356b66563378535930713635616544504a32500a6d7869306668577955496b474b686b4149683531576c32773132686b615556724272614b7a32754d745a52767559615568674d624f68534241394d355a5168780a67666d4f4c4e444339316c445371786d562f5964766e6d4d6e697a59316c413d0a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a
+secret=52e3237faabe0c482d034521a33144e0913fd80fae435963abd7bb2726397183b64bcc73ebbd3472d3180f2e70033b7a37cbeffd3edc1bce370bd41b450118b2c25db551bdd521520fea7330907f6cce487bbbc8bb363ade0f21c2911a66dc2c1b9ac40e384a753b29d5669e9ae886f64373f86afc34b82454672318063b9411053e3d0cdbcc0504684a704d729ed7ef54b903d6d4f0b713d692d74448efef9ac90b424008c5b5e224463323cdcf21fafe0dc293d3ec6d780c25539d98d537b984ac3e86b106d59926cae2f5c87066d6d4f73486d98f39659c6922efe0aa56ed09333ee32eb81f256d765f5bd73ab6a4df833f7f1077d84e8012ddfecd7ac2a8
+
+prv_key_type=DH_PRIV
+prv_key=308202640201003082023906072a8648ce3e02013082022c028201010087a8e61db4b6663cffbbd19c651959998ceef608660dd0f25d2ceed4435e3b00e00df8f1d61957d4faf7df4561b2aa3016c3d91134096faa3bf4296d830e9a7c209e0c6497517abd5a8a9d306bcf67ed91f9e6725b4758c022e0b1ef4275bf7b6c5bfc11d45f9088b941f54eb1e59bb8bc39a0bf12307f5c4fdb70c581b23f76b63acae1caa6b7902d52526735488a0ef13c6d9a51bfa4ab3ad8347796524d8ef6a167b5a41825d967e144e5140564251ccacb83e6b486f6b3ca3f7971506026c0b857f689962856ded4010abd0be621c3a3960a54e710c375f26375d7014103a4b54330c198af126116d2276e11715f693877fad7ef09cadb094ae91e1a1597028201003fb32c9b73134d0b2e77506660edbd484ca7b18f21ef205407f4793a1a0ba12510dbc15077be463fff4fed4aac0bb555be3a6c1b0c6b47b1bc3773bf7e8c6f62901228f8c28cbb18a55ae31341000a650196f931c77a57f2ddf463e5e9ec144b777de62aaab8a8628ac376d282d6ed3864e67982428ebc831d14348f6f2f9193b5045af2767164e1dfc967c1fb3f2e55a4bd1bffe83b9c80d052b985d182ea0adb2a3b7313d3fe14c8484b1e052588b9b7d2bbd2df016199ecd06e1557cd0915b3353bbb64e0ec377fd028370df92b52c7891428cdc67eb6184b523d1db246c32f63078490f00ef8d647d148d47954515e2327cfef98c582664b4c0f6cc416590221008cf83642a709a097b447997640129da299b1a47d1eb3750ba308b0fe64f5fbd3042202202aaf96ac7710c515c4be2a4a291cd32ab8fd821520349b4b005c7d01f0291306
+pub_key_type=DH_PUB
+pub_key=2d2d2d2d2d424547494e205055424c4943204b45592d2d2d2d2d0a4d494944526a4343416a6b4742797147534d342b4167457767674973416f494241514348714f5964744c5a6d50502b37305a786c47566d5a6a4f37324347594e0a30504a644c4f375551313437414f414e2b504857475666552b76666652574779716a415777396b524e416c76716a76304b57324444707038494a344d5a4a64520a65723161697030776138396e375a4835356e4a6252316a414975437837304a3176337473572f775231462b51694c6c4239553678355a753476446d67767849770a66317850323344466762492f647259367975484b707265514c564a535a7a5649696737785047326155622b6b717a72594e486557556b324f3971466e746151590a4a646c6e3455546c4641566b4a527a4b7934506d7449623273386f2f655846515943624175466632695a596f5674375541517139432b596877364f57436c546e0a454d4e31386d4e313177464241365331517a44426d4b3853595262534a323452635639704f486636312b384a7974734a53756b6547685758416f494241442b7a0a4c4a747a4530304c4c6e64515a6d44747655684d70374750496538675641663065546f614336456c454e76425548652b526a2f2f542b314b72417531566234360a6242734d613065787644647a7633364d62324b5145696a34776f7937474b566134784e424141706c415a62354d636436562f4c643947506c36657755533364390a35697171754b686969734e32306f4c573754686b356e6d43516f3638677830554e4939764c35475474515261386e5a785a4f4866795766422b7a3875566153390a472f2f6f4f35794130464b3568644743366772624b6a747a4539502b464d6849537834464a59693574394b3730743842595a6e73304734565638304a46624d310a4f37746b344f77336639416f4e7733354b314c486952516f7a635a2b7468684c556a3064736b62444c324d48684a447744766a575239464931486c555556346a0a4a382f766d4d57435a6b744d44327a45466c6b434951434d2b445a4370776d676c3752486d585a41457032696d62476b6652367a6451756a434c442b5a5058370a30774f4341515541416f49424144633754717837716f41423876354a62515a614f70703735537352676d556462444c6667524264434d53457142616c6b5749710a544f6e666f716c4152786344754f477068504b49564a57356b57334e4a647a6e453862694f47595145366d68376b64387441384737444573346e695055446c370a7562306b726b324362642b2b62775a67775055652f7432466a3859774268576859335069426c5a4b32667158377855447063587169625a313679534a76516a420a677353614c306b48725665325674595a714e4e3535576c6671597543714171763832385a735143456d3930595a517966357055355174764566624c38636434590a6757354969537550453764722b65454c373053394c2b50544731574649563056674f49447a32464f474668354d674b4c6867664665764f3464424b34556a4f540a795a6844514974726b2f34314c434b4c756e4c2f3361305330554c46374f2f486965303d0a2d2d2d2d2d454e44205055424c4943204b45592d2d2d2d2d0a
+secret=168e1ede814b3c27e6aba6e83f00ec7a95501f0f2460eae47ef540e0ae4cf97086d08b3740d4c2984dda61632a19029c211db463392b1047620c21fdafad56639962cbd31c8da86bec1cf6f6e6503029bd170842c2b9e77930fb675f909ca80c6d1385d9c5c38c53a052ed9ee9bef570dabbac9826a1303685f5cde67e879fbdeba478477c08d7cb26ace1338e7fdc1b7a5073ed4ca4bd8e722c61348a74f2508718ad3d5de3332f43007ead772a4f2e373b2d4fa29f43bcd1f68f1a465b4b2e3fe6ea3a0405c98465ef460a6539bdacb6d42f5abf31bae8cb36f992e269bcb4a599c20c3a8455650a2eaab36dbde83368ef00037054d89325c6f633a2cfebfd
+
diff --git a/src/yaca/test-vectors/key_derive_kdf.txt b/src/yaca/test-vectors/key_derive_kdf.txt
new file mode 100644 (file)
index 0000000..8ff86ca
--- /dev/null
@@ -0,0 +1,35 @@
+kdf=X962
+algo=SHA256
+secret=96c05619d56c328ab95fe84b18264b08725b85e33fd34f08
+info=
+key_material=443024c3dae66b95e6f5670601558f71
+
+kdf=X962
+algo=SHA256
+secret=96f600b73ad6ac5629577eced51743dd2c24c21b1ac83ee4
+info=
+key_material=b6295162a7804f5667ba9070f82fa522
+
+kdf=X962
+algo=SHA256
+secret=22518b10e70f2a3f243810ae3254139efbee04aa57c7af7d
+info=75eef81aa3041e33b80971203d2c0c52
+key_material=c498af77161cc59f2962b9a713e2b215152d139766ce34a776df11866a69bf2e52a13d9c7c6fc878c50c5ea0bc7b00e0da2447cfd874f6cf92f30d0097111485500c90c3af8b487872d04685d14c8d1dc8d7fa08beb0ce0ababc11f0bd496269142d43525a78e5bc79a17f59676a5706dc54d54d4d1f0bd7e386128ec26afc21
+
+kdf=X962
+algo=SHA256
+secret=7e335afa4b31d772c0635c7b0e06f26fcd781df947d2990a
+info=d65a4812733f8cdbcdfb4b2f4c191d87
+key_material=c0bd9e38a8f9de14c2acd35b2f3410c6988cf02400543631e0d6a4c1d030365acbf398115e51aaddebdc9590664210f9aa9fed770d4c57edeafa0b8c14f93300865251218c262d63dadc47dfa0e0284826793985137e0a544ec80abf2fdf5ab90bdaea66204012efe34971dc431d625cd9a329b8217cc8fd0d9f02b13f2f6b0b
+
+kdf=X942
+algo=SHA224
+secret=16343907ebcdcee93c918e3b364dd9534071f20e92397e4e19d2a7fc26314ffd8dabe72fa0d9182438c5dc9004a0aae26bb6badee78df51c8e2e909e2556785b8a5d7c0e92e1b4ae67683ed533ef98fdd2f65896e3ec1c34a0e9964f0ff7705575879b016570b560af1362aec74a8ecf4c09033d587207d596cc144f80eaf320af3e53cdfa193c3e131b9e0ccfd0de5deb80c8949a83af7061ed7f365a6bb8dc47be52ebd29944de0a047898a2a412102368bfddabd20d4a0c0aa80c6b7f8f32f130f2543bb845bcf80a12fe70439e41b8652cf50124f20970f18801fcaa1f07067ac465a568fe201f9bc757e96135b13496b5b1835bbc1870bc88e06e41e23e
+info=
+key_material=f825b2790307c673c228dcfcf949e28fc741355ba6d90fa5
+
+kdf=X942
+algo=SHA384
+secret=1987755a21b47cb209d2c5b3084204766099142569ae6545f507527ccbdcbda5736c4bcbc5ccf54fab8f88684c2db5f7fda94716a34ab323f89c06fc6615eb4258df2c7ba8c1903fdd1d27f336f7533e12533902d5b94dfd708fdd57cd32563324f4610e0208d000e94e98a2b7a8e37fe0cbf6f8d138cf34916ade7b91a3874763204ffba66beffe36b9d32edfd27bb30836f0c5b6afda6b9627eb09106049564f78def2ef084c18e7de104771c0b1a95ecb20d02a1ba9d98cb71aceef6bea2f92cfba7a9418e0f1f070d7682aa43cf214be1bf150c615817be2beb28a64f1662c200374a0f6f1a0c6a104b49a85c5d40f0bb4f473f65c9983ec73d4ad36de22
+info=
+key_material=43f07538d7c41ac095dd0a3ec8702c1681722c57dd12a643
diff --git a/src/yaca/test-vectors/key_pbkdf2.txt b/src/yaca/test-vectors/key_pbkdf2.txt
new file mode 100644 (file)
index 0000000..3cbdfff
--- /dev/null
@@ -0,0 +1,64 @@
+password=
+salt=9d1b74e15562b40a475e119b86b93afc32b6736b
+salt_len=20
+iter=1
+algo=MD5
+key_bit_len=64
+key=52f3d57fa63dab7f
+
+password=a
+salt=412c46e8039535d7dcc8094196e2eb46cb725b62
+salt_len=20
+iter=5
+algo=SHA1
+key_bit_len=128
+key=7930fd527ea6a0e42456119e745051e2
+
+password=aaa
+salt=17eb5c11ec194175e6a62dd6d545e343c83e3598
+salt_len=20
+iter=10
+algo=SHA224
+key_bit_len=128
+key=b6471015a5e3eaa7b53a8ff768d864dc
+
+password=password
+salt=194a50ad20a87d0c26864f349b7824b5ab0a5a5b
+salt_len=20
+iter=50
+algo=SHA256
+key_bit_len=192
+key=61b91432adb8403012f8ce0b9a8272432614b0ea71a0ec94
+
+password=qwerty
+salt=a35047f285518b57ce3e7e0556673a7a8a1177fa
+salt_len=20
+iter=100
+algo=SHA384
+key_bit_len=256
+key=40ab3882c1780ddaa479585d5cf2ac92e02b7f2aec739e6353fd40f70f5e6740
+
+password=1234567890
+salt=257624551e265fe39afc16421172b8c4e5552a3c
+salt_len=20
+iter=1000
+algo=SHA512
+key_bit_len=256
+key=5694ae84cfc33c485fa4b7bac6503a1532e7e87ac34d89bb7a2c314b3f22147f
+
+password=!@#$%^&*()_+
+salt=9d8d0e1bd2ce6d31d46dc222f2d56c465812216d
+salt_len=20
+iter=10000
+algo=SHA512
+key_bit_len=256
+key=05967d6c8d8211a48c5e34677800e51d5cef1cd47af717268330a2a3113ec692
+
+password=456qweRTYuio123$%^789
+salt=70285b859c8c6c6a61d9b2e998f0c1d085d14f9d
+salt_len=20
+iter=100000
+algo=SHA512
+key_bit_len=256
+key=84013e2f464450f96cb94a8c9be87df5a891eecf3738839152bdf49be1f98136
+
diff --git a/src/yaca/test-vectors/key_x509.txt b/src/yaca/test-vectors/key_x509.txt
new file mode 100644 (file)
index 0000000..ba09291
--- /dev/null
@@ -0,0 +1,41 @@
+#################################### PEM ###################################
+key_type=RSA_PUB
+cert=2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949432f444343416d5767417749424167494a414e5732735a6d5a346b42694d413047435371475349623344514542437755414d4947564d517377435159440a5651514745774a51544445554d424947413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45510a4d413447413155454367774855324674633356755a7a45524d41384741315545437777495532566a64584a7064486b78456a415142674e5642414d4d43586c680a593245746447567a6444456d4d43514743537147534962334451454a41525958624335775958646c62474e366557744163324674633356755a79356a623230770a4942634e4d5459774e7a41784d5463784d7a5177576867504d6a49354d4441304d5455784e7a457a4e4442614d4947564d517377435159445651514745774a510a544445554d424947413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45514d413447413155450a4367774855324674633356755a7a45524d41384741315545437777495532566a64584a7064486b78456a415142674e5642414d4d43586c68593245746447567a0a6444456d4d43514743537147534962334451454a41525958624335775958646c62474e366557744163324674633356755a79356a62323077675a38774451594a0a4b6f5a496876634e4151454242514144675930414d49474a416f4742414b4e6d57366e5934362b757745353377324a724475623542744f757642425a4645376a0a36706e436763447270615a634a75554e596c45324d576c786d6758337877626c53452f4a57626e64526570306457582f386c41663343564a39524258476f37680a2b516478344c4a727446353156716f574732773274397636346b39434d37614b6d67476c54302f77436c534a636e56612b41696861753535625050694b754d780a7a5839645150505441674d424141476a5544424f4d42304741315564446751574242544642426563746a3734585545584a2b6266776264556e4b3756674441660a42674e5648534d45474441576742544642426563746a3734585545584a2b6266776264556e4b37566744414d42674e5648524d45425441444151482f4d4130470a43537147534962334451454243775541413447424146445949344a4c2b2f32764d6453377743554354774445564634443769313635344c784f4b6372683838780a544c5035363768754c534b684635464668724d4e4a526b526e4a7756575a7a6d6f61416e65397a6943575042597342394535756b33622b63306f4758536b30680a376e313153414e5a7053556253754b4f65616a7871674a4830484e4d3232427a6850657a53745a7879446854345a42717276375a303065587755786d67456a340a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a
+pub_key=30819f300d06092a864886f70d010101050003818d0030818902818100a3665ba9d8e3afaec04e77c3626b0ee6f906d3aebc1059144ee3ea99c281c0eba5a65c26e50d6251363169719a05f7c706e5484fc959b9dd45ea747565fff2501fdc2549f510571a8ee1f90771e0b26bb45e7556aa161b6c36b7dbfae24f4233b68a9a01a54f4ff00a548972755af808a16aee796cf3e22ae331cd7f5d40f3d30203010001
+
+key_type=RSA_PUB
+cert=2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949432f444343416d5767417749424167494a41505649764d5a70616469744d413047435371475349623344514542437755414d4947564d517377435159440a5651514745774a51544445554d424947413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45510a4d413447413155454367774855324674633356755a7a45524d41384741315545437777495532566a64584a7064486b78456a415142674e5642414d4d43586c680a593245746447567a6444456d4d43514743537147534962334451454a41525958624335775958646c62474e366557744163324674633356755a79356a623230770a4942634e4d5459774e7a41784d5463784e545530576867504d6a49354d4441304d5455784e7a45314e5452614d4947564d517377435159445651514745774a510a544445554d424947413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45514d413447413155450a4367774855324674633356755a7a45524d41384741315545437777495532566a64584a7064486b78456a415142674e5642414d4d43586c68593245746447567a0a6444456d4d43514743537147534962334451454a41525958624335775958646c62474e366557744163324674633356755a79356a62323077675a38774451594a0a4b6f5a496876634e4151454242514144675930414d49474a416f4742414a38393338645679584c4a742f677a396b446f2b3031455365547a795164725179627a0a4638536777667034457148414f6b58724b5174665543414b4869656976666f6b5462666652502f327139576245795672326f323843424f7a796b454d44714c300a745376424e755935536265434765436b6d6e686f556a736b32625353517365474f38794e59704e7264437a5449322f4d6335542f5a75425567442b75506b7a4a0a39497a5a6e61344841674d424141476a5544424f4d4230474131556444675157424253584a2b327a7a73583273777a4a366a374a543337735667747a774441660a42674e5648534d4547444157674253584a2b327a7a73583273777a4a366a374a543337735667747a7744414d42674e5648524d45425441444151482f4d4130470a43537147534962334451454243775541413447424142744570515946496f4b76494f6138556146706d434f4d34394557742f72417579557777674f494c4d53520a41577362365a654233304d4a74593263596a6e67356f626a526b666538314b50537934674d4243524e6b623568636245414e42435a3861334c6643544c554f4c0a5431705a6f722b71425a505665694258335a774b6370314146525352754e723770686e644e792b59617763665262574f7a456436684148715a324570637841760a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a
+pub_key=30819f300d06092a864886f70d010101050003818d00308189028181009f3ddfc755c972c9b7f833f640e8fb4d4449e4f3c9076b4326f317c4a0c1fa7812a1c03a45eb290b5f50200a1e27a2bdfa244db7df44fff6abd59b13256bda8dbc0813b3ca410c0ea2f4b52bc136e63949b78219e0a49a7868523b24d9b49242c7863bcc8d62936b742cd3236fcc7394ff66e054803fae3e4cc9f48cd99dae070203010001
+
+key_type=RSA_PUB
+cert=2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d4949432f444343416d5767417749424167494a4150424b57696d39626252354d413047435371475349623344514542437755414d4947564d517377435159440a5651514745774a51544445554d424947413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45510a4d413447413155454367774855324674633356755a7a45524d41384741315545437777495532566a64584a7064486b78456a415142674e5642414d4d43586c680a593245746447567a6444456d4d43514743537147534962334451454a41525958624335775958646c62474e366557744163324674633356755a79356a623230770a4942634e4d5459774e7a41784d5463784e6a4d7a576867504d6a49354d4441304d5455784e7a45324d7a4e614d4947564d517377435159445651514745774a510a544445554d424947413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45514d413447413155450a4367774855324674633356755a7a45524d41384741315545437777495532566a64584a7064486b78456a415142674e5642414d4d43586c68593245746447567a0a6444456d4d43514743537147534962334451454a41525958624335775958646c62474e366557744163324674633356755a79356a62323077675a38774451594a0a4b6f5a496876634e4151454242514144675930414d49474a416f4742414e533476365a387331324c4b4c5a7245367937386458304e514d55794b58726567354e0a6b573457784670415a4e674b71776b73416b352b5a38753565372f475a74705448777a632f6f4565647454664e6931386b4d313367416746645251686d6758460a6143493072784f4c46714d6f786a752b4852775a5852674d32704b656a495070474f4d694b6c712b3739746e71644c4e61567a6e587850624a6461633768752b0a48792b6e7846626241674d424141476a5544424f4d42304741315564446751574242527a56622b3071413479712b4a44433830716d30796f6a496f6a336a41660a42674e5648534d45474441576742527a56622b3071413479712b4a44433830716d30796f6a496f6a336a414d42674e5648524d45425441444151482f4d4130470a4353714753496233445145424377554141344742414b7157574d7748395462745236367a3955506d77444a36306830473272726b3842517343743349786a67590a7962524b3463706a494c35356a32376773543176385578714c6779434b6b577670524c764762634b46714d624d554333447a6535524b77496e35486d766f63770a714d6946763668796d5667316c327850754d4c6e6f4f3134687a46745a39685032324276335762683377683761616661465a37733673764b434832716e645a4e0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a
+pub_key=30819f300d06092a864886f70d010101050003818d0030818902818100d4b8bfa67cb35d8b28b66b13acbbf1d5f4350314c8a5eb7a0e4d916e16c45a4064d80aab092c024e7e67cbb97bbfc666da531f0cdcfe811e76d4df362d7c90cd778008057514219a05c5682234af138b16a328c63bbe1d1c195d180cda929e8c83e918e3222a5abeefdb67a9d2cd695ce75f13db25d69cee1bbe1f2fa7c456db0203010001
+
+key_type=DSA_PUB
+cert=2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494944586a434341787567417749424167494a414b73527058466866432f714d417347435743475341466c41775144416a426e4d51737743515944565151470a45774a51544445554d424947413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45514d4134470a413155454367774855324674633356755a7a454d4d416f47413155454377774455695a454d52457744775944565151444441686b6332457459325679644441650a467730784e6a41334d6a55784d7a49324e446861467730784e7a41334d6a55784d7a49324e4468614d476378437a414a42674e5642415954416c424d4d5251770a45675944565151494441744e5958707664326c6c593274705a5445504d413047413155454277774756324679633246334d524177446759445651514b444164540a5957317a6457356e4d517777436759445651514c44414e534a6b51784554415042674e5642414d4d4347527a5953316a5a584a304d494942746a4343415373470a42797147534d34344241457767674565416f474241497339734b5143437270796d70554548756f2b56542b34642f386b42625656615235632f685346776c58350a3544446c487a692b33726d4c6e413055496e4546625a4a587a6e4768386a68336a38512f2b5a6a776c6d674b546d7471392f59786766625656676d516d6473530a4b31674e7073396a58667542734832374a726b6b566345683248444859354775464e75673443424d69477863586751656552364638474b565a58654b587672540a41685541796b53473261544f79323945736b7249475759564a475570664f3043675942395366674369756f774570353952704f4e6a774a6232786f5a574950560a327074375561432b4941645665784b344d6e5361595a4a6b714252714d48796b7a7746336e31334f7958526c434b46706459704b2f62464b53724574746c43720a6276794776447a64567333506e6a46387a504150434b63616f666b35364f7552453469516c4f57757669785a4775736b5866367a63694e5176397043674746530a6e6a6935733765586c6d6d4b71514f426841414367594172526b64503035733176614e4b6e3330746a53687653594137794f5763474637784a6d77365837646a0a4e374668557068566f6e44593648596376463131327732626679665a447970786739745751756b6e46746e52316753652b653931442f4e5157615259756476320a56514a74373347433530376958726c4637565a465544735a6c37777033714d585a6d7a38354a6a666a7a65625274752b444f426578333243424653676a4362680a334b4e514d453477485159445652304f42425945464464547744596b446d4e44597058594b58466257585568564f4f384d42384741315564497751594d4261410a464464547744596b446d4e44597058594b58466257585568564f4f384d41774741315564457751464d414d42416638774377594a59495a494157554442414d430a417a41414d4330434643554259514b726630705a66444b7162486e56626a4f7757534130416855416f6b704943656c6c5536572f4a6e53724c745337494e2f640a5674593d0a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a
+pub_key=308201b63082012b06072a8648ce3804013082011e028181008b3db0a4020aba729a95041eea3e553fb877ff2405b555691e5cfe1485c255f9e430e51f38bedeb98b9c0d142271056d9257ce71a1f238778fc43ff998f096680a4e6b6af7f63181f6d556099099db122b580da6cf635dfb81b07dbb26b92455c121d870c76391ae14dba0e0204c886c5c5e041e791e85f0629565778a5efad3021500ca4486d9a4cecb6f44b24ac81966152465297ced0281807d49f8028aea30129e7d46938d8f025bdb1a195883d5da9b7b51a0be2007557b12b832749a619264a8146a307ca4cf01779f5dcec9746508a169758a4afdb14a4ab12db650ab6efc86bc3cdd56cdcf9e317cccf00f08a71aa1f939e8eb9113889094e5aebe2c591aeb245dfeb3722350bfda428061529e38b9b3b79796698aa9038184000281802b46474fd39b35bda34a9f7d2d8d286f49803bc8e59c185ef1266c3a5fb76337b161529855a270d8e8761cbc5d75db0d9b7f27d90f2a7183db5642e92716d9d1d6049ef9ef750ff35059a458b9dbf655026def7182e74ee25eb945ed5645503b1997bc29dea317666cfce498df8f379b46dbbe0ce05ec77d820454a08c26e1dc
+
+key_type=EC_PUB
+cert=2d2d2d2d2d424547494e2043455254494649434154452d2d2d2d2d0a4d494943456a434341626d67417749424167494a414d44356978617071657a4f4d416f4743437147534d343942414d434d475978437a414a42674e56424159540a416c424d4d52517745675944565151494441744e5958707664326c6c593274705a5445504d413047413155454277774756324679633246334d524177446759440a5651514b444164545957317a6457356e4d517777436759445651514c44414e534a6b51784544414f42674e5642414d4d4232566a4c574e6c636e51774868634e0a4d5459774e7a49314d544d7a4e5451775768634e4d5463774e7a49314d544d7a4e545177576a426d4d517377435159445651514745774a51544445554d4249470a413155454341774c54574636623364705a574e7261575578447a414e42674e564241634d426c6468636e4e68647a45514d4134474131554543677748553246740a633356755a7a454d4d416f47413155454377774455695a454d52417744675944565151444441646c5979316a5a584a304d466b77457759484b6f5a497a6a30430a415159494b6f5a497a6a3044415163445167414535692f7137352b6a6967486e594c6c3662507a595678766f536f50587552655149554d74517777545a414d6f0a2f736447494566617942342b6b726e706b4265555464313635382b464930387a7259664f6d63447a6d614e514d453477485159445652304f42425945464777560a795768386a56657450716a51543454326d6d78354e6633624d42384741315564497751594d42614146477756795768386a56657450716a51543454326d6d78350a4e6633624d41774741315564457751464d414d4241663877436759494b6f5a497a6a3045417749445277417752414967505a464e5a79716b49537a6a4f4858710a3061566231794b355771614456727064594f5355613375666531304349455a4b52364c6c4435384c70346348684c587147636e494573336c4a4c746457725a470a2f436643466276500a2d2d2d2d2d454e442043455254494649434154452d2d2d2d2d0a
+pub_key=3059301306072a8648ce3d020106082a8648ce3d03010703420004e62feaef9fa38a01e760b97a6cfcd8571be84a83d7b9179021432d430c13640328fec7462047dac81e3e92b9e99017944ddd7ae7cf85234f33ad87ce99c0f399
+
+#################################### DER ################################
+key_type=RSA_PUB
+cert=308202fc30820265a003020102020900d5b6b19999e24062300d06092a864886f70d01010b0500308195310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e673111300f060355040b0c0853656375726974793112301006035504030c09796163612d746573743126302406092a864886f70d01090116176c2e706177656c637a796b4073616d73756e672e636f6d3020170d3136303730313137313334305a180f32323930303431353137313334305a308195310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e673111300f060355040b0c0853656375726974793112301006035504030c09796163612d746573743126302406092a864886f70d01090116176c2e706177656c637a796b4073616d73756e672e636f6d30819f300d06092a864886f70d010101050003818d0030818902818100a3665ba9d8e3afaec04e77c3626b0ee6f906d3aebc1059144ee3ea99c281c0eba5a65c26e50d6251363169719a05f7c706e5484fc959b9dd45ea747565fff2501fdc2549f510571a8ee1f90771e0b26bb45e7556aa161b6c36b7dbfae24f4233b68a9a01a54f4ff00a548972755af808a16aee796cf3e22ae331cd7f5d40f3d30203010001a350304e301d0603551d0e04160414c504179cb63ef85d411727e6dfc1b7549caed580301f0603551d23041830168014c504179cb63ef85d411727e6dfc1b7549caed580300c0603551d13040530030101ff300d06092a864886f70d01010b05000381810050d823824bfbfdaf31d4bbc025024f00c4545e03ee2d7ae782f138a72b87cf314cb3f9ebb86e2d22a117914586b30d2519119c9c15599ce6a1a0277bdce20963c162c07d139ba4ddbf9cd281974a4d21ee7d75480359a5251b4ae28e79a8f1aa0247d0734cdb607384f7b34ad671c83853e1906aaefed9d34797c14c668048f8
+pub_key=30819f300d06092a864886f70d010101050003818d0030818902818100a3665ba9d8e3afaec04e77c3626b0ee6f906d3aebc1059144ee3ea99c281c0eba5a65c26e50d6251363169719a05f7c706e5484fc959b9dd45ea747565fff2501fdc2549f510571a8ee1f90771e0b26bb45e7556aa161b6c36b7dbfae24f4233b68a9a01a54f4ff00a548972755af808a16aee796cf3e22ae331cd7f5d40f3d30203010001
+
+key_type=RSA_PUB
+cert=308202fc30820265a003020102020900f548bcc66969d8ad300d06092a864886f70d01010b0500308195310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e673111300f060355040b0c0853656375726974793112301006035504030c09796163612d746573743126302406092a864886f70d01090116176c2e706177656c637a796b4073616d73756e672e636f6d3020170d3136303730313137313535345a180f32323930303431353137313535345a308195310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e673111300f060355040b0c0853656375726974793112301006035504030c09796163612d746573743126302406092a864886f70d01090116176c2e706177656c637a796b4073616d73756e672e636f6d30819f300d06092a864886f70d010101050003818d00308189028181009f3ddfc755c972c9b7f833f640e8fb4d4449e4f3c9076b4326f317c4a0c1fa7812a1c03a45eb290b5f50200a1e27a2bdfa244db7df44fff6abd59b13256bda8dbc0813b3ca410c0ea2f4b52bc136e63949b78219e0a49a7868523b24d9b49242c7863bcc8d62936b742cd3236fcc7394ff66e054803fae3e4cc9f48cd99dae070203010001a350304e301d0603551d0e041604149727edb3cec5f6b30cc9ea3ec94f7eec560b73c0301f0603551d230418301680149727edb3cec5f6b30cc9ea3ec94f7eec560b73c0300c0603551d13040530030101ff300d06092a864886f70d01010b0500038181001b44a506052282af20e6bc51a16998238ce3d116b7fac0bb2530c203882cc491016b1be99781df4309b58d9c6239e0e686e34647def3528f4b2e203010913646f985c6c400d04267c6b72df0932d438b4f5a59a2bfaa0593d57a2057dd9c0a729d40151491b8dafba619dd372f986b071f45b58ecc477a8401ea67612973102f
+pub_key=30819f300d06092a864886f70d010101050003818d00308189028181009f3ddfc755c972c9b7f833f640e8fb4d4449e4f3c9076b4326f317c4a0c1fa7812a1c03a45eb290b5f50200a1e27a2bdfa244db7df44fff6abd59b13256bda8dbc0813b3ca410c0ea2f4b52bc136e63949b78219e0a49a7868523b24d9b49242c7863bcc8d62936b742cd3236fcc7394ff66e054803fae3e4cc9f48cd99dae070203010001
+
+key_type=RSA_PUB
+cert=308202fc30820265a003020102020900f04a5a29bd6db479300d06092a864886f70d01010b0500308195310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e673111300f060355040b0c0853656375726974793112301006035504030c09796163612d746573743126302406092a864886f70d01090116176c2e706177656c637a796b4073616d73756e672e636f6d3020170d3136303730313137313633335a180f32323930303431353137313633335a308195310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e673111300f060355040b0c0853656375726974793112301006035504030c09796163612d746573743126302406092a864886f70d01090116176c2e706177656c637a796b4073616d73756e672e636f6d30819f300d06092a864886f70d010101050003818d0030818902818100d4b8bfa67cb35d8b28b66b13acbbf1d5f4350314c8a5eb7a0e4d916e16c45a4064d80aab092c024e7e67cbb97bbfc666da531f0cdcfe811e76d4df362d7c90cd778008057514219a05c5682234af138b16a328c63bbe1d1c195d180cda929e8c83e918e3222a5abeefdb67a9d2cd695ce75f13db25d69cee1bbe1f2fa7c456db0203010001a350304e301d0603551d0e041604147355bfb4a80e32abe2430bcd2a9b4ca88c8a23de301f0603551d230418301680147355bfb4a80e32abe2430bcd2a9b4ca88c8a23de300c0603551d13040530030101ff300d06092a864886f70d01010b050003818100aa9658cc07f536ed47aeb3f543e6c0327ad21d06dabae4f0142c0addc8c63818c9b44ae1ca6320be798f6ee0b13d6ff14c6a2e0c822a45afa512ef19b70a16a31b3140b70f37b944ac089f91e6be8730a8c885bfa872995835976c4fb8c2e7a0ed7887316d67d84fdb606fdd66e1df087b69a7da159eeceacbca087daa9dd64d
+pub_key=30819f300d06092a864886f70d010101050003818d0030818902818100d4b8bfa67cb35d8b28b66b13acbbf1d5f4350314c8a5eb7a0e4d916e16c45a4064d80aab092c024e7e67cbb97bbfc666da531f0cdcfe811e76d4df362d7c90cd778008057514219a05c5682234af138b16a328c63bbe1d1c195d180cda929e8c83e918e3222a5abeefdb67a9d2cd695ce75f13db25d69cee1bbe1f2fa7c456db0203010001
+
+key_type=DSA_PUB
+cert=3082035e3082031ba003020102020900ab11a571617c2fea300b06096086480165030403023067310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e67310c300a060355040b0c035226443111300f06035504030c086473612d63657274301e170d3136303732353133323634385a170d3137303732353133323634385a3067310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e67310c300a060355040b0c035226443111300f06035504030c086473612d63657274308201b63082012b06072a8648ce3804013082011e028181008b3db0a4020aba729a95041eea3e553fb877ff2405b555691e5cfe1485c255f9e430e51f38bedeb98b9c0d142271056d9257ce71a1f238778fc43ff998f096680a4e6b6af7f63181f6d556099099db122b580da6cf635dfb81b07dbb26b92455c121d870c76391ae14dba0e0204c886c5c5e041e791e85f0629565778a5efad3021500ca4486d9a4cecb6f44b24ac81966152465297ced0281807d49f8028aea30129e7d46938d8f025bdb1a195883d5da9b7b51a0be2007557b12b832749a619264a8146a307ca4cf01779f5dcec9746508a169758a4afdb14a4ab12db650ab6efc86bc3cdd56cdcf9e317cccf00f08a71aa1f939e8eb9113889094e5aebe2c591aeb245dfeb3722350bfda428061529e38b9b3b79796698aa9038184000281802b46474fd39b35bda34a9f7d2d8d286f49803bc8e59c185ef1266c3a5fb76337b161529855a270d8e8761cbc5d75db0d9b7f27d90f2a7183db5642e92716d9d1d6049ef9ef750ff35059a458b9dbf655026def7182e74ee25eb945ed5645503b1997bc29dea317666cfce498df8f379b46dbbe0ce05ec77d820454a08c26e1dca350304e301d0603551d0e041604143753c036240e63436295d829715b59752154e3bc301f0603551d230418301680143753c036240e63436295d829715b59752154e3bc300c0603551d13040530030101ff300b0609608648016503040302033000302d021425016102ab7f4a597c32aa6c79d56e33b0592034021500a24a4809e96553a5bf2674ab2ed4bb20dfdd56d6
+pub_key=308201b63082012b06072a8648ce3804013082011e028181008b3db0a4020aba729a95041eea3e553fb877ff2405b555691e5cfe1485c255f9e430e51f38bedeb98b9c0d142271056d9257ce71a1f238778fc43ff998f096680a4e6b6af7f63181f6d556099099db122b580da6cf635dfb81b07dbb26b92455c121d870c76391ae14dba0e0204c886c5c5e041e791e85f0629565778a5efad3021500ca4486d9a4cecb6f44b24ac81966152465297ced0281807d49f8028aea30129e7d46938d8f025bdb1a195883d5da9b7b51a0be2007557b12b832749a619264a8146a307ca4cf01779f5dcec9746508a169758a4afdb14a4ab12db650ab6efc86bc3cdd56cdcf9e317cccf00f08a71aa1f939e8eb9113889094e5aebe2c591aeb245dfeb3722350bfda428061529e38b9b3b79796698aa9038184000281802b46474fd39b35bda34a9f7d2d8d286f49803bc8e59c185ef1266c3a5fb76337b161529855a270d8e8761cbc5d75db0d9b7f27d90f2a7183db5642e92716d9d1d6049ef9ef750ff35059a458b9dbf655026def7182e74ee25eb945ed5645503b1997bc29dea317666cfce498df8f379b46dbbe0ce05ec77d820454a08c26e1dc
+
+key_type=EC_PUB
+cert=30820212308201b9a003020102020900c0f98b16a9a9ecce300a06082a8648ce3d0403023066310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e67310c300a060355040b0c035226443110300e06035504030c0765632d63657274301e170d3136303732353133333534305a170d3137303732353133333534305a3066310b300906035504061302504c3114301206035504080c0b4d617a6f776965636b6965310f300d06035504070c065761727361773110300e060355040a0c0753616d73756e67310c300a060355040b0c035226443110300e06035504030c0765632d636572743059301306072a8648ce3d020106082a8648ce3d03010703420004e62feaef9fa38a01e760b97a6cfcd8571be84a83d7b9179021432d430c13640328fec7462047dac81e3e92b9e99017944ddd7ae7cf85234f33ad87ce99c0f399a350304e301d0603551d0e041604146c15c9687c8d57ad3ea8d04f84f69a6c7935fddb301f0603551d230418301680146c15c9687c8d57ad3ea8d04f84f69a6c7935fddb300c0603551d13040530030101ff300a06082a8648ce3d040302034700304402203d914d672aa4212ce33875ead1a55bd722b95aa68356ba5d60e4946b7b9f7b5d0220464a47a2e50f9f0ba7870784b5ea19c9c812cde524bb5d5ab646fc27c215bbcf
+pub_key=3059301306072a8648ce3d020106082a8648ce3d03010703420004e62feaef9fa38a01e760b97a6cfcd8571be84a83d7b9179021432d430c13640328fec7462047dac81e3e92b9e99017944ddd7ae7cf85234f33ad87ce99c0f399
diff --git a/src/yaca/test-vectors/sign_ascii.txt b/src/yaca/test-vectors/sign_ascii.txt
new file mode 100644 (file)
index 0000000..f88da4b
--- /dev/null
@@ -0,0 +1,49 @@
+##################### RSA #####################
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=
+output=ae9ad1b6bf1beb19bff66a97e14573f392820d56dc6bd7ecfc9f95c296c556d1250f5ecb84e8a11c9200d15a1c8998ae2214a2897069da90fb355994570958a03cbe72a20055190330efbe062b75f086b6a6087e233188a3c9e042da4729141692583a27a0d9c1c5e262a93426c658a38217a93fdb579e4b07b42db527ec32e3
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=a
+output=131d083e6f355f50740ba80690bc62abc8061bc1e0330304be23862f5410f0034a700269c3026d7913b8021f361a9b80fe663e1acba00e80d53c0a04ec6a8da5d21cac839f7b23905e8414a2a0f3a2881eceaa9ff833d9e74221eb11a84a7e063626a69d714d06f4f642019cef2f6a90d002cbf6b80afd541a9b10569d1031df
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=message signature
+output=0b5e6e9e6679ea5a64bf5453aafd644351c8b93fb7558dbb85527ed9e37b26e9362d006f1dd306728bfe7c5b0f032b8c0ef539ba2578e7cc521d21e56c67cd2d14f1c23c6b27901581af379eba0621ae3619b56fde90175a49239e51fef011e0cd5816af05465b7238adbe42e9cd7b8107a266adfa06f6cdf124aa7a03f1b1e1
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=69993e483920296cc4b555681e36b3709b56671f5adf427a4e1e884b8dca95bd836af04b14b4f933bf466e616b932fb9eb0083f9059766b4f9e0aa9e623c828bd642c2632b2be5bfa9eabedd2f4497ad26a07c482a43e481745ba965276337c4066d33c9c1fed0c99c91937f01b0ce1e7368812d5c9d89ea62ea301c833f1081
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=20316dc8be3c7f33f85c7c39d4e36132e76f6caa717faaada7cfd0911c85d60fffbc755f356cd760073b6e865a12e0eb60c73b461400a1f18ac3ceece401a97624a5cb7901adc00f01269f93664ebb620fa59c2aef05eadac268ac051c2acb2ebea8fa1ddf5f2a258cabeeaa63a7a451ff6f69d6098fdeb2b763963ad67921ea
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=10
+input=repeat test
+output=1b95329c1d5ec811cde3de767d1c248227d7096c5572d2d077a30094e212f96e6b9d33cd7f5b1c5883815969f66dcb7470311a7e9d0fcfae13e45d26b2bd02c0c542d7ea5658d37968aac7d81c14d06a36a5199b7c7648b60b5ab2d76344047cf6d8533447db991d4c05e4260e8af0c21124554d4a7506272de6a6616e77feef
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1000
+input=qwerty
+output=1114f028cf35a5cfee025c7407ab6c849a336c529a50aa3785b9c8211f7ae972867925efb09babb5a3c0bbf687d2ced5cf6f41ea88720b0ddbd712d7dd13a235681c91816d75e0de42f8aed49fc781fdab5e2ea24bb91f1167ab5ccc724c4a4b7d324bf116689ad8410c4d82f2b024bdec4d8c16429472a3fc97a679610de072
diff --git a/src/yaca/test-vectors/sign_cmac_ascii.txt b/src/yaca/test-vectors/sign_cmac_ascii.txt
new file mode 100644 (file)
index 0000000..e49b01d
--- /dev/null
@@ -0,0 +1,85 @@
+##################### AES-128-CBC #####################
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=
+output=abc0b7b8d415716230c892c786a1b699
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=a
+output=fdb60985fef85ed01f259ab8aba3da43
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=message signature
+output=9c1879f350713722e786f5c67f26c429
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=ee6fa7733f6bd2c018bff1d76b455af8
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=f5915331a8710e6cc2911440fe538b47
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=10
+input=repeat test
+output=4a5925050bc4a391b5c5bf180eb8a691
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f4
+repeats=1000
+input=qwerty
+output=c9b541252628ac53ee27a36afa7a3e39
+
+##################### AES-256-CBC #####################
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=
+output=1743c3b9157af33aff0f36dca4ad2571
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=a
+output=ac53f9ab1d6fc5e998db9d53c783a64c
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=message signature
+output=bcda18e89f9c23af816c83534cf84f36
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=53e27292cde100e92f5d5c3418cc3c7b
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=2e96d8c1d77bb09dc53798bde48be0f4
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=10
+input=repeat test
+output=c37d4facd55eb645ad123dcf7d6e2143
+
+algo=AES
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1000
+input=qwerty
+output=2c82129dc0c274cd1563154b331d746a
diff --git a/src/yaca/test-vectors/sign_hmac_ascii.txt b/src/yaca/test-vectors/sign_hmac_ascii.txt
new file mode 100644 (file)
index 0000000..b8b1ff7
--- /dev/null
@@ -0,0 +1,85 @@
+##################### MD5 #####################
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=
+output=213cfe14aee97a6a0da820c74315b357
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=a
+output=208d870f6228ff283e6c7e4463adc618
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=message signature
+output=051e3bb9264e67fadfe18fef12a92449
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=1958335f446c0c6710a0b3c85a223c73
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=294ee23ddcc73a51578040e8af50f6eb
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=10
+input=repeat test
+output=19eac925eafe7d0eeb7d0076b5d4cee7
+
+algo=MD5
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1000
+input=qwerty
+output=f496aebea8a5a40157101ea1765f02f1
+
+##################### SHA256 #####################
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=
+output=5f897d6c00afcc234202776bc332fef4e25eb45e4d8337100d5a75afc8302f89
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=a
+output=6144b106f94dfc8673e9ab9b0d10194f7ba4cd8e325047010e6ac6f584ecc0f3
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=message signature
+output=e3f20825b0a34b36618ed456de3a188be597fff26ff733028676a4502d19ea22
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+output=3a0d6e608b56ee234c77b1f380a23ea4b18e8fec1f78979a9f380c3dcd851307
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+output=8da6e59304b054ee143b480058e106be9a9b201504a0408416642d26597cb88f
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=10
+input=repeat test
+output=d66a2e3f327b376083ff91cb36a0df157e568f666d72a29f360d255ad19a343c
+
+algo=SHA256
+key=d1f08ace3c3fd32afb786d3da9aa43f40fc8b770b14ba475a658e98fd28f413b
+repeats=1000
+input=qwerty
+output=e4dbbd5f5c606f3fcec5dca5f5b22557dc46a8aad9a0a2c2c11668989001466e
diff --git a/src/yaca/test-vectors/sign_verify_ascii.txt b/src/yaca/test-vectors/sign_verify_ascii.txt
new file mode 100644 (file)
index 0000000..c87a358
--- /dev/null
@@ -0,0 +1,128 @@
+##################### RSA #####################
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=a
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=message signature
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=10
+input=repeat test
+
+algo=SHA256
+key_type=RSA_PRIV
+key=3082025d02010002818100b8e7b2cfb6263ab59563b2468d7a912695585fb91e61ed72e65167821572d36fc8c213339660e205b5a02f1f1c9f5adb0a5f0ba11f6b4f1ac6e6a7e3a0b0f322345811d062edfac670413cdf84541086d135d67442c0f8007d021f501fdd7b58f672f43a607e1aa2e4dbdec1b85924c075465fd48975ff1cb3c70a62eb21d859020301000102818023325f94304d08a1e604eb3b88d4caea7845313b70b01d5de0bfa01f5febd29995b273ab3f35c3f068494c8ef488d4e79b0aca90ea052832a5a7e44f6d1821bf8f3786fc31fa62c4b94bf459c1d2cf9959950a9a62cf84f175ebc38f5744ba7abd63b74c1f3a2b336b9a6aac44f140a4224b8bd92f85c1bd15aadb609fc6f3cd024100dc0030b906977e4fe63c5cea11bfaf3c6c674b8fb97b6d6221b6abfc37dec2c93bb011cd5d59943f8b351f052f75dfbef695ca25ee1e7ee50c8984af91467b2b024100d7295a9a1f1c94bcb84271f8cf386fe5f5c7aa08ee9b434ef166cb90eb3723722951bce56b42ae9e25a2450c2f4d7eb93dd98ff1111cfd70a7040aba87bae88b02400a44cc0166e85d51f76a2be015120068ee9a67b17eb3df282c70ad586977315a5939dfaad9479c1ed72d94941662071e8fbdf020931bc34a87aa47923652b6df02410096041155b0277f54edabf64722441950dec2edbcf8906ca7980cb21642c9d8fef9ec31a64bd8dc630b9e4e4226a103a0288d8e9ce7efac8d65059e6d5bc167ed024100da8ca5833e81132808890eb9cd6bbc6cd9b35f25cdc78dbe9e42ee463f8d115a0d6c086bb4fe489a343e7bc72ceb56532667a734477794913437b2d002f7e128
+repeats=1000
+input=qwerty
+
+##################### DSA #####################
+algo=SHA256
+key_type=DSA_PRIV
+key=308201ba020100028181009b4519b665efa283f28ba19c2f0ca5ad259bda158f00c39305229300a2e5814dc76dfb95482bde5f6574fc1d758987b7f29ed7236a71bbda90fcac4ed5c540706ec2d695169342f26de74c90e9aac0bf7c4c601eaf06bca7e6bcc24eb5a42b60c6dab3bce107315b94262657f4287944bd2cdc89312498c56e483a8e796cca9d02150091db8be34ba49bbf8443e6dfa613e0b17e600c41028180607f07a27d3a0807ebf7b6640912a4dfe3214410225d79ba2f29672a488a5c5dcbb79f503b7f18108cb6b8d9b325951d2202226167cb1c2725e2955382b37cda08e226c1b65d60095dfc6f27f522b6775f918453af0f5880fb039b3026ea03f1903100414f275d0d3715dd638882b46e9e8d6f56241bb4496a15495b09e2df270281807308fad131e8cba343c1fc613b24f84ae0a9944cdeca1663de971f74f9fdef6de937e2dfdc3ca9587cec2c6835922724b4c5c1e501c5b0764d73a81bcae80a572d0aa58ca27d23651b54c2ad8aeebaa8452334f1496257ca72401ed0d60c838a8004f361da105d81e91814231ea21db7a5f4a8d8c82863859329a151eba5b9a6021463d8c7c434d7dfa8092ad29f137f5a32f527ee3c
+repeats=1
+input=
+
+algo=SHA256
+key_type=DSA_PRIV
+key=308201ba020100028181009b4519b665efa283f28ba19c2f0ca5ad259bda158f00c39305229300a2e5814dc76dfb95482bde5f6574fc1d758987b7f29ed7236a71bbda90fcac4ed5c540706ec2d695169342f26de74c90e9aac0bf7c4c601eaf06bca7e6bcc24eb5a42b60c6dab3bce107315b94262657f4287944bd2cdc89312498c56e483a8e796cca9d02150091db8be34ba49bbf8443e6dfa613e0b17e600c41028180607f07a27d3a0807ebf7b6640912a4dfe3214410225d79ba2f29672a488a5c5dcbb79f503b7f18108cb6b8d9b325951d2202226167cb1c2725e2955382b37cda08e226c1b65d60095dfc6f27f522b6775f918453af0f5880fb039b3026ea03f1903100414f275d0d3715dd638882b46e9e8d6f56241bb4496a15495b09e2df270281807308fad131e8cba343c1fc613b24f84ae0a9944cdeca1663de971f74f9fdef6de937e2dfdc3ca9587cec2c6835922724b4c5c1e501c5b0764d73a81bcae80a572d0aa58ca27d23651b54c2ad8aeebaa8452334f1496257ca72401ed0d60c838a8004f361da105d81e91814231ea21db7a5f4a8d8c82863859329a151eba5b9a6021463d8c7c434d7dfa8092ad29f137f5a32f527ee3c
+repeats=1
+input=a
+
+algo=SHA256
+key_type=DSA_PRIV
+key=308201ba020100028181009b4519b665efa283f28ba19c2f0ca5ad259bda158f00c39305229300a2e5814dc76dfb95482bde5f6574fc1d758987b7f29ed7236a71bbda90fcac4ed5c540706ec2d695169342f26de74c90e9aac0bf7c4c601eaf06bca7e6bcc24eb5a42b60c6dab3bce107315b94262657f4287944bd2cdc89312498c56e483a8e796cca9d02150091db8be34ba49bbf8443e6dfa613e0b17e600c41028180607f07a27d3a0807ebf7b6640912a4dfe3214410225d79ba2f29672a488a5c5dcbb79f503b7f18108cb6b8d9b325951d2202226167cb1c2725e2955382b37cda08e226c1b65d60095dfc6f27f522b6775f918453af0f5880fb039b3026ea03f1903100414f275d0d3715dd638882b46e9e8d6f56241bb4496a15495b09e2df270281807308fad131e8cba343c1fc613b24f84ae0a9944cdeca1663de971f74f9fdef6de937e2dfdc3ca9587cec2c6835922724b4c5c1e501c5b0764d73a81bcae80a572d0aa58ca27d23651b54c2ad8aeebaa8452334f1496257ca72401ed0d60c838a8004f361da105d81e91814231ea21db7a5f4a8d8c82863859329a151eba5b9a6021463d8c7c434d7dfa8092ad29f137f5a32f527ee3c
+repeats=1
+input=message signature
+
+algo=SHA256
+key_type=DSA_PRIV
+key=308201ba020100028181009b4519b665efa283f28ba19c2f0ca5ad259bda158f00c39305229300a2e5814dc76dfb95482bde5f6574fc1d758987b7f29ed7236a71bbda90fcac4ed5c540706ec2d695169342f26de74c90e9aac0bf7c4c601eaf06bca7e6bcc24eb5a42b60c6dab3bce107315b94262657f4287944bd2cdc89312498c56e483a8e796cca9d02150091db8be34ba49bbf8443e6dfa613e0b17e600c41028180607f07a27d3a0807ebf7b6640912a4dfe3214410225d79ba2f29672a488a5c5dcbb79f503b7f18108cb6b8d9b325951d2202226167cb1c2725e2955382b37cda08e226c1b65d60095dfc6f27f522b6775f918453af0f5880fb039b3026ea03f1903100414f275d0d3715dd638882b46e9e8d6f56241bb4496a15495b09e2df270281807308fad131e8cba343c1fc613b24f84ae0a9944cdeca1663de971f74f9fdef6de937e2dfdc3ca9587cec2c6835922724b4c5c1e501c5b0764d73a81bcae80a572d0aa58ca27d23651b54c2ad8aeebaa8452334f1496257ca72401ed0d60c838a8004f361da105d81e91814231ea21db7a5f4a8d8c82863859329a151eba5b9a6021463d8c7c434d7dfa8092ad29f137f5a32f527ee3c
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+
+algo=SHA256
+key_type=DSA_PRIV
+key=308201ba020100028181009b4519b665efa283f28ba19c2f0ca5ad259bda158f00c39305229300a2e5814dc76dfb95482bde5f6574fc1d758987b7f29ed7236a71bbda90fcac4ed5c540706ec2d695169342f26de74c90e9aac0bf7c4c601eaf06bca7e6bcc24eb5a42b60c6dab3bce107315b94262657f4287944bd2cdc89312498c56e483a8e796cca9d02150091db8be34ba49bbf8443e6dfa613e0b17e600c41028180607f07a27d3a0807ebf7b6640912a4dfe3214410225d79ba2f29672a488a5c5dcbb79f503b7f18108cb6b8d9b325951d2202226167cb1c2725e2955382b37cda08e226c1b65d60095dfc6f27f522b6775f918453af0f5880fb039b3026ea03f1903100414f275d0d3715dd638882b46e9e8d6f56241bb4496a15495b09e2df270281807308fad131e8cba343c1fc613b24f84ae0a9944cdeca1663de971f74f9fdef6de937e2dfdc3ca9587cec2c6835922724b4c5c1e501c5b0764d73a81bcae80a572d0aa58ca27d23651b54c2ad8aeebaa8452334f1496257ca72401ed0d60c838a8004f361da105d81e91814231ea21db7a5f4a8d8c82863859329a151eba5b9a6021463d8c7c434d7dfa8092ad29f137f5a32f527ee3c
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+
+algo=SHA256
+key_type=DSA_PRIV
+key=308201ba020100028181009b4519b665efa283f28ba19c2f0ca5ad259bda158f00c39305229300a2e5814dc76dfb95482bde5f6574fc1d758987b7f29ed7236a71bbda90fcac4ed5c540706ec2d695169342f26de74c90e9aac0bf7c4c601eaf06bca7e6bcc24eb5a42b60c6dab3bce107315b94262657f4287944bd2cdc89312498c56e483a8e796cca9d02150091db8be34ba49bbf8443e6dfa613e0b17e600c41028180607f07a27d3a0807ebf7b6640912a4dfe3214410225d79ba2f29672a488a5c5dcbb79f503b7f18108cb6b8d9b325951d2202226167cb1c2725e2955382b37cda08e226c1b65d60095dfc6f27f522b6775f918453af0f5880fb039b3026ea03f1903100414f275d0d3715dd638882b46e9e8d6f56241bb4496a15495b09e2df270281807308fad131e8cba343c1fc613b24f84ae0a9944cdeca1663de971f74f9fdef6de937e2dfdc3ca9587cec2c6835922724b4c5c1e501c5b0764d73a81bcae80a572d0aa58ca27d23651b54c2ad8aeebaa8452334f1496257ca72401ed0d60c838a8004f361da105d81e91814231ea21db7a5f4a8d8c82863859329a151eba5b9a6021463d8c7c434d7dfa8092ad29f137f5a32f527ee3c
+repeats=10
+input=repeat test
+
+algo=SHA256
+key_type=DSA_PRIV
+key=308201ba020100028181009b4519b665efa283f28ba19c2f0ca5ad259bda158f00c39305229300a2e5814dc76dfb95482bde5f6574fc1d758987b7f29ed7236a71bbda90fcac4ed5c540706ec2d695169342f26de74c90e9aac0bf7c4c601eaf06bca7e6bcc24eb5a42b60c6dab3bce107315b94262657f4287944bd2cdc89312498c56e483a8e796cca9d02150091db8be34ba49bbf8443e6dfa613e0b17e600c41028180607f07a27d3a0807ebf7b6640912a4dfe3214410225d79ba2f29672a488a5c5dcbb79f503b7f18108cb6b8d9b325951d2202226167cb1c2725e2955382b37cda08e226c1b65d60095dfc6f27f522b6775f918453af0f5880fb039b3026ea03f1903100414f275d0d3715dd638882b46e9e8d6f56241bb4496a15495b09e2df270281807308fad131e8cba343c1fc613b24f84ae0a9944cdeca1663de971f74f9fdef6de937e2dfdc3ca9587cec2c6835922724b4c5c1e501c5b0764d73a81bcae80a572d0aa58ca27d23651b54c2ad8aeebaa8452334f1496257ca72401ed0d60c838a8004f361da105d81e91814231ea21db7a5f4a8d8c82863859329a151eba5b9a6021463d8c7c434d7dfa8092ad29f137f5a32f527ee3c
+repeats=1000
+input=qwerty
+
+##################### EC #####################
+algo=SHA256
+key_type=EC_PRIV
+key=3081dc0201010442017bec27e058e045f040c330e1be3916d1fec5039efca5193cdafdda125479709d061407db3eb2d12f52dc559b6b27436e730433c6da998900d97fcfc432820ed042a00706052b81040023a181890381860004000e26c0e0a522a9797d312f99823d458924c1c1d75898d2dabb900b25bc8f8931618a7b97d44f5a9e7a1b1acd1415f10a002898d30e2f302f77b28c0493b0d84f8b0012337623bd08f5245ec1a8b5bade96d1cd751f4e47740f87f4c7f625b7ccf0961e30ee7aa8fa9b24705437d00ce13f0a22c1dec851c9b602b3bb16160426fe565a
+repeats=1
+input=
+
+algo=SHA256
+key_type=EC_PRIV
+key=3081dc0201010442017bec27e058e045f040c330e1be3916d1fec5039efca5193cdafdda125479709d061407db3eb2d12f52dc559b6b27436e730433c6da998900d97fcfc432820ed042a00706052b81040023a181890381860004000e26c0e0a522a9797d312f99823d458924c1c1d75898d2dabb900b25bc8f8931618a7b97d44f5a9e7a1b1acd1415f10a002898d30e2f302f77b28c0493b0d84f8b0012337623bd08f5245ec1a8b5bade96d1cd751f4e47740f87f4c7f625b7ccf0961e30ee7aa8fa9b24705437d00ce13f0a22c1dec851c9b602b3bb16160426fe565a
+repeats=1
+input=a
+
+algo=SHA256
+key_type=EC_PRIV
+key=3081dc0201010442017bec27e058e045f040c330e1be3916d1fec5039efca5193cdafdda125479709d061407db3eb2d12f52dc559b6b27436e730433c6da998900d97fcfc432820ed042a00706052b81040023a181890381860004000e26c0e0a522a9797d312f99823d458924c1c1d75898d2dabb900b25bc8f8931618a7b97d44f5a9e7a1b1acd1415f10a002898d30e2f302f77b28c0493b0d84f8b0012337623bd08f5245ec1a8b5bade96d1cd751f4e47740f87f4c7f625b7ccf0961e30ee7aa8fa9b24705437d00ce13f0a22c1dec851c9b602b3bb16160426fe565a
+repeats=1
+input=message signature
+
+algo=SHA256
+key_type=EC_PRIV
+key=3081dc0201010442017bec27e058e045f040c330e1be3916d1fec5039efca5193cdafdda125479709d061407db3eb2d12f52dc559b6b27436e730433c6da998900d97fcfc432820ed042a00706052b81040023a181890381860004000e26c0e0a522a9797d312f99823d458924c1c1d75898d2dabb900b25bc8f8931618a7b97d44f5a9e7a1b1acd1415f10a002898d30e2f302f77b28c0493b0d84f8b0012337623bd08f5245ec1a8b5bade96d1cd751f4e47740f87f4c7f625b7ccf0961e30ee7aa8fa9b24705437d00ce13f0a22c1dec851c9b602b3bb16160426fe565a
+repeats=1
+input=qwertyuiopasdfghjklzxcvbnm
+
+algo=SHA256
+key_type=EC_PRIV
+key=3081dc0201010442017bec27e058e045f040c330e1be3916d1fec5039efca5193cdafdda125479709d061407db3eb2d12f52dc559b6b27436e730433c6da998900d97fcfc432820ed042a00706052b81040023a181890381860004000e26c0e0a522a9797d312f99823d458924c1c1d75898d2dabb900b25bc8f8931618a7b97d44f5a9e7a1b1acd1415f10a002898d30e2f302f77b28c0493b0d84f8b0012337623bd08f5245ec1a8b5bade96d1cd751f4e47740f87f4c7f625b7ccf0961e30ee7aa8fa9b24705437d00ce13f0a22c1dec851c9b602b3bb16160426fe565a
+repeats=1
+input=1234567890qwertyuiop !@#$%^&*() POIUYTREWQ
+
+algo=SHA256
+key_type=EC_PRIV
+key=3081dc0201010442017bec27e058e045f040c330e1be3916d1fec5039efca5193cdafdda125479709d061407db3eb2d12f52dc559b6b27436e730433c6da998900d97fcfc432820ed042a00706052b81040023a181890381860004000e26c0e0a522a9797d312f99823d458924c1c1d75898d2dabb900b25bc8f8931618a7b97d44f5a9e7a1b1acd1415f10a002898d30e2f302f77b28c0493b0d84f8b0012337623bd08f5245ec1a8b5bade96d1cd751f4e47740f87f4c7f625b7ccf0961e30ee7aa8fa9b24705437d00ce13f0a22c1dec851c9b602b3bb16160426fe565a
+repeats=10
+input=repeat test
+
+algo=SHA256
+key_type=EC_PRIV
+key=3081dc0201010442017bec27e058e045f040c330e1be3916d1fec5039efca5193cdafdda125479709d061407db3eb2d12f52dc559b6b27436e730433c6da998900d97fcfc432820ed042a00706052b81040023a181890381860004000e26c0e0a522a9797d312f99823d458924c1c1d75898d2dabb900b25bc8f8931618a7b97d44f5a9e7a1b1acd1415f10a002898d30e2f302f77b28c0493b0d84f8b0012337623bd08f5245ec1a8b5bade96d1cd751f4e47740f87f4c7f625b7ccf0961e30ee7aa8fa9b24705437d00ce13f0a22c1dec851c9b602b3bb16160426fe565a
+repeats=1000
+input=qwerty
diff --git a/src/yaca/tools/containers.py b/src/yaca/tools/containers.py
new file mode 100644 (file)
index 0000000..1100f16
--- /dev/null
@@ -0,0 +1,181 @@
+import string
+import subprocess
+from collections import OrderedDict
+import copy
+
+bcm_list = ['NONE', 'ECB', 'CTR', 'CBC', 'GCM',
+            'CFB', 'CFB1', 'CFB8','OFB', 'CCM', 'WRAP']
+
+key_length_list = [8, 40, 64, 80, 128,
+                   192, 256, 512, 1024, 2048, 4096,]
+
+iv_length_list = [0, 56, 64, 96, 104, 128, 256]
+
+tag_len_list = range(3, 18 + 1, 1)
+
+openssl_cmd_params = [
+                    "-aes-128-ecb",
+                    "-aes-192-ecb",
+                    "-aes-256-ecb",
+                    "-aes-128-ctr",
+                    "-aes-192-ctr",
+                    "-aes-256-ctr",
+                    "-aes-128-cbc",
+                    "-aes-192-cbc",
+                    "-aes-256-cbc",
+                    # command-line GCM doesn't work
+                    "-aes-128-cfb",
+                    "-aes-192-cfb",
+                    "-aes-256-cfb",
+                    "-aes-128-cfb1",
+                    "-aes-192-cfb1",
+                    "-aes-256-cfb1",
+                    "-aes-128-cfb8",
+                    "-aes-192-cfb8",
+                    "-aes-256-cfb8",
+                    "-aes-128-ofb",
+                    "-aes-192-ofb",
+                    "-aes-256-ofb",
+                    # command line CCM doesn't work
+                    "-des-ecb",
+                    "-des-cbc",
+                    "-des-cfb",
+                    "-des-cfb1",
+                    "-des-cfb8",
+                    "-des-ofb",
+                    "-des-ede", #ECB
+                    "-des-ede-cbc",
+                    "-des-ede-cfb",
+                    "-des-ede-ofb",
+                    "-des-ede3",
+                    "-des-ede3-cbc",
+                    "-des-ede3-cfb",
+                    #"-des-ede3-cfb1", OpenSSL Bug
+                    "-des-ede3-cfb8",
+                    "-des-ede3-ofb",
+                    #"-rc2-ecb",
+                    #"-rc2-cbc",
+                    #"-rc2-cfb",
+                    #"-rc2-ofb",
+                    #"-rc4",
+                    #"-cast5-cbc",
+                    #"-cast5-cfb",
+                    #"-cast5-ecb",
+                    #"-cast5-ofb",
+                    #cast-5, rc2 and rc4 algorithms take 128bit keys every time.
+                    #even if user use shorter, it is padded with zeros to 128.
+                    #When using openssl commandline tool to encrypt random data,
+                    #128bits from command are taken as iv arg
+                    #which may lead to different encryption result
+                  ]
+key = '534c1dd926ffc55db2a1ec2f8d21ed4ac3b9ad3d67a0ae381275f00cc0f7d3fd' #256
+
+iv = 'd17d7ace9acea556527b1037ee3aa824' #128
+
+def default_iv_len(algo, bcm):
+    if bcm == 'ECB' or bcm == 'NONE' or (algo == '3DES_3TDEA' and bcm == 'WRAP'):
+        iv_len = 0
+    elif algo == 'AES' and bcm != 'CCM' and bcm != 'WRAP':
+        iv_len = 128
+    else:
+        iv_len = 64
+
+    return iv_len
+
+class Algorithm:
+    def __init__(self, key_len_list):
+        self.key_len_list = key_len_list
+        self.bcm_list = []
+
+    def set_valid_key_len(self, key_len_list):
+        self.key_len_list = key_len_list
+
+    def set_bcm(self, bcm_list):
+        self.bcm_list = bcm_list
+
+class Bcm:
+    def __init__(self, iv_len_list, tag_len_list = None):
+        self.iv_len_list = iv_len_list
+        if tag_len_list != None:
+            self.tag_len_list = tag_len_list
+        else:
+            tag_len_list = []
+
+    def set_valid_iv_len(self, iv_len_list):
+        self.iv_len_list = iv_len_list
+
+
+aes = Algorithm([128, 192, 256])
+aes.set_bcm(OrderedDict([
+                        ('CBC',  Bcm([128])),
+                        ('OFB',  Bcm([128])),
+                        ('CFB',  Bcm([128])),
+                        ('CFB1', Bcm([128])),
+                        ('CFB8', Bcm([128])),
+                        ('ECB',  Bcm([0])),
+                        ('GCM',  Bcm(range(24, 256 + 8, 8), [4, 8, 12, 13, 14, 15, 16])),
+                        ('CCM',  Bcm(range(56, 104 + 8, 8), range(4, 16 + 2, 2))),
+                        ('CTR',  Bcm([128])),
+                        ('WRAP', Bcm([64])),
+                        ]))
+des = Algorithm([64])
+des.set_bcm(OrderedDict([
+                        ('CBC',  Bcm([64])),
+                        ('OFB',  Bcm([64])),
+                        ('CFB',  Bcm([64])),
+                        ('CFB1', Bcm([64])),
+                        ('CFB8', Bcm([64])),
+                        ('ECB',  Bcm([0])),
+                        ]))
+
+t_des_2 = Algorithm([128])
+t_des_2.set_bcm(OrderedDict([
+                            ('CBC', Bcm([64])),
+                            ('OFB', Bcm([64])),
+                            ('CFB', Bcm([64])),
+                            ('ECB', Bcm([0])),
+                            ]))
+
+t_des_3 = Algorithm([192])
+t_des_3.set_bcm(OrderedDict([
+                            ('CBC',  Bcm([64])),
+                            ('OFB',  Bcm([64])),
+                            ('CFB',  Bcm([64])),
+                            ('CFB1', Bcm([64])),
+                            ('CFB8', Bcm([64])),
+                            ('ECB',  Bcm([0])),
+                            ('WRAP', Bcm([0])),
+                            ]))
+
+rc2 = Algorithm(range(8, 1024 + 8, 8))
+rc2.set_bcm(OrderedDict([
+                        ('CBC', Bcm([64])),
+                        ('OFB', Bcm([64])),
+                        ('CFB', Bcm([64])),
+                        ('ECB', Bcm([0])),
+                        ]))
+
+rc4 = Algorithm(range(40, 2048 + 8, 8))
+rc4.set_bcm(OrderedDict([
+                        ('NONE', Bcm([0])),
+                        ]))
+
+cast5 = Algorithm(range(40, 128 + 8, 8))
+cast5.set_bcm(OrderedDict([
+                          ('CBC', Bcm([64])),
+                          ('OFB', Bcm([64])),
+                          ('CFB', Bcm([64])),
+                          ('ECB', Bcm([0])),
+                          ]))
+
+valid_database = OrderedDict([
+                             ('AES',        aes),
+                             ('DES',        des),
+                             ('3DES_2TDEA', t_des_2),
+                             ('3DES_3TDEA', t_des_3),
+                             ('RC2',        rc2),
+                             ('RC4',        rc4),
+                             ('CAST5',      cast5)
+                             ])
+
+separator = '##################'
diff --git a/src/yaca/tools/encrypt_output_comparison.py b/src/yaca/tools/encrypt_output_comparison.py
new file mode 100755 (executable)
index 0000000..913bf59
--- /dev/null
@@ -0,0 +1,138 @@
+#!/usr/bin/python
+import os
+import subprocess
+import containers
+from encrypt_param_combinations import add_description
+
+def openssl_to_yaca_params(openssl_param):
+    bcm = None
+    algo = None
+    des_case = False
+    for i in containers.valid_database:
+        if openssl_param.find(i.lower()) != -1:
+            if openssl_param.find('des-ede3') != -1:
+                algo = '3DES_3TDEA'
+                des_case = True
+                break
+            elif openssl_param.find('des-ede') != -1:
+                algo = '3DES_2TDEA'
+                des_case = True
+                break
+            else:
+                algo = i
+                break
+
+    for i in containers.bcm_list:
+        if openssl_param.find(i.lower()) != -1:
+            bcm = i
+
+    if bcm == None:
+        if des_case == True:
+            bcm = 'ECB'
+        else:
+            bcm = 'NONE'
+
+    return tuple((algo, bcm))
+
+def encrypt_output_comp(out_file, DEVNULL):
+    """
+    function generates sets of random openssl_inputs with different encrypt algorithm params
+    and openssl commmand line results
+    """
+    to_hex_com = 'od -A n -t x1'
+
+    for it in containers.openssl_cmd_params:
+        openssl_input = "abcdefghijklmnoprstuvwxyz0123456789ABCDEFGHIJKLMNOPRSTUVWXYZ"
+        add_description(out_file, it[1:])
+        echo_process = subprocess.Popen("echo -n '" + openssl_input + "'", shell=True, \
+                                        stdout=subprocess.PIPE, stderr = DEVNULL)
+        bin2hex_conv_process = subprocess.Popen(to_hex_com, shell=True, stdin=echo_process.stdout,\
+                                                stdout=subprocess.PIPE, stderr=DEVNULL)
+        echo_process.stdout.close()
+        openssl_input_to_write = bin2hex_conv_process.communicate()[0]
+        openssl_input_to_write = ''.join(openssl_input_to_write.split())
+        for x in range(0, 3):
+            command = 'openssl enc ' + it + ' -nosalt' #-nopad for future tests
+            if x == 0:
+                out_file.write("input=" + os.linesep)
+            else:
+                out_file.write("input=" + openssl_input_to_write + os.linesep)
+
+            algo_bcm = openssl_to_yaca_params(it)
+            algo_obj = containers.valid_database[algo_bcm[0]]
+            bcm_obj  = algo_obj.bcm_list[algo_bcm[1]]
+
+            out_file.write("algo=" + algo_bcm[0] + os.linesep)
+            out_file.write("bcm=" + algo_bcm[1] + os.linesep)
+
+            if it.find('128') != -1:
+                key_len = 128
+            elif it.find('256') != -1:
+                key_len = 256
+            elif it.find('192') != -1:
+                key_len = 192
+            elif len(algo_obj.key_len_list) > 1:
+                if x == 1:
+                   key_len = algo_obj.key_len_list[len(algo_obj.key_len_list)/2]
+                elif x == 2:
+                   key_len = algo_obj.key_len_list[-1]
+            else:
+                key_len = algo_obj.key_len_list[0]
+
+            key = containers.key[:key_len/4]
+            out_file.write("key="+ key + os.linesep)
+
+            iv =''
+            iv_len = bcm_obj.iv_len_list[0]
+            iv = containers.iv[:iv_len/4]
+            out_file.write("iv=" + iv + os.linesep)
+
+            repeated_openssl_input = ''
+            if x == 0:
+                repeat_num = 1
+            elif x == 1:
+                repeat_num = 3
+            else:
+                repeat_num = 5
+
+            out_file.write("repeats=" + str(repeat_num) + os.linesep)
+
+            if repeat_num != 1:
+                """
+                "repeats" is the number of calls to yaca_*_update but it has to be > 0.
+                No input means update is not called.
+                So instead of setting repeats=0 and non-empty input
+                we set repeats=1 and input=""
+                """
+                repeated_openssl_input = openssl_input * repeat_num;
+
+            echo_process = subprocess.Popen("echo -n " + repeated_openssl_input, shell=True, \
+                                            stdout=subprocess.PIPE, stderr=DEVNULL)
+            if iv_len == 0:
+                openssl_cmd_process = subprocess.Popen(command + " -K " + key, shell=True, \
+                                                       stdin=echo_process.stdout, \
+                                                       stdout=subprocess.PIPE, stderr=DEVNULL)
+            else:
+                openssl_cmd_process = subprocess.Popen(command + " -K " + key + " -iv " + iv, \
+                                                       shell=True, stdin=echo_process.stdout, \
+                                                       stdout=subprocess.PIPE, stderr=DEVNULL)
+            echo_process.stdout.close()
+            bin2hex_conv_process = subprocess.Popen(to_hex_com, shell=True, \
+                                                    stdin=openssl_cmd_process.stdout, \
+                                                    stdout=subprocess.PIPE, stderr = DEVNULL)
+            openssl_cmd_process.stdout.close()
+            output = bin2hex_conv_process.communicate()[0]
+            output = ''.join(output.split())
+            out_file.write("output=" + output + os.linesep)
+            out_file.write(os.linesep)
+
+def main():
+   f_name = 'encrypt_output_comparison.txt'
+   out_file = open(f_name, 'w')
+   DEVNULL = open(os.devnull, 'w')
+   encrypt_output_comp(out_file, DEVNULL)
+   out_file.close()
+   DEVNULL.close()
+
+if __name__ == '__main__':
+    main()
diff --git a/src/yaca/tools/encrypt_param_combinations.py b/src/yaca/tools/encrypt_param_combinations.py
new file mode 100755 (executable)
index 0000000..228bd93
--- /dev/null
@@ -0,0 +1,119 @@
+#!/usr/bin/python
+import containers
+import os
+
+def add_description(out_file, string):
+    out_file.write(containers.separator + ' ' + string + ' ' + containers.separator +\
+                   os.linesep + os.linesep)
+
+def write_set(algo_name, bcm, key_len, iv_len, out_file, valid = None, tag_len = None):
+    out_file.write('algo=' + algo_name + os.linesep)
+    out_file.write('bcm=' + bcm + os.linesep)
+    out_file.write('key_len=' + str(key_len) + os.linesep)
+    out_file.write('iv_len=' + str(iv_len) + os.linesep)
+    if tag_len != None:
+        out_file.write('tag_len=' + str(tag_len) + os.linesep)
+    if valid != None:
+        out_file.write('valid=' + valid + os.linesep)
+    out_file.write(os.linesep)
+
+def check_bcm_for_algo(out_file):
+    add_description(out_file, 'check bcm for algorithm')
+
+    for algo_name, algo in containers.valid_database.iteritems():
+        add_description(out_file, algo_name)
+        for bcm_name in containers.bcm_list:
+            key_len = algo.key_len_list[0]
+            """
+            iv_len must be set 'manually' because it depends on algorithm and bcm
+            If we have inaproppriate combination, is there another way to set it?
+            """
+            iv_len = containers.default_iv_len(algo_name, bcm_name)
+            valid = str(int(bcm_name in algo.bcm_list.iterkeys()))
+
+            write_set(algo_name, bcm_name, key_len, iv_len, out_file, valid)
+
+def check_key_len_for_algo(out_file):
+    add_description(out_file, 'check key_len for algorithm')
+    """
+    Initialization Vector length is constant in this test,
+    because in all cases bcm: ECB or NONE is used
+    """
+    iv_len = 0
+
+    for algo_name, algo in containers.valid_database.iteritems():
+        add_description(out_file, algo_name)
+        for key_len in containers.key_length_list:
+            bcm = filter(lambda x: x == 'ECB' or x == 'NONE', algo.bcm_list)[0]
+            valid = str(int(key_len in algo.key_len_list))
+            write_set(algo_name, bcm, key_len, iv_len, out_file, valid)
+
+def check_iv_len_for_algo_bcm(out_file):
+    add_description(out_file, 'check iv_len for algorithm and bcm')
+
+    for algo_name, algo in containers.valid_database.iteritems():
+        add_description(out_file, algo_name)
+        for bcm_name, bcm in algo.bcm_list.iteritems():
+            for iv_len in containers.iv_length_list:
+                key_len = algo.key_len_list[0]
+                valid = str(int(iv_len in bcm.iv_len_list))
+                write_set(algo_name, bcm_name, key_len, iv_len, out_file, valid)
+
+def generate_valid_combs_only(out_file, bcm_list):
+    add_description(out_file, 'Proper sets for encrypt-decrypt comparison')
+
+    for algo_name, algo in containers.valid_database.iteritems():
+        add_description(out_file, algo_name)
+        for bcm in set(algo.bcm_list).intersection(set(bcm_list)):
+            for key_len in set(algo.key_len_list).intersection(set(containers.key_length_list)):
+                for iv_len in set(algo.bcm_list[bcm].iv_len_list).intersection(\
+                set(containers.iv_length_list)):
+                    write_set(algo_name, bcm, key_len, iv_len, out_file)
+
+def generate_combs(out_file):
+    check_bcm_for_algo(out_file)
+    check_key_len_for_algo(out_file)
+    check_iv_len_for_algo_bcm(out_file)
+
+def generate_tag_len_comb_for_algo_bcm(out_file, algo_name, bcm_name):
+    add_description(out_file, 'Check tag_len for algo and bcm')
+    algo = containers.valid_database[algo_name]
+    bcm = algo.bcm_list[bcm_name]
+    key_len = algo.key_len_list[0]
+
+    add_description(out_file, algo_name)
+    add_description(out_file, bcm_name)
+    iv_len = containers.default_iv_len(algo, bcm)
+    for tag_len in containers.tag_len_list:
+        valid = str(int(tag_len in bcm.tag_len_list))
+        write_set(algo_name, bcm_name, key_len, iv_len, out_file, valid, tag_len)
+
+def generate_combs(out_file):
+    check_bcm_for_algo(out_file)
+    check_key_len_for_algo(out_file)
+    check_iv_len_for_algo_bcm(out_file)
+
+def main():
+    file_name = 'encrypt_param_comb.txt'
+    out_file = open(file_name, 'w')
+    generate_combs(out_file)
+    out_file.close()
+
+    file_name = 'encrypt_valid_param.txt'
+    out_file = open(file_name, 'w')
+    exclude_gcm_ccm_wrap = filter(lambda x: x != 'GCM' and x != 'CCM' and x != 'WRAP', containers.bcm_list)
+    generate_valid_combs_only(out_file, exclude_gcm_ccm_wrap)
+    out_file.close()
+
+    file_name = 'encrypt_aes_gcm_tag_len.txt'
+    out_file = open(file_name, 'w')
+    generate_tag_len_comb_for_algo_bcm(out_file, 'AES', 'GCM')
+    out_file.close()
+
+    file_name = 'encrypt_aes_ccm_tag_len.txt'
+    out_file = open(file_name, 'w')
+    generate_tag_len_comb_for_algo_bcm(out_file, 'AES', 'CCM')
+    out_file.close()
+
+if __name__ == "__main__":
+    main()
diff --git a/src/yaca/yaca-test-common.cpp b/src/yaca/yaca-test-common.cpp
new file mode 100644 (file)
index 0000000..e4a8e69
--- /dev/null
@@ -0,0 +1,459 @@
+/*
+ *  Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+/*
+ * @file       yaca-test-common.cpp
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @author     Mateusz Forc (m.forc@samsung.com)
+ * @version    1.0
+ */
+
+#include <vector>
+#include <string>
+#include <fstream>
+#include <sstream>
+
+#include <yaca_simple.h>
+#include <yaca_seal.h>
+#include <yaca_sign.h>
+#include <yaca_digest.h>
+#include <yaca_encrypt.h>
+
+#include "yaca-test-common.h"
+
+namespace {
+
+std::vector<std::string> opensslErrors;
+
+} // anonymous
+
+void error_cb(const char *msg)
+{
+    opensslErrors.push_back(msg ? msg : "NULL");
+}
+
+const std::vector<std::string>& get_openssl_errors()
+{
+    return opensslErrors;
+}
+
+void clear_openssl_errors()
+{
+    opensslErrors.clear();
+}
+
+const char *yaca_error(int error)
+{
+    return yaca_debug_translate_error(static_cast<yaca_error_e>(error));
+}
+
+ChrPtr wrap_ptr(char *buffer)
+{
+    return ChrPtr(buffer, yaca_free);
+}
+
+KeyPtr wrap_ptr(yaca_key_h key)
+{
+    return KeyPtr(key, yaca_key_destroy);
+}
+
+CtxPtr wrap_ptr(yaca_context_h ctx)
+{
+    return CtxPtr(ctx, yaca_context_destroy);
+}
+
+ChrPtr create_yaca_buffer(size_t size)
+{
+    char *buffer;
+    YACA_SUCCESS(yaca_malloc(size, (void**)&buffer));
+    return wrap_ptr(buffer);
+}
+
+KeyPtr null_key()
+{
+    return wrap_ptr(static_cast<yaca_key_h>(YACA_KEY_NULL));
+}
+
+KeyPtr generate_key(yaca_key_type_e type, size_t bit_len)
+{
+    yaca_key_h key;
+    YACA_SUCCESS(yaca_key_generate(type, bit_len, &key));
+    YACA_ASSERT_MSG(key != YACA_KEY_NULL, "NULL key generated");
+    return wrap_ptr(key);
+}
+
+KeyPtr generate_key_from_parameters(const KeyPtr &params)
+{
+    yaca_key_h key;
+    YACA_SUCCESS(yaca_key_generate_from_parameters(params.get(), &key));
+    YACA_ASSERT_MSG(key != YACA_KEY_NULL, "NULL key generated");
+    return wrap_ptr(key);
+}
+
+KeyPtr extract_public_key(const KeyPtr &key_prv)
+{
+    yaca_key_h key_pub;
+    YACA_SUCCESS(yaca_key_extract_public(key_prv.get(), &key_pub));
+    YACA_ASSERT_MSG(key_pub != YACA_KEY_NULL, "NULL public key extracted");
+    return wrap_ptr(key_pub);
+}
+
+KeyPtr extract_parameters(const KeyPtr &key)
+{
+    yaca_key_h params;
+    YACA_SUCCESS(yaca_key_extract_parameters(key.get(), &params));
+    YACA_ASSERT_MSG(params != YACA_KEY_NULL, "NULL parameters extracted");
+    return wrap_ptr(params);
+}
+
+ChrPtr export_key(const KeyPtr &key,
+                  yaca_key_format_e key_fmt,
+                  yaca_key_file_format_e key_file_fmt,
+                  const char *password,
+                  size_t *data_len)
+{
+    char *data;
+
+    YACA_SUCCESS(yaca_key_export(key.get(), key_fmt, key_file_fmt,
+                                 password, &data, data_len));
+
+    return wrap_ptr(data);
+}
+
+KeyPtr import_key(yaca_key_type_e key_type,
+                  const char *password,
+                  const char *data,
+                  size_t data_len)
+{
+    yaca_key_h key;
+
+    YACA_SUCCESS(yaca_key_import(key_type, password, data, data_len, &key));
+
+    return wrap_ptr(key);
+}
+
+ChrPtr key_derive_dh(const KeyPtr &prv_key,
+                     const KeyPtr &pub_key,
+                     size_t *secret_len)
+{
+    char *secret;
+
+    YACA_SUCCESS(yaca_key_derive_dh(prv_key.get(), pub_key.get(), &secret, secret_len));
+
+    return wrap_ptr(secret);
+}
+
+ChrPtr key_derive_kdf(yaca_kdf_e kdf,
+                      yaca_digest_algorithm_e algo,
+                      const char *secret,
+                      size_t secret_len,
+                      const char *info,
+                      size_t info_len,
+                      size_t key_material_len)
+{
+    char *key_material;
+
+    YACA_SUCCESS(yaca_key_derive_kdf(kdf, algo, secret, secret_len, info, info_len,
+                                     key_material_len, &key_material));
+
+    return wrap_ptr(key_material);
+}
+
+KeyPtr key_derive_pbkdf2(const char *password,
+                         const char *salt,
+                         size_t salt_len,
+                         size_t iterations,
+                         yaca_digest_algorithm_e algo,
+                         size_t key_bit_len)
+{
+    yaca_key_h key;
+
+    YACA_SUCCESS(yaca_key_derive_pbkdf2(password, salt, salt_len, iterations, algo, key_bit_len, &key));
+
+    return wrap_ptr(key);
+}
+
+size_t get_output_length(const CtxPtr &ctx, size_t input_len)
+{
+    size_t output_len;
+
+    YACA_SUCCESS(yaca_context_get_output_length(ctx.get(), input_len, &output_len));
+
+    return output_len;
+}
+
+ChrPtr simple_sign(yaca_digest_algorithm_e algo,
+                   const KeyPtr &key_prv,
+                   const char *data,
+                   size_t data_len,
+                   size_t *signature_len)
+{
+    char *signature;
+
+    YACA_SUCCESS(yaca_simple_calculate_signature(algo, key_prv.get(), data, data_len,
+                                                 &signature, signature_len));
+
+    return wrap_ptr(signature);
+}
+
+ChrPtr simple_encrypt(yaca_encrypt_algorithm_e algo,
+                      yaca_block_cipher_mode_e bcm,
+                      const KeyPtr &key,
+                      const KeyPtr &iv,
+                      const char *plaintext,
+                      size_t plaintext_len,
+                      size_t *ciphertext_len)
+{
+    char *ciphertext;
+
+    YACA_SUCCESS(yaca_simple_encrypt(algo, bcm, key.get(), iv.get(), plaintext, plaintext_len,
+                                     &ciphertext, ciphertext_len));
+
+    return wrap_ptr(ciphertext);
+}
+
+ChrPtr simple_decrypt(yaca_encrypt_algorithm_e algo,
+                      yaca_block_cipher_mode_e bcm,
+                      const KeyPtr &key,
+                      const KeyPtr &iv,
+                      const char *ciphertext,
+                      size_t ciphertext_len,
+                      size_t *plaintext_len)
+{
+    char *plaintext;
+
+    YACA_SUCCESS(yaca_simple_decrypt(algo, bcm, key.get(), iv.get(), ciphertext, ciphertext_len,
+                                     &plaintext, plaintext_len));
+
+    return wrap_ptr(plaintext);
+}
+
+CtxPtr encrypt_init(yaca_encrypt_algorithm_e algo,
+                    yaca_block_cipher_mode_e bcm,
+                    const KeyPtr &sym_key,
+                    const KeyPtr &iv)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_encrypt_initialize(&ctx, algo, bcm, sym_key.get(), iv.get()));
+
+    return wrap_ptr(ctx);
+}
+
+CtxPtr decrypt_init(yaca_encrypt_algorithm_e algo,
+                    yaca_block_cipher_mode_e bcm,
+                    const KeyPtr& sym_key,
+                    const KeyPtr& iv)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_decrypt_initialize(&ctx, algo, bcm, sym_key.get(), iv.get()));
+
+    return wrap_ptr(ctx);
+}
+
+CtxPtr seal_init(const KeyPtr &key_pub,
+                 yaca_encrypt_algorithm_e algo,
+                 yaca_block_cipher_mode_e bcm,
+                 size_t sym_key_bit_len,
+                 KeyPtr& sym_key_ptr,
+                 KeyPtr& iv_ptr)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+    yaca_key_h sym_key = YACA_KEY_NULL;
+    yaca_key_h iv = YACA_KEY_NULL;
+
+    YACA_SUCCESS(yaca_seal_initialize(&ctx, key_pub.get(), algo, bcm, sym_key_bit_len, &sym_key, &iv));
+
+    sym_key_ptr.reset(sym_key);
+    iv_ptr.reset(iv);
+    return wrap_ptr(ctx);
+}
+
+CtxPtr open_init(const KeyPtr &key_priv,
+                 yaca_encrypt_algorithm_e algo,
+                 yaca_block_cipher_mode_e bcm,
+                 size_t sym_key_bit_len,
+                 const KeyPtr& sym_key,
+                 const KeyPtr& iv)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_open_initialize(&ctx, key_priv.get(), algo, bcm, sym_key_bit_len,
+                                      sym_key.get(), iv.get()));
+
+    return wrap_ptr(ctx);
+}
+
+CtxPtr sign_init(yaca_digest_algorithm_e algo, const KeyPtr &key_prv)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_sign_initialize(&ctx, algo, key_prv.get()));
+
+    return wrap_ptr(ctx);
+}
+
+CtxPtr verify_init(yaca_digest_algorithm_e algo, const KeyPtr &key_prv)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_verify_initialize(&ctx, algo, key_prv.get()));
+
+    return wrap_ptr(ctx);
+}
+
+CtxPtr hmac_init(yaca_digest_algorithm_e algo, const KeyPtr &key)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_sign_initialize_hmac(&ctx, algo, key.get()));
+
+    return wrap_ptr(ctx);
+}
+
+CtxPtr cmac_init(yaca_encrypt_algorithm_e algo, const KeyPtr &key)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_sign_initialize_cmac(&ctx, algo, key.get()));
+
+    return wrap_ptr(ctx);
+}
+
+CtxPtr digest_init(yaca_digest_algorithm_e algo)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+
+    YACA_SUCCESS(yaca_digest_initialize(&ctx, algo));
+
+    return wrap_ptr(ctx);
+}
+
+Buffer random_buffer(size_t length)
+{
+    RUNNER_ASSERT(length > 0);
+
+    Buffer buffer(length);
+    std::ifstream is("/dev/urandom", std::ifstream::binary);
+    RUNNER_ASSERT_MSG(is, "Failed to open /dev/urandom");
+    is.read(buffer.data(), length);
+    if(static_cast<std::streamsize>(length) != is.gcount()) {
+        RUNNER_ASSERT_MSG(false,
+                          "Not enough bytes read from /dev/urandom: " << length << "!=" <<
+                          is.gcount());
+    }
+
+    return buffer;
+}
+
+ChrPtr out_buf_alloc(const CtxPtr& ctx_ptr, size_t input_len, size_t &out_len)
+{
+    out_len = get_output_length(ctx_ptr, input_len);
+    if (out_len > 0)
+        return create_yaca_buffer(out_len);
+    else
+        return wrap_ptr((char*)nullptr);
+}
+
+#define ENUM_DESCRIBE(enum_value) case (enum_value): return #enum_value;
+const char* keytype2str(yaca_key_type_e key_type)
+{
+    switch (key_type) {
+    ENUM_DESCRIBE(YACA_KEY_TYPE_SYMMETRIC);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_DES);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_IV);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_RSA_PRIV);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_RSA_PUB);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_DSA_PRIV);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_DSA_PUB);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_DSA_PARAMS);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_DH_PRIV);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_DH_PUB);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_DH_PARAMS);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_EC_PRIV);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_EC_PUB);
+    ENUM_DESCRIBE(YACA_KEY_TYPE_EC_PARAMS);
+    default: return "Unknown key type";
+    }
+}
+
+const char* digest2str(yaca_digest_algorithm_e algo)
+{
+    switch (algo) {
+    ENUM_DESCRIBE(YACA_DIGEST_MD5);
+    ENUM_DESCRIBE(YACA_DIGEST_SHA1);
+    ENUM_DESCRIBE(YACA_DIGEST_SHA224);
+    ENUM_DESCRIBE(YACA_DIGEST_SHA256);
+    ENUM_DESCRIBE(YACA_DIGEST_SHA384);
+    ENUM_DESCRIBE(YACA_DIGEST_SHA512);
+    default: return "Unknown digest algorithm";
+    }
+}
+
+const char* encrypt2str(yaca_encrypt_algorithm_e algo)
+{
+    switch (algo) {
+    ENUM_DESCRIBE(YACA_ENCRYPT_AES);
+    ENUM_DESCRIBE(YACA_ENCRYPT_UNSAFE_DES);
+    ENUM_DESCRIBE(YACA_ENCRYPT_UNSAFE_3DES_2TDEA);
+    ENUM_DESCRIBE(YACA_ENCRYPT_3DES_3TDEA);
+    ENUM_DESCRIBE(YACA_ENCRYPT_UNSAFE_RC2);
+    ENUM_DESCRIBE(YACA_ENCRYPT_UNSAFE_RC4);
+    ENUM_DESCRIBE(YACA_ENCRYPT_CAST5);
+    default: return "Unknown encrypt algorithm";
+    }
+}
+
+const char* padding2str(yaca_padding_e padding)
+{
+    switch (padding) {
+    ENUM_DESCRIBE(YACA_PADDING_NONE);
+    ENUM_DESCRIBE(YACA_PADDING_X931);
+    ENUM_DESCRIBE(YACA_PADDING_PKCS1);
+    ENUM_DESCRIBE(YACA_PADDING_PKCS1_PSS);
+    ENUM_DESCRIBE(YACA_PADDING_PKCS1_OAEP);
+    ENUM_DESCRIBE(YACA_PADDING_PKCS1_SSLV23);
+    ENUM_DESCRIBE(YACA_PADDING_PKCS7);
+    default: return "Unknown padding type";
+    }
+}
+
+const char* bcm2str(yaca_block_cipher_mode_e bcm)
+{
+    switch (bcm) {
+    ENUM_DESCRIBE(YACA_BCM_NONE);
+    ENUM_DESCRIBE(YACA_BCM_ECB);
+    ENUM_DESCRIBE(YACA_BCM_CTR);
+    ENUM_DESCRIBE(YACA_BCM_CBC);
+    ENUM_DESCRIBE(YACA_BCM_GCM);
+    ENUM_DESCRIBE(YACA_BCM_CFB);
+    ENUM_DESCRIBE(YACA_BCM_CFB1);
+    ENUM_DESCRIBE(YACA_BCM_CFB8);
+    ENUM_DESCRIBE(YACA_BCM_OFB);
+    ENUM_DESCRIBE(YACA_BCM_CCM);
+    ENUM_DESCRIBE(YACA_BCM_WRAP);
+    default: return "Unknown bcm type";
+    }
+}
+#undef ENUM_DESCRIBE
+
+std::string truncate_str(const std::string &input, size_t len)
+{
+    if (len >= input.size())
+        return input;
+
+    return input.substr(0, len).append("...");
+}
diff --git a/src/yaca/yaca-test-common.h b/src/yaca/yaca-test-common.h
new file mode 100644 (file)
index 0000000..98d014b
--- /dev/null
@@ -0,0 +1,250 @@
+/*
+ *  Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+/*
+ * @file       yaca-test-common.h
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+
+#pragma once
+
+#include <utility>
+#include <vector>
+#include <string>
+#include <iostream>
+#include <sstream>
+#include <memory>
+
+#include <yaca_crypto.h>
+#include <yaca_error.h>
+#include <yaca_key.h>
+
+#include <dpl/gdbbacktrace.h>
+#include <dpl/test/test_failed.h>
+#include <dpl/test/test_runner.h>
+
+#include "debug.h"
+
+#define YACA_ASSERT_MSG(test, message)                                            \
+do {                                                                              \
+    if (!(test)) {                                                                \
+        std::ostringstream assertMsg;                                             \
+        assertMsg << message << DPL::gdbbacktrace();                              \
+        if (!get_openssl_errors().empty()) {                                      \
+            assertMsg << std::endl << "OPENSSL ERRORS:" << std::endl;             \
+            for (auto &err : get_openssl_errors())                                \
+                assertMsg << err;                                                 \
+            clear_openssl_errors();                                               \
+        }                                                                         \
+        DPL::Test::TestFailed e(#test, __FILE__, __LINE__, assertMsg.str());      \
+        if (!std::uncaught_exception())                                           \
+            throw e;                                                              \
+        DPL::Test::TestRunnerSingleton::Instance().addFailReason(e.GetMessage()); \
+    } else if (!get_openssl_errors().empty()) {                                   \
+        std::ostringstream failMsg;                                               \
+        failMsg << DPL::gdbbacktrace();                              \
+        failMsg << std::endl << "OPENSSL ERRORS:" << std::endl;                 \
+        for (auto &err : get_openssl_errors())                                    \
+            failMsg << err;                                                     \
+        clear_openssl_errors();                                                   \
+        DPL::Test::TestFailed e("Unhandled OpenSSL error",                        \
+                                __FILE__,                                         \
+                                __LINE__,                                         \
+                                failMsg.str());                                 \
+        if (!std::uncaught_exception())                                           \
+            throw e;                                                              \
+        DPL::Test::TestRunnerSingleton::Instance().addFailReason(e.GetMessage()); \
+    }                                                                             \
+} while (0)
+
+const char *yaca_error(int error);
+
+void error_cb(const char *msg);
+
+const std::vector<std::string>& get_openssl_errors();
+void clear_openssl_errors();
+
+struct YacaTest {
+    YacaTest() {}
+    ~YacaTest() {}
+
+    void init(const std::string&)
+    {
+        int ret = yaca_initialize();
+        YACA_ASSERT_MSG(ret == 0, "yaca_initialize() failed with " << yaca_error(ret));
+
+        yaca_debug_set_error_cb(&error_cb);
+    }
+
+    void finish()
+    {
+        yaca_cleanup();
+    }
+};
+
+// YACA_ASSERT wrappers
+#define YACA_RESULT(expected, func)                                            \
+do {                                                                           \
+    int ret = func;                                                            \
+    YACA_ASSERT_MSG(ret == (expected),                                         \
+                    "Expected: " << yaca_error((expected)) <<                  \
+                    " got: " << yaca_error(ret) );                             \
+} while(0)
+
+#define YACA_SUCCESS(func) YACA_RESULT(YACA_ERROR_NONE, func)
+
+#define YACA_INVALID_PARAM(func) YACA_RESULT(YACA_ERROR_INVALID_PARAMETER, func)
+
+typedef std::unique_ptr<char, void (*)(void*)> ChrPtr;
+typedef std::unique_ptr<yaca_key_s, void (*)(yaca_key_h)> KeyPtr;
+typedef std::unique_ptr<yaca_context_s, void (*)(yaca_context_h)> CtxPtr;
+
+typedef std::vector<char> Buffer;
+
+ChrPtr wrap_ptr(char *buffer);
+KeyPtr wrap_ptr(yaca_key_h key);
+CtxPtr wrap_ptr(yaca_context_h ctx);
+
+ChrPtr create_yaca_buffer(size_t size);
+
+KeyPtr null_key();
+
+KeyPtr generate_key(yaca_key_type_e type, size_t bit_len);
+
+KeyPtr generate_key_from_parameters(const KeyPtr &params);
+
+KeyPtr extract_public_key(const KeyPtr &key_prv);
+
+KeyPtr extract_parameters(const KeyPtr &key);
+
+ChrPtr export_key(const KeyPtr &key,
+                  yaca_key_format_e key_fmt,
+                  yaca_key_file_format_e key_file_fmt,
+                  const char *password,
+                  size_t *data_len);
+
+KeyPtr import_key(yaca_key_type_e key_type,
+                  const char *password,
+                  const char *data,
+                  size_t data_len);
+
+ChrPtr key_derive_dh(const KeyPtr &prv_key,
+                     const KeyPtr &pub_key,
+                     size_t *secret_len);
+
+ChrPtr key_derive_kdf(yaca_kdf_e kdf,
+                      yaca_digest_algorithm_e algo,
+                      const char *secret,
+                      size_t secret_len,
+                      const char *info,
+                      size_t info_len,
+                      size_t key_material_len);
+
+KeyPtr key_derive_pbkdf2(const char *password,
+                         const char *salt,
+                         size_t salt_len,
+                         size_t iterations,
+                         yaca_digest_algorithm_e algo,
+                         size_t key_bit_len);
+
+size_t get_output_length(const CtxPtr &ctx, size_t input_len = 0);
+
+ChrPtr simple_sign(yaca_digest_algorithm_e algo,
+                   const KeyPtr &key_prv,
+                   const char *data,
+                   size_t data_len,
+                   size_t *signature_len);
+
+ChrPtr simple_encrypt(yaca_encrypt_algorithm_e algo,
+                      yaca_block_cipher_mode_e bcm,
+                      const KeyPtr &key,
+                      const KeyPtr &iv,
+                      const char *plaintext,
+                      size_t plaintext_len,
+                      size_t *ciphertext_len);
+
+
+ChrPtr simple_decrypt(yaca_encrypt_algorithm_e algo,
+                      yaca_block_cipher_mode_e bcm,
+                      const KeyPtr &key,
+                      const KeyPtr &iv,
+                      const char *ciphertext,
+                      size_t ciphertext_len,
+                      size_t *plaintext_len);
+
+CtxPtr seal_init(const KeyPtr &key_pub,
+                 yaca_encrypt_algorithm_e algo,
+                 yaca_block_cipher_mode_e bcm,
+                 size_t sym_key_bit_len,
+                 KeyPtr &sym_key_ptr,
+                 KeyPtr &iv_ptr);
+
+CtxPtr open_init(const KeyPtr &key_priv,
+                 yaca_encrypt_algorithm_e algo,
+                 yaca_block_cipher_mode_e bcm,
+                 size_t sym_key_bit_len,
+                 const KeyPtr& sym_key,
+                 const KeyPtr& iv);
+
+CtxPtr encrypt_init(yaca_encrypt_algorithm_e algo,
+                    yaca_block_cipher_mode_e bcm,
+                    const KeyPtr &sym_key,
+                    const KeyPtr &iv);
+
+CtxPtr decrypt_init(yaca_encrypt_algorithm_e algo,
+                    yaca_block_cipher_mode_e bcm,
+                    const KeyPtr &sym_key,
+                    const KeyPtr &iv);
+
+CtxPtr sign_init(yaca_digest_algorithm_e algo, const KeyPtr &key_prv);
+
+CtxPtr verify_init(yaca_digest_algorithm_e algo, const KeyPtr &key_prv);
+
+CtxPtr hmac_init(yaca_digest_algorithm_e algo, const KeyPtr &key);
+
+CtxPtr cmac_init(yaca_encrypt_algorithm_e algo, const KeyPtr &key);
+
+CtxPtr digest_init(yaca_digest_algorithm_e algo);
+
+Buffer random_buffer(size_t length);
+
+ChrPtr out_buf_alloc(const CtxPtr& ctx_ptr, size_t input_len, size_t &out_len);
+
+const char* keytype2str(yaca_key_type_e algo);
+
+const char* digest2str(yaca_digest_algorithm_e algo);
+
+const char* encrypt2str(yaca_encrypt_algorithm_e algo);
+
+const char* padding2str(yaca_padding_e padding);
+
+const char* bcm2str(yaca_block_cipher_mode_e bcm);
+
+/* If input is longer than len it is truncated and an ellipsis is appended.
+ * Otherwise the original string is returned. */
+std::string truncate_str(const std::string &input, size_t len);
+
+struct KeyPair {
+    KeyPtr prv;
+    KeyPtr pub;
+    size_t bit_len;
+
+    KeyPair(yaca_key_type_e prv_key_type, size_t key_bit_len) :
+            prv(generate_key(prv_key_type, key_bit_len)),
+            pub(extract_public_key(prv)),
+            bit_len(key_bit_len)
+            {}
+};
diff --git a/src/yaca/yaca-test-crypto.cpp b/src/yaca/yaca-test-crypto.cpp
new file mode 100644 (file)
index 0000000..2962188
--- /dev/null
@@ -0,0 +1,165 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ */
+
+#include "dpl/test/test_runner.h"
+#include "yaca-test-common.h"
+
+#include <yaca_crypto.h>
+#include <yaca_digest.h>
+
+
+RUNNER_TEST_GROUP_INIT(T1000_YACA_CRYPTO);
+
+RUNNER_TEST(T1000_yaca_initialize_cleanup)
+{
+    YACA_SUCCESS(yaca_initialize());
+
+    yaca_cleanup();
+
+    YACA_SUCCESS(yaca_initialize());
+    YACA_RESULT(YACA_ERROR_INTERNAL, yaca_initialize());
+
+    yaca_cleanup();
+    yaca_cleanup();
+    yaca_cleanup();
+}
+
+// TODO what should happen if yaca_initialize() is not called?
+
+RUNNER_TEST(T1010_yaca_malloc, YacaTest)
+{
+    void *memory;
+    YACA_INVALID_PARAM(yaca_malloc(0, &memory));
+    YACA_INVALID_PARAM(yaca_malloc(42, nullptr));
+
+    YACA_SUCCESS(yaca_malloc(42, &memory));
+    yaca_free(memory);
+}
+
+RUNNER_TEST(T1020_yaca_zalloc, YacaTest)
+{
+    void *memory;
+    YACA_INVALID_PARAM(yaca_zalloc(0, &memory));
+    YACA_INVALID_PARAM(yaca_zalloc(42, nullptr));
+
+    YACA_SUCCESS(yaca_zalloc(42, &memory));
+    yaca_free(memory);
+}
+
+RUNNER_TEST(T1030_yaca_realloc, YacaTest)
+{
+    void *memory;
+    YACA_INVALID_PARAM(yaca_realloc(0, &memory));
+    YACA_INVALID_PARAM(yaca_realloc(42, nullptr));
+
+    YACA_SUCCESS(yaca_malloc(40, &memory));
+    YACA_SUCCESS(yaca_realloc(42, &memory));
+    yaca_free(memory);
+}
+
+RUNNER_TEST(T1035_yaca_memcmp, YacaTest)
+{
+    void *first;
+    void *second;
+
+    YACA_SUCCESS(yaca_zalloc(10, &first));
+    YACA_SUCCESS(yaca_zalloc(10, &second));
+    YACA_SUCCESS(yaca_memcmp(first, second, 10));
+
+    *(int*)first = 42;
+    YACA_RESULT(YACA_ERROR_DATA_MISMATCH, yaca_memcmp(first, second, 10));
+
+    yaca_free(first);
+    yaca_free(second);
+}
+
+RUNNER_TEST(T1040_yaca_free, YacaTest)
+{
+    yaca_free(nullptr);
+
+    void *memory;
+    YACA_SUCCESS(yaca_malloc(42, &memory));
+
+    yaca_free(memory);
+}
+
+RUNNER_TEST(T1050_yaca_randomize_bytes, YacaTest)
+{
+    Buffer data = random_buffer(42);
+
+    YACA_INVALID_PARAM(yaca_randomize_bytes(nullptr, data.size()));
+    YACA_INVALID_PARAM(yaca_randomize_bytes(data.data(), 0));
+
+    YACA_SUCCESS(yaca_randomize_bytes(data.data(), data.size()));
+}
+
+RUNNER_TEST(T1060_yaca_context_set_property_invalid_param, YacaTest)
+{
+    size_t tag_len = 4;
+    YACA_INVALID_PARAM(yaca_context_set_property(YACA_CONTEXT_NULL,
+                                                 YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)tag_len,
+                                                 sizeof(tag_len)));
+
+    auto ctx_ptr = digest_init(YACA_DIGEST_MD5);
+    YACA_INVALID_PARAM(yaca_context_set_property(ctx_ptr.get(),
+                                                 YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)tag_len,
+                                                 sizeof(tag_len)));
+}
+
+RUNNER_TEST(T1070_yaca_context_get_property_invalid_param, YacaTest)
+{
+    void *tag;
+    size_t tag_len;
+    YACA_INVALID_PARAM(yaca_context_get_property(YACA_CONTEXT_NULL,
+                                                 YACA_PROPERTY_GCM_TAG,
+                                                 &tag,
+                                                 &tag_len));
+
+    auto ctx_ptr = digest_init(YACA_DIGEST_MD5);
+    YACA_INVALID_PARAM(yaca_context_get_property(ctx_ptr.get(),
+                                                 YACA_PROPERTY_GCM_TAG_LEN,
+                                                 &tag,
+                                                 &tag_len));
+}
+
+RUNNER_TEST(T1080_yaca_context_destroy, YacaTest)
+{
+    yaca_context_destroy(YACA_CONTEXT_NULL);
+
+    yaca_context_h ctx;
+    YACA_SUCCESS(yaca_digest_initialize(&ctx, YACA_DIGEST_MD5));
+
+    yaca_context_destroy(ctx);
+}
+
+RUNNER_TEST(T1090_yaca_get_output_length_invalid_param)
+{
+    size_t out_len;
+    auto ctx_ptr = digest_init(YACA_DIGEST_MD5);
+
+    YACA_INVALID_PARAM(yaca_context_get_output_length(YACA_CONTEXT_NULL, 0, &out_len));
+    YACA_INVALID_PARAM(yaca_context_get_output_length(YACA_CONTEXT_NULL, 42, &out_len));
+    YACA_INVALID_PARAM(yaca_context_get_output_length(ctx_ptr.get(), 42, nullptr));
+}
diff --git a/src/yaca/yaca-test-digest.cpp b/src/yaca/yaca-test-digest.cpp
new file mode 100644 (file)
index 0000000..0e28fc0
--- /dev/null
@@ -0,0 +1,198 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ */
+
+#include <map>
+#include <vector>
+
+#include "dpl/test/test_runner.h"
+#include "yaca-test-common.h"
+#include "yaca-test-vector.h"
+
+#include <yaca_digest.h>
+
+using namespace std;
+
+namespace {
+const Buffer DATA = random_buffer(1024);
+
+void digest_length_test(yaca_digest_algorithm_e algo, size_t expected_bit_len)
+{
+    auto ctx_ptr = digest_init(algo);
+    size_t output_len = get_output_length(ctx_ptr);
+
+    YACA_ASSERT_MSG(output_len == expected_bit_len / 8,
+                    "Digest " << digest2str(algo) << " produces " << output_len * 8 <<
+                    " bit digest. Expected " << expected_bit_len << " bits.");
+}
+
+void check_test_vector(yaca_digest_algorithm_e algo,
+                       size_t repeats,
+                       const Buffer& input,
+                       const Buffer& expected)
+{
+    auto ctx_ptr = digest_init(algo);
+    size_t out_len;
+
+    out_len = get_output_length(ctx_ptr);
+
+    /* check the test vector */
+    if (input.size() > 0) {
+        for (size_t i = 0; i < repeats; i++)
+            YACA_SUCCESS(yaca_digest_update(ctx_ptr.get(),
+                                            input.data(),
+                                            input.size()));
+    }
+
+    Buffer output(out_len);
+    YACA_SUCCESS(yaca_digest_finalize(ctx_ptr.get(), output.data(), &out_len));
+    RUNNER_ASSERT_MSG(output.size() >= out_len,
+                      "Length returned from yaca_digest_finalize() (" << out_len <<
+                      ") is greater than the one returned from yaca_context_get_output_length() ("
+                      << output.size() << ")");
+    output.resize(out_len);
+
+    YACA_ASSERT_MSG(output.size() == expected.size(),
+                    "Digest calculated for \""  <<
+                    truncate_str(std::string(input.data(), input.size()), 16)
+                    << "\" with " << digest2str(algo) << " is " << output.size() * 8
+                    <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+    int ret = yaca_memcmp(output.data(), expected.data(), output.size());
+    YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                    "Digest calculated for \"" <<
+                    truncate_str(std::string(input.data(), input.size()), 16)
+                    << "\" with " << digest2str(algo) << " is different than expected");
+}
+
+} // anonymous namespace
+
+RUNNER_TEST_GROUP_INIT(T2000_YACA_DIGEST);
+
+RUNNER_TEST(T2010_yaca_digest_initialize_invalid_param, YacaTest)
+{
+    YACA_INVALID_PARAM(yaca_digest_initialize(nullptr, YACA_DIGEST_MD5));
+
+    yaca_context_h ctx;
+    YACA_INVALID_PARAM(yaca_digest_initialize(
+            &ctx,
+            static_cast<yaca_digest_algorithm_e>(YACA_DIGEST_MD5-1)));
+
+    YACA_INVALID_PARAM(yaca_digest_initialize(
+            &ctx,
+            static_cast<yaca_digest_algorithm_e>(YACA_DIGEST_SHA512+1)));
+}
+
+RUNNER_TEST(T2020_yaca_digest_update_invalid_param, YacaTest)
+{
+    YACA_INVALID_PARAM(yaca_digest_update(YACA_CONTEXT_NULL, DATA.data(), DATA.size()));
+
+    {
+        auto key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+        auto ctx_ptr = hmac_init(YACA_DIGEST_MD5, key_ptr);
+
+        YACA_INVALID_PARAM(yaca_digest_update(ctx_ptr.get(), DATA.data(), DATA.size()));
+    }
+
+    auto ctx_ptr = digest_init(YACA_DIGEST_MD5);
+
+    YACA_INVALID_PARAM(yaca_digest_update(ctx_ptr.get(), NULL, 42));
+    YACA_INVALID_PARAM(yaca_digest_update(ctx_ptr.get(), DATA.data(), 0));
+}
+
+RUNNER_TEST(T2030_yaca_digest_finalize_invalid_param, YacaTest)
+{
+    char output[256];
+    size_t out_len;
+    YACA_INVALID_PARAM(yaca_digest_finalize(YACA_CONTEXT_NULL, output, &out_len));
+
+    {
+        auto key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+        auto ctx_ptr = hmac_init(YACA_DIGEST_MD5, key_ptr);
+
+        YACA_INVALID_PARAM(yaca_digest_finalize(ctx_ptr.get(), output, &out_len));
+    }
+
+    auto ctx_ptr = digest_init(YACA_DIGEST_MD5);
+    YACA_SUCCESS(yaca_digest_update(ctx_ptr.get(), DATA.data(), DATA.size()));
+
+    YACA_INVALID_PARAM(yaca_digest_finalize(ctx_ptr.get(), nullptr, &out_len));
+    YACA_INVALID_PARAM(yaca_digest_finalize(ctx_ptr.get(), output, nullptr));
+}
+
+RUNNER_TEST(T2040_yaca_digest_get_output_length_invalid_param, YacaTest)
+{
+    auto ctx_ptr = digest_init(YACA_DIGEST_MD5);
+
+    YACA_INVALID_PARAM(yaca_context_get_output_length(ctx_ptr.get(), 0, nullptr));
+
+    size_t out_len;
+    YACA_INVALID_PARAM(yaca_context_get_output_length(ctx_ptr.get(), 42, &out_len));
+}
+
+RUNNER_TEST(T2050_yaca_digest_get_output_length, YacaTest)
+{
+    digest_length_test(YACA_DIGEST_MD5,    128);
+    digest_length_test(YACA_DIGEST_SHA1,   160);
+    digest_length_test(YACA_DIGEST_SHA224, 224);
+    digest_length_test(YACA_DIGEST_SHA256, 256);
+    digest_length_test(YACA_DIGEST_SHA384, 384);
+    digest_length_test(YACA_DIGEST_SHA512, 512);
+}
+
+RUNNER_TEST(T2060_yaca_digest_test_ascii_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("digest_ascii.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        size_t repeats;
+        std::string input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        check_test_vector(algo, repeats, Buffer(input.begin(), input.end()), expected);
+    }
+}
+
+RUNNER_TEST(T2070_yaca_digest_test_binary_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("digest_binary.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        size_t repeats;
+        Buffer input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        check_test_vector(algo, repeats, input, expected);
+    }
+}
diff --git a/src/yaca/yaca-test-encrypt.cpp b/src/yaca/yaca-test-encrypt.cpp
new file mode 100644 (file)
index 0000000..d27cc5e
--- /dev/null
@@ -0,0 +1,1055 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ * @author Mateusz Forc (m.forc@samsung.com)
+ */
+
+#include "dpl/test/test_runner.h"
+#include "yaca-test-common.h"
+#include "yaca-test-vector.h"
+
+#include <yaca_encrypt.h>
+#include <yaca_key.h>
+
+namespace {
+
+const Buffer DATA = random_buffer(1024);
+const size_t INVALID_IV_BIT_LENGTH = 512;
+
+struct KeyIvPair {
+public:
+    KeyPtr key;
+    KeyPtr iv;
+
+    KeyIvPair() : key(generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT)),
+                  iv(generate_key(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_IV_128BIT))
+                  {}
+};
+
+yaca_key_type_e algo_to_key_type(yaca_encrypt_algorithm_e algo)
+{
+    if (algo == YACA_ENCRYPT_3DES_3TDEA ||
+        algo == YACA_ENCRYPT_UNSAFE_3DES_2TDEA ||
+        algo == YACA_ENCRYPT_UNSAFE_DES)
+        return YACA_KEY_TYPE_DES;
+    else
+        return YACA_KEY_TYPE_SYMMETRIC;
+}
+
+class Encryptor {
+public:
+    Encryptor(yaca_encrypt_algorithm_e algo,
+              yaca_block_cipher_mode_e bcm,
+              const KeyPtr& key_ptr,
+              const KeyPtr& iv_ptr,
+              size_t key_bits = 0,
+              bool padded = true) :
+        m_enCtxPtr(encrypt_init(algo, bcm, key_ptr, iv_ptr)),
+        m_decCtxPtr(decrypt_init(algo, bcm, key_ptr, iv_ptr))
+    {
+        if (!padded)
+            set_padding(YACA_PADDING_NONE);
+        if (key_bits > 0)
+            set_effective_key_bits(key_bits);
+    }
+
+    virtual Buffer encrypt(const Buffer& data, size_t repeats = 1)
+    {
+        Buffer update_out = run_update(data, repeats, &m_enCtxPtr, yaca_encrypt_update);
+        Buffer final_out  = run_finalize(&m_enCtxPtr, yaca_encrypt_finalize);
+        update_out.insert(update_out.end(), final_out.begin(), final_out.end());
+        return update_out;
+    }
+
+    virtual Buffer decrypt(const Buffer& data, size_t repeats = 1)
+    {
+        Buffer update_out = run_update(data, repeats, &m_decCtxPtr, yaca_decrypt_update);
+        Buffer final_out  = run_finalize(&m_decCtxPtr, yaca_decrypt_finalize);
+        update_out.insert(update_out.end(), final_out.begin(), final_out.end());
+        return update_out;
+    }
+
+    void set_padding(yaca_padding_e padding)
+    {
+        YACA_SUCCESS(yaca_context_set_property(m_enCtxPtr.get(), YACA_PROPERTY_PADDING,
+                                               (char*)(&padding), sizeof(padding)));
+        YACA_SUCCESS(yaca_context_set_property(m_decCtxPtr.get(), YACA_PROPERTY_PADDING,
+                                               (char*)(&padding), sizeof(padding)));
+    }
+
+    void set_effective_key_bits(size_t key_bits)
+    {
+        YACA_SUCCESS(yaca_context_set_property(m_enCtxPtr.get(), YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
+                                               (char*)(&key_bits), sizeof(key_bits)));
+        YACA_SUCCESS(yaca_context_set_property(m_decCtxPtr.get(), YACA_PROPERTY_RC2_EFFECTIVE_KEY_BITS,
+                                               (char*)(&key_bits), sizeof(key_bits)));
+    }
+
+    int set_tag_len(yaca_block_cipher_mode_e bcm, size_t tag_len)
+    {
+        switch (bcm) {
+        case YACA_BCM_GCM:
+            return yaca_context_set_property(m_enCtxPtr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                             (void*)&tag_len, sizeof(tag_len));
+        case YACA_BCM_CCM:
+            return yaca_context_set_property(m_enCtxPtr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                             (void*)&tag_len, sizeof(tag_len));
+        default:
+            return YACA_ERROR_INVALID_PARAMETER;
+        }
+    }
+
+private:
+    CtxPtr m_enCtxPtr;
+    CtxPtr m_decCtxPtr;
+
+    typedef std::function<int(yaca_context_h, const char*, size_t, char*, size_t*)> Update;
+    typedef std::function<int(yaca_context_h, char*, size_t*)> Final;
+
+    Buffer run_update(const Buffer& data, size_t repeats, CtxPtr* ctx_ptr, Update update)
+    {
+        Buffer output;
+        if (!data.empty()) {
+            size_t len = 0;
+            auto text_ptr = out_buf_alloc(*ctx_ptr, data.size(), len);
+
+            for (size_t i = 0; i < repeats; ++i) {
+                YACA_SUCCESS(update(ctx_ptr->get(), data.data(), data.size(), text_ptr.get(), &len));
+                output.insert(output.end(), text_ptr.get(), text_ptr.get() + len);
+            }
+        }
+
+        return output;
+    }
+
+    Buffer run_finalize(CtxPtr* ctx_ptr, Final finalize)
+    {
+        Buffer output;
+        size_t len = 0;
+        auto final_ptr = out_buf_alloc(m_decCtxPtr, 0, len);
+        if (final_ptr != nullptr) {
+            YACA_SUCCESS(finalize(ctx_ptr->get(), final_ptr.get(), &len));
+            output.insert(output.end(), final_ptr.get(), final_ptr.get() + len);
+        }
+        return output;
+    }
+};
+
+std::string bin2hex(const Buffer &bin_str)
+{
+    std::stringstream data;
+
+    for (const auto& i : bin_str)
+        data << std::hex << static_cast<int>(static_cast<unsigned char>(i));
+
+    return data.str();
+}
+
+void check_test_vector_init(yaca_encrypt_algorithm_e algo,
+                            yaca_block_cipher_mode_e bcm,
+                            size_t key_len,
+                            size_t iv_len,
+                            bool valid)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+    int expected = YACA_ERROR_NONE;
+    yaca_key_type_e key_type;
+
+    if (!valid)
+       expected = YACA_ERROR_INVALID_PARAMETER;
+
+    auto iv_ptr = (iv_len > 0) ? generate_key(YACA_KEY_TYPE_IV, iv_len)
+                               : null_key();
+
+    /*
+     * Invalid DES key cannot be created using yaca_key_generate().
+     * If test case is incorrect, wrong key (symmetric) is generated
+     * in order to check how api behave with inappropriate key imported
+     */
+
+    if ((algo == YACA_ENCRYPT_UNSAFE_DES || algo == YACA_ENCRYPT_UNSAFE_3DES_2TDEA ||
+        algo == YACA_ENCRYPT_3DES_3TDEA) && valid)
+        key_type = YACA_KEY_TYPE_DES;
+    else
+        key_type = YACA_KEY_TYPE_SYMMETRIC;
+
+    auto key_ptr = generate_key(key_type, key_len);
+
+    YACA_RESULT(expected, yaca_encrypt_initialize(&ctx, algo, bcm, key_ptr.get(), iv_ptr.get()));
+    yaca_context_destroy(ctx);
+    ctx = YACA_CONTEXT_NULL;
+    YACA_RESULT(expected, yaca_decrypt_initialize(&ctx, algo, bcm, key_ptr.get(), iv_ptr.get()));
+    yaca_context_destroy(ctx);
+}
+
+void check_test_vector_output(const Buffer &input,
+                              yaca_encrypt_algorithm_e algo,
+                              yaca_block_cipher_mode_e bcm,
+                              const Buffer &key,
+                              size_t key_bits,
+                              const Buffer &iv,
+                              size_t repeats,
+                              const Buffer &expected,
+                              bool padded)
+{
+    auto key_ptr = import_key(algo_to_key_type(algo), nullptr, key.data(), key.size());
+    auto iv_ptr = (iv.size() > 0) ? import_key(YACA_KEY_TYPE_IV, nullptr, iv.data(), iv.size())
+                                  : null_key();
+
+    Encryptor encryptor(algo, bcm, key_ptr, iv_ptr, key_bits, padded);
+    Buffer output_vector = encryptor.encrypt(input, repeats);
+
+    auto keyHex = bin2hex(key);
+    auto ivHex = bin2hex(iv);
+    std::stringstream message;
+
+    message << "Parameters:\n"
+            << encrypt2str(algo) << std::endl
+            << bcm2str(bcm)      << std::endl
+            << "key: "           << keyHex  << std::endl
+            << "iv:  "           << ivHex   << std::endl
+            << "repeats: "       << repeats << std::endl;
+
+    YACA_ASSERT_MSG(expected.size() == output_vector.size(), "size differs\n" << message.str());
+    YACA_ASSERT_MSG(expected == output_vector,
+                    "\nEncrypt string comparison failed\n" << message.str());
+}
+
+void test_encryption_output(std::string filename, bool padded=true)
+{
+    auto tvv = loadTestVector(filename);
+
+    for (const auto& tv : tvv) {
+        Buffer input;
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        Buffer key;
+        size_t key_bits = 0;
+        Buffer iv;
+        size_t repeats;
+        Buffer expected;
+
+        tv.get("input", input);
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key", key);
+        if (algo == YACA_ENCRYPT_UNSAFE_RC2)
+            tv.get("effective_key_bits", key_bits);
+        tv.get("iv", iv);
+        tv.get("repeats", repeats);
+        tv.get("output", expected);
+
+        check_test_vector_output(input, algo, bcm, key, key_bits, iv, repeats, expected, padded);
+    }
+}
+
+void test_vector_encrypt_decrypt(const Buffer &input,
+                                 yaca_encrypt_algorithm_e algo,
+                                 yaca_block_cipher_mode_e bcm,
+                                 size_t key_len,
+                                 size_t iv_len)
+{
+    std::stringstream message;
+
+    auto key_ptr = generate_key(algo_to_key_type(algo), key_len);
+    auto iv_ptr = (iv_len > 0) ? generate_key(YACA_KEY_TYPE_IV, iv_len)
+                               : null_key();
+    Encryptor encryptor(algo, bcm, key_ptr, iv_ptr);
+
+    auto encrypt_output = encryptor.encrypt(input);
+    auto decrypt_output = encryptor.decrypt(encrypt_output);
+
+    message << "Parameters:\n"
+            << encrypt2str(algo) << std::endl
+            << bcm2str(bcm)      << std::endl
+            << "key_len: "       << key_len << std::endl
+            << "iv_len:  "       << iv_len  << std::endl;
+
+    YACA_ASSERT_MSG(input.size() == decrypt_output.size(), "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(input == decrypt_output, "Text after encrypt-decrypt has changed\n"
+                                              << message.str());
+}
+
+void test_encryption_decryption(std::string filename)
+{
+    std::string s = "abcdefghijklmnoprstuvwxyz0123456789";
+
+    auto tvv = loadTestVector(filename);
+
+    for (const auto& tv : tvv) {
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        size_t key_len;
+        size_t iv_len;
+        size_t key_data_len = 0;
+        Buffer input;
+
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key_len", key_len);
+        tv.get("iv_len", iv_len);
+        if (bcm == YACA_BCM_WRAP)
+            tv.get("key_data_len", key_data_len);
+
+        if (key_data_len > 0)
+            input = random_buffer(key_data_len / 8);
+        else
+            std::copy(s.begin(), s.end(), std::back_inserter(input));
+
+        test_vector_encrypt_decrypt(input, algo, bcm, key_len, iv_len);
+    }
+}
+
+void test_vector_gcm_tag_len(size_t key_len,
+                             size_t iv_len,
+                             size_t tag_len,
+                             bool valid)
+{
+    auto key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, key_len);
+    auto iv_ptr  = generate_key(YACA_KEY_TYPE_IV, iv_len);
+
+    int expected = YACA_ERROR_NONE;
+    if (!valid)
+        expected = YACA_ERROR_INVALID_PARAMETER;
+
+    Encryptor encryptor(YACA_ENCRYPT_AES, YACA_BCM_GCM, key_ptr, iv_ptr);
+    encryptor.encrypt(DATA);
+
+    YACA_RESULT(expected, encryptor.set_tag_len(YACA_BCM_GCM, tag_len));
+}
+
+void test_vector_ccm_tag_len(size_t key_len,
+                             size_t iv_len,
+                             size_t tag_len,
+                             bool valid)
+{
+    auto key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, key_len);
+    auto iv_ptr  = generate_key(YACA_KEY_TYPE_IV, iv_len);
+
+    int expected = YACA_ERROR_NONE;
+    if (!valid)
+        expected = YACA_ERROR_INVALID_PARAMETER;
+
+    Encryptor encryptor(YACA_ENCRYPT_AES, YACA_BCM_CCM, key_ptr, iv_ptr);
+
+    YACA_RESULT(expected, encryptor.set_tag_len(YACA_BCM_CCM, tag_len));
+}
+
+void aes_gcm_test_output(const Buffer &input,
+                         yaca_encrypt_algorithm_e algo,
+                         yaca_block_cipher_mode_e bcm,
+                         const Buffer &key,
+                         const Buffer &iv,
+                         const Buffer &aad,
+                         const Buffer &tag,
+                         const Buffer &output)
+{
+    auto key_ptr = import_key(algo_to_key_type(algo), nullptr, key.data(), key.size());
+    auto iv_ptr = (iv.size() > 0) ? import_key(YACA_KEY_TYPE_IV, nullptr, iv.data(), iv.size())
+                                  : null_key();
+
+    size_t tag_len = tag.size();
+    auto tag_output = create_yaca_buffer(tag_len);
+
+    // encryption
+    Buffer encrypt_output;
+    auto enc_ctx_ptr = encrypt_init(algo, bcm, key_ptr, iv_ptr);
+    size_t update_len = 0;
+    size_t final_len = 0;
+
+    if (!aad.empty())
+        YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                               aad.data(), aad.size()));
+
+    if (!input.empty()) {
+        auto update_ptr = out_buf_alloc(enc_ctx_ptr, input.size(), update_len);
+        YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), input.data(), input.size(),
+                                         update_ptr.get(), &update_len));
+        encrypt_output.insert(encrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    auto final_ptr = out_buf_alloc(enc_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_encrypt_finalize(enc_ctx_ptr.get(), final_ptr.get(), &final_len));
+    encrypt_output.insert(encrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                           (void*)&tag_len, sizeof(tag_len)));
+    YACA_SUCCESS(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                           (void**)tag_output.get(), &tag_len));
+
+    YACA_ASSERT_MSG(output.size() == encrypt_output.size(), "Ciphertext size after encrypt differs\n");
+    YACA_ASSERT_MSG(output == encrypt_output, "Ciphertext after encrypt differs\n");
+    YACA_ASSERT_MSG(tag.size() == tag_len, "Tag size after encrypt differs\n");
+    YACA_ASSERT_MSG(yaca_memcmp(tag.data(), tag_output.get(), tag_len) == YACA_ERROR_NONE,
+                    "Tag after encrypt differs\n");
+
+    // decryption
+    Buffer decrypt_output;
+    auto dec_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_GCM, key_ptr, iv_ptr);
+
+    if (!aad.empty())
+        YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                               aad.data(), aad.size()));
+    if (!output.empty()) {
+        auto update_ptr = out_buf_alloc(dec_ctx_ptr, output.size(), update_len);
+        YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), output.data(), output.size(),
+                                         update_ptr.get(), &update_len));
+        decrypt_output.insert(decrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                           tag.data(), tag.size()));
+
+    final_ptr = out_buf_alloc(dec_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_decrypt_finalize(dec_ctx_ptr.get(), final_ptr.get(), &final_len));
+    decrypt_output.insert(decrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_ASSERT_MSG(input.size() == decrypt_output.size(), "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(input == decrypt_output, "Text after encrypt-decrypt has changed\n");
+}
+
+void aes_ccm_test_output(const Buffer &input,
+                         yaca_encrypt_algorithm_e algo,
+                         yaca_block_cipher_mode_e bcm,
+                         const Buffer &key,
+                         const Buffer &iv,
+                         const Buffer &aad,
+                         const Buffer &tag,
+                         const Buffer &output)
+{
+    auto key_ptr = import_key(algo_to_key_type(algo), nullptr, key.data(), key.size());
+    auto iv_ptr = (iv.size() > 0) ? import_key(YACA_KEY_TYPE_IV, nullptr, iv.data(), iv.size())
+                                  : null_key();
+
+    size_t tag_len = tag.size();
+    auto tag_output = create_yaca_buffer(tag_len);
+
+    // encryption
+    Buffer encrypt_output;
+    auto enc_ctx_ptr = encrypt_init(algo, bcm, key_ptr, iv_ptr);
+    size_t update_len = 0;
+    size_t final_len = 0;
+
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                           (void*)&tag_len, sizeof(tag_len)));
+
+    if (!aad.empty()) {
+        YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), NULL, input.size(), NULL, &update_len));
+        YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                               aad.data(), aad.size()));
+    }
+
+    if (!input.empty()) {
+        auto update_ptr = out_buf_alloc(enc_ctx_ptr, input.size(), update_len);
+        YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), input.data(), input.size(),
+                                         update_ptr.get(), &update_len));
+        encrypt_output.insert(encrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    auto final_ptr = out_buf_alloc(enc_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_encrypt_finalize(enc_ctx_ptr.get(), final_ptr.get(), &final_len));
+    encrypt_output.insert(encrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_SUCCESS(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                           (void**)tag_output.get(), &tag_len));
+
+    YACA_ASSERT_MSG(output.size() == encrypt_output.size(), "Ciphertext size after encrypt differs \n");
+    YACA_ASSERT_MSG(output == encrypt_output, "ciphertext after encrypt differs\n");
+    YACA_ASSERT_MSG(tag.size() == tag_len, "Tag size after encrypt differs\n");
+    YACA_ASSERT_MSG(yaca_memcmp(tag.data(), tag_output.get(), tag_len) == YACA_ERROR_NONE,
+                    "Tag after encrypt differs\n");
+
+    // decryption
+    Buffer decrypt_output;
+    auto dec_ctx_ptr = decrypt_init(algo, bcm, key_ptr, iv_ptr);
+
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                           tag.data(), tag.size()));
+
+    if (!aad.empty()) {
+        YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), NULL, output.size(), NULL, &update_len));
+        YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                               aad.data(), aad.size()));
+    }
+
+    if (!output.empty()) {
+        auto update_ptr = out_buf_alloc(dec_ctx_ptr, output.size(), update_len);
+        YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), output.data(), output.size(),
+                                         update_ptr.get(), &update_len));
+        decrypt_output.insert(decrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+    }
+
+    final_ptr = out_buf_alloc(dec_ctx_ptr, 0, final_len);
+    YACA_SUCCESS(yaca_decrypt_finalize(dec_ctx_ptr.get(), final_ptr.get(), &final_len));
+    decrypt_output.insert(decrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_ASSERT_MSG(input.size() == decrypt_output.size(), "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(input == decrypt_output, "Text after encrypt-decrypt has changed\n");
+}
+
+}//namespace anonymous
+
+RUNNER_TEST_GROUP_INIT(T3000_YACA_ENCRYPT);
+
+RUNNER_TEST(T3010_yaca_encrypt_init_invalid_param, YacaTest)
+{
+    yaca_context_h ctx;
+    KeyIvPair key_iv_pair;
+    auto asym_key_ptr = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto bad_iv_ptr = generate_key(YACA_KEY_TYPE_IV, INVALID_IV_BIT_LENGTH);
+    auto des_key_ptr = generate_key(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_64BIT);
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(nullptr, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.key.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, static_cast<yaca_encrypt_algorithm_e>(-1),
+                                               YACA_BCM_CBC, key_iv_pair.key.get(),
+                                               key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_AES,
+                                               static_cast<yaca_block_cipher_mode_e>(-1),
+                                               key_iv_pair.key.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_NULL,
+                                               key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               asym_key_ptr.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_ECB,
+                                               des_key_ptr.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.key.get(), YACA_KEY_NULL));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.key.get(), bad_iv_ptr.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.iv.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_encrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               des_key_ptr.get(), key_iv_pair.iv.get()));
+}
+
+RUNNER_TEST(T3020_yaca_encrypt_update_invalid_param, YacaTest)
+{
+    size_t ciphertext_len = 0;
+    KeyIvPair key_iv_pair;
+    auto en_ctx_ptr = encrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+    auto inv_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+    auto ciphertext_ptr = out_buf_alloc(en_ctx_ptr, DATA.size(), ciphertext_len);
+
+    YACA_INVALID_PARAM(yaca_encrypt_update(YACA_CONTEXT_NULL, DATA.data(), DATA.size(),
+                                           ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_update(en_ctx_ptr.get(), nullptr, DATA.size(),
+                                           ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_update(en_ctx_ptr.get(), nullptr, 0,
+                                           ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_update(en_ctx_ptr.get(), DATA.data(), 0,
+                                           ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_update(en_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                           nullptr, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_update(en_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                           ciphertext_ptr.get(), nullptr));
+
+    YACA_INVALID_PARAM(yaca_encrypt_update(inv_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                           ciphertext_ptr.get(), &ciphertext_len));
+}
+
+RUNNER_TEST(T3030_yaca_encrypt_final_invalid_param, YacaTest)
+{
+    size_t ciphertext_len = 0;
+    KeyIvPair key_iv_pair;
+    auto en_ctx_ptr = encrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+    auto ciphertext_ptr = out_buf_alloc(en_ctx_ptr, DATA.size(), ciphertext_len);
+    auto inv_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+
+    YACA_INVALID_PARAM(yaca_encrypt_finalize(YACA_CONTEXT_NULL, ciphertext_ptr.get(),
+                                             &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_finalize(en_ctx_ptr.get(), nullptr, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_finalize(en_ctx_ptr.get(), ciphertext_ptr.get(), nullptr));
+
+    YACA_INVALID_PARAM(yaca_encrypt_finalize(inv_ctx_ptr.get(), ciphertext_ptr.get(),
+                                             &ciphertext_len));
+}
+
+RUNNER_TEST(T3040_yaca_decrypt_init_invalid_param, YacaTest)
+{
+    yaca_context_h ctx;
+    KeyIvPair key_iv_pair;
+    auto asym_key_ptr = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto bad_iv_ptr = generate_key(YACA_KEY_TYPE_IV, INVALID_IV_BIT_LENGTH);
+    auto des_key_ptr = generate_key(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_64BIT);
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(nullptr, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.key.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, static_cast<yaca_encrypt_algorithm_e>(-1),
+                                               YACA_BCM_CBC, key_iv_pair.key.get(),
+                                               key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_AES,
+                                               static_cast<yaca_block_cipher_mode_e>(-1),
+                                               key_iv_pair.key.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_NULL,
+                                               key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               asym_key_ptr.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_UNSAFE_DES, YACA_BCM_ECB,
+                                               des_key_ptr.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.key.get(), YACA_KEY_NULL));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.key.get(), bad_iv_ptr.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               key_iv_pair.iv.get(), key_iv_pair.iv.get()));
+
+    YACA_INVALID_PARAM(yaca_decrypt_initialize(&ctx, YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                               des_key_ptr.get(), key_iv_pair.iv.get()));
+}
+
+RUNNER_TEST(T3050_yaca_decrypt_update_invalid_param, YacaTest)
+{
+    size_t plaintext_len = 0;
+    KeyIvPair key_iv_pair;
+    auto dec_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+    auto plaintext_ptr = out_buf_alloc(dec_ctx_ptr, DATA.size(), plaintext_len);
+    auto inv_ctx_ptr = encrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+
+    YACA_INVALID_PARAM(yaca_decrypt_update(YACA_CONTEXT_NULL, DATA.data(), DATA.size(),
+                                           nullptr, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_update(dec_ctx_ptr.get(), nullptr, DATA.size(),
+                                           plaintext_ptr.get(), &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_update(dec_ctx_ptr.get(), DATA.data(), 0,
+                                           plaintext_ptr.get(), &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_update(dec_ctx_ptr.get(), nullptr, 0,
+                                           plaintext_ptr.get(), &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_update(dec_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                           nullptr, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_update(dec_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                           plaintext_ptr.get(), nullptr));
+
+    YACA_INVALID_PARAM(yaca_decrypt_update(inv_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                           plaintext_ptr.get(), &plaintext_len));
+}
+
+RUNNER_TEST(T3060_yaca_decrypt_final_invalid_param, YacaTest)
+{
+    size_t plaintext_len = 0;
+    KeyIvPair key_iv_pair;
+    auto dec_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+    auto plaintext_ptr = out_buf_alloc(dec_ctx_ptr, DATA.size(), plaintext_len);
+    auto inv_ctx_ptr = encrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CBC, key_iv_pair.key, key_iv_pair.iv);
+
+    YACA_INVALID_PARAM(yaca_decrypt_finalize(YACA_CONTEXT_NULL, plaintext_ptr.get(),
+                                             &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_finalize(dec_ctx_ptr.get(), nullptr, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_finalize(dec_ctx_ptr.get(), plaintext_ptr.get(), nullptr));
+
+    YACA_INVALID_PARAM(yaca_decrypt_finalize(inv_ctx_ptr.get(), plaintext_ptr.get(),
+                                             &plaintext_len));
+}
+
+RUNNER_TEST(T3070_yaca_get_iv_bits_invalid_param, YacaTest)
+{
+    const size_t KEY_LEN = 256;
+    size_t iv_bit_len;
+    const size_t INVALID_KEY_BIT_LENGTH = 512;
+
+    YACA_INVALID_PARAM(yaca_encrypt_get_iv_bit_length(static_cast<yaca_encrypt_algorithm_e>(-1),
+                                                      YACA_BCM_CBC, KEY_LEN, &iv_bit_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_get_iv_bit_length(YACA_ENCRYPT_AES,
+                                                      static_cast<yaca_block_cipher_mode_e>(-1),
+                                                      KEY_LEN, &iv_bit_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_get_iv_bit_length(YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                                      INVALID_KEY_BIT_LENGTH, &iv_bit_len));
+
+    YACA_INVALID_PARAM(yaca_encrypt_get_iv_bit_length(YACA_ENCRYPT_AES, YACA_BCM_CBC,
+                                                      KEY_LEN, nullptr));
+}
+
+RUNNER_TEST(T3075_yaca_key_wrap_unwrap_invalid_param, YacaTest)
+{
+    size_t wrapped_len = 0;
+    size_t unwrapped_len = 0;
+
+    KeyPtr key = generate_key(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT);
+    KeyPtr iv = null_key();
+    Buffer key_data = random_buffer(YACA_KEY_LENGTH_192BIT / 8);
+
+    CtxPtr enc_ctx = encrypt_init(YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_WRAP, key, iv);
+    CtxPtr dec_ctx = decrypt_init(YACA_ENCRYPT_3DES_3TDEA, YACA_BCM_WRAP, key, iv);
+
+    ChrPtr wrapped = out_buf_alloc(enc_ctx, key_data.size(), wrapped_len);
+    ChrPtr unwrapped = out_buf_alloc(dec_ctx, wrapped_len, unwrapped_len);
+
+    YACA_INVALID_PARAM(yaca_encrypt_finalize(enc_ctx.get(), wrapped.get(), &wrapped_len));
+    YACA_INVALID_PARAM(yaca_encrypt_update(enc_ctx.get(), key_data.data(), YACA_KEY_LENGTH_UNSAFE_64BIT / 8,
+                                           wrapped.get(), &wrapped_len));
+    YACA_INVALID_PARAM(yaca_encrypt_update(enc_ctx.get(), key_data.data(), YACA_KEY_LENGTH_512BIT / 8,
+                                           wrapped.get(), &wrapped_len));
+    YACA_SUCCESS(yaca_encrypt_update(enc_ctx.get(), key_data.data(), key_data.size(),
+                                     wrapped.get(), &wrapped_len));
+
+    // only a single update is allowed
+    YACA_INVALID_PARAM(yaca_encrypt_update(enc_ctx.get(), key_data.data(), key_data.size(),
+                                           wrapped.get(), &wrapped_len));
+
+    YACA_INVALID_PARAM(yaca_decrypt_finalize(dec_ctx.get(), wrapped.get(), &wrapped_len));
+    YACA_INVALID_PARAM(yaca_decrypt_update(dec_ctx.get(), wrapped.get(), wrapped_len - 1,
+                                           unwrapped.get(),&unwrapped_len));
+    YACA_SUCCESS(yaca_decrypt_update(dec_ctx.get(), wrapped.get(), wrapped_len,
+                                     unwrapped.get(), &unwrapped_len));
+
+    // only a single update is allowed
+    YACA_INVALID_PARAM(yaca_decrypt_update(dec_ctx.get(), wrapped.get(), wrapped_len,
+                                           unwrapped.get(), &unwrapped_len));
+}
+
+RUNNER_TEST(T3080_yaca_encrypt_decrypt_init_param_comb, YacaTest)
+{
+    auto tvv = loadTestVector("encrypt_param_comb.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        size_t key_len;
+        size_t iv_len;
+        bool valid;
+
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key_len", key_len);
+        tv.get("iv_len", iv_len);
+        tv.get("valid", valid);
+
+        check_test_vector_init(algo, bcm, key_len, iv_len, valid);
+    }
+}
+
+RUNNER_TEST(T3090_yaca_encrypt_update_finalize_output_comp, YacaTest)
+{
+    test_encryption_output("encrypt_output_comparison.txt");
+    test_encryption_output("encrypt_output_comparison_rc2_cast5_nopad.txt", false);
+    test_encryption_output("encrypt_output_comparison_rc4.txt");
+    test_encryption_output("encrypt_output_comparison_wrap.txt");
+}
+
+RUNNER_TEST(T3100_yaca_encrypt_decrypt_comparison, YacaTest)
+{
+    test_encryption_decryption("encrypt_valid_param.txt");
+    test_encryption_decryption("encrypt_valid_param_wrap.txt");
+}
+
+RUNNER_TEST(T3110_yaca_aes_gcm_call_order_invalid_param, YacaTest)
+{
+    KeyIvPair key_iv_pair;
+    size_t tag_len = 14;
+    auto tag = create_yaca_buffer(tag_len);
+    auto aad = random_buffer(16);
+    Buffer encrypt_output;
+    Buffer decrypt_output;
+
+    // encryption
+    auto enc_ctx_ptr = encrypt_init(YACA_ENCRYPT_AES, YACA_BCM_GCM,
+                                    key_iv_pair.key, key_iv_pair.iv);
+    size_t update_len = 0;
+    auto update_ptr = out_buf_alloc(enc_ctx_ptr, DATA.size(), update_len);
+    size_t final_len = 0;
+    auto final_ptr = out_buf_alloc(enc_ctx_ptr, 0, final_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                           aad.data(), aad.size()));
+
+    YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                     update_ptr.get(), &update_len));
+    encrypt_output.insert(encrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+
+    YACA_SUCCESS(yaca_encrypt_finalize(enc_ctx_ptr.get(), final_ptr.get(), &final_len));
+    encrypt_output.insert(encrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                           (void*)&tag_len, sizeof(tag_len)));
+    YACA_SUCCESS(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                           (void**)tag.get(), &tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+
+    // decryption
+    auto dec_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_GCM,
+                                    key_iv_pair.key, key_iv_pair.iv);
+    update_ptr = out_buf_alloc(dec_ctx_ptr, encrypt_output.size(), update_len);
+    final_ptr = out_buf_alloc(dec_ctx_ptr, 0, final_len);
+
+    YACA_INVALID_PARAM(yaca_context_get_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                           aad.data(), aad.size()));
+
+    YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), encrypt_output.data(), encrypt_output.size(),
+                                     update_ptr.get(), &update_len));
+    decrypt_output.insert(decrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+    YACA_INVALID_PARAM(yaca_context_get_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 tag.get(), tag_len + 42));
+
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                           tag.get(), tag_len));
+
+    YACA_SUCCESS(yaca_decrypt_finalize(dec_ctx_ptr.get(), final_ptr.get(), &final_len));
+    decrypt_output.insert(decrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+    YACA_INVALID_PARAM(yaca_context_get_property(dec_ctx_ptr.get(), YACA_PROPERTY_GCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+
+    YACA_ASSERT_MSG(DATA.size() == decrypt_output.size(), "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(DATA == decrypt_output, "Text after encrypt-decrypt has changed\n");
+}
+
+RUNNER_TEST(T3120_yaca_aes_ccm_call_order_invalid_param, YacaTest)
+{
+    KeyPtr key = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+    KeyPtr iv = generate_key(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_IV_64BIT);
+    size_t tag_len = 16;
+    auto tag = create_yaca_buffer(tag_len);
+    auto aad = random_buffer(16);
+    Buffer encrypt_output;
+    Buffer decrypt_output;
+
+    // encryption
+    auto enc_ctx_ptr = encrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CCM, key, iv);
+    size_t update_len = 0;
+    auto update_ptr = out_buf_alloc(enc_ctx_ptr, DATA.size(), update_len);
+    size_t final_len = 0;
+    auto final_ptr = out_buf_alloc(enc_ctx_ptr, 0, final_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                           (void*)&tag_len, sizeof(tag_len)));
+
+    YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), NULL, DATA.size(), NULL, &update_len));
+    YACA_SUCCESS(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                           aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+
+    YACA_SUCCESS(yaca_encrypt_update(enc_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                     update_ptr.get(), &update_len));
+    encrypt_output.insert(encrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+    YACA_INVALID_PARAM(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+
+    YACA_SUCCESS(yaca_encrypt_finalize(enc_ctx_ptr.get(), final_ptr.get(), &final_len));
+    encrypt_output.insert(encrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+    YACA_SUCCESS(yaca_context_get_property(enc_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                           (void**)tag.get(), &tag_len));
+
+    // decryption
+    auto dec_ctx_ptr = decrypt_init(YACA_ENCRYPT_AES, YACA_BCM_CCM, key, iv);
+    update_ptr = out_buf_alloc(dec_ctx_ptr, encrypt_output.size(), update_len);
+    final_ptr = out_buf_alloc(dec_ctx_ptr, 0, final_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+    YACA_INVALID_PARAM(yaca_context_get_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 tag.get(), tag_len + 42));
+
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                           tag.get(), tag_len));
+
+    YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), NULL, encrypt_output.size(),
+                                     NULL, &update_len));
+    YACA_SUCCESS(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                           aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 tag.get(), tag_len));
+
+    YACA_SUCCESS(yaca_decrypt_update(dec_ctx_ptr.get(), encrypt_output.data(), encrypt_output.size(),
+                                     update_ptr.get(), &update_len));
+    decrypt_output.insert(decrypt_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+    YACA_INVALID_PARAM(yaca_context_get_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+
+    YACA_SUCCESS(yaca_decrypt_finalize(dec_ctx_ptr.get(), final_ptr.get(), &final_len));
+    decrypt_output.insert(decrypt_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_AAD,
+                                                 aad.data(), aad.size()));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 tag.get(), tag_len));
+    YACA_INVALID_PARAM(yaca_context_set_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG_LEN,
+                                                 (void*)&tag_len, sizeof(tag_len)));
+    YACA_INVALID_PARAM(yaca_context_get_property(dec_ctx_ptr.get(), YACA_PROPERTY_CCM_TAG,
+                                                 (void**)tag.get(), &tag_len));
+
+    YACA_ASSERT_MSG(DATA.size() == decrypt_output.size(), "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(DATA == decrypt_output, "Text after encrypt-decrypt has changed\n");
+}
+
+RUNNER_TEST(T3130_yaca_aes_gcm_tag_len_combs_invalid_param, YacaTest)
+{
+    auto tvv = loadTestVector("encrypt_aes_gcm_tag_len.txt");
+
+    for (const auto& tv : tvv) {
+        size_t key_len;
+        size_t iv_len;
+        size_t tag_len;
+        bool valid;
+
+        tv.get("key_len", key_len);
+        tv.get("iv_len", iv_len);
+        tv.get("tag_len", tag_len);
+        tv.get("valid", valid);
+
+        test_vector_gcm_tag_len(key_len, iv_len, tag_len, valid);
+    }
+}
+
+RUNNER_TEST(T3140_yaca_aes_ccm_tag_len_combs_invalid_param, YacaTest)
+{
+    auto tvv = loadTestVector("encrypt_aes_ccm_tag_len.txt");
+
+    for (const auto& tv : tvv) {
+        size_t key_len;
+        size_t iv_len;
+        size_t tag_len;
+        bool valid;
+
+        tv.get("key_len", key_len);
+        tv.get("iv_len", iv_len);
+        tv.get("tag_len", tag_len);
+        tv.get("valid", valid);
+
+        test_vector_ccm_tag_len(key_len, iv_len, tag_len, valid);
+    }
+}
+
+RUNNER_TEST(T3150_yaca_aes_gcm_ccm_output_comparison, YacaTest)
+{
+    auto tvv = loadTestVector("encrypt_output_comparison_aes_gcm_ccm.txt");
+
+    for (const auto& tv : tvv) {
+        Buffer input;
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        Buffer key;
+        Buffer iv;
+        Buffer aad;
+        Buffer tag;
+        Buffer output;
+
+        tv.get("input", input);
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key", key);
+        tv.get("iv", iv);
+        tv.get("aad", aad);
+        tv.get("tag", tag);
+        tv.get("output", output);
+
+        bcm == YACA_BCM_GCM ? aes_gcm_test_output(input, algo, bcm, key, iv, aad, tag, output)
+                            : aes_ccm_test_output(input, algo, bcm, key, iv, aad, tag, output);
+    }
+}
diff --git a/src/yaca/yaca-test-key.cpp b/src/yaca/yaca-test-key.cpp
new file mode 100644 (file)
index 0000000..efb1017
--- /dev/null
@@ -0,0 +1,917 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ */
+
+#include "dpl/test/test_runner.h"
+
+#include <stdint.h>
+
+#include <yaca_key.h>
+#include <yaca_types.h>
+#include <yaca_error.h>
+
+#include "yaca-test-common.h"
+#include "yaca-test-vector.h"
+
+namespace {
+
+bool is_key_private(yaca_key_type_e key_type)
+{
+    switch (key_type) {
+    case YACA_KEY_TYPE_RSA_PRIV:
+    case YACA_KEY_TYPE_DSA_PRIV:
+    case YACA_KEY_TYPE_DH_PRIV:
+    case YACA_KEY_TYPE_EC_PRIV:
+        return true;
+    default:
+        return false;
+    }
+}
+
+void key_gen_test(yaca_key_type_e expected_type, size_t expected_bits)
+{
+    size_t bits;
+    yaca_key_type_e type;
+    size_t mask = 0xFFFFFFFF;
+
+    if (expected_type == YACA_KEY_TYPE_DH_PRIV)
+        mask = YACA_KEYLEN_COMPONENT_DH_PRIME_MASK;
+
+    auto key_ptr = generate_key(expected_type, expected_bits);
+
+    YACA_SUCCESS(yaca_key_get_bit_length(key_ptr.get(), &bits));
+    YACA_ASSERT_MSG(bits == (expected_bits & mask),
+                    "Expected key length: " << expected_bits << " got: " << bits);
+
+    YACA_SUCCESS(yaca_key_get_type(key_ptr.get(), &type));
+    YACA_ASSERT_MSG(type == expected_type,
+                    "Expected key type: " << expected_type << " got: " << type);
+
+    bool do_params_test = false;
+    yaca_key_type_e params_type;
+
+    switch (expected_type) {
+    case YACA_KEY_TYPE_DSA_PRIV:
+        do_params_test = true;
+        params_type = YACA_KEY_TYPE_DSA_PARAMS;
+        break;
+    case YACA_KEY_TYPE_DH_PRIV:
+        do_params_test = true;
+        params_type = YACA_KEY_TYPE_DH_PARAMS;
+        break;
+    case YACA_KEY_TYPE_EC_PRIV:
+        do_params_test = true;
+        params_type = YACA_KEY_TYPE_EC_PARAMS;
+        break;
+    default:
+        break;
+    }
+
+    if (do_params_test) {
+        auto key_params = generate_key(params_type, expected_bits);
+
+        YACA_SUCCESS(yaca_key_get_bit_length(key_params.get(), &bits));
+        YACA_ASSERT_MSG(bits == (expected_bits & mask),
+                        "Expected key length: " << expected_bits << " got: " << bits);
+
+        YACA_SUCCESS(yaca_key_get_type(key_params.get(), &type));
+        YACA_ASSERT_MSG(type == params_type,
+                        "Expected key type: " << params_type << " got: " << type);
+
+        auto key_prv = generate_key_from_parameters(key_params);
+
+        YACA_SUCCESS(yaca_key_get_bit_length(key_ptr.get(), &bits));
+        YACA_ASSERT_MSG(bits == (expected_bits & mask),
+                        "Expected key length: " << expected_bits << " got: " << bits);
+
+        YACA_SUCCESS(yaca_key_get_type(key_ptr.get(), &type));
+        YACA_ASSERT_MSG(type == expected_type,
+                        "Expected key type: " << expected_type << " got: " << type);
+    }
+}
+
+void key_gen_invalid_param(yaca_key_type_e key_type,
+                           size_t key_bit_len,
+                           yaca_key_h *key)
+{
+    YACA_INVALID_PARAM(yaca_key_generate(key_type, key_bit_len, key));
+
+    YACA_ASSERT_MSG(key == nullptr || *key == YACA_KEY_NULL,
+                    "Non-empty key returned from a function that failed");
+}
+
+void key_gen_from_params_invalid_param(yaca_key_h params,
+                                       yaca_key_h *key)
+{
+    YACA_INVALID_PARAM(yaca_key_generate_from_parameters(params, key));
+
+    YACA_ASSERT_MSG(key == nullptr || *key == YACA_KEY_NULL,
+                    "Non-empty key returned from a function that failed");
+}
+
+void key_extract_public_invalid_param(yaca_key_h key,
+                                      yaca_key_h *pub)
+{
+    YACA_INVALID_PARAM(yaca_key_extract_public(key, pub));
+
+    YACA_ASSERT_MSG(pub == nullptr || *pub == YACA_KEY_NULL,
+                    "Non-empty key returned from a function that failed");
+}
+
+void key_extract_params_invalid_param(yaca_key_h key,
+                                      yaca_key_h *params)
+{
+    YACA_INVALID_PARAM(yaca_key_extract_parameters(key, params));
+
+    YACA_ASSERT_MSG(params == nullptr || *params == YACA_KEY_NULL,
+                    "Non-empty key returned from a function that failed");
+}
+
+void import_key_wrong_password(yaca_key_type_e key_type,
+                               const std::string &password,
+                               const char *data,
+                               size_t data_len)
+{
+    yaca_key_h key = YACA_KEY_NULL;
+    std::string password_wrong = password + "!";
+
+    if (password.size() > 0) {
+        YACA_RESULT(YACA_ERROR_INVALID_PASSWORD,
+                    yaca_key_import(key_type, "", data, data_len, &key));
+
+        YACA_ASSERT_MSG(key == YACA_KEY_NULL,
+                        "Non-empty key returned from a function that failed");
+
+        YACA_RESULT(YACA_ERROR_INVALID_PASSWORD,
+                    yaca_key_import(key_type, nullptr, data, data_len, &key));
+
+        YACA_ASSERT_MSG(key == YACA_KEY_NULL,
+                        "Non-empty key returned from a function that failed");
+    }
+
+    YACA_RESULT(YACA_ERROR_INVALID_PASSWORD,
+                yaca_key_import(key_type, password_wrong.c_str(), data, data_len, &key));
+
+    YACA_ASSERT_MSG(key == YACA_KEY_NULL,
+                    "Non-empty key returned from a function that failed");
+}
+
+void assert_keys_equal(const KeyPtr &key1,
+                       const KeyPtr &key2)
+{
+    yaca_key_format_e key_fmt = YACA_KEY_FORMAT_DEFAULT;
+    yaca_key_file_format_e key_file_fmt = static_cast<yaca_key_file_format_e>(-1); // fix clang
+    yaca_key_type_e key1_type;
+    yaca_key_type_e key2_type;
+
+    YACA_SUCCESS(yaca_key_get_type(key1.get(), &key1_type));
+    YACA_SUCCESS(yaca_key_get_type(key2.get(), &key2_type));
+
+    YACA_ASSERT_MSG(key1_type == key2_type, "Key types are not equal");
+
+    switch(key1_type) {
+    case YACA_KEY_TYPE_SYMMETRIC:
+    case YACA_KEY_TYPE_DES:
+    case YACA_KEY_TYPE_IV:
+        key_file_fmt = YACA_KEY_FILE_FORMAT_RAW;
+        break;
+    case YACA_KEY_TYPE_RSA_PUB:
+    case YACA_KEY_TYPE_RSA_PRIV:
+    case YACA_KEY_TYPE_DSA_PUB:
+    case YACA_KEY_TYPE_DSA_PRIV:
+    case YACA_KEY_TYPE_DSA_PARAMS:
+    case YACA_KEY_TYPE_DH_PUB:
+    case YACA_KEY_TYPE_DH_PRIV:
+    case YACA_KEY_TYPE_DH_PARAMS:
+    case YACA_KEY_TYPE_EC_PUB:
+    case YACA_KEY_TYPE_EC_PRIV:
+    case YACA_KEY_TYPE_EC_PARAMS:
+        key_file_fmt = YACA_KEY_FILE_FORMAT_DER;
+        break;
+    default:
+        RUNNER_FAIL_MSG("Wrong key_type passed");
+    }
+
+    size_t key1_len;
+    ChrPtr key1_data = export_key(key1, key_fmt, key_file_fmt, nullptr, &key1_len);
+
+    size_t key2_len;
+    ChrPtr key2_data = export_key(key2, key_fmt, key_file_fmt, nullptr, &key2_len);
+
+    YACA_ASSERT_MSG(key1_len == key2_len, "Compared keys are not of equal length");
+    YACA_SUCCESS(yaca_memcmp(key1_data.get(), key2_data.get(), key1_len));
+}
+
+} // anonymous namespace
+
+RUNNER_TEST_GROUP_INIT(T4000_YACA_KEY);
+
+
+RUNNER_TEST(T4006_yaca_key_destroy, YacaTest)
+{
+    yaca_key_destroy(YACA_KEY_NULL);
+
+    yaca_key_h key;
+    YACA_SUCCESS(yaca_key_generate(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT, &key));
+
+    yaca_key_destroy(key);
+}
+
+RUNNER_TEST(T4010_yaca_key_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+
+    key_gen_invalid_param(static_cast<yaca_key_type_e>(-1), YACA_KEY_LENGTH_256BIT, &out);
+    key_gen_from_params_invalid_param(nullptr, &out);
+    key_extract_public_invalid_param(nullptr, &out);
+    key_extract_params_invalid_param(nullptr, &out);
+}
+
+RUNNER_TEST(T4020_yaca_key_symmetric_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+
+    key_gen_invalid_param(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_SYMMETRIC, 0, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_SYMMETRIC, 1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_SYMMETRIC, 69, &out);
+}
+
+RUNNER_TEST(T4030_yaca_key_iv_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+
+    key_gen_invalid_param(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_256BIT, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_IV, 0, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_IV, 1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_IV, 69, &out);
+}
+
+RUNNER_TEST(T4040_yaca_key_des_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+
+    key_gen_invalid_param(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_DES, 0, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DES, 1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DES, 69, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DES, 72, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_256BIT, &out);
+}
+
+RUNNER_TEST(T4050_yaca_key_rsa_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+    KeyPtr priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    KeyPtr pub = extract_public_key(priv);
+
+    key_gen_invalid_param(YACA_KEY_TYPE_RSA_PUB, YACA_KEY_LENGTH_1024BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_UNSAFE_128BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_RSA_PRIV, 1023, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_EC_PRIME256V1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256, &out);
+
+    key_gen_from_params_invalid_param(priv.get(), &out);
+    key_gen_from_params_invalid_param(pub.get(), &out);
+
+    key_extract_public_invalid_param(priv.get(), nullptr);
+    key_extract_public_invalid_param(pub.get(), &out);
+
+    key_extract_params_invalid_param(priv.get(), &out);
+    key_extract_params_invalid_param(pub.get(), &out);
+}
+
+RUNNER_TEST(T4060_yaca_key_dsa_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+    KeyPtr priv = generate_key(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    KeyPtr pub = extract_public_key(priv);
+    KeyPtr params = extract_parameters(priv);
+
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PUB, YACA_KEY_LENGTH_1024BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PARAMS, YACA_KEY_LENGTH_1024BIT, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_UNSAFE_128BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PARAMS, YACA_KEY_LENGTH_UNSAFE_128BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PRIV, 1016, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PARAMS, 1016, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PRIV, 1023, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PARAMS, 1023, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_256BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PARAMS, YACA_KEY_LENGTH_256BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_EC_PRIME256V1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PARAMS, YACA_KEY_LENGTH_EC_PRIME256V1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DSA_PARAMS, YACA_KEY_LENGTH_DH_RFC_2048_256, &out);
+
+    key_gen_from_params_invalid_param(params.get(), nullptr);
+    key_gen_from_params_invalid_param(priv.get(), &out);
+    key_gen_from_params_invalid_param(pub.get(), &out);
+
+    key_extract_public_invalid_param(priv.get(), nullptr);
+    key_extract_public_invalid_param(pub.get(), &out);
+
+    key_extract_params_invalid_param(priv.get(), nullptr);
+    key_extract_params_invalid_param(params.get(), &out);
+}
+
+RUNNER_TEST(T4065_yaca_key_dh_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+    KeyPtr priv = generate_key(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256);
+    KeyPtr pub = extract_public_key(priv);
+    KeyPtr params = extract_parameters(priv);
+
+    key_gen_invalid_param(YACA_KEY_TYPE_DH_PUB, YACA_KEY_LENGTH_DH_RFC_2048_256, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_DH_PARAMS, YACA_KEY_LENGTH_DH_RFC_2048_256, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_512BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DH_PARAMS, YACA_KEY_LENGTH_512BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_EC_PRIME256V1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_DH_PARAMS, YACA_KEY_LENGTH_EC_PRIME256V1, &out);
+
+    key_gen_from_params_invalid_param(params.get(), nullptr);
+    key_gen_from_params_invalid_param(priv.get(), &out);
+    key_gen_from_params_invalid_param(pub.get(), &out);
+
+    key_extract_public_invalid_param(priv.get(), nullptr);
+    key_extract_public_invalid_param(pub.get(), &out);
+
+    key_extract_params_invalid_param(priv.get(), nullptr);
+    key_extract_params_invalid_param(params.get(), &out);
+}
+
+RUNNER_TEST(T4070_yaca_key_ec_invalid_param, YacaTest)
+{
+    yaca_key_h out = YACA_KEY_NULL;
+    KeyPtr priv = generate_key(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_PRIME256V1);
+    KeyPtr pub = extract_public_key(priv);
+    KeyPtr params = extract_parameters(priv);
+
+    key_gen_invalid_param(YACA_KEY_TYPE_EC_PUB, YACA_KEY_LENGTH_EC_PRIME256V1, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_PRIME256V1, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_EC_PARAMS, YACA_KEY_LENGTH_EC_PRIME256V1, nullptr);
+    key_gen_invalid_param(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_512BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_EC_PARAMS, YACA_KEY_LENGTH_512BIT, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256, &out);
+    key_gen_invalid_param(YACA_KEY_TYPE_EC_PARAMS, YACA_KEY_LENGTH_DH_RFC_2048_256, &out);
+
+    key_gen_from_params_invalid_param(params.get(), nullptr);
+    key_gen_from_params_invalid_param(priv.get(), &out);
+    key_gen_from_params_invalid_param(pub.get(), &out);
+
+    key_extract_public_invalid_param(priv.get(), nullptr);
+    key_extract_public_invalid_param(pub.get(), &out);
+
+    key_extract_params_invalid_param(priv.get(), nullptr);
+    key_extract_params_invalid_param(params.get(), &out);
+}
+
+RUNNER_TEST(T4080_yaca_key_generate_symmetric, YacaTest)
+{
+    key_gen_test(YACA_KEY_TYPE_SYMMETRIC, 8);
+    key_gen_test(YACA_KEY_TYPE_SYMMETRIC, 72);
+    key_gen_test(YACA_KEY_TYPE_SYMMETRIC, 24);
+    key_gen_test(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_512BIT);
+    key_gen_test(YACA_KEY_TYPE_SYMMETRIC, 1016);
+    key_gen_test(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_4096BIT);
+    key_gen_test(YACA_KEY_TYPE_SYMMETRIC, 8192);
+}
+
+RUNNER_TEST(T4090_yaca_key_generate_iv, YacaTest)
+{
+    key_gen_test(YACA_KEY_TYPE_IV, 8);
+    key_gen_test(YACA_KEY_TYPE_IV, 72);
+    key_gen_test(YACA_KEY_TYPE_IV, 24);
+    key_gen_test(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_512BIT);
+    key_gen_test(YACA_KEY_TYPE_IV, 1016);
+    key_gen_test(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_4096BIT);
+    key_gen_test(YACA_KEY_TYPE_IV, 8192);
+}
+
+RUNNER_TEST(T4100_yaca_key_generate_des, YacaTest)
+{
+    key_gen_test(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_64BIT);
+    key_gen_test(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_UNSAFE_128BIT);
+    key_gen_test(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT);
+}
+
+RUNNER_TEST(T4110_yaca_key_generate_rsa, YacaTest)
+{
+    key_gen_test(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    key_gen_test(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    key_gen_test(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_2048BIT);
+    key_gen_test(YACA_KEY_TYPE_RSA_PRIV, 1016);
+}
+
+RUNNER_TEST(T4120_yaca_key_generate_dsa, YacaTest)
+{
+    key_gen_test(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    key_gen_test(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    key_gen_test(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_2048BIT);
+    key_gen_test(YACA_KEY_TYPE_DSA_PRIV, 1088);
+}
+
+RUNNER_TEST(T4130_yaca_key_generate_dh, YacaTest)
+{
+    key_gen_test(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_GENERATOR_2 | 333);
+    key_gen_test(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_GENERATOR_5 | 512);
+    key_gen_test(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_1024_160);
+    key_gen_test(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_224);
+    key_gen_test(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256);
+}
+
+RUNNER_TEST(T4140_yaca_key_generate_ec, YacaTest)
+{
+    // This curve doesn't work on fedora:
+    //key_gen_test(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_PRIME192V1);
+    key_gen_test(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_PRIME256V1);
+    key_gen_test(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_SECP256K1);
+    key_gen_test(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_SECP384R1);
+    key_gen_test(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_SECP521R1);
+}
+
+RUNNER_TEST(T4200_yaca_key_get_type_invalid_param, YacaTest)
+{
+    yaca_key_type_e type;
+
+    YACA_INVALID_PARAM(yaca_key_get_type(YACA_KEY_NULL, &type));
+
+    auto key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_512BIT);
+
+    YACA_INVALID_PARAM(yaca_key_get_type(key_ptr.get(), nullptr));
+}
+
+RUNNER_TEST(T4210_yaca_key_get_bits_invalid_param, YacaTest)
+{
+    size_t bits;
+
+    YACA_INVALID_PARAM(yaca_key_get_bit_length(YACA_KEY_NULL, &bits));
+
+    auto key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_512BIT);
+
+    YACA_INVALID_PARAM(yaca_key_get_bit_length(key_ptr.get(), nullptr));
+}
+
+RUNNER_TEST(T4220_yaca_key_export_invalid_param, YacaTest)
+{
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 1024);
+    KeyPtr key_rsa = generate_key(YACA_KEY_TYPE_RSA_PRIV, 1024);
+    KeyPtr key_rsa_pub = extract_public_key(key_rsa);
+    char *data;
+    size_t data_len;
+
+    YACA_INVALID_PARAM(yaca_key_export(nullptr,
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_BASE64,
+                                       nullptr, &data, &data_len));
+
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_BASE64,
+                                       nullptr, nullptr, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_BASE64,
+                                       nullptr, &data, nullptr));
+
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_BASE64,
+                                       "pass", &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       static_cast<yaca_key_format_e>(-1),
+                                       YACA_KEY_FILE_FORMAT_BASE64,
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       static_cast<yaca_key_file_format_e>(-1),
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_PEM,
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_DER,
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_sym.get(),
+                                       YACA_KEY_FORMAT_PKCS8,
+                                       YACA_KEY_FILE_FORMAT_PEM,
+                                       nullptr, &data, &data_len));
+
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa.get(),
+                                       static_cast<yaca_key_format_e>(-1),
+                                       YACA_KEY_FILE_FORMAT_PEM,
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       static_cast<yaca_key_file_format_e>(-1),
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_BASE64,
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_RAW,
+                                       nullptr, &data, &data_len));
+
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa_pub.get(),
+                                       YACA_KEY_FORMAT_PKCS8,
+                                       YACA_KEY_FILE_FORMAT_PEM,
+                                       nullptr, &data, &data_len));
+
+    /* passing password with a key/format that doesn't support it */
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_DER,
+                                       "pass", &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa_pub.get(),
+                                       YACA_KEY_FORMAT_DEFAULT,
+                                       YACA_KEY_FILE_FORMAT_PEM,
+                                       "pass", &data, &data_len));
+
+    /* not passing a password with a format that requires it */
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa.get(),
+                                       YACA_KEY_FORMAT_PKCS8,
+                                       YACA_KEY_FILE_FORMAT_PEM,
+                                       nullptr, &data, &data_len));
+    YACA_INVALID_PARAM(yaca_key_export(key_rsa.get(),
+                                       YACA_KEY_FORMAT_PKCS8,
+                                       YACA_KEY_FILE_FORMAT_PEM,
+                                       "", &data, &data_len));
+}
+
+RUNNER_TEST(T4230_yaca_key_import_invalid_param, YacaTest)
+{
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+    size_t key_sym_data_len;
+    ChrPtr key_sym_data = export_key(key_sym, YACA_KEY_FORMAT_DEFAULT,
+                                     YACA_KEY_FILE_FORMAT_BASE64,
+                                     nullptr, &key_sym_data_len);
+
+    KeyPtr key_rsa = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    size_t key_rsa_data_len;
+    ChrPtr key_rsa_data = export_key(key_rsa, YACA_KEY_FORMAT_DEFAULT,
+                                     YACA_KEY_FILE_FORMAT_DER,
+                                     nullptr, &key_rsa_data_len);
+
+    KeyPtr key_rsa_pub = extract_public_key(key_rsa);
+    size_t key_rsa_pub_data_len;
+    ChrPtr key_rsa_pub_data = export_key(key_rsa_pub, YACA_KEY_FORMAT_DEFAULT,
+                                         YACA_KEY_FILE_FORMAT_PEM,
+                                         nullptr, &key_rsa_pub_data_len);
+
+    const char *inv_data1 = "qwertyuiopasdfghjklzxcvbnmqwerty";
+    size_t inv_data1_len = strlen(inv_data1);
+    const char *inv_data2 = "--------qwertyuiopasdfghjklzxcvbnm";
+    size_t inv_data2_len = strlen(inv_data2);
+    yaca_key_h out;
+
+    YACA_INVALID_PARAM(yaca_key_import(static_cast<yaca_key_type_e>(-1), nullptr,
+                                       key_sym_data.get(), key_sym_data_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_SYMMETRIC, "pass",
+                                       key_sym_data.get(), key_sym_data_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_SYMMETRIC, nullptr,
+                                       nullptr, key_sym_data_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_SYMMETRIC, nullptr,
+                                       key_sym_data.get(), 0, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_DES, nullptr,
+                                       key_sym_data.get(), key_sym_data_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_SYMMETRIC, nullptr,
+                                       inv_data2, SIZE_MAX / 2, &out));
+
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PUB, nullptr,
+                                       key_rsa_data.get(), key_rsa_data_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_DSA_PRIV, nullptr,
+                                       key_rsa_data.get(), key_rsa_data_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PRIV, nullptr,
+                                       key_rsa_data.get(), key_rsa_data_len - 1, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PRIV, nullptr,
+                                       inv_data1, inv_data1_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PRIV, nullptr,
+                                       inv_data2, inv_data2_len, &out));
+
+    /* implementation specific tests, might go away at some point */
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PRIV, nullptr,
+                                       key_rsa_data.get(), static_cast<size_t>(INT_MAX) + 1, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PRIV, nullptr,
+                                       key_rsa_data.get(), 3, &out));
+
+    /* passing password with a key/format that doesn't support it */
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PRIV, "pass",
+                                       key_rsa_data.get(), key_rsa_data_len, &out));
+    YACA_INVALID_PARAM(yaca_key_import(YACA_KEY_TYPE_RSA_PUB, "pass",
+                                       key_rsa_pub_data.get(), key_rsa_pub_data_len, &out));
+}
+
+RUNNER_TEST(T4233_yaca_key_derive_dh_invalid_param, YacaTest)
+{
+    char *secret;
+    size_t secret_len;
+
+    KeyPtr key_dh_priv = generate_key(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256);
+    KeyPtr key_dh_pub = extract_public_key(key_dh_priv);
+
+    KeyPtr key_dh_priv_2048_224 = generate_key(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_224);
+    KeyPtr key_dh_pub_2048_224 = extract_public_key(key_dh_priv_2048_224);
+
+    KeyPtr key_ecdh_priv = generate_key(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_SECP521R1);
+    KeyPtr key_ecdh_pub = extract_public_key(key_ecdh_priv);
+
+    KeyPtr key_ecdh_priv_256V1 = generate_key(YACA_KEY_TYPE_EC_PRIV, YACA_KEY_LENGTH_EC_PRIME256V1);
+    KeyPtr key_ecdh_pub_256V1 = extract_public_key(key_ecdh_priv_256V1);
+
+    KeyPtr key_rsa_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    KeyPtr key_rsa_pub = extract_public_key(key_rsa_priv);
+
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(null_key().get(), key_dh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_pub.get(), key_dh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_dh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_pub.get(), key_dh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_rsa_priv.get(), key_dh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_rsa_pub.get(), key_dh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_sym.get(), key_dh_pub.get(), &secret, &secret_len));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(null_key().get(), key_ecdh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_ecdh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_pub.get(), key_ecdh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_pub.get(), key_ecdh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_rsa_priv.get(), key_ecdh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_rsa_pub.get(), key_ecdh_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_sym.get(), key_ecdh_pub.get(), &secret, &secret_len));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), null_key().get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_dh_priv.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_ecdh_priv.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_rsa_priv.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_rsa_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_sym.get(), &secret, &secret_len));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), null_key().get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_dh_priv.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_ecdh_priv.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_rsa_priv.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_rsa_pub.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_sym.get(), &secret, &secret_len));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_rsa_priv.get(), key_rsa_pub.get(), &secret, &secret_len));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_dh_pub.get(), nullptr, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_ecdh_priv.get(), nullptr, &secret_len));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_dh_pub.get(), &secret, nullptr));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_ecdh_pub.get(), &secret, nullptr));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv.get(), key_dh_pub_2048_224.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_dh_priv_2048_224.get(), key_dh_pub.get(), &secret, &secret_len));
+
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv.get(), key_ecdh_pub_256V1.get(), &secret, &secret_len));
+    YACA_INVALID_PARAM(yaca_key_derive_dh(key_ecdh_priv_256V1.get(), key_ecdh_pub.get(), &secret, &secret_len));
+}
+
+RUNNER_TEST(T4236_yaca_key_derive_kdf_invalid_param, YacaTest)
+{
+    yaca_kdf_e kdf = YACA_KDF_X942;
+    yaca_digest_algorithm_e digest = YACA_DIGEST_SHA512;
+    size_t secret_len;
+    char *info = NULL;
+    size_t info_len = 0;
+    char *key_material;
+
+    KeyPtr key_dh_priv = generate_key(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256);
+    KeyPtr peer_key_dh_priv = generate_key(YACA_KEY_TYPE_DH_PRIV, YACA_KEY_LENGTH_DH_RFC_2048_256);
+    KeyPtr peer_key_dh_pub = extract_public_key(peer_key_dh_priv);
+
+    ChrPtr secret = key_derive_dh(key_dh_priv, peer_key_dh_pub, &secret_len);
+
+    YACA_INVALID_PARAM(yaca_key_derive_kdf(static_cast<yaca_kdf_e>(-1),
+                                           digest, secret.get(), secret_len, info, info_len, 512, &key_material));
+    YACA_INVALID_PARAM(yaca_key_derive_kdf(kdf, static_cast<yaca_digest_algorithm_e>(-1),
+                                           secret.get(), secret_len, info, info_len, 512, &key_material));
+    YACA_INVALID_PARAM(yaca_key_derive_kdf(kdf, digest, nullptr, secret_len, info, info_len, 512, &key_material));
+    YACA_INVALID_PARAM(yaca_key_derive_kdf(kdf, digest, secret.get(), 0, info, info_len, 512, &key_material));
+    YACA_INVALID_PARAM(yaca_key_derive_kdf(kdf, digest, secret.get(), secret_len, info, info_len, 0, &key_material));
+    YACA_INVALID_PARAM(yaca_key_derive_kdf(kdf, digest, secret.get(), secret_len, info, info_len, 512, nullptr));
+}
+
+RUNNER_TEST(T4240_yaca_key_derive_pbkdf2_invalid_param, YacaTest)
+{
+    yaca_key_h key;
+
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2(nullptr, "salt", 4, 1, YACA_DIGEST_MD5, 128, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", nullptr, 4, 1, YACA_DIGEST_MD5, 128, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", nullptr, 1, 1, YACA_DIGEST_MD5, 128, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", "salt", 0, 1, YACA_DIGEST_MD5, 128, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", "salt", 4, 0, YACA_DIGEST_MD5, 128, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", "salt", 4, 1,
+                                              static_cast<yaca_digest_algorithm_e>(-1),128, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", "salt", 4, 1, YACA_DIGEST_MD5, 0, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", "salt", 4, 1, YACA_DIGEST_MD5, 127, &key));
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", "salt", 4, 1, YACA_DIGEST_MD5, 128, nullptr));
+
+    /* implementation specific tests, might go away at some point */
+    YACA_INVALID_PARAM(yaca_key_derive_pbkdf2("pass", "salt", 4, static_cast<size_t>(INT_MAX) + 1,
+                                              YACA_DIGEST_MD5, 128, &key));
+}
+
+RUNNER_TEST(T4250_yaca_key_export_import, YacaTest)
+{
+    auto tvv = loadTestVector("key.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_key_type_e key_type;
+        size_t key_len_bits;
+        yaca_key_format_e key_format;
+        yaca_key_file_format_e key_file_format;
+        std::string password;
+
+        tv.get("key_type", key_type);
+        tv.get("key_len_bits", key_len_bits);
+        tv.get("key_format", key_format);
+        tv.get("key_file_format", key_file_format);
+        tv.get("password", password);
+
+        KeyPtr key = generate_key(key_type, key_len_bits);
+
+        size_t key_data_len;
+        ChrPtr key_data = export_key(key, key_format, key_file_format, password.c_str(), &key_data_len);
+        KeyPtr key_imp = import_key(key_type, password.c_str(), key_data.get(), key_data_len);
+
+        assert_keys_equal(key, key_imp);
+
+        /* password test for asymmetric DEFAULT PEM */
+        if (key_format == YACA_KEY_FORMAT_DEFAULT && is_key_private(key_type) &&
+            key_file_format == YACA_KEY_FILE_FORMAT_PEM)
+            import_key_wrong_password(key_type, password, key_data.get(), key_data_len);
+
+        /* password test for asymmetric PKCS8 PEM and DER */
+        if (key_format == YACA_KEY_FORMAT_PKCS8 && is_key_private(key_type))
+            import_key_wrong_password(key_type, password, key_data.get(), key_data_len);
+
+        /* public key and params test for asymmetric DEFAULT PEM and DER */
+        if (key_format == YACA_KEY_FORMAT_DEFAULT && is_key_private(key_type)) {
+            yaca_key_type_e key_pub_type = static_cast<yaca_key_type_e>(-1);
+            yaca_key_type_e key_params_type = static_cast<yaca_key_type_e>(-1);
+
+            switch (key_type) {
+            case YACA_KEY_TYPE_RSA_PRIV:
+                key_pub_type = YACA_KEY_TYPE_RSA_PUB;
+                break;
+            case YACA_KEY_TYPE_DSA_PRIV:
+                key_pub_type = YACA_KEY_TYPE_DSA_PUB;
+                key_params_type = YACA_KEY_TYPE_DSA_PARAMS;
+                break;
+            case YACA_KEY_TYPE_DH_PRIV:
+                key_pub_type = YACA_KEY_TYPE_DH_PUB;
+                key_params_type = YACA_KEY_TYPE_DH_PARAMS;
+                break;
+            case YACA_KEY_TYPE_EC_PRIV:
+                key_pub_type = YACA_KEY_TYPE_EC_PUB;
+                key_params_type = YACA_KEY_TYPE_EC_PARAMS;
+                break;
+            default:
+                RUNNER_FAIL_MSG("Wrong key_type passed");
+            }
+
+            if (key_pub_type != static_cast<yaca_key_type_e>(-1)) {
+                KeyPtr key_pub = extract_public_key(key);
+                size_t key_pub_data_len;
+                ChrPtr key_pub_data = export_key(key_pub, key_format, key_file_format, nullptr, &key_pub_data_len);
+                KeyPtr key_pub_imp = import_key(key_pub_type, nullptr, key_pub_data.get(), key_pub_data_len);
+
+                assert_keys_equal(key_pub, key_pub_imp);
+            }
+
+            if (key_params_type != static_cast<yaca_key_type_e>(-1)) {
+                KeyPtr key_params = extract_parameters(key);
+                size_t key_params_data_len;
+                ChrPtr key_params_data = export_key(key_params, key_format, key_file_format, nullptr, &key_params_data_len);
+                KeyPtr key_params_imp = import_key(key_params_type, nullptr, key_params_data.get(), key_params_data_len);
+
+                assert_keys_equal(key_params, key_params_imp);
+            }
+        }
+    }
+}
+
+RUNNER_TEST(T4260_yaca_key_import_x509, YacaTest)
+{
+    auto tvv = loadTestVector("key_x509.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_key_type_e key_type;
+        Buffer cert_data;
+        Buffer pub_key_data;
+
+        tv.get("key_type", key_type);
+        tv.get("cert", cert_data);
+        tv.get("pub_key", pub_key_data);
+
+        KeyPtr cert_key = import_key(key_type, nullptr, cert_data.data(), cert_data.size());
+        KeyPtr pub_key = import_key(key_type, nullptr, pub_key_data.data(), pub_key_data.size());
+
+        assert_keys_equal(cert_key, pub_key);
+    }
+}
+
+RUNNER_TEST(T4263_yaca_key_derive_dh, YacaTest)
+{
+    auto tvv = loadTestVector("key_derive_dh.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_key_type_e prv_key_type;
+        Buffer prv_key_data;
+        yaca_key_type_e pub_key_type;
+        Buffer pub_key_data;
+        Buffer secret_data;
+
+        tv.get("prv_key_type", prv_key_type);
+        tv.get("prv_key", prv_key_data);
+        tv.get("pub_key_type", pub_key_type);
+        tv.get("pub_key", pub_key_data);
+        tv.get("secret", secret_data);
+
+        KeyPtr prv_key = import_key(prv_key_type, nullptr, prv_key_data.data(), prv_key_data.size());
+        KeyPtr pub_key = import_key(pub_key_type, nullptr, pub_key_data.data(), pub_key_data.size());
+
+        size_t secret_len;
+        ChrPtr derived_secret = key_derive_dh(prv_key, pub_key, &secret_len);
+
+        YACA_ASSERT_MSG(secret_data.size() == secret_len, "Compared secrets are not of equal length");
+        YACA_SUCCESS(yaca_memcmp(secret_data.data(), derived_secret.get(), secret_data.size()));
+    }
+}
+
+RUNNER_TEST(T4266_yaca_key_derive_kdf, YacaTest)
+{
+    auto tvv = loadTestVector("key_derive_kdf.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_kdf_e kdf;
+        yaca_digest_algorithm_e algo;
+        Buffer secret;
+        Buffer info;
+        Buffer key_material;
+
+        tv.get("kdf", kdf);
+        tv.get("algo", algo);
+        tv.get("secret", secret);
+        tv.get("info", info);
+        tv.get("key_material", key_material);
+
+        ChrPtr derived_key_material = key_derive_kdf(kdf, algo, secret.data(), secret.size(),
+                                                     info.data(), info.size(), key_material.size());
+
+        YACA_SUCCESS(yaca_memcmp(key_material.data(), derived_key_material.get(), key_material.size()));
+    }
+}
+
+RUNNER_TEST(T4270_yaca_key_derive_pbkdf2, YacaTest)
+{
+    auto tvv = loadTestVector("key_pbkdf2.txt");
+
+    for (const auto& tv : tvv) {
+        std::string password;
+        Buffer salt;
+        size_t iter;
+        yaca_digest_algorithm_e algo;
+        size_t key_bit_len;
+        Buffer key_data;
+
+        tv.get("password", password);
+        tv.get("salt", salt);
+        tv.get("iter", iter);
+        tv.get("algo", algo);
+        tv.get("key_bit_len", key_bit_len);
+        tv.get("key", key_data);
+
+        KeyPtr key_expected = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
+        KeyPtr key_derived = key_derive_pbkdf2(password.c_str(), salt.data(), salt.size(), iter, algo, key_bit_len);
+
+        assert_keys_equal(key_expected, key_derived);
+    }
+}
diff --git a/src/yaca/yaca-test-rsa.cpp b/src/yaca/yaca-test-rsa.cpp
new file mode 100644 (file)
index 0000000..89634ac
--- /dev/null
@@ -0,0 +1,332 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ */
+
+#include <vector>
+
+#include "dpl/test/test_runner.h"
+
+#include <yaca_rsa.h>
+#include <yaca_types.h>
+#include <yaca_key.h>
+
+#include "yaca-test-common.h"
+#include "yaca-test-vector.h"
+#include "lorem.h"
+
+
+namespace {
+
+const size_t SHORT_ENOUGH = 16;
+
+typedef int (*CryptoOp)(yaca_padding_e, const yaca_key_h, const char *, size_t, char **, size_t *);
+
+void rsa_invalid_param(CryptoOp op,
+                       yaca_padding_e padding,
+                       const yaca_key_h key,
+                       const char *input,
+                       size_t input_len,
+                       char **output,
+                       size_t *output_len)
+{
+    if (output != nullptr)
+        *output = nullptr;
+    if (output_len != nullptr)
+        *output_len = 0;
+
+    YACA_INVALID_PARAM(op(padding, key, input, input_len, output, output_len));
+}
+
+void test_rsa_common_invalid_param(CryptoOp op, const KeyPtr& valid_key,
+                                   const char *input, size_t input_len)
+{
+    char *output = nullptr;
+    size_t output_len;
+
+    auto sym_key = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+    auto iv = generate_key(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_IV_128BIT);
+    auto dsa_param = generate_key(YACA_KEY_TYPE_DSA_PARAMS, YACA_KEY_LENGTH_1024BIT);
+    auto dsa_priv = generate_key_from_parameters(dsa_param);
+    auto dsa_pub = extract_public_key(dsa_priv);
+
+    YACA_INVALID_PARAM(op(static_cast<yaca_padding_e>(-1), valid_key.get(),
+                          input, input_len,
+                          &output, &output_len));
+
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, YACA_KEY_NULL,
+                          input, input_len,
+                          &output, &output_len));
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, dsa_pub.get(),
+                          input, input_len,
+                          &output, &output_len));
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, sym_key.get(),
+                          input, input_len,
+                          &output, &output_len));
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, iv.get(),
+                          input, input_len,
+                          &output, &output_len));
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, dsa_param.get(),
+                          input, input_len,
+                          &output, &output_len));
+
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, valid_key.get(),
+                          nullptr, SHORT_ENOUGH,
+                          &output, &output_len));
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, valid_key.get(),
+                          input, 0,
+                          &output, &output_len));
+
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, valid_key.get(),
+                          input, input_len,
+                          nullptr, &output_len));
+    YACA_INVALID_PARAM(op(YACA_PADDING_PKCS1, valid_key.get(),
+                          input, input_len,
+                          &output, nullptr));
+}
+
+enum EncryptionType
+{
+    ET_NONE = 0,
+    ET_PUB = 1 << 0,
+    ET_PRV = 1 << 1
+};
+
+struct PaddingInfo {
+    yaca_padding_e padding;
+    int supported_encryption;
+    size_t padding_size;
+    bool exact;
+};
+
+const std::vector<PaddingInfo> PADDINGS = {
+    { YACA_PADDING_NONE,         ET_PUB | ET_PRV, 0,  true  },
+    { YACA_PADDING_X931,         ET_NONE,         0,  false },
+    { YACA_PADDING_PKCS1,        ET_PUB | ET_PRV, 11, false },
+    { YACA_PADDING_PKCS1_PSS,    ET_NONE,         0,  false },
+    { YACA_PADDING_PKCS1_OAEP,   ET_PUB,          42, false },
+    { YACA_PADDING_PKCS1_SSLV23, ET_PUB,          11, false },
+    { YACA_PADDING_PKCS7,        ET_NONE,         0,  false }
+};
+
+void test_rsa_padding(const KeyPair& kp, const PaddingInfo& pi, EncryptionType et)
+{
+    char *tmp;
+    size_t ciphertext_len;
+    size_t plaintext_len;
+    int expected;
+
+    yaca_padding_e padding = pi.padding;
+    size_t max_len = kp.bit_len / 8 - pi.padding_size;
+    const KeyPtr& enc_key = (et == ET_PUB) ? kp.pub : kp.prv;
+    const KeyPtr& dec_key = (et == ET_PUB) ? kp.prv : kp.pub;
+    CryptoOp encrypt = (et == ET_PUB) ? yaca_rsa_public_encrypt : yaca_rsa_private_encrypt;
+    CryptoOp decrypt = (et == ET_PUB) ? yaca_rsa_private_decrypt : yaca_rsa_public_decrypt;
+
+    /* padding not suitable for this operation */
+    if ((pi.supported_encryption & et) == 0) {
+        YACA_INVALID_PARAM(encrypt(pi.padding, enc_key.get(),
+                                   lorem1024, SHORT_ENOUGH,
+                                   &tmp, &ciphertext_len));
+        return;
+    }
+
+    /* input too long */
+    YACA_INVALID_PARAM(encrypt(padding, enc_key.get(),
+                               lorem1024, max_len + 1,
+                               &tmp, &ciphertext_len));
+
+    /* input shorter than max len */
+    expected = pi.exact ? YACA_ERROR_INVALID_PARAMETER : YACA_ERROR_NONE;
+    tmp = NULL;
+    YACA_RESULT(expected, encrypt(padding, enc_key.get(),
+                                  lorem1024, max_len - 1,
+                                  &tmp, &ciphertext_len));
+    yaca_free(tmp);
+    tmp = NULL;
+    YACA_RESULT(expected, encrypt(padding, enc_key.get(),
+                                  nullptr, 0,
+                                  &tmp, &ciphertext_len));
+    yaca_free(tmp);
+
+    /* valid length */
+    tmp = NULL;
+    YACA_SUCCESS(encrypt(padding, enc_key.get(),
+                         lorem1024, max_len,
+                         &tmp, &ciphertext_len));
+
+    auto ciphertext = wrap_ptr(tmp);
+
+    YACA_ASSERT_MSG(ciphertext != nullptr, "Empty ciphertext");
+    YACA_ASSERT_MSG(ciphertext_len == kp.bit_len / 8,
+                    "Expected ciphertext length: " << kp.bit_len / 8 <<
+                    " got: " << ciphertext_len);
+
+    /* decrypt with incorrect paddings */
+    for (auto& p : PADDINGS) {
+        /* don't decrypt with the same padding except for SSLV23 */
+        if (p.padding == padding && p.padding != YACA_PADDING_PKCS1_SSLV23)
+            continue;
+
+        /*
+         * - YACA_PADDING_PKCS1 & YACA_PADDING_PKCS1_SSLV23 are compatible in case of
+         *   public_encrypt/private_decrypt
+         * - YACA_PADDING_NONE checks only the input length
+         */
+        expected = YACA_ERROR_INVALID_PARAMETER;
+        if (p.padding == YACA_PADDING_NONE ||
+            (et == ET_PUB && ((p.padding == YACA_PADDING_PKCS1 && padding == YACA_PADDING_PKCS1_SSLV23) ||
+                              (p.padding == YACA_PADDING_PKCS1_SSLV23 && padding == YACA_PADDING_PKCS1))))
+            expected = YACA_ERROR_NONE;
+
+        YACA_RESULT(expected, decrypt(p.padding, dec_key.get(),
+                                      ciphertext.get(), ciphertext_len,
+                                      &tmp, &plaintext_len));
+    }
+
+    /* decryption with SSLV23 will fail if it was used during encryption */
+    if (padding == YACA_PADDING_PKCS1_SSLV23)
+        padding = YACA_PADDING_PKCS1;
+
+    /*
+     * Shortened ciphertext. During encryption without padding OpenSSL allows
+     * input of length equal to the key length but during decryption it allows
+     * also shorter input. Yaca API does the same.
+     */
+    if (padding != YACA_PADDING_NONE)
+        YACA_INVALID_PARAM(decrypt(padding, dec_key.get(),
+                                   ciphertext.get(), ciphertext_len - 1,
+                                   &tmp, &plaintext_len));
+
+    /* extended ciphertext */
+    std::vector<char> extended(ciphertext.get(), ciphertext.get() + ciphertext_len);
+    extended.push_back(' ');
+    YACA_INVALID_PARAM(decrypt(padding, dec_key.get(),
+                               extended.data(), extended.size(),
+                               &tmp, &plaintext_len));
+
+    /* valid ciphertext */
+    YACA_SUCCESS(decrypt(padding, dec_key.get(),
+                         ciphertext.get(), ciphertext_len,
+                         &tmp, &plaintext_len));
+    ChrPtr plaintext = wrap_ptr(tmp);
+
+    RUNNER_ASSERT_MSG(plaintext_len == max_len,
+                      "Decrypted message has different length (" << plaintext_len <<
+                      "B) than the original (" << max_len << "B)");
+
+    YACA_SUCCESS(yaca_memcmp(plaintext.get(), lorem1024, plaintext_len));
+}
+
+} // anonymous namespace
+
+RUNNER_TEST_GROUP_INIT(T9000_YACA_RSA);
+
+RUNNER_TEST(T9010_yaca_rsa_public_encrypt_invalid_param, YacaTest)
+{
+    char *ciphertext = nullptr;
+    size_t ciphertext_len;
+
+    KeyPair rsa(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+
+    test_rsa_common_invalid_param(yaca_rsa_public_encrypt, rsa.pub, lorem1024, SHORT_ENOUGH);
+
+    rsa_invalid_param(yaca_rsa_public_encrypt, YACA_PADDING_PKCS1, rsa.prv.get(),
+                      lorem1024, SHORT_ENOUGH,
+                      &ciphertext, &ciphertext_len);
+}
+
+RUNNER_TEST(T9020_yaca_rsa_private_decrypt_invalid_param, YacaTest)
+{
+    char *tmp;
+    size_t ciphertext_len;
+    char *plaintext = nullptr;
+    size_t plaintext_len;
+
+    KeyPair rsa(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+
+    YACA_SUCCESS(yaca_rsa_public_encrypt(YACA_PADDING_PKCS1, rsa.pub.get(),
+                                         lorem1024, SHORT_ENOUGH,
+                                         &tmp, &ciphertext_len));
+
+    ChrPtr ciphertext = wrap_ptr(tmp);
+
+    test_rsa_common_invalid_param(yaca_rsa_private_decrypt, rsa.prv,
+                                  ciphertext.get(), ciphertext_len);
+
+    rsa_invalid_param(yaca_rsa_private_decrypt, YACA_PADDING_PKCS1, rsa.pub.get(),
+                      ciphertext.get(), ciphertext_len,
+                      &plaintext, &plaintext_len);
+}
+
+RUNNER_TEST(T9030_yaca_rsa_private_encrypt_invalid_param, YacaTest)
+{
+    char *ciphertext = nullptr;
+    size_t ciphertext_len;
+
+    KeyPair rsa(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+
+    test_rsa_common_invalid_param(yaca_rsa_private_encrypt, rsa.prv, lorem1024, SHORT_ENOUGH);
+
+    rsa_invalid_param(yaca_rsa_private_encrypt, YACA_PADDING_PKCS1, rsa.pub.get(),
+                      lorem1024, SHORT_ENOUGH,
+                      &ciphertext, &ciphertext_len);
+}
+
+RUNNER_TEST(T9040_yaca_rsa_public_decrypt_invalid_param, YacaTest)
+{
+    char *tmp;
+    size_t ciphertext_len;
+    char *plaintext = nullptr;
+    size_t plaintext_len;
+
+    KeyPair rsa(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+
+    YACA_SUCCESS(yaca_rsa_private_encrypt(YACA_PADDING_PKCS1, rsa.prv.get(),
+                                          lorem1024, SHORT_ENOUGH,
+                                          &tmp, &ciphertext_len));
+
+    ChrPtr ciphertext = wrap_ptr(tmp);
+
+    test_rsa_common_invalid_param(yaca_rsa_public_decrypt, rsa.pub,
+                                  ciphertext.get(), ciphertext_len);
+
+    rsa_invalid_param(yaca_rsa_public_decrypt, YACA_PADDING_PKCS1, rsa.prv.get(),
+                      ciphertext.get(), ciphertext_len,
+                      &plaintext, &plaintext_len);
+}
+
+RUNNER_TEST(T9050_yaca_rsa_encryption_paddings, YacaTest)
+{
+    std::vector<KeyPair> key_pairs;
+    key_pairs.emplace_back(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    key_pairs.emplace_back(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    key_pairs.emplace_back(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_2048BIT);
+    key_pairs.emplace_back(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_3072BIT);
+    key_pairs.emplace_back(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_4096BIT);
+
+    for (auto& kp : key_pairs) {
+        for (auto& pi : PADDINGS) {
+            test_rsa_padding(kp, pi, ET_PUB);
+            test_rsa_padding(kp, pi, ET_PRV);
+        }
+    }
+}
diff --git a/src/yaca/yaca-test-seal.cpp b/src/yaca/yaca-test-seal.cpp
new file mode 100644 (file)
index 0000000..d3a11d7
--- /dev/null
@@ -0,0 +1,334 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ */
+
+#include "dpl/test/test_runner.h"
+#include "yaca-test-common.h"
+#include "yaca-test-vector.h"
+
+#include <yaca_seal.h>
+#include <yaca_encrypt.h>
+#include <yaca_key.h>
+
+namespace {
+
+const Buffer DATA = random_buffer(1024);
+
+typedef std::vector<KeyPair> KeyPairs;
+
+void test_vector_seal_open(yaca_encrypt_algorithm_e algo,
+                           yaca_block_cipher_mode_e bcm,
+                           size_t sym_key_len,
+                           const KeyPtr &rsa_priv,
+                           const KeyPtr &rsa_pub)
+{
+    Buffer seal_output;
+    Buffer open_output;
+    size_t update_len = 0;
+    size_t final_len = 0;
+    KeyPtr sym_key = null_key();
+    KeyPtr iv = null_key();
+
+    CtxPtr seal_ctx = seal_init(rsa_pub, algo, bcm, sym_key_len, sym_key, iv);
+    CtxPtr open_ctx = open_init(rsa_priv, algo, bcm, sym_key_len, sym_key, iv);
+
+    ChrPtr update_ptr = out_buf_alloc(seal_ctx, DATA.size(), update_len);
+    ChrPtr final_ptr = out_buf_alloc(seal_ctx, 0, final_len);
+
+    YACA_SUCCESS(yaca_seal_update(seal_ctx.get(), DATA.data(), DATA.size(), update_ptr.get(), &update_len));
+    seal_output.insert(seal_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+
+    YACA_SUCCESS(yaca_seal_finalize(seal_ctx.get(), final_ptr.get(), &final_len));
+    seal_output.insert(seal_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    update_ptr = out_buf_alloc(open_ctx, seal_output.size(), update_len);
+    final_ptr = out_buf_alloc(open_ctx, 0, final_len);
+
+    YACA_SUCCESS(yaca_open_update(open_ctx.get(), seal_output.data(), seal_output.size(),
+                                  update_ptr.get(), &update_len));
+    open_output.insert(open_output.end(), update_ptr.get(), update_ptr.get() + update_len);
+
+    YACA_SUCCESS(yaca_open_finalize(open_ctx.get(), final_ptr.get(), &final_len));
+    open_output.insert(open_output.end(), final_ptr.get(), final_ptr.get() + final_len);
+
+    YACA_ASSERT_MSG(DATA.size() == open_output.size(), "Size after seal-open differs\n");
+    YACA_ASSERT_MSG(DATA == open_output, "Text after seal-open has changed\n");
+}
+
+}//namespace anonymous
+
+RUNNER_TEST_GROUP_INIT(T5000_YACA_SEAL);
+
+RUNNER_TEST(T5010_yaca_seal_init_invalid_param, YacaTest)
+{
+    yaca_context_h ctx;
+    yaca_key_h sym_key;
+    yaca_key_h iv;
+
+    yaca_encrypt_algorithm_e algo = YACA_ENCRYPT_UNSAFE_RC2;
+    yaca_block_cipher_mode_e bcm = YACA_BCM_CBC;
+    size_t sym_key_bit_len = YACA_KEY_LENGTH_192BIT;
+
+    auto rsa_priv_key_ptr = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub_key_ptr = extract_public_key(rsa_priv_key_ptr);
+
+    auto dsa_priv_key_ptr = generate_key(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto dsa_pub_key_ptr = extract_public_key(dsa_priv_key_ptr);
+    auto dsa_params_ptr = extract_parameters(dsa_priv_key_ptr);
+
+    auto aes_key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+
+    YACA_INVALID_PARAM(yaca_seal_initialize(nullptr, rsa_pub_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            &sym_key, &iv));
+
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, YACA_KEY_NULL, algo, bcm, sym_key_bit_len,
+                                            &sym_key, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_priv_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            &sym_key, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, dsa_priv_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            &sym_key, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, dsa_pub_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            &sym_key, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, dsa_params_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            &sym_key, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, aes_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            &sym_key, &iv));
+
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_pub_key_ptr.get(),
+                                            static_cast<yaca_encrypt_algorithm_e>(-1),
+                                            bcm, sym_key_bit_len, &sym_key, &iv));
+
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_pub_key_ptr.get(), algo,
+                                            static_cast<yaca_block_cipher_mode_e>(-1),
+                                            sym_key_bit_len, &sym_key, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_pub_key_ptr.get(), algo, YACA_BCM_WRAP, sym_key_bit_len,
+                                            &sym_key, &iv));
+
+    // sym_key_bit_len must be at least 88 bits shorter than RSA key bit length
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_pub_key_ptr.get(), algo, bcm, YACA_KEY_LENGTH_1024BIT,
+                                            &sym_key, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_pub_key_ptr.get(), algo, bcm, 63, &sym_key, &iv));
+
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_pub_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            nullptr, &iv));
+    YACA_INVALID_PARAM(yaca_seal_initialize(&ctx, rsa_pub_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            &sym_key, nullptr));
+}
+
+RUNNER_TEST(T5020_yaca_seal_update_invalid_param, YacaTest)
+{
+    size_t ciphertext_len = 0;
+    KeyPtr sym_key = null_key();
+    KeyPtr iv = null_key();
+
+    auto rsa_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub = extract_public_key(rsa_priv);
+
+    auto seal_ctx_ptr = seal_init(rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+    auto open_ctx_ptr = open_init(rsa_priv, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+
+    auto ciphertext_ptr = out_buf_alloc(seal_ctx_ptr, DATA.size(), ciphertext_len);
+
+    YACA_INVALID_PARAM(yaca_seal_update(YACA_CONTEXT_NULL, DATA.data(), DATA.size(),
+                                        ciphertext_ptr.get(), &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_seal_update(open_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                        ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_seal_update(seal_ctx_ptr.get(), nullptr, DATA.size(),
+                                        ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_seal_update(seal_ctx_ptr.get(), DATA.data(), 0,
+                                        ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_seal_update(seal_ctx_ptr.get(), nullptr, 0,
+                                        ciphertext_ptr.get(), &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_seal_update(seal_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                        nullptr, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_seal_update(seal_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                        ciphertext_ptr.get(), nullptr));
+}
+
+RUNNER_TEST(T5030_yaca_seal_final_invalid_param, YacaTest)
+{
+    size_t ciphertext_len = 0;
+    KeyPtr sym_key = null_key();
+    KeyPtr iv = null_key();
+
+    auto rsa_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub = extract_public_key(rsa_priv);
+
+    auto seal_ctx_ptr = seal_init(rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+    auto open_ctx_ptr = open_init(rsa_priv, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+
+    auto ciphertext_ptr = out_buf_alloc(seal_ctx_ptr, DATA.size(), ciphertext_len);
+
+    YACA_INVALID_PARAM(yaca_seal_finalize(YACA_CONTEXT_NULL, ciphertext_ptr.get(), &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_seal_finalize(open_ctx_ptr.get(), ciphertext_ptr.get(), &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_seal_finalize(seal_ctx_ptr.get(), nullptr, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_seal_finalize(seal_ctx_ptr.get(), ciphertext_ptr.get(), nullptr));
+}
+
+RUNNER_TEST(T5040_yaca_open_init_invalid_param, YacaTest)
+{
+    yaca_context_h ctx;
+    KeyPtr sym_key = null_key();
+    KeyPtr iv = null_key();
+
+    yaca_encrypt_algorithm_e algo = YACA_ENCRYPT_AES;
+    yaca_block_cipher_mode_e bcm = YACA_BCM_CBC;
+    size_t sym_key_bit_len = YACA_KEY_LENGTH_192BIT;
+
+    auto rsa_priv_key_ptr = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub_key_ptr = extract_public_key(rsa_priv_key_ptr);
+
+    auto seal_ctx_ptr = seal_init(rsa_pub_key_ptr, algo, bcm, sym_key_bit_len, sym_key, iv);
+
+    auto dsa_priv_key_ptr = generate_key(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto dsa_pub_key_ptr = extract_public_key(dsa_priv_key_ptr);
+    auto dsa_params_ptr = extract_parameters(dsa_priv_key_ptr);
+
+    auto aes_key_ptr = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+
+    YACA_INVALID_PARAM(yaca_open_initialize(nullptr, rsa_priv_key_ptr.get(), algo, bcm,
+                                            sym_key_bit_len, sym_key.get(), iv.get()));
+
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, YACA_KEY_NULL, algo, bcm, sym_key_bit_len,
+                                            sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_pub_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, dsa_priv_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, dsa_pub_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, dsa_params_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, aes_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            sym_key.get(), iv.get()));
+
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(),
+                                            static_cast<yaca_encrypt_algorithm_e>(-1),
+                                            bcm, sym_key_bit_len, sym_key.get(), iv.get()));
+
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(), algo,
+                                            static_cast<yaca_block_cipher_mode_e>(-1),
+                                            sym_key_bit_len, sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(), algo, YACA_BCM_WRAP,
+                                            sym_key_bit_len, sym_key.get(), iv.get()));
+
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(), algo, bcm, 512,
+                                            sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(), algo, bcm, 64,
+                                            sym_key.get(), iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(), algo, bcm, 63,
+                                            sym_key.get(), iv.get()));
+
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            YACA_KEY_NULL, iv.get()));
+    YACA_INVALID_PARAM(yaca_open_initialize(&ctx, rsa_priv_key_ptr.get(), algo, bcm, sym_key_bit_len,
+                                            sym_key.get(), YACA_KEY_NULL));
+}
+
+RUNNER_TEST(T5050_yaca_open_update_invalid_param, YacaTest)
+{
+    size_t plaintext_len = 0;
+    KeyPtr sym_key = null_key();
+    KeyPtr iv = null_key();
+
+    auto rsa_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub = extract_public_key(rsa_priv);
+
+    auto seal_ctx_ptr = seal_init(rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+    auto open_ctx_ptr = open_init(rsa_priv, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+
+    auto plaintext_ptr = out_buf_alloc(open_ctx_ptr, DATA.size(), plaintext_len);
+
+    YACA_INVALID_PARAM(yaca_open_update(YACA_CONTEXT_NULL, DATA.data(), DATA.size(),
+                                        plaintext_ptr.get(), &plaintext_len));
+    YACA_INVALID_PARAM(yaca_open_update(seal_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                        plaintext_ptr.get(), &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_open_update(open_ctx_ptr.get(), nullptr, DATA.size(),
+                                        plaintext_ptr.get(), &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_open_update(open_ctx_ptr.get(), DATA.data(), 0,
+                                        plaintext_ptr.get(), &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_open_update(open_ctx_ptr.get(), nullptr, 0,
+                                        plaintext_ptr.get(), &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_open_update(open_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                        nullptr, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_open_update(open_ctx_ptr.get(), DATA.data(), DATA.size(),
+                                        plaintext_ptr.get(), nullptr));
+}
+
+RUNNER_TEST(T5060_yaca_open_final_invalid_param, YacaTest)
+{
+    size_t plaintext_len = 0;
+    KeyPtr sym_key = null_key();
+    KeyPtr iv = null_key();
+
+    auto rsa_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub = extract_public_key(rsa_priv);
+
+    auto seal_ctx_ptr = seal_init(rsa_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+    auto open_ctx_ptr = open_init(rsa_priv, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_192BIT,
+                                  sym_key, iv);
+
+    auto plaintext_ptr = out_buf_alloc(open_ctx_ptr, DATA.size(), plaintext_len);
+
+    YACA_INVALID_PARAM(yaca_open_finalize(YACA_CONTEXT_NULL, plaintext_ptr.get(), &plaintext_len));
+    YACA_INVALID_PARAM(yaca_open_finalize(seal_ctx_ptr.get(), plaintext_ptr.get(), &plaintext_len));
+    YACA_INVALID_PARAM(yaca_open_finalize(open_ctx_ptr.get(), nullptr, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_open_finalize(open_ctx_ptr.get(), plaintext_ptr.get(), nullptr));
+}
+
+RUNNER_TEST(T5070_yaca_seal_open_comparison, YacaTest)
+{
+    auto tvv = loadTestVector("encrypt_valid_param.txt");
+    KeyPairs keys;
+    keys.push_back(KeyPair(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_3072BIT));
+    keys.push_back(KeyPair(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_4096BIT));
+
+    for (const auto& tv : tvv) {
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        size_t sym_key_len;
+
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key_len", sym_key_len);
+
+        for (const auto& key : keys)
+            test_vector_seal_open(algo, bcm, sym_key_len, key.prv, key.pub);
+    }
+}
diff --git a/src/yaca/yaca-test-sign.cpp b/src/yaca/yaca-test-sign.cpp
new file mode 100644 (file)
index 0000000..0a8d77b
--- /dev/null
@@ -0,0 +1,557 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ */
+
+#include <vector>
+
+#include "dpl/test/test_runner.h"
+
+#include <yaca_sign.h>
+#include <yaca_types.h>
+
+#include "yaca-test-common.h"
+#include "yaca-test-vector.h"
+#include "lorem.h"
+
+
+namespace {
+
+void sign_length_test(yaca_digest_algorithm_e algo,
+                      const KeyPtr &key)
+{
+    CtxPtr ctx = sign_init(algo, key);
+    size_t output_len;
+    size_t key_bit_len;
+
+    YACA_SUCCESS(yaca_key_get_bit_length(key.get(), &key_bit_len));
+
+    output_len = get_output_length(ctx);
+
+    YACA_ASSERT_MSG(output_len * 8 == key_bit_len,
+                    "Sign " << digest2str(algo) << " produces " << output_len * 8 <<
+                    " bit signature. Expected " << key_bit_len << " bits.");
+}
+
+} // anonymous namespace
+
+RUNNER_TEST_GROUP_INIT(T6000_YACA_SIGN);
+
+RUNNER_TEST(T6010_yaca_sign_init_invalid_param, YacaTest)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr pub = extract_public_key(prv);
+    KeyPtr sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+
+    YACA_INVALID_PARAM(yaca_sign_initialize(nullptr, YACA_DIGEST_MD5, prv.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, static_cast<yaca_digest_algorithm_e>(-1), prv.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL));
+    YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, pub.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize(&ctx, YACA_DIGEST_MD5, sym.get()));
+}
+
+RUNNER_TEST(T6020_yaca_sign_hmac_init_invalid_param, YacaTest)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+    KeyPtr sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr pub = extract_public_key(prv);
+
+    YACA_INVALID_PARAM(yaca_sign_initialize_hmac(nullptr, YACA_DIGEST_MD5, sym.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize_hmac(&ctx, static_cast<yaca_digest_algorithm_e>(-1), prv.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL));
+    YACA_INVALID_PARAM(yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, prv.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize_hmac(&ctx, YACA_DIGEST_MD5, pub.get()));
+}
+
+RUNNER_TEST(T6030_yaca_sign_cmac_init_invalid_param, YacaTest)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+    KeyPtr sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr pub = extract_public_key(prv);
+
+    YACA_INVALID_PARAM(yaca_sign_initialize_cmac(nullptr, YACA_ENCRYPT_AES, sym.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize_cmac(&ctx, static_cast<yaca_encrypt_algorithm_e>(-1), prv.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, YACA_KEY_NULL));
+    YACA_INVALID_PARAM(yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, prv.get()));
+    YACA_INVALID_PARAM(yaca_sign_initialize_cmac(&ctx, YACA_ENCRYPT_AES, pub.get()));
+}
+
+RUNNER_TEST(T6040_yaca_sign_update_invalid_param, YacaTest)
+{
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    CtxPtr ctx = sign_init(YACA_DIGEST_MD5, prv);
+    CtxPtr ctx_bad = digest_init(YACA_DIGEST_MD5);
+
+    YACA_INVALID_PARAM(yaca_sign_update(YACA_CONTEXT_NULL, lorem16, LOREM16_SIZE));
+    YACA_INVALID_PARAM(yaca_sign_update(ctx_bad.get(), lorem16, LOREM16_SIZE));
+    YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), nullptr, LOREM16_SIZE));
+    YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), lorem16, 0));
+}
+
+RUNNER_TEST(T6050_yaca_sign_final_invalid_param, YacaTest)
+{
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    CtxPtr ctx = sign_init(YACA_DIGEST_MD5, prv);
+    size_t sign_len = get_output_length(ctx);
+    ChrPtr sign = create_yaca_buffer(sign_len);
+
+    YACA_INVALID_PARAM(yaca_sign_finalize(YACA_CONTEXT_NULL, sign.get(), &sign_len));
+    YACA_INVALID_PARAM(yaca_sign_finalize(ctx.get(), nullptr, &sign_len));
+    YACA_INVALID_PARAM(yaca_sign_finalize(ctx.get(), sign.get(), nullptr));
+}
+
+RUNNER_TEST(T6060_yaca_verify_init_invalid_param)
+{
+    yaca_context_h ctx = YACA_CONTEXT_NULL;
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr pub = extract_public_key(prv);
+    KeyPtr sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_256BIT);
+
+    YACA_INVALID_PARAM(yaca_verify_initialize(nullptr, YACA_DIGEST_MD5, pub.get()));
+    YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, static_cast<yaca_digest_algorithm_e>(-1), prv.get()));
+    YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, YACA_KEY_NULL));
+    YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, prv.get()));
+    YACA_INVALID_PARAM(yaca_verify_initialize(&ctx, YACA_DIGEST_MD5, sym.get()));
+}
+
+RUNNER_TEST(T6070_yaca_verify_update_invalid_param)
+{
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr pub = extract_public_key(prv);
+    CtxPtr ctx = verify_init(YACA_DIGEST_MD5, pub);
+
+    YACA_INVALID_PARAM(yaca_sign_update(YACA_CONTEXT_NULL, lorem16, LOREM16_SIZE));
+    YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), nullptr, LOREM16_SIZE));
+    YACA_INVALID_PARAM(yaca_sign_update(ctx.get(), lorem16, 0));
+}
+
+RUNNER_TEST(T6080_yaca_verify_final_invalid_param)
+{
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr pub = extract_public_key(prv);
+    CtxPtr ctx = verify_init(YACA_DIGEST_MD5, pub);
+
+    YACA_INVALID_PARAM(yaca_verify_finalize(YACA_CONTEXT_NULL, lorem16, LOREM16_SIZE));
+    YACA_INVALID_PARAM(yaca_verify_finalize(ctx.get(), nullptr, LOREM16_SIZE));
+    YACA_INVALID_PARAM(yaca_verify_finalize(ctx.get(), lorem16, 0));
+}
+
+RUNNER_TEST(T6090_yaca_sign_get_output_length_invalid_param)
+{
+    KeyPtr prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr pub = extract_public_key(prv);
+    CtxPtr ctx = sign_init(YACA_DIGEST_MD5, prv);
+    CtxPtr ctx_vrf = verify_init(YACA_DIGEST_MD5, pub);
+    size_t output_len;
+
+    YACA_INVALID_PARAM(yaca_context_get_output_length(ctx_vrf.get(), 0, &output_len));
+    YACA_INVALID_PARAM(yaca_context_get_output_length(ctx.get(), 1, &output_len));
+    YACA_INVALID_PARAM(yaca_context_get_output_length(ctx.get(), 0, nullptr));
+}
+
+RUNNER_TEST(T6100_yaca_sign_set_property_invalid_param)
+{
+    KeyPtr key = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    KeyPtr key_pub = extract_public_key(key);
+    KeyPtr key_dsa = generate_key(YACA_KEY_TYPE_DSA_PRIV, YACA_KEY_LENGTH_512BIT);
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+    CtxPtr ctx_sgn = sign_init(YACA_DIGEST_SHA1, key);
+    CtxPtr ctx_vrf = verify_init(YACA_DIGEST_SHA1, key_pub);
+    CtxPtr ctx_dsa = sign_init(YACA_DIGEST_SHA1, key_dsa);
+    CtxPtr ctx_hmac = hmac_init(YACA_DIGEST_SHA1, key_sym);
+    CtxPtr ctx_digest = digest_init(YACA_DIGEST_SHA1);
+    yaca_padding_e padding = YACA_PADDING_PKCS1;
+    yaca_padding_e padding_wrong = static_cast<yaca_padding_e>(-1);
+
+    std::vector<CtxPtr> contexts;
+    contexts.push_back(std::move(ctx_sgn));
+    contexts.push_back(std::move(ctx_vrf));
+    for (const CtxPtr &ctx: contexts) {
+        YACA_INVALID_PARAM(yaca_context_set_property(ctx.get(), YACA_PROPERTY_GCM_TAG,
+                                                     static_cast<void*>(&padding),
+                                                     sizeof(yaca_padding_e)));
+        YACA_INVALID_PARAM(yaca_context_set_property(ctx.get(), YACA_PROPERTY_PADDING,
+                                                     nullptr,
+                                                     sizeof(yaca_padding_e)));
+        YACA_INVALID_PARAM(yaca_context_set_property(ctx.get(), YACA_PROPERTY_PADDING,
+                                                     static_cast<void*>(&padding_wrong),
+                                                     sizeof(yaca_padding_e)));
+        YACA_INVALID_PARAM(yaca_context_set_property(ctx.get(), YACA_PROPERTY_PADDING,
+                                                     static_cast<void*>(&padding),
+                                                     sizeof(yaca_padding_e) + 1));
+        YACA_INVALID_PARAM(yaca_context_set_property(ctx.get(), YACA_PROPERTY_PADDING,
+                                                     static_cast<void*>(&padding),
+                                                     0));
+    }
+
+    YACA_INVALID_PARAM(yaca_context_set_property(ctx_dsa.get(), YACA_PROPERTY_PADDING,
+                                                 static_cast<void*>(&padding),
+                                                 sizeof(yaca_padding_e)));
+    YACA_INVALID_PARAM(yaca_context_set_property(ctx_hmac.get(), YACA_PROPERTY_PADDING,
+                                                 static_cast<void*>(&padding),
+                                                 sizeof(yaca_padding_e)));
+    YACA_INVALID_PARAM(yaca_context_set_property(ctx_digest.get(), YACA_PROPERTY_PADDING,
+                                                 static_cast<void*>(&padding),
+                                                 sizeof(yaca_padding_e)));
+
+}
+
+RUNNER_TEST(T6120_yaca_sign_get_output_length)
+{
+    const std::vector<yaca_digest_algorithm_e> digests = {
+        YACA_DIGEST_MD5,
+        YACA_DIGEST_SHA1,
+        YACA_DIGEST_SHA224,
+        YACA_DIGEST_SHA256,
+        YACA_DIGEST_SHA384,
+        YACA_DIGEST_SHA512
+    };
+
+    const std::vector<yaca_key_bit_length_e> lengths = {
+        YACA_KEY_LENGTH_512BIT,
+        YACA_KEY_LENGTH_1024BIT,
+        YACA_KEY_LENGTH_2048BIT,
+        YACA_KEY_LENGTH_3072BIT,
+        YACA_KEY_LENGTH_4096BIT
+    };
+
+    std::vector<KeyPtr> keys;
+
+    /* pre-generate keys to shorten the test execution time */
+    for (auto &l: lengths)
+        keys.push_back(generate_key(YACA_KEY_TYPE_RSA_PRIV, l));
+
+    for (auto &d: digests)
+        for (const auto &k: keys)
+            sign_length_test(d, k);
+}
+
+RUNNER_TEST(T6130_yaca_sign_test_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_ascii.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        yaca_key_type_e key_type;
+        Buffer key_data;
+        size_t repeats;
+        std::string input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key_type", key_type);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(key_type, nullptr, key_data.data(), key_data.size());
+
+        CtxPtr ctx = sign_init(algo, key);
+        size_t output_len = get_output_length(ctx);
+
+        if (input.size() > 0)
+            for (size_t i = 0; i < repeats; i++)
+                YACA_SUCCESS(yaca_sign_update(ctx.get(),
+                                              input.c_str(),
+                                              input.size()));
+
+        Buffer output(output_len);
+        YACA_SUCCESS(yaca_sign_finalize(ctx.get(), output.data(), &output_len));
+        RUNNER_ASSERT_MSG(output.size() >= output_len,
+                          "Length returned from yaca_sign_finalize() (" << output_len <<
+                          ") is greater than the one returned from yaca_context_get_output_length() ("
+                          << output.size() << ")");
+        output.resize(output_len);
+
+        YACA_ASSERT_MSG(output.size() == expected.size(),
+                        "Signature calculated for \""  << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " and " << keytype2str(key_type)
+                        << " key is " << output.size() * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(output.data(), expected.data(), output.size());
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "Signature calculated for \"" << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " and " << keytype2str(key_type)
+                        << " key is different than expected");
+    }
+}
+
+RUNNER_TEST(T6140_yaca_sign_verify_test_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_verify_ascii.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        yaca_key_type_e key_type;
+        Buffer key_data;
+        size_t repeats;
+        std::string input;
+
+        tv.get("algo", algo);
+        tv.get("key_type", key_type);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+
+        KeyPtr key_prv = import_key(key_type, nullptr, key_data.data(), key_data.size());
+        KeyPtr key_pub = extract_public_key(key_prv);
+
+        CtxPtr ctx = sign_init(algo, key_prv);
+        size_t output_len = get_output_length(ctx);
+
+        if (input.size() > 0)
+            for (size_t i = 0; i < repeats; i++)
+                YACA_SUCCESS(yaca_sign_update(ctx.get(),
+                                              input.c_str(),
+                                              input.size()));
+
+        Buffer output(output_len);
+        YACA_SUCCESS(yaca_sign_finalize(ctx.get(), output.data(), &output_len));
+        RUNNER_ASSERT_MSG(output.size() >= output_len,
+                          "Length returned from yaca_sign_finalize() (" << output_len <<
+                          ") is greater than the one returned from yaca_context_get_output_length() ("
+                          << output.size() << ")");
+        output.resize(output_len);
+
+        ctx = verify_init(algo, key_pub);
+
+        if (input.size() > 0)
+            for (size_t i = 0; i < repeats; i++)
+                YACA_SUCCESS(yaca_verify_update(ctx.get(),
+                                                input.c_str(),
+                                                input.size()));
+
+        int ret = yaca_verify_finalize(ctx.get(), output.data(), output_len);
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "Verification failed for \"" << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " and " << keytype2str(key_type) << " key");
+
+        std::string input_wrong = input + "!";
+        ctx = verify_init(algo, key_pub);
+
+        for (size_t i = 0; i < repeats; i++)
+            YACA_SUCCESS(yaca_verify_update(ctx.get(),
+                                            input_wrong.c_str(),
+                                            input_wrong.size()));
+
+        ret = yaca_verify_finalize(ctx.get(), output.data(), output_len);
+        YACA_ASSERT_MSG(YACA_ERROR_DATA_MISMATCH == ret,
+                        "Verification succeeded for \"" << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " and " << keytype2str(key_type)
+                        << " key while the input was tampered with");
+    }
+}
+
+RUNNER_TEST(T6150_yaca_sign_hmac_test_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_hmac_ascii.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        Buffer key_data;
+        size_t repeats;
+        std::string input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
+
+        CtxPtr ctx = hmac_init(algo, key);
+        size_t output_len = get_output_length(ctx);
+
+        if (input.size() > 0)
+            for (size_t i = 0; i < repeats; i++)
+                YACA_SUCCESS(yaca_sign_update(ctx.get(),
+                                              input.c_str(),
+                                              input.size()));
+
+        Buffer output(output_len);
+        YACA_SUCCESS(yaca_sign_finalize(ctx.get(), output.data(), &output_len));
+        RUNNER_ASSERT_MSG(output.size() >= output_len,
+                          "Length returned from yaca_sign_finalize() (" << output_len <<
+                          ") is greater than the one returned from yaca_context_get_output_length() ("
+                          << output.size() << ")");
+        output.resize(output_len);
+
+        YACA_ASSERT_MSG(output.size() == expected.size(),
+                        "HMAC calculated for \""  << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " is " << output.size() * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(output.data(), expected.data(), output.size());
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "HMAC calculated for \"" << truncate_str(input, 16) << "\" with "
+                        << digest2str(algo) << " is different than expected");
+    }
+}
+
+RUNNER_TEST(T6160_yaca_sign_cmac_test_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_cmac_ascii.txt");
+
+    for (const auto& tv : tvv) {
+        yaca_encrypt_algorithm_e algo;
+        Buffer key_data;
+        size_t repeats;
+        std::string input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
+
+        CtxPtr ctx = cmac_init(algo, key);
+        size_t output_len = get_output_length(ctx);
+
+        if (input.size() > 0)
+            for (size_t i = 0; i < repeats; i++)
+                YACA_SUCCESS(yaca_sign_update(ctx.get(),
+                                              input.c_str(),
+                                              input.size()));
+
+        Buffer output(output_len);
+        YACA_SUCCESS(yaca_sign_finalize(ctx.get(), output.data(), &output_len));
+        RUNNER_ASSERT_MSG(output.size() >= output_len,
+                          "Length returned from yaca_sign_finalize() (" << output_len <<
+                          ") is greater than the one returned from yaca_context_get_output_length() ("
+                          << output.size() << ")");
+        output.resize(output_len);
+
+        YACA_ASSERT_MSG(output.size() == expected.size(),
+                        "CMAC calculated for \""  << truncate_str(input, 16) << "\" with "
+                        << encrypt2str(algo) << " is " << output.size() * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(output.data(), expected.data(), output.size());
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "CMAC calculated for \"" << truncate_str(input, 16) << "\" with "
+                        << encrypt2str(algo) << " is different than expected");
+    }
+}
+
+RUNNER_TEST(T6180_yaca_sign_verify_padding_test_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_verify_ascii.txt");
+
+    std::vector<yaca_padding_e> paddings = {
+        YACA_PADDING_PKCS1,
+        YACA_PADDING_PKCS1_PSS,
+        YACA_PADDING_X931
+    };
+
+    for (const auto& tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        yaca_key_type_e key_type;
+        Buffer key_data;
+        size_t repeats;
+        std::string input;
+
+        tv.get("algo", algo);
+        tv.get("key_type", key_type);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+
+        /* padding only works for RSA */
+        if (key_type != YACA_KEY_TYPE_RSA_PRIV)
+            continue;
+
+        KeyPtr key_prv = import_key(key_type, nullptr, key_data.data(), key_data.size());
+        KeyPtr key_pub = extract_public_key(key_prv);
+
+        for (auto padding: paddings) {
+            CtxPtr ctx = sign_init(algo, key_prv);
+            size_t output_len = get_output_length(ctx);
+            YACA_SUCCESS(yaca_context_set_property(ctx.get(), YACA_PROPERTY_PADDING,
+                                                   static_cast<void*>(&padding), sizeof(padding)));
+
+            if (input.size() > 0) {
+                for (size_t i = 0; i < repeats; i++)
+                    YACA_SUCCESS(yaca_sign_update(ctx.get(),
+                                                  input.c_str(),
+                                                  input.size()));
+            }
+
+            Buffer output(output_len);
+            YACA_SUCCESS(yaca_sign_finalize(ctx.get(), output.data(), &output_len));
+            output.resize(output_len);
+
+            ctx = verify_init(algo, key_pub);
+            YACA_SUCCESS(yaca_context_set_property(ctx.get(), YACA_PROPERTY_PADDING,
+                                                   static_cast<void*>(&padding), sizeof(padding)));
+
+            if (input.size() > 0)
+                for (size_t i = 0; i < repeats; i++)
+                    YACA_SUCCESS(yaca_verify_update(ctx.get(),
+                                                    input.c_str(),
+                                                    input.size()));
+
+            int ret = yaca_verify_finalize(ctx.get(), output.data(), output_len);
+            YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                            "Verification failed for \"" << truncate_str(input, 16) << "\" with "
+                            << digest2str(algo) << " and " << padding2str(padding) << " padding");
+
+            yaca_padding_e padding_wrong;
+            switch(padding) {
+            case YACA_PADDING_PKCS1:
+                padding_wrong = YACA_PADDING_PKCS1_PSS;
+                break;
+            case YACA_PADDING_PKCS1_PSS:
+                padding_wrong = YACA_PADDING_X931;
+                break;
+            case YACA_PADDING_X931:
+                padding_wrong = YACA_PADDING_PKCS1;
+                break;
+            default:
+                RUNNER_FAIL_MSG("Wrong padding passed");
+            }
+            ctx = verify_init(algo, key_pub);
+            YACA_SUCCESS(yaca_context_set_property(ctx.get(), YACA_PROPERTY_PADDING,
+                                                   static_cast<void*>(&padding_wrong), sizeof(padding_wrong)));
+
+            if (input.size() > 0)
+                for (size_t i = 0; i < repeats; i++)
+                    YACA_SUCCESS(yaca_verify_update(ctx.get(),
+                                                    input.c_str(),
+                                                    input.size()));
+
+            ret = yaca_verify_finalize(ctx.get(), output.data(), output_len);
+            YACA_ASSERT_MSG(YACA_ERROR_DATA_MISMATCH == ret,
+                            "Verification succeeded for \"" << truncate_str(input, 16) << "\" with "
+                            << digest2str(algo) << " and " << padding2str(padding)
+                            << " padding while the padding type has been changed");
+        }
+    }
+}
diff --git a/src/yaca/yaca-test-simple.cpp b/src/yaca/yaca-test-simple.cpp
new file mode 100644 (file)
index 0000000..62f9848
--- /dev/null
@@ -0,0 +1,856 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ */
+
+#include <yaca_simple.h>
+
+#include "dpl/test/test_runner.h"
+#include "yaca-test-common.h"
+#include "yaca-test-vector.h"
+
+namespace {
+
+void digest_check_test_vector(yaca_digest_algorithm_e algo,
+                              size_t repeats,
+                              const Buffer &single_input,
+                              const Buffer &expected)
+{
+    /* concatenate input if needed */
+    Buffer input(single_input);
+    for (size_t i = 1; i < repeats; i++)
+        input.insert(input.end(), single_input.begin(), single_input.end());
+
+    char *digest;
+    size_t digest_len;
+    YACA_SUCCESS(yaca_simple_calculate_digest(algo,
+                                              input.data(),
+                                              input.size(),
+                                              &digest,
+                                              &digest_len));
+    RUNNER_ASSERT_MSG(digest != NULL, "NULL digest calculated");
+
+    auto digest_ptr = wrap_ptr(digest);
+
+    YACA_ASSERT_MSG(digest_len == expected.size(),
+                    "Digest calculated for \""  <<
+                    truncate_str(std::string(input.data(), input.size()), 16)
+                    << "\" with " << digest2str(algo) << " is " <<
+                    digest_len * 8 <<" bits long. Expected " <<
+                    expected.size() * 8 << " bits");
+
+    int ret = yaca_memcmp(digest, expected.data(), digest_len);
+    YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                    "Digest calculated for \"" <<
+                    truncate_str(std::string(input.data(), input.size()), 16)
+                    << "\" with " << digest2str(algo) <<
+                    " is different than expected");
+}
+
+void test_vector_simple_encrypt_decrypt(const Buffer &input,
+                                        yaca_encrypt_algorithm_e algo,
+                                        yaca_block_cipher_mode_e bcm,
+                                        size_t key_len,
+                                        size_t iv_len)
+{
+    KeyPtr key = generate_key(YACA_KEY_TYPE_SYMMETRIC, key_len);
+    KeyPtr iv = (iv_len > 0) ? generate_key(YACA_KEY_TYPE_IV, iv_len)
+                             : null_key();
+
+    size_t ciphertext_len = 0;
+    size_t plaintext_len = 0;
+    ChrPtr ciphertext = simple_encrypt(algo, bcm, key, iv, input.data(), input.size(), &ciphertext_len);
+    ChrPtr plaintext = simple_decrypt(algo, bcm, key, iv, ciphertext.get(), ciphertext_len, &plaintext_len);
+
+    YACA_ASSERT_MSG(input.size() == plaintext_len, "Size after encrypt-decrypt differs\n");
+    YACA_ASSERT_MSG(yaca_memcmp(plaintext.get(), input.data(), plaintext_len) == YACA_ERROR_NONE,
+                    "Text after encrypt-decrypt has changed\n");
+}
+
+void test_vector_simple_encrypt_decrypt_output(const Buffer &input,
+                                               yaca_encrypt_algorithm_e algo,
+                                               yaca_block_cipher_mode_e bcm,
+                                               const Buffer &key,
+                                               const Buffer &iv,
+                                               size_t repeats,
+                                               const Buffer &expected)
+{
+    Buffer input_repeated;
+    for (size_t i = 0; i < repeats; ++i)
+        std::copy(input.begin(), input.end(), std::back_inserter(input_repeated));
+
+    KeyPtr key_ptr = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key.data(), key.size());
+    KeyPtr iv_ptr = (iv.size() > 0) ? import_key(YACA_KEY_TYPE_IV, nullptr, iv.data(), iv.size())
+                                    : null_key();
+
+    size_t ciphertext_len = 0;
+    ChrPtr ciphertext = simple_encrypt(algo, bcm, key_ptr, iv_ptr,
+                                       input_repeated.data(), input_repeated.size(), &ciphertext_len);
+
+    YACA_ASSERT_MSG(expected.size() == ciphertext_len, "Size after encrypt differs\n");
+    YACA_ASSERT_MSG(yaca_memcmp(ciphertext.get(), expected.data(), ciphertext_len) == YACA_ERROR_NONE,
+                    "Text after encrypt differs\n");
+}
+
+void test_simple_encryption_output(std::string filename)
+{
+    auto tvv = loadTestVector(filename);
+
+    for (const auto& tv : tvv) {
+        Buffer input;
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        Buffer key;
+        Buffer iv;
+        size_t repeats;
+        Buffer expected;
+
+        tv.get("input", input);
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key", key);
+        tv.get("iv", iv);
+        tv.get("repeats", repeats);
+        tv.get("output", expected);
+
+        test_vector_simple_encrypt_decrypt_output(input, algo, bcm, key, iv, repeats, expected);
+    }
+}
+
+void test_simple_encryption_decryption(std::string filename)
+{
+    std::string s = "abcdefghijklmnoprstuvwxyz0123456789";
+
+    auto tvv = loadTestVector(filename);
+
+    for (const auto& tv : tvv) {
+        yaca_encrypt_algorithm_e algo;
+        yaca_block_cipher_mode_e bcm;
+        size_t key_len;
+        size_t iv_len;
+        size_t key_data_len = 0;
+        Buffer input;
+
+        tv.get("algo", algo);
+        tv.get("bcm", bcm);
+        tv.get("key_len", key_len);
+        tv.get("iv_len", iv_len);
+        if (bcm == YACA_BCM_WRAP)
+            tv.get("key_data_len", key_data_len);
+
+        if (key_data_len > 0)
+            input = random_buffer(key_data_len / 8);
+        else
+            std::copy(s.begin(), s.end(), std::back_inserter(input));
+
+        test_vector_simple_encrypt_decrypt(input, algo, bcm, key_len, iv_len);
+    }
+}
+
+} // anonymous namespace
+
+
+RUNNER_TEST_GROUP_INIT(T7000_YACA_SIMPLE);
+
+RUNNER_TEST(T7010_yaca_simple_calculate_digest_invalid_param, YacaTest)
+{
+    char *digest;
+    size_t digest_len;
+    Buffer data = random_buffer(42);
+
+    YACA_INVALID_PARAM(yaca_simple_calculate_digest(static_cast<yaca_digest_algorithm_e>(-1),
+                                                    data.data(),
+                                                    data.size(),
+                                                    &digest,
+                                                    &digest_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
+                                                    nullptr,
+                                                    data.size(),
+                                                    &digest,
+                                                    &digest_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
+                                                    data.data(),
+                                                    0,
+                                                    &digest,
+                                                    &digest_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
+                                                    data.data(),
+                                                    data.size(),
+                                                    nullptr,
+                                                    &digest_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_digest(YACA_DIGEST_MD5,
+                                                    data.data(),
+                                                    data.size(),
+                                                    &digest,
+                                                    nullptr));
+}
+
+RUNNER_TEST(T7020_yaca_simple_calculate_digest_ascii_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("digest_ascii.txt");
+
+    for (const auto &tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        size_t repeats;
+        std::string input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        digest_check_test_vector(algo, repeats, Buffer(input.begin(), input.end()), expected);
+    }
+}
+
+RUNNER_TEST(T7030_yaca_simple_calculate_digest_binary_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("digest_binary.txt");
+
+    for (const auto &tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        size_t repeats;
+        Buffer input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("repeats", repeats);
+        tv.get("input", input);
+        tv.get("output", expected);
+
+        digest_check_test_vector(algo, repeats, input, expected);
+    }
+}
+
+RUNNER_TEST(T7040_yaca_simple_calculate_signature_invalid_param, YacaTest)
+{
+    char *signature;
+    size_t signature_len;
+    Buffer data = random_buffer(42);
+    KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr key_pub = extract_public_key(key_prv);
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
+
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(static_cast<yaca_digest_algorithm_e>(-1),
+                                                       key_prv.get(),
+                                                       data.data(),
+                                                       data.size(),
+                                                       &signature,
+                                                       &signature_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
+                                                       nullptr,
+                                                       data.data(),
+                                                       data.size(),
+                                                       &signature,
+                                                       &signature_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
+                                                       key_pub.get(),
+                                                       data.data(),
+                                                       data.size(),
+                                                       &signature,
+                                                       &signature_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
+                                                       key_sym.get(),
+                                                       data.data(),
+                                                       data.size(),
+                                                       &signature,
+                                                       &signature_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
+                                                       key_prv.get(),
+                                                       nullptr,
+                                                       data.size(),
+                                                       &signature,
+                                                       &signature_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
+                                                       key_prv.get(),
+                                                       data.data(),
+                                                       0,
+                                                       &signature,
+                                                       &signature_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
+                                                       key_prv.get(),
+                                                       data.data(),
+                                                       data.size(),
+                                                       nullptr,
+                                                       &signature_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_signature(YACA_DIGEST_MD5,
+                                                       key_prv.get(),
+                                                       data.data(),
+                                                       data.size(),
+                                                       &signature,
+                                                       nullptr));
+}
+
+RUNNER_TEST(T7050_yaca_simple_verify_signature_invalid_param, YacaTest)
+{
+    size_t signature_len;
+    Buffer data = random_buffer(42);
+    KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr key_pub = extract_public_key(key_prv);
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
+    ChrPtr signature = simple_sign(YACA_DIGEST_MD5, key_prv, data.data(), data.size(), &signature_len);
+
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(static_cast<yaca_digest_algorithm_e>(-1),
+                                                    key_pub.get(),
+                                                    data.data(),
+                                                    data.size(),
+                                                    signature.get(),
+                                                    signature_len));
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
+                                                    nullptr,
+                                                    data.data(),
+                                                    data.size(),
+                                                    signature.get(),
+                                                    signature_len));
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
+                                                    key_prv.get(),
+                                                    data.data(),
+                                                    data.size(),
+                                                    signature.get(),
+                                                    signature_len));
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
+                                                    key_sym.get(),
+                                                    data.data(),
+                                                    data.size(),
+                                                    signature.get(),
+                                                    signature_len));
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
+                                                    key_pub.get(),
+                                                    nullptr,
+                                                    data.size(),
+                                                    signature.get(),
+                                                    signature_len));
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
+                                                    key_pub.get(),
+                                                    data.data(),
+                                                    0,
+                                                    signature.get(),
+                                                    signature_len));
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
+                                                    key_pub.get(),
+                                                    data.data(),
+                                                    data.size(),
+                                                    nullptr,
+                                                    signature_len));
+    YACA_INVALID_PARAM(yaca_simple_verify_signature(YACA_DIGEST_MD5,
+                                                    key_pub.get(),
+                                                    data.data(),
+                                                    data.size(),
+                                                    signature.get(),
+                                                    0));
+}
+
+RUNNER_TEST(T7060_yaca_simple_calculate_hmac_invalid_param, YacaTest)
+{
+    char *mac;
+    size_t mac_len;
+    Buffer data = random_buffer(42);
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
+    KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr key_pub = extract_public_key(key_prv);
+
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(static_cast<yaca_digest_algorithm_e>(-1),
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
+                                                  nullptr,
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
+                                                  key_prv.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
+                                                  key_pub.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
+                                                  key_sym.get(),
+                                                  nullptr,
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  0,
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  nullptr,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_hmac(YACA_DIGEST_MD5,
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  nullptr));
+}
+
+RUNNER_TEST(T7070_yaca_simple_calculate_cmac_invalid_param, YacaTest)
+{
+    char *mac;
+    size_t mac_len;
+    Buffer data = random_buffer(42);
+    KeyPtr key_sym = generate_key(YACA_KEY_TYPE_SYMMETRIC, 256);
+    KeyPtr key_prv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    KeyPtr key_pub = extract_public_key(key_prv);
+
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(static_cast<yaca_encrypt_algorithm_e>(-1),
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
+                                                  nullptr,
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
+                                                  key_prv.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
+                                                  key_pub.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
+                                                  key_sym.get(),
+                                                  nullptr,
+                                                  data.size(),
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  0,
+                                                  &mac,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  nullptr,
+                                                  &mac_len));
+    YACA_INVALID_PARAM(yaca_simple_calculate_cmac(YACA_ENCRYPT_AES,
+                                                  key_sym.get(),
+                                                  data.data(),
+                                                  data.size(),
+                                                  &mac,
+                                                  nullptr));
+}
+
+RUNNER_TEST(T7080_yaca_simple_calculate_signature_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_ascii.txt");
+
+    for (const auto &tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        yaca_key_type_e key_type;
+        Buffer key_data;
+        size_t repeats;
+        std::string single_input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key_type", key_type);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", single_input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(key_type, nullptr, key_data.data(), key_data.size());
+
+        /* concatenate input if needed */
+        Buffer input(single_input.begin(), single_input.end());
+        for (size_t i = 1; i < repeats; i++)
+            input.insert(input.end(), single_input.begin(), single_input.end());
+
+        char *signature;
+        size_t signature_len;
+        YACA_SUCCESS(yaca_simple_calculate_signature(algo,
+                                                     key.get(),
+                                                     input.data(),
+                                                     input.size(),
+                                                     &signature,
+                                                     &signature_len));
+        RUNNER_ASSERT_MSG(signature != NULL, "NULL signature calculated");
+
+        ChrPtr signature_ptr = wrap_ptr(signature);
+
+        YACA_ASSERT_MSG(signature_len == expected.size(),
+                        "Signature calculated for \""  <<
+                        truncate_str(std::string(input.data(), input.size()), 16)
+                        << "\" with " << digest2str(algo) << " and " << keytype2str(key_type)
+                        << " key is " << signature_len * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(signature, expected.data(), signature_len);
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "Signature calculated for \"" <<
+                        truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
+                        << digest2str(algo) << " and " << keytype2str(key_type)
+                        << "key is different than expected");
+    }
+}
+
+RUNNER_TEST(T7090_yaca_simple_calculate_signature_verify_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_verify_ascii.txt");
+
+    for (const auto &tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        yaca_key_type_e key_type;
+        Buffer key_data;
+        size_t repeats;
+        std::string single_input;
+
+        tv.get("algo", algo);
+        tv.get("key_type", key_type);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", single_input);
+
+        KeyPtr key_prv = import_key(key_type, nullptr, key_data.data(), key_data.size());
+        KeyPtr key_pub = extract_public_key(key_prv);
+
+        /* concatenate input if needed */
+        Buffer input(single_input.begin(), single_input.end());
+        for (size_t i = 1; i < repeats; i++)
+            input.insert(input.end(), single_input.begin(), single_input.end());
+
+        char *signature;
+        size_t signature_len;
+        YACA_SUCCESS(yaca_simple_calculate_signature(algo,
+                                                     key_prv.get(),
+                                                     input.data(),
+                                                     input.size(),
+                                                     &signature,
+                                                     &signature_len));
+        RUNNER_ASSERT_MSG(signature != NULL, "NULL signature calculated");
+
+        ChrPtr signature_ptr = wrap_ptr(signature);
+
+        int ret = yaca_simple_verify_signature(algo,
+                                               key_pub.get(),
+                                               input.data(),
+                                               input.size(),
+                                               signature,
+                                               signature_len);
+
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "Verification failed for \"" <<
+                        truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
+                        << digest2str(algo) << " and " << keytype2str(key_type) << " key");
+
+        Buffer input_wrong = input;
+        input_wrong.push_back('!');
+
+        ret = yaca_simple_verify_signature(algo,
+                                           key_pub.get(),
+                                           input_wrong.data(),
+                                           input_wrong.size(),
+                                           signature,
+                                           signature_len);
+
+        YACA_ASSERT_MSG(YACA_ERROR_DATA_MISMATCH == ret,
+                        "Verification succeeded for \"" <<
+                        truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
+                        << digest2str(algo) << " and " << keytype2str(key_type)
+                        << " key while the input has been tampered with");
+    }
+}
+
+RUNNER_TEST(T7100_yaca_simple_calculate_hmac_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_hmac_ascii.txt");
+
+    for (const auto &tv : tvv) {
+        yaca_digest_algorithm_e algo;
+        Buffer key_data;
+        size_t repeats;
+        std::string single_input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", single_input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
+
+        /* concatenate input if needed */
+        Buffer input(single_input.begin(), single_input.end());
+        for (size_t i = 1; i < repeats; i++)
+            input.insert(input.end(), single_input.begin(), single_input.end());
+
+        char *mac;
+        size_t mac_len;
+        YACA_SUCCESS(yaca_simple_calculate_hmac(algo,
+                                                key.get(),
+                                                input.data(),
+                                                input.size(),
+                                                &mac,
+                                                &mac_len));
+        RUNNER_ASSERT_MSG(mac != NULL, "NULL signature calculated");
+
+        ChrPtr mac_ptr = wrap_ptr(mac);
+
+        YACA_ASSERT_MSG(mac_len == expected.size(),
+                        "HMAC calculated for \""  <<
+                        truncate_str(std::string(input.data(), input.size()), 16)
+                        << "\" with " << digest2str(algo) << " is " << mac_len * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(mac, expected.data(), mac_len);
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "HMAC calculated for \"" <<
+                        truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
+                        << digest2str(algo) << " is different than expected");
+    }
+}
+
+RUNNER_TEST(T7110_yaca_simple_calculate_cmac_vectors, YacaTest)
+{
+    auto tvv = loadTestVector("sign_cmac_ascii.txt");
+
+    for (const auto &tv : tvv) {
+        yaca_encrypt_algorithm_e algo;
+        Buffer key_data;
+        size_t repeats;
+        std::string single_input;
+        Buffer expected;
+
+        tv.get("algo", algo);
+        tv.get("key", key_data);
+        tv.get("repeats", repeats);
+        tv.get("input", single_input);
+        tv.get("output", expected);
+
+        KeyPtr key = import_key(YACA_KEY_TYPE_SYMMETRIC, nullptr, key_data.data(), key_data.size());
+
+        /* concatenate input if needed */
+        Buffer input(single_input.begin(), single_input.end());
+        for (size_t i = 1; i < repeats; i++)
+            input.insert(input.end(), single_input.begin(), single_input.end());
+
+        char *mac;
+        size_t mac_len;
+        YACA_SUCCESS(yaca_simple_calculate_cmac(algo,
+                                                key.get(),
+                                                input.data(),
+                                                input.size(),
+                                                &mac,
+                                                &mac_len));
+        RUNNER_ASSERT_MSG(mac != NULL, "NULL signature calculated");
+
+        ChrPtr mac_ptr = wrap_ptr(mac);
+
+        YACA_ASSERT_MSG(mac_len == expected.size(),
+                        "CMAC calculated for \""  <<
+                        truncate_str(std::string(input.data(), input.size()), 16)
+                        << "\" with " << encrypt2str(algo) << " is " << mac_len * 8
+                        <<" bits long. Expected " << expected.size() * 8 << " bits");
+
+        int ret = yaca_memcmp(mac, expected.data(), mac_len);
+        YACA_ASSERT_MSG(YACA_ERROR_NONE == ret,
+                        "CMAC calculated for \"" <<
+                        truncate_str(std::string(input.data(), input.size()), 16) << "\" with "
+                        << encrypt2str(algo) << " is different than expected");
+    }
+}
+
+RUNNER_TEST(T7120_yaca_simple_encrypt_invalid_param, YacaTest)
+{
+    Buffer plaintext = random_buffer(1024);
+    char* ciphertext;
+    size_t ciphertext_len;
+
+    yaca_encrypt_algorithm_e algo = YACA_ENCRYPT_AES;
+    yaca_block_cipher_mode_e bcm = YACA_BCM_CBC;
+
+    auto sym_key = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+    auto iv = generate_key(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_IV_128BIT);
+
+    auto rsa_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub = extract_public_key(rsa_priv);
+    auto des_key = generate_key(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT);
+    auto dh_params = generate_key(YACA_KEY_TYPE_DH_PARAMS, YACA_KEY_LENGTH_DH_RFC_1024_160);
+    auto dh_priv = generate_key_from_parameters(dh_params);
+    auto bad_iv = generate_key(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_UNSAFE_8BIT);
+
+    YACA_INVALID_PARAM(yaca_simple_encrypt(static_cast<yaca_encrypt_algorithm_e>(-1), bcm,
+                                           sym_key.get(), iv.get(), plaintext.data(), plaintext.size(),
+                                           &ciphertext, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, static_cast<yaca_block_cipher_mode_e>(-1),
+                                           sym_key.get(), iv.get(), plaintext.data(), plaintext.size(),
+                                           &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, YACA_BCM_GCM, sym_key.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, YACA_BCM_CCM, sym_key.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, YACA_KEY_NULL, iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, iv.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, rsa_priv.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, rsa_pub.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, dh_params.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, dh_priv.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), YACA_KEY_NULL,
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), bad_iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), sym_key.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), rsa_priv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), rsa_pub.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), dh_params.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), dh_priv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), des_key.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           nullptr, plaintext.size(), &ciphertext, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           plaintext.data(), 0, &ciphertext, &ciphertext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), nullptr, &ciphertext_len));
+    YACA_INVALID_PARAM(yaca_simple_encrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           plaintext.data(), plaintext.size(), &ciphertext, nullptr));
+}
+
+RUNNER_TEST(T7130_yaca_simple_decrypt_invalid_param, YacaTest)
+{
+    Buffer ciphertext = random_buffer(1024);
+    char* plaintext;
+    size_t plaintext_len;
+
+    yaca_encrypt_algorithm_e algo = YACA_ENCRYPT_AES;
+    yaca_block_cipher_mode_e bcm = YACA_BCM_CBC;
+
+    auto sym_key = generate_key(YACA_KEY_TYPE_SYMMETRIC, YACA_KEY_LENGTH_192BIT);
+    auto iv = generate_key(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_IV_128BIT);
+
+    auto rsa_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+    auto rsa_pub = extract_public_key(rsa_priv);
+    auto des_key = generate_key(YACA_KEY_TYPE_DES, YACA_KEY_LENGTH_192BIT);
+    auto dh_params = generate_key(YACA_KEY_TYPE_DH_PARAMS, YACA_KEY_LENGTH_DH_RFC_1024_160);
+    auto dh_priv = generate_key_from_parameters(dh_params);
+    auto bad_iv = generate_key(YACA_KEY_TYPE_IV, YACA_KEY_LENGTH_UNSAFE_8BIT);
+
+    YACA_INVALID_PARAM(yaca_simple_decrypt(static_cast<yaca_encrypt_algorithm_e>(-1), bcm,
+                                           sym_key.get(), iv.get(), ciphertext.data(), ciphertext.size(),
+                                           &plaintext, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, static_cast<yaca_block_cipher_mode_e>(-1),
+                                           sym_key.get(), iv.get(), ciphertext.data(), ciphertext.size(),
+                                           &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, YACA_BCM_GCM, sym_key.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, YACA_BCM_CCM, sym_key.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, YACA_KEY_NULL, iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, iv.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, rsa_priv.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, rsa_pub.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, dh_params.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, dh_priv.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), YACA_KEY_NULL,
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), bad_iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), sym_key.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), rsa_priv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), rsa_pub.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), dh_params.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), dh_priv.get(),
+                                           ciphertext.data(), ciphertext.size(),&plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), des_key.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           nullptr, ciphertext.size(), &plaintext, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           ciphertext.data(), 0, &plaintext, &plaintext_len));
+
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), nullptr, &plaintext_len));
+    YACA_INVALID_PARAM(yaca_simple_decrypt(algo, bcm, sym_key.get(), iv.get(),
+                                           ciphertext.data(), ciphertext.size(), &plaintext, nullptr));
+}
+
+RUNNER_TEST(T7150_yaca_simple_encrypt_decrypt_output, YacaTest)
+{
+     test_simple_encryption_output("encrypt_output_comparison.txt");
+     test_simple_encryption_output("encrypt_output_comparison_rc4.txt");
+     test_simple_encryption_output("encrypt_output_comparison_wrap.txt");
+}
+
+RUNNER_TEST(T7160_yaca_simple_encrypt_decrypt_comparison, YacaTest)
+{
+    test_simple_encryption_decryption("encrypt_valid_param.txt");
+    test_simple_encryption_decryption("encrypt_valid_param_wrap.txt");
+}
diff --git a/src/yaca/yaca-test-stress.cpp b/src/yaca/yaca-test-stress.cpp
new file mode 100644 (file)
index 0000000..73a8322
--- /dev/null
@@ -0,0 +1,151 @@
+/*
+ *  Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+/*
+ * @file       yaca-test-stress.cpp
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+
+#include <thread>
+#include <random>
+#include <chrono>
+
+#include <unistd.h>
+
+#include <yaca_crypto.h>
+#include <yaca_key.h>
+#include <yaca_seal.h>
+
+#include "dpl/test/test_runner_child.h"
+#include "yaca-test-common.h"
+
+#include "lorem.h"
+
+void thread_fn()
+{
+    auto sym_key = null_key();
+    auto iv = null_key();
+
+    size_t enc_size;
+    size_t block_len;
+    size_t output_len;
+    size_t out_size;
+    size_t rem;
+
+    for (size_t i = 0; i < 50; i++) {
+        auto key_priv = generate_key(YACA_KEY_TYPE_RSA_PRIV, YACA_KEY_LENGTH_1024BIT);
+        auto key_pub = extract_public_key(key_priv);
+
+        auto ctx = seal_init(key_pub, YACA_ENCRYPT_AES, YACA_BCM_CBC, YACA_KEY_LENGTH_256BIT, sym_key, iv);
+
+        output_len = get_output_length(ctx, LOREM4096_SIZE);
+        block_len = get_output_length(ctx);
+
+        enc_size = output_len + block_len;
+
+        auto enc = create_yaca_buffer(enc_size);
+
+        out_size = enc_size;
+        YACA_SUCCESS(yaca_seal_update(ctx.get(), lorem4096, LOREM4096_SIZE, enc.get(), &out_size));
+
+        rem = enc_size - out_size;
+        YACA_SUCCESS(yaca_seal_finalize(ctx.get(), enc.get() + out_size, &rem));
+    }
+}
+
+void random_sleep(size_t miliseconds)
+{
+    std::default_random_engine gen;
+    std::uniform_int_distribution<size_t> dist(0, miliseconds);
+    int duration = dist(gen);
+
+    std::this_thread::sleep_for(std::chrono::milliseconds(duration));
+}
+
+void thread_test(size_t cnt, void (*fn)())
+{
+    std::thread* threads[cnt];
+    for (size_t i = 0; i < cnt; i++)
+        threads[i] = new std::thread(fn);
+
+    for (size_t i = 0; i < cnt; i++) {
+        threads[i]->join();
+        delete threads[i];
+    }
+}
+
+// TODO: Make a separate binary for stress tests? They may take a long time to complete.
+RUNNER_TEST_GROUP_INIT(T8000_YACA_STRESS);
+
+/* Properly initialize and deinitialize threads */
+RUNNER_CHILD_TEST(T8000_yaca_stress_threads, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            YACA_SUCCESS(yaca_initialize());
+            thread_fn();
+            yaca_cleanup();
+    });
+}
+
+/* No initialization in threads except for main one */
+RUNNER_CHILD_TEST(T8010_yaca_stress_threads_no_init, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            thread_fn();
+            yaca_cleanup();
+    });
+}
+
+/* No cleanup in threads except for main one. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8020_yaca_stress_threads_no_final, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            YACA_SUCCESS(yaca_initialize());
+            thread_fn();
+    });
+}
+
+/* No initialization & cleanup in threads except for main one. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8030_yaca_stress_threads_no_init_no_final, YacaTest)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            thread_fn();
+    });
+}
+
+/* Single initialization in main thread. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8040_yaca_stress_threads_init_only)
+{
+    YACA_SUCCESS(yaca_initialize());
+    thread_test(10, []{
+            random_sleep(3000);
+            thread_fn();
+    });
+}
+
+/* Initialization in threads other than main. May cause memory leaks. */
+RUNNER_CHILD_TEST(T8050_yaca_stress_threads_init_thread_only)
+{
+    thread_test(10, []{
+            random_sleep(3000);
+            YACA_SUCCESS(yaca_initialize());
+            thread_fn();
+    });
+}
diff --git a/src/yaca/yaca-test-vector.cpp b/src/yaca/yaca-test-vector.cpp
new file mode 100644 (file)
index 0000000..b145a67
--- /dev/null
@@ -0,0 +1,242 @@
+/*
+ *  Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+/*
+ * @file       yaca-test-vector.cpp
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+
+#include <fstream>
+
+#include <yaca_types.h>
+
+#include <dpl/test/test_runner.h>
+
+#include "yaca-test-vector.h"
+
+namespace {
+
+Buffer hex2bin(const std::string &hex_str)
+{
+    RUNNER_ASSERT_MSG(hex_str.size() % 2 == 0,
+                      "Length of the provided string is not divisable by 2");
+
+    /* convert a string representing hex to an array of bytes */
+    Buffer data(hex_str.size() / 2);
+    for (size_t i = 0; i < hex_str.size(); i += 2) {
+        std::string byte_str = hex_str.substr(i, 2);
+        std::stringstream ss;
+        int byte;
+
+        /* Will throw if it can't handle it and that's fine */
+        ss << std::hex << byte_str;
+        ss >> byte;
+
+        RUNNER_ASSERT_MSG(byte == (byte & 0xff), "Byte value out of range");
+
+        data[i / 2] = static_cast<char>(byte);
+    }
+
+    return data;
+}
+
+std::unordered_map<std::string, yaca_key_format_e> str2keyformat = {
+    std::make_pair("DEFAULT", YACA_KEY_FORMAT_DEFAULT),
+    std::make_pair("PKCS8",   YACA_KEY_FORMAT_PKCS8)
+};
+
+std::unordered_map<std::string, yaca_key_file_format_e> str2keyfileformat = {
+    std::make_pair("RAW",    YACA_KEY_FILE_FORMAT_RAW),
+    std::make_pair("BASE64", YACA_KEY_FILE_FORMAT_BASE64),
+    std::make_pair("PEM",    YACA_KEY_FILE_FORMAT_PEM),
+    std::make_pair("DER",    YACA_KEY_FILE_FORMAT_DER)
+};
+
+std::unordered_map<std::string, yaca_key_type_e> str2keytype = {
+    std::make_pair("SYMMETRIC",  YACA_KEY_TYPE_SYMMETRIC),
+    std::make_pair("DES",        YACA_KEY_TYPE_DES),
+    std::make_pair("IV",         YACA_KEY_TYPE_IV),
+    std::make_pair("RSA_PRIV",   YACA_KEY_TYPE_RSA_PRIV),
+    std::make_pair("RSA_PUB",    YACA_KEY_TYPE_RSA_PUB),
+    std::make_pair("DSA_PRIV",   YACA_KEY_TYPE_DSA_PRIV),
+    std::make_pair("DSA_PUB",    YACA_KEY_TYPE_DSA_PUB),
+    std::make_pair("DSA_PARAMS", YACA_KEY_TYPE_DSA_PARAMS),
+    std::make_pair("DH_PRIV",    YACA_KEY_TYPE_DH_PRIV),
+    std::make_pair("DH_PUB",     YACA_KEY_TYPE_DH_PUB),
+    std::make_pair("DH_PARAMS",  YACA_KEY_TYPE_DH_PARAMS),
+    std::make_pair("EC_PRIV",    YACA_KEY_TYPE_EC_PRIV),
+    std::make_pair("EC_PUB",     YACA_KEY_TYPE_EC_PUB),
+    std::make_pair("EC_PARAMS",  YACA_KEY_TYPE_EC_PARAMS)
+};
+
+std::unordered_map<std::string, yaca_digest_algorithm_e> str2digest = {
+    std::make_pair("MD5",    YACA_DIGEST_MD5),
+    std::make_pair("SHA1",   YACA_DIGEST_SHA1),
+    std::make_pair("SHA224", YACA_DIGEST_SHA224),
+    std::make_pair("SHA256", YACA_DIGEST_SHA256),
+    std::make_pair("SHA384", YACA_DIGEST_SHA384),
+    std::make_pair("SHA512", YACA_DIGEST_SHA512)
+};
+
+std::unordered_map<std::string, yaca_encrypt_algorithm_e> str2encrypt = {
+    std::make_pair("AES",        YACA_ENCRYPT_AES),
+    std::make_pair("DES",        YACA_ENCRYPT_UNSAFE_DES),
+    std::make_pair("3DES_2TDEA", YACA_ENCRYPT_UNSAFE_3DES_2TDEA),
+    std::make_pair("3DES_3TDEA", YACA_ENCRYPT_3DES_3TDEA),
+    std::make_pair("RC2",        YACA_ENCRYPT_UNSAFE_RC2),
+    std::make_pair("RC4",        YACA_ENCRYPT_UNSAFE_RC4),
+    std::make_pair("CAST5",      YACA_ENCRYPT_CAST5)
+};
+
+std::unordered_map<std::string, yaca_block_cipher_mode_e> str2bcm = {
+    std::make_pair("NONE", YACA_BCM_NONE),
+    std::make_pair("ECB",  YACA_BCM_ECB),
+    std::make_pair("CTR",  YACA_BCM_CTR),
+    std::make_pair("CBC",  YACA_BCM_CBC),
+    std::make_pair("GCM",  YACA_BCM_GCM),
+    std::make_pair("CFB",  YACA_BCM_CFB),
+    std::make_pair("CFB1", YACA_BCM_CFB1),
+    std::make_pair("CFB8", YACA_BCM_CFB8),
+    std::make_pair("OFB",  YACA_BCM_OFB),
+    std::make_pair("CCM",  YACA_BCM_CCM),
+    std::make_pair("WRAP", YACA_BCM_WRAP)
+};
+
+std::unordered_map<std::string, yaca_kdf_e> str2kdf = {
+    std::make_pair("X942", YACA_KDF_X942),
+    std::make_pair("X962", YACA_KDF_X962)
+};
+
+} // anonymous namespace
+
+void TestVector::add(const std::string &key, const std::string &val)
+{
+    RUNNER_ASSERT_MSG(m_data.find(key) == m_data.end(),
+                      "The key " << key << " already exists in this test vector");
+    m_data[key] = val;
+}
+
+void TestVector::get(const std::string &key, std::string &val) const
+{
+    val = value(key);
+}
+
+void TestVector::get(const std::string &key, Buffer &val) const
+{
+    val = hex2bin(value(key));
+}
+
+void TestVector::get(const std::string &key, yaca_key_format_e &val) const
+{
+    val = str2keyformat.at(value(key));
+}
+
+void TestVector::get(const std::string &key, yaca_key_file_format_e &val) const
+{
+    val = str2keyfileformat.at(value(key));
+}
+
+void TestVector::get(const std::string &key, yaca_key_type_e &val) const
+{
+    val = str2keytype.at(value(key));
+}
+
+void TestVector::get(const std::string &key, yaca_digest_algorithm_e &val) const
+{
+    val = str2digest.at(value(key));
+}
+
+void TestVector::get(const std::string &key, yaca_encrypt_algorithm_e &val) const
+{
+    val = str2encrypt.at(value(key));
+}
+
+void TestVector::get(const std::string &key, yaca_block_cipher_mode_e &val) const
+{
+    val = str2bcm.at(value(key));
+}
+
+void TestVector::get(const std::string &key, yaca_kdf_e &val) const
+{
+    val = str2kdf.at(value(key));
+}
+
+void TestVector::reset()
+{
+    m_data.clear();
+}
+
+bool TestVector::empty() const
+{
+    return m_data.empty();
+}
+
+std::string TestVector::value(const std::string &key) const
+{
+    auto it = m_data.find(key);
+    RUNNER_ASSERT_MSG(it != m_data.end(),
+                      "No entry for key \"" << key << "\" in current test vector");
+    return it->second;
+}
+
+TestVectorVector loadTestVector(const std::string &filename)
+{
+    std::string path_local = std::string("./test-vectors/") + filename;
+    std::string path_shared = std::string(YACA_TEST_DIR"/test-vectors/") + filename;
+
+    TestVectorVector tvv;
+
+    std::ifstream ifs(path_local, std::ifstream::in);
+    if (!ifs)
+        ifs.open(path_shared, std::ifstream::in);
+
+    RUNNER_ASSERT_MSG(ifs, "Failed to open " << filename);
+    std::string line;
+    TestVector tv;
+    while (std::getline(ifs, line)) {
+        /* truncate blank chars from the beginning of the line */
+        size_t i;
+        for (i = 0; i < line.size(); ++i)
+            if (!isblank(line[i]))
+                break;
+        line = line.substr(i);
+
+        if (line.empty()) {
+            /* next test vector */
+            if (!tv.empty()) {
+                tvv.push_back(tv);
+                tv.reset();
+            }
+        } else {
+            size_t equals = line.find('=');
+            bool comment = (line[0] == '#');
+
+            /* ignore lines without '=' */
+            if (!comment && equals != std::string::npos) {
+                std::string key = line.substr(0, equals);
+                std::string value = line.substr(equals + 1);
+                tv.add(key, value);
+            }
+        }
+
+        if (ifs.eof())
+            break;
+    }
+    RUNNER_ASSERT_MSG(ifs.eof(), "Failed to read " << filename);
+    if (!tv.empty())
+        tvv.push_back(tv);
+    return tvv;
+}
diff --git a/src/yaca/yaca-test-vector.h b/src/yaca/yaca-test-vector.h
new file mode 100644 (file)
index 0000000..1e34481
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ *  Copyright (c) 2000 - 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+/*
+ * @file       yaca-test-vector.h
+ * @author     Krzysztof Jackiewicz (k.jackiewicz@samsung.com)
+ * @version    1.0
+ */
+#pragma once
+
+#include <string>
+#include <vector>
+#include <unordered_map>
+#include <sstream>
+
+#include "yaca-test-common.h"
+
+class TestVector {
+public:
+    TestVector() {}
+
+    void add(const std::string &key, const std::string &value);
+
+    template <typename T>
+    void get(const std::string &key, T &val) const
+    {
+        std::stringstream ss(value(key));
+        ss >> val;
+    }
+    /* special case for string (because >> stops on whitespace) */
+    void get(const std::string &key, std::string &val) const;
+    /* special case for buffer */
+    void get(const std::string &key, Buffer &val) const;
+    /* special case for key format */
+    void get(const std::string &key, yaca_key_format_e &val) const;
+    /* special case for key file format */
+    void get(const std::string &key, yaca_key_file_format_e &val) const;
+    /* special case for key type */
+    void get(const std::string &key, yaca_key_type_e &val) const;
+    /* special case for message digest */
+    void get(const std::string &key, yaca_digest_algorithm_e &val) const;
+    /* special case for encryption algorithm */
+    void get(const std::string &key, yaca_encrypt_algorithm_e &val) const;
+    /* special case for bcm */
+    void get(const std::string &key, yaca_block_cipher_mode_e &val) const;
+    /* special case for kdf */
+    void get(const std::string &key, yaca_kdf_e &val) const;
+
+    void reset();
+
+    bool empty() const;
+private:
+    std::string value(const std::string &key) const;
+
+    // key, value
+    std::unordered_map<std::string, std::string> m_data;
+};
+
+typedef std::vector<TestVector> TestVectorVector;
+
+TestVectorVector loadTestVector(const std::string &filename);
diff --git a/src/yaca/yaca-test.cpp b/src/yaca/yaca-test.cpp
new file mode 100644 (file)
index 0000000..50f4e3b
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+ *  Copyright (c) 2016 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ *  Contact: Dariusz Michaluk (d.michaluk@samsung.com)
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License
+ */
+
+/**
+ * @file
+ * @author Dariusz Michaluk (d.michaluk@samsung.com)
+ */
+
+#include "dpl/test/test_runner.h"
+
+int main (int argc, char *argv[])
+{
+    int status = DPL::Test::TestRunnerSingleton::Instance().ExecTestRunner(argc, argv);
+    return status;
+}