/*
* gnome-keyring
*
* Copyright (C) 2008 Stefan Walter
*
* This program 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.1 of
* the License, or (at your option) any later version.
*
* This program 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 program; if not, see
* .
*
* Author: Stef Walter
*/
#include "config.h"
#include "gcr-ssh-agent-util.h"
#include
#include
#include
#include
static struct {
const char *filename;
const char *encoded;
} PUBLIC_FILES[] = {
{ SRCDIR "/gcr/fixtures/ssh-agent/id_rsa_test.pub",
"AAAAB3NzaC1yc2EAAAABIwAAAQEAoD6VKqkhay6pKHSRjAGWWfFPU8xfsi2gnOwP/B1UHDoztx3czhO+py/fTlhCnSP1jsjkrVIZcnzah2fUNFFRgS4+jROBtvbgHsS72V1E6+ZogV+mBJWWAhw0iPrmQ3Kvm38D3PByo5Y7yKO5kIG2LloYLjosJ5F4sx2xh0uz2wXNtnY1b5xhe2+VEksm9OB+FXaUkZC2fQrTNo8ZGFJQSFd8kUhIfbUDJmlYuZ+vvHM+A3Lc9rHyW4IPaRyxFQciRmb+ZQqU2uSdOXAhg17lskuX/q8yCI5Hy5eDicC222oUMdJTtYgwX4dQCU8TICWhxb3x4RCV+g7D99+tkIvv+w==" },
{ SRCDIR "/gcr/fixtures/ssh-agent/id_dsa_test.pub",
"AAAAB3NzaC1kc3MAAACBANHNmw2YHEodUj4Ae27i8Rm8uoLnpS68QEiCJx8bv9P1o0AaD0w55sH+TBzlo7vtAEDlAzIOBY3PMpy5WarELTIeXmFPzKfHL8tuxMbOPaN/wDkDZNnJZsqlyRwlQKStPcAlvLBNuMjA53u2ndMTVghtUHXETQzwxKhXf7TmvfLBAAAAFQDnF/Y8MgFCP0PpRC5ZAQo1dyDEwwAAAIEAr4iOpTeZx8i1QgQpRl+dmbBAtHTXbPiophzNJBge9lixqF0T3egN2B9wGGnumIXmnst9RPPjuu+cHCLfxhXHzLlW8MLwoiF6ZQOx9M8WcfWIl5oiGyr2e969woRf5OcMGQPOQBdws6MEtemRqq5gu6dqDqVl3xfhSZSP9LpqAI8AAACAUjiuQ3qGErsCz++qd0qrR++QA185XGXAPZqQEHcr4iKSlO17hSUYA03kOWtDaeRtJOlxjIjl9iLo3juKGFgxUfo2StScOSO2saTWFGjA4MybHCK1+mIYXRcYrq314yK2Tmbql/UGDWpcCCGXLWpSFHTaXTbJjPd6VL+TO9/8tFk=" },
{ SRCDIR "/gcr/fixtures/ssh-agent/identity.pub",
NULL }
};
#define COMMENT "A public key comment"
static void
test_parse_public (void)
{
GBytes *input_bytes, *output_bytes;
gchar *comment;
guchar *data;
const guchar *blob;
gsize n_data;
gchar *encoded;
gsize i;
for (i = 0; i < G_N_ELEMENTS (PUBLIC_FILES); ++i) {
if (!g_file_get_contents (PUBLIC_FILES[i].filename, (gchar **)&data, &n_data, NULL))
g_assert_not_reached ();
input_bytes = g_bytes_new_take (data, n_data);
output_bytes = _gcr_ssh_agent_parse_public_key (input_bytes, &comment);
g_bytes_unref (input_bytes);
if (PUBLIC_FILES[i].encoded == NULL) {
g_assert (output_bytes == NULL);
} else {
g_assert (output_bytes);
blob = g_bytes_get_data (output_bytes, &n_data);
encoded = g_base64_encode (blob, n_data);
g_bytes_unref (output_bytes);
g_assert_cmpstr (encoded, ==, PUBLIC_FILES[i].encoded);
g_free (encoded);
g_assert_cmpstr (comment, ==, COMMENT);
g_free (comment);
}
}
}
static void
test_canon_error (void)
{
static const gchar input[] =
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\n"
"@ WARNING: UNPROTECTED PRIVATE KEY FILE! @\r\n"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
"Permissions 0620 for '/home/foo/.ssh/id_rsa' are too open.\r\n"
"It is required that your private key files are NOT accessible by others.\r\n"
"This private key will be ignored.\r\n";
static const gchar expected[] =
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
"@ WARNING: UNPROTECTED PRIVATE KEY FILE! @\n"
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n"
"Permissions 0620 for '/home/foo/.ssh/id_rsa' are too open.\n"
"It is required that your private key files are NOT accessible by others.\n"
"This private key will be ignored.\n";
gchar *p, *output;
p = g_strdup (input);
output = _gcr_ssh_agent_canon_error (p);
g_assert (output == p);
g_assert_cmpstr (expected, ==, output);
g_free (p);
}
int
main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
g_test_add_func ("/ssh-agent/util/parse_public", test_parse_public);
g_test_add_func ("/ssh-agent/util/canon_error", test_canon_error);
return g_test_run ();
}