summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/.gitignore1
-rwxr-xr-xtests/test-admin-gpg.sh5
-rw-r--r--tests/test-commit-sign-sh-ext.c118
-rwxr-xr-xtests/test-commit-sign.sh10
4 files changed, 132 insertions, 2 deletions
diff --git a/tests/.gitignore b/tests/.gitignore
index 938c169f..6355c8df 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -24,3 +24,4 @@ test-repo-finder-mount
test-rfc2616-dates
test-rollsum-cli
test-kargs
+test-commit-sign-sh-ext
diff --git a/tests/test-admin-gpg.sh b/tests/test-admin-gpg.sh
index 2167f673..bd34aae4 100755
--- a/tests/test-admin-gpg.sh
+++ b/tests/test-admin-gpg.sh
@@ -148,4 +148,9 @@ ${CMD_PREFIX} ostree admin status > status.txt
test -f status.txt
assert_file_has_content status.txt "GPG: Signature made"
assert_not_file_has_content status.txt "GPG: Can't check signature: public key not found"
+rm -f status.txt
+
+${CMD_PREFIX} ostree admin status --verify > status.txt
+assert_file_has_content status.txt "GPG: Signature made"
+rm -f status.txt
echo 'ok gpg signature'
diff --git a/tests/test-commit-sign-sh-ext.c b/tests/test-commit-sign-sh-ext.c
new file mode 100644
index 00000000..b5c5dcc6
--- /dev/null
+++ b/tests/test-commit-sign-sh-ext.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright (C) 2021 Red Hat, Inc.
+ *
+ * SPDX-License-Identifier: LGPL-2.0+
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#include "config.h"
+
+#include "libglnx.h"
+#include <ostree.h>
+
+static void
+assert_error_contains (GError **error, const char *msg)
+{
+ g_assert (error != NULL);
+ GError *actual = *error;
+ g_assert (actual != NULL);
+ if (strstr (actual->message, msg) == NULL)
+ g_error ("%s does not contain %s", actual->message, msg);
+ g_clear_error (error);
+}
+
+// Perhaps in the future we hook this up to a fuzzer
+static GBytes *
+corrupt (GBytes *input)
+{
+ gsize len = 0;
+ const guint8 *buf = g_bytes_get_data (input, &len);
+ g_assert_cmpint (len, >, 0);
+ g_assert_cmpint (len, <, G_MAXINT);
+ g_autofree char *newbuf = g_memdup (buf, len);
+ int o = g_random_int_range (0, len);
+ newbuf[o] = (newbuf[0] + 1);
+
+ return g_bytes_new_take (g_steal_pointer (&newbuf), len);
+}
+
+static gboolean
+run (GError **error)
+{
+ g_autoptr(OstreeRepo) repo = ostree_repo_open_at (AT_FDCWD, "repo", NULL, error);
+ if (!repo)
+ return FALSE;
+
+ g_autofree char *rev = NULL;
+ if (!ostree_repo_resolve_rev (repo, "origin:main", FALSE, &rev, error))
+ return FALSE;
+ g_assert (rev);
+ g_autoptr(GVariant) commit = NULL;
+ if (!ostree_repo_load_variant (repo, OSTREE_OBJECT_TYPE_COMMIT, rev, &commit, error))
+ return FALSE;
+ g_assert (commit);
+
+ g_autoptr(GVariant) detached_meta = NULL;
+ if (!ostree_repo_read_commit_detached_metadata (repo, rev, &detached_meta, NULL, error))
+ return FALSE;
+ g_assert (detached_meta);
+
+ g_autoptr(GBytes) commit_bytes = g_variant_get_data_as_bytes (commit);
+ g_autoptr(GBytes) detached_meta_bytes = g_variant_get_data_as_bytes (detached_meta);
+ g_autofree char *verify_report = NULL;
+ if (!ostree_repo_signature_verify_commit_data (repo, "origin", commit_bytes, detached_meta_bytes, 0,
+ &verify_report, error))
+ return FALSE;
+
+ if (ostree_repo_signature_verify_commit_data (repo, "origin", commit_bytes, detached_meta_bytes,
+ OSTREE_REPO_VERIFY_FLAGS_NO_GPG | OSTREE_REPO_VERIFY_FLAGS_NO_SIGNAPI,
+ &verify_report, error))
+ g_error ("Should not have validated");
+ assert_error_contains (error, "No commit verification types enabled");
+
+ // No signatures
+ g_autoptr(GBytes) empty = g_bytes_new_static ("", 0);
+ if (ostree_repo_signature_verify_commit_data (repo, "origin", commit_bytes, empty, 0,
+ &verify_report, error))
+ g_error ("Should not have validated");
+ assert_error_contains (error, "no signatures found");
+ // No such remote
+ if (ostree_repo_signature_verify_commit_data (repo, "nosuchremote", commit_bytes, detached_meta_bytes, 0,
+ &verify_report, error))
+ g_error ("Should not have validated");
+ assert_error_contains (error, "Remote \"nosuchremote\" not found");
+
+ // Corrupted commit
+ g_autoptr(GBytes) corrupted_commit = corrupt (commit_bytes);
+ if (ostree_repo_signature_verify_commit_data (repo, "origin", corrupted_commit, detached_meta_bytes, 0,
+ &verify_report, error))
+ g_error ("Should not have validated");
+ assert_error_contains (error, "BAD signature");
+
+ return TRUE;
+}
+
+int
+main (int argc, char **argv)
+{
+ g_autoptr(GError) error = NULL;
+ if (!run (&error))
+ {
+ g_printerr ("error: %s\n", error->message);
+ exit (1);
+ }
+}
diff --git a/tests/test-commit-sign.sh b/tests/test-commit-sign.sh
index e9e7a6da..c3f9ce63 100755
--- a/tests/test-commit-sign.sh
+++ b/tests/test-commit-sign.sh
@@ -28,7 +28,7 @@ if ! has_gpgme; then
exit 0
fi
-echo "1..6"
+echo "1..7"
keyid="472CDAFA"
oldpwd=`pwd`
@@ -85,9 +85,15 @@ ${CMD_PREFIX} ostree --repo=repo remote add origin $(cat httpd-address)/ostree/g
${CMD_PREFIX} ostree --repo=repo pull origin main
${CMD_PREFIX} ostree --repo=repo show --gpg-verify-remote=origin main > show.txt
assert_file_has_content_literal show.txt 'Found 1 signature'
-rm repo -rf
echo "ok pull verify"
+# Run tests written in C
+${OSTREE_UNINSTALLED}/tests/test-commit-sign-sh-ext
+echo "ok extra C tests"
+
+# Clean things up and reinit
+rm repo -rf
+
# A test with corrupted detached signature
cd ${test_tmpdir}
find ${test_tmpdir}/ostree-srv/gnomerepo -name '*.commitmeta' | while read fname; do