summary refs log tree commit diff
path: root/libnm-util/tests
diff options
context:
space:
mode:
authorMichael Biebl <biebl@debian.org>2011-05-04 21:35:41 +0200
committerMichael Biebl <biebl@debian.org>2011-05-04 21:35:41 +0200
commit9f806e97a24bba61417ae312fcc0da40914266fb (patch)
tree4a25723414ceac11b4cba0558aa16f6f4b459f4b /libnm-util/tests
parent8baa1aca8dfd35e3190d7d5655eb83b5b901e263 (diff)
Imported Upstream version 0.8.999 upstream/0.8.999
Diffstat (limited to 'libnm-util/tests')
-rw-r--r--libnm-util/tests/Makefile.am55
-rw-r--r--libnm-util/tests/Makefile.in112
-rw-r--r--libnm-util/tests/certs/Makefile.am1
-rw-r--r--libnm-util/tests/certs/Makefile.in56
-rw-r--r--libnm-util/tests/certs/test_ca_cert.derbin0 -> 1162 bytes
-rw-r--r--libnm-util/tests/test-crypto.c145
-rw-r--r--libnm-util/tests/test-general.c602
-rw-r--r--libnm-util/tests/test-secrets.c314
-rw-r--r--libnm-util/tests/test-setting-8021x.c356
9 files changed, 1262 insertions, 379 deletions
diff --git a/libnm-util/tests/Makefile.am b/libnm-util/tests/Makefile.am
index a0b4779c..daf4d688 100644
--- a/libnm-util/tests/Makefile.am
+++ b/libnm-util/tests/Makefile.am
@@ -79,61 +79,52 @@ check-local: test-settings-defaults test-crypto test-secrets
 	$(abs_builddir)/test-general
 
 # Private key and CA certificate in the same file (PEM)
-	$(abs_builddir)/test-setting-8021x \
-		$(top_srcdir)/libnm-util/tests/certs/test_key_and_cert.pem \
-		"test" \
-		$(top_srcdir)/libnm-util/tests/certs/test-key-only-decrypted.der
+	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test_key_and_cert.pem "test"
 
 # Private key by itself (PEM)
-	$(abs_builddir)/test-setting-8021x \
-		$(top_srcdir)/libnm-util/tests/certs/test-key-only.pem \
-		"test" \
-		$(top_srcdir)/libnm-util/tests/certs/test-key-only-decrypted.der
+	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-key-only.pem "test"
 
 # Private key and CA certificate in the same file (pkcs12)
-	$(abs_builddir)/test-setting-8021x \
-		$(top_srcdir)/libnm-util/tests/certs/test-cert.p12 \
-		"test"
+	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-cert.p12 "test"
 
 # Normal CA certificate
-	$(abs_builddir)/test-crypto --cert \
-		$(top_srcdir)/libnm-util/tests/certs/test_ca_cert.pem
+	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.pem
 
 # Another CA certificate
-	$(abs_builddir)/test-crypto --cert \
-		$(top_srcdir)/libnm-util/tests/certs/test2_ca_cert.pem
+	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_ca_cert.pem
+
+# Normal CA certificate (DER format)
+	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.der
 
 # CA certificate without an ending newline
-	$(abs_builddir)/test-crypto --cert \
-		$(top_srcdir)/libnm-util/tests/certs/ca-no-ending-newline.pem
+	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/ca-no-ending-newline.pem
 
 # Combined user cert and private key
-	$(abs_builddir)/test-crypto --cert \
-		$(top_srcdir)/libnm-util/tests/certs/test_key_and_cert.pem
+	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_key_and_cert.pem
 
 # Another combined user cert and private key
-	$(abs_builddir)/test-crypto --cert \
-		$(top_srcdir)/libnm-util/tests/certs/test2_key_and_cert.pem
+	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_key_and_cert.pem
 
 # Private key with 8 bytes of tail padding
 	$(abs_builddir)/test-crypto --key \
-		$(top_srcdir)/libnm-util/tests/certs/test_key_and_cert.pem \
-		"test"
+		$(srcdir)/certs/test_key_and_cert.pem \
+		"test" \
+		$(srcdir)/certs/test-key-only-decrypted.der
+
+# Private key only (not combined with a cert)
+	$(abs_builddir)/test-crypto --key \
+		$(srcdir)/certs/test-key-only.pem \
+		"test" \
+		$(srcdir)/certs/test-key-only-decrypted.der
 
 # Private key with 6 bytes of tail padding
-	$(abs_builddir)/test-crypto --key \
-		$(top_srcdir)/libnm-util/tests/certs/test2_key_and_cert.pem \
-		"12345testing"
+	$(abs_builddir)/test-crypto --key $(srcdir)/certs/test2_key_and_cert.pem "12345testing"
 
 # PKCS#12 file
-	$(abs_builddir)/test-crypto --p12 \
-		$(top_srcdir)/libnm-util/tests/certs/test-cert.p12 \
-		"test"
+	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test-cert.p12 "test"
 
 # Another PKCS#12 file
-	$(abs_builddir)/test-crypto --p12 \
-		$(top_srcdir)/libnm-util/tests/certs/test2-cert.p12 \
-		"12345testing"
+	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test2-cert.p12 "12345testing"
 
 endif
 
diff --git a/libnm-util/tests/Makefile.in b/libnm-util/tests/Makefile.in
index ab69399a..9e65094c 100644
--- a/libnm-util/tests/Makefile.in
+++ b/libnm-util/tests/Makefile.in
@@ -41,11 +41,16 @@ subdir = libnm-util/tests
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/intltool.m4 \
-	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -83,7 +88,7 @@ test_settings_defaults_DEPENDENCIES =  \
 	$(top_builddir)/libnm-util/libnm-util.la $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1)
 DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
-depcomp = $(SHELL) $(top_srcdir)/depcomp
+depcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
@@ -156,7 +161,6 @@ am__relativize = \
   done; \
   reldir="$$dir2"
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -165,13 +169,15 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DATADIRNAME = @DATADIRNAME@
 DBUS_CFLAGS = @DBUS_CFLAGS@
@@ -183,6 +189,7 @@ DHCLIENT_PATH = @DHCLIENT_PATH@
 DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
 DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -191,6 +198,7 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
@@ -199,8 +207,8 @@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
-GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
 GNUTLS_LIBS = @GNUTLS_LIBS@
 GREP = @GREP@
@@ -215,13 +223,23 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
+IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
+IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
@@ -229,6 +247,8 @@ LIBDL = @LIBDL@
 LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
 LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
 LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
 LIBM = @LIBM@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
 LIBNL_LIBS = @LIBNL_LIBS@
@@ -237,13 +257,15 @@ LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
-MKINSTALLDIRS = @MKINSTALLDIRS@
 MSGFMT = @MSGFMT@
-MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -269,13 +291,12 @@ PKGCONFIG_PATH = @PKGCONFIG_PATH@
 PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POFILES = @POFILES@
 POLKIT_CFLAGS = @POLKIT_CFLAGS@
 POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
-PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
-PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
 RESOLVCONF_PATH = @RESOLVCONF_PATH@
 SED = @SED@
@@ -289,11 +310,15 @@ UUID_CFLAGS = @UUID_CFLAGS@
 UUID_LIBS = @UUID_LIBS@
 VERSION = @VERSION@
 XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -911,61 +936,52 @@ uninstall-am:
 @WITH_TESTS_TRUE@	$(abs_builddir)/test-general
 
 # Private key and CA certificate in the same file (PEM)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test_key_and_cert.pem \
-@WITH_TESTS_TRUE@		"test" \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test-key-only-decrypted.der
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test_key_and_cert.pem "test"
 
 # Private key by itself (PEM)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test-key-only.pem \
-@WITH_TESTS_TRUE@		"test" \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test-key-only-decrypted.der
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-key-only.pem "test"
 
 # Private key and CA certificate in the same file (pkcs12)
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test-cert.p12 \
-@WITH_TESTS_TRUE@		"test"
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-setting-8021x $(srcdir)/certs/test-cert.p12 "test"
 
 # Normal CA certificate
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test_ca_cert.pem
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.pem
 
 # Another CA certificate
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test2_ca_cert.pem
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_ca_cert.pem
+
+# Normal CA certificate (DER format)
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_ca_cert.der
 
 # CA certificate without an ending newline
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/ca-no-ending-newline.pem
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/ca-no-ending-newline.pem
 
 # Combined user cert and private key
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test_key_and_cert.pem
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test_key_and_cert.pem
 
 # Another combined user cert and private key
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test2_key_and_cert.pem
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --cert $(srcdir)/certs/test2_key_and_cert.pem
 
 # Private key with 8 bytes of tail padding
 @WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --key \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test_key_and_cert.pem \
-@WITH_TESTS_TRUE@		"test"
+@WITH_TESTS_TRUE@		$(srcdir)/certs/test_key_and_cert.pem \
+@WITH_TESTS_TRUE@		"test" \
+@WITH_TESTS_TRUE@		$(srcdir)/certs/test-key-only-decrypted.der
+
+# Private key only (not combined with a cert)
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --key \
+@WITH_TESTS_TRUE@		$(srcdir)/certs/test-key-only.pem \
+@WITH_TESTS_TRUE@		"test" \
+@WITH_TESTS_TRUE@		$(srcdir)/certs/test-key-only-decrypted.der
 
 # Private key with 6 bytes of tail padding
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --key \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test2_key_and_cert.pem \
-@WITH_TESTS_TRUE@		"12345testing"
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --key $(srcdir)/certs/test2_key_and_cert.pem "12345testing"
 
 # PKCS#12 file
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test-cert.p12 \
-@WITH_TESTS_TRUE@		"test"
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test-cert.p12 "test"
 
 # Another PKCS#12 file
-@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 \
-@WITH_TESTS_TRUE@		$(top_srcdir)/libnm-util/tests/certs/test2-cert.p12 \
-@WITH_TESTS_TRUE@		"12345testing"
+@WITH_TESTS_TRUE@	$(abs_builddir)/test-crypto --p12 $(srcdir)/certs/test2-cert.p12 "12345testing"
 
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
diff --git a/libnm-util/tests/certs/Makefile.am b/libnm-util/tests/certs/Makefile.am
index 4cd8a24b..02d5a5f5 100644
--- a/libnm-util/tests/certs/Makefile.am
+++ b/libnm-util/tests/certs/Makefile.am
@@ -9,6 +9,7 @@
 
 EXTRA_DIST = \
 	test_ca_cert.pem \
+	test_ca_cert.der \
 	test_key_and_cert.pem \
 	test-cert.p12 \
 	test2_ca_cert.pem \
diff --git a/libnm-util/tests/certs/Makefile.in b/libnm-util/tests/certs/Makefile.in
index 0821f71d..873218e8 100644
--- a/libnm-util/tests/certs/Makefile.in
+++ b/libnm-util/tests/certs/Makefile.in
@@ -46,11 +46,16 @@ subdir = libnm-util/tests/certs
 DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/m4/compiler_warnings.m4 \
-	$(top_srcdir)/m4/gtk-doc.m4 $(top_srcdir)/m4/intltool.m4 \
-	$(top_srcdir)/m4/libnl-check.m4 $(top_srcdir)/m4/libtool.m4 \
-	$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
-	$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
-	$(top_srcdir)/m4/nls.m4 $(top_srcdir)/configure.ac
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gtk-doc.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/intltool.m4 $(top_srcdir)/m4/introspection.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libnl-check.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
 mkinstalldirs = $(install_sh) -d
@@ -67,7 +72,6 @@ SOURCES =
 DIST_SOURCES =
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
-ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
 ALL_LINGUAS = @ALL_LINGUAS@
 AMTAR = @AMTAR@
 AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
@@ -76,13 +80,15 @@ AUTOCONF = @AUTOCONF@
 AUTOHEADER = @AUTOHEADER@
 AUTOMAKE = @AUTOMAKE@
 AWK = @AWK@
-CATALOGS = @CATALOGS@
-CATOBJEXT = @CATOBJEXT@
 CC = @CC@
 CCDEPMODE = @CCDEPMODE@
 CFLAGS = @CFLAGS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
 CYGPATH_W = @CYGPATH_W@
 DATADIRNAME = @DATADIRNAME@
 DBUS_CFLAGS = @DBUS_CFLAGS@
@@ -94,6 +100,7 @@ DHCLIENT_PATH = @DHCLIENT_PATH@
 DHCLIENT_VERSION = @DHCLIENT_VERSION@
 DHCPCD_PATH = @DHCPCD_PATH@
 DISABLE_DEPRECATED = @DISABLE_DEPRECATED@
+DLLTOOL = @DLLTOOL@
 DSYMUTIL = @DSYMUTIL@
 DUMPBIN = @DUMPBIN@
 ECHO_C = @ECHO_C@
@@ -102,6 +109,7 @@ ECHO_T = @ECHO_T@
 EGREP = @EGREP@
 EXEEXT = @EXEEXT@
 FGREP = @FGREP@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
 GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
 GIO_CFLAGS = @GIO_CFLAGS@
 GIO_LIBS = @GIO_LIBS@
@@ -110,8 +118,8 @@ GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
 GLIB_LIBS = @GLIB_LIBS@
 GMODULE_CFLAGS = @GMODULE_CFLAGS@
 GMODULE_LIBS = @GMODULE_LIBS@
-GMOFILES = @GMOFILES@
 GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
 GNUTLS_CFLAGS = @GNUTLS_CFLAGS@
 GNUTLS_LIBS = @GNUTLS_LIBS@
 GREP = @GREP@
@@ -126,13 +134,23 @@ INSTALL_DATA = @INSTALL_DATA@
 INSTALL_PROGRAM = @INSTALL_PROGRAM@
 INSTALL_SCRIPT = @INSTALL_SCRIPT@
 INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
-INSTOBJEXT = @INSTOBJEXT@
 INTLLIBS = @INTLLIBS@
 INTLTOOL_EXTRACT = @INTLTOOL_EXTRACT@
 INTLTOOL_MERGE = @INTLTOOL_MERGE@
 INTLTOOL_PERL = @INTLTOOL_PERL@
 INTLTOOL_UPDATE = @INTLTOOL_UPDATE@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
 IPTABLES_PATH = @IPTABLES_PATH@
+IWMX_SDK_CFLAGS = @IWMX_SDK_CFLAGS@
+IWMX_SDK_LIBS = @IWMX_SDK_LIBS@
 KERNEL_FIRMWARE_DIR = @KERNEL_FIRMWARE_DIR@
 LD = @LD@
 LDFLAGS = @LDFLAGS@
@@ -140,6 +158,8 @@ LIBDL = @LIBDL@
 LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
 LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
 LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
 LIBM = @LIBM@
 LIBNL_CFLAGS = @LIBNL_CFLAGS@
 LIBNL_LIBS = @LIBNL_LIBS@
@@ -148,13 +168,15 @@ LIBS = @LIBS@
 LIBTOOL = @LIBTOOL@
 LIPO = @LIPO@
 LN_S = @LN_S@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
 LTLIBOBJS = @LTLIBOBJS@
 MAINT = @MAINT@
 MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
 MKDIR_P = @MKDIR_P@
-MKINSTALLDIRS = @MKINSTALLDIRS@
 MSGFMT = @MSGFMT@
-MSGFMT_OPTS = @MSGFMT_OPTS@
+MSGFMT_015 = @MSGFMT_015@
 MSGMERGE = @MSGMERGE@
 NM = @NM@
 NMEDIT = @NMEDIT@
@@ -180,13 +202,12 @@ PKGCONFIG_PATH = @PKGCONFIG_PATH@
 PKG_CONFIG = @PKG_CONFIG@
 PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
 PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
-POFILES = @POFILES@
 POLKIT_CFLAGS = @POLKIT_CFLAGS@
 POLKIT_LIBS = @POLKIT_LIBS@
 POSUB = @POSUB@
-PO_IN_DATADIR_FALSE = @PO_IN_DATADIR_FALSE@
-PO_IN_DATADIR_TRUE = @PO_IN_DATADIR_TRUE@
 PPPD_PLUGIN_DIR = @PPPD_PLUGIN_DIR@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
 RANLIB = @RANLIB@
 RESOLVCONF_PATH = @RESOLVCONF_PATH@
 SED = @SED@
@@ -200,11 +221,15 @@ UUID_CFLAGS = @UUID_CFLAGS@
 UUID_LIBS = @UUID_LIBS@
 VERSION = @VERSION@
 XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
 abs_builddir = @abs_builddir@
 abs_srcdir = @abs_srcdir@
 abs_top_builddir = @abs_top_builddir@
 abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
 ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
 ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
 am__include = @am__include@
 am__leading_dot = @am__leading_dot@
@@ -254,6 +279,7 @@ top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 EXTRA_DIST = \
 	test_ca_cert.pem \
+	test_ca_cert.der \
 	test_key_and_cert.pem \
 	test-cert.p12 \
 	test2_ca_cert.pem \
diff --git a/libnm-util/tests/certs/test_ca_cert.der b/libnm-util/tests/certs/test_ca_cert.der
new file mode 100644
index 00000000..e844f65b
--- /dev/null
+++ b/libnm-util/tests/certs/test_ca_cert.der
Binary files differdiff --git a/libnm-util/tests/test-crypto.c b/libnm-util/tests/test-crypto.c
index a5466bc8..6cfb6ac2 100644
--- a/libnm-util/tests/test-crypto.c
+++ b/libnm-util/tests/test-crypto.c
@@ -18,7 +18,7 @@
  * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  * Boston, MA 02110-1301 USA.
  *
- * (C) Copyright 2007 - 2009 Red Hat, Inc.
+ * (C) Copyright 2007 - 2011 Red Hat, Inc.
  */
 
 #include <glib.h>
@@ -113,28 +113,46 @@ test_load_cert (const char *path, const char *desc)
 	g_byte_array_free (array, TRUE);
 }
 
+static GByteArray *
+file_to_byte_array (const char *filename)
+{
+	char *contents;
+	GByteArray *array = NULL;
+	gsize length = 0;
+
+	if (g_file_get_contents (filename, &contents, &length, NULL)) {
+		array = g_byte_array_sized_new (length);
+		if (array) {
+			g_byte_array_append (array, (guint8 *) contents, length);
+			g_assert (array->len == length);
+		}
+		g_free (contents);
+	}
+	return array;
+}
+
 static void
 test_load_private_key (const char *path,
                        const char *password,
+                       const char *decrypted_path,
                        gboolean expect_fail,
                        const char *desc)
 {
 	NMCryptoKeyType key_type = NM_CRYPTO_KEY_TYPE_UNKNOWN;
-	NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
-	GByteArray *array;
+	GByteArray *array, *decrypted;
 	GError *error = NULL;
 
-	array = crypto_get_private_key (path, password, &key_type, &format, &error);
+	array = crypto_decrypt_private_key (path, password, &key_type, &error);
 	if (expect_fail) {
 		ASSERT (array == NULL, desc,
 		        "unexpected success reading private key file '%s' with "
 		        "invalid password",
 		        path);
 
-		ASSERT (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN, desc,
-		        "unexpected success determining private key file '%s' "
-		        "format with invalid password (expected %d, got %d)",
-		        path, NM_CRYPTO_FILE_FORMAT_UNKNOWN, format);
+		ASSERT (key_type != NM_CRYPTO_KEY_TYPE_UNKNOWN, desc,
+		        "unexpected failure determining private key file '%s' "
+		        "type with invalid password (expected %d, got %d)",
+		        path, NM_CRYPTO_KEY_TYPE_UNKNOWN, key_type);
 		return;
 	}
 
@@ -142,13 +160,28 @@ test_load_private_key (const char *path,
 	        "couldn't read private key file '%s': %d %s",
 	        path, error->code, error->message);
 
-	ASSERT (format == NM_CRYPTO_FILE_FORMAT_RAW_KEY, desc,
-	        "%s: unexpected private key file format (expected %d, got %d)",
-	        path, NM_CRYPTO_FILE_FORMAT_RAW_KEY, format);
-
 	ASSERT (key_type == NM_CRYPTO_KEY_TYPE_RSA, desc,
 	        "%s: unexpected private key type (expected %d, got %d)",
-	        path, NM_CRYPTO_KEY_TYPE_RSA, format);
+	        path, NM_CRYPTO_KEY_TYPE_RSA, key_type);
+
+	if (decrypted_path) {
+		/* Compare the crypto decrypted key against a known-good decryption */
+		decrypted = file_to_byte_array (decrypted_path);
+		ASSERT (decrypted != NULL, desc,
+		        "couldn't read decrypted private key file '%s': %d %s",
+		        decrypted_path, error->code, error->message);
+
+		ASSERT (decrypted->len > 0, desc, "decrypted key file invalid (size 0)");
+
+		ASSERT (decrypted->len == array->len,
+			    desc, "decrypted key file (%d) and decrypted key data (%d) lengths don't match",
+			    decrypted->len, array->len);
+
+		ASSERT (memcmp (decrypted->data, array->data, array->len) == 0,
+			    desc, "decrypted key file and decrypted key data don't match");
+
+		g_byte_array_free (decrypted, TRUE);
+	}
 
 	g_byte_array_free (array, TRUE);
 }
@@ -159,46 +192,35 @@ test_load_pkcs12 (const char *path,
                   gboolean expect_fail,
                   const char *desc)
 {
-	NMCryptoKeyType key_type = NM_CRYPTO_KEY_TYPE_UNKNOWN;
 	NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
-	GByteArray *array;
 	GError *error = NULL;
 
-	array = crypto_get_private_key (path, password, &key_type, &format, &error);
+	format = crypto_verify_private_key (path, password, &error);
 	if (expect_fail) {
-		ASSERT (array == NULL, desc,
+		ASSERT (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN, desc,
 		        "unexpected success reading PKCS#12 private key file "
 		        "'%s' with invalid password",
 		        path);
-
-		/* PKCS#12 file format can be determined even if the password
-		 * is wrong; check that.
-		 */
-		ASSERT (format == NM_CRYPTO_FILE_FORMAT_UNKNOWN, desc,
-		        "unexpected success determining PKCS#12 private key "
-		        "'%s' file format with invalid password (expected %d, "
-		        "got %d)",
-		        path, NM_CRYPTO_FILE_FORMAT_UNKNOWN, format);
-		ASSERT (key_type == NM_CRYPTO_KEY_TYPE_UNKNOWN, desc,
-		        "unexpected success determining PKCS#12 private key "
-		        "'%s' type with invalid password (expected %d, got %d)",
-		        path, NM_CRYPTO_KEY_TYPE_UNKNOWN, key_type);
-		return;
+	} else {
+		ASSERT (format == NM_CRYPTO_FILE_FORMAT_PKCS12, desc,
+			    "%s: unexpected PKCS#12 private key file format (expected %d, got "
+			    "%d): %d %s",
+			    path, NM_CRYPTO_FILE_FORMAT_PKCS12, format, error->code, error->message);
 	}
+}
 
-	ASSERT (array != NULL, desc,
-	        "couldn't read PKCS#12 private key file '%s': %d %s",
-	        path, error->code, error->message);
+static void
+test_load_pkcs12_no_password (const char *path, const char *desc)
+{
+	NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
+	GError *error = NULL;
 
+	/* We should still get a valid returned crypto file format */
+	format = crypto_verify_private_key (path, NULL, &error);
 	ASSERT (format == NM_CRYPTO_FILE_FORMAT_PKCS12, desc,
-	        "%s: unexpected PKCS#12 private key file format (expected %d, got %d)",
-	        path, NM_CRYPTO_FILE_FORMAT_RAW_KEY, format);
-
-	ASSERT (key_type == NM_CRYPTO_KEY_TYPE_ENCRYPTED, desc,
-	        "%s: unexpected PKCS#12 private key type (expected %d, got %d)",
-	        path, NM_CRYPTO_KEY_TYPE_ENCRYPTED, format);
-
-	g_byte_array_free (array, TRUE);
+		    "%s: unexpected PKCS#12 private key file format (expected %d, got "
+		    "%d): %d %s",
+		    path, NM_CRYPTO_FILE_FORMAT_PKCS12, format, error->code, error->message);
 }
 
 static void
@@ -211,10 +233,9 @@ test_is_pkcs12 (const char *path, gboolean expect_fail, const char *desc)
 		ASSERT (is_pkcs12 == FALSE, desc,
 		        "unexpected success reading non-PKCS#12 file '%s'",
 		        path);
-		return;
+	} else {
+		ASSERT (is_pkcs12 == TRUE, desc, "couldn't read PKCS#12 file '%s'", path);
 	}
-
-	ASSERT (is_pkcs12 == TRUE, desc, "couldn't read PKCS#12 file '%s'", path);
 }
 
 static void
@@ -223,23 +244,17 @@ test_encrypt_private_key (const char *path,
                           const char *desc)
 {
 	NMCryptoKeyType key_type = NM_CRYPTO_KEY_TYPE_UNKNOWN;
-	NMCryptoFileFormat format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
 	GByteArray *array, *encrypted, *re_decrypted;
 	GError *error = NULL;
 
-	array = crypto_get_private_key (path, password, &key_type, &format, &error);
-
+	array = crypto_decrypt_private_key (path, password, &key_type, &error);
 	ASSERT (array != NULL, desc,
 	        "couldn't read private key file '%s': %d %s",
 	        path, error->code, error->message);
 
-	ASSERT (format == NM_CRYPTO_FILE_FORMAT_RAW_KEY, desc,
-	        "%s: unexpected private key file format (expected %d, got %d)",
-	        path, NM_CRYPTO_FILE_FORMAT_RAW_KEY, format);
-
 	ASSERT (key_type == NM_CRYPTO_KEY_TYPE_RSA, desc,
 	        "%s: unexpected private key type (expected %d, got %d)",
-	        path, NM_CRYPTO_KEY_TYPE_RSA, format);
+	        path, NM_CRYPTO_KEY_TYPE_RSA, key_type);
 
 	/* Now re-encrypt the private key */
 	encrypted = nm_utils_rsa_key_encrypt (array, password, NULL, &error);
@@ -249,20 +264,14 @@ test_encrypt_private_key (const char *path,
 
 	/* Then re-decrypt the private key */
 	key_type = NM_CRYPTO_KEY_TYPE_UNKNOWN;
-	format = NM_CRYPTO_FILE_FORMAT_UNKNOWN;
-	re_decrypted = crypto_get_private_key_data (encrypted, password, &key_type, &format, &error);
-
+	re_decrypted = crypto_decrypt_private_key_data (encrypted, password, &key_type, &error);
 	ASSERT (re_decrypted != NULL, desc,
 	        "couldn't read private key file '%s': %d %s",
 	        path, error->code, error->message);
 
-	ASSERT (format == NM_CRYPTO_FILE_FORMAT_RAW_KEY, desc,
-	        "%s: unexpected private key file format (expected %d, got %d)",
-	        path, NM_CRYPTO_FILE_FORMAT_RAW_KEY, format);
-
 	ASSERT (key_type == NM_CRYPTO_KEY_TYPE_RSA, desc,
 	        "%s: unexpected private key type (expected %d, got %d)",
-	        path, NM_CRYPTO_KEY_TYPE_RSA, format);
+	        path, NM_CRYPTO_KEY_TYPE_RSA, key_type);
 
 	/* Compare the original decrypted key with the re-decrypted key */
 	ASSERT (array->len == re_decrypted->len, desc,
@@ -292,17 +301,21 @@ int main (int argc, char **argv)
 	if (!strcmp (argv[1], "--cert"))
 		test_load_cert (argv[2], "cert");
 	else if (!strcmp (argv[1], "--key")) {
-		ASSERT (argc == 4, "test-crypto",
-		        "wrong number of arguments (--key <key file> <password>)");
+		const char *decrypted_path = (argc == 5) ? argv[4] : NULL;
+
+		ASSERT (argc == 4 || argc == 5, "test-crypto",
+		        "wrong number of arguments (--key <key file> <password> [<decrypted key file>])");
 
-		test_load_private_key (argv[2], argv[3], FALSE, "private-key");
-		test_load_private_key (argv[2], "blahblahblah", TRUE, "private-key-bad-password");
+		test_is_pkcs12 (argv[2], TRUE, "not-pkcs12");
+		test_load_private_key (argv[2], argv[3], decrypted_path, FALSE, "private-key");
+		test_load_private_key (argv[2], "blahblahblah", NULL, TRUE, "private-key-bad-password");
+		test_load_private_key (argv[2], NULL, NULL, TRUE, "private-key-no-password");
 		test_encrypt_private_key (argv[2], argv[3], "private-key-rencrypt");
-		test_is_pkcs12 (argv[2], TRUE, "is-pkcs12-not-pkcs12");
 	} else if (!strcmp (argv[1], "--p12")) {
 		test_is_pkcs12 (argv[2], FALSE, "is-pkcs12");
 		test_load_pkcs12 (argv[2], argv[3], FALSE, "pkcs12-private-key");
 		test_load_pkcs12 (argv[2], "blahblahblah", TRUE, "pkcs12-private-key-bad-password");
+		test_load_pkcs12_no_password (argv[2], "pkcs12-private-key-no-password");
 	} else {
 		ASSERT (argc > 2, "test-crypto", "unknown test type (not --cert, --key, or --p12)");
 	}
diff --git a/libnm-util/tests/test-general.c b/libnm-util/tests/test-general.c
index c7421faf..1ce80622 100644
--- a/libnm-util/tests/test-general.c
+++ b/libnm-util/tests/test-general.c
@@ -15,7 +15,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2008 - 2010 Red Hat, Inc.
+ * Copyright (C) 2008 - 2011 Red Hat, Inc.
  *
  */
 
@@ -29,10 +29,13 @@
 #include "nm-setting-connection.h"
 #include "nm-setting-vpn.h"
 #include "nm-setting-gsm.h"
+#include "nm-setting-cdma.h"
 #include "nm-setting-wired.h"
+#include "nm-setting-wireless-security.h"
 #include "nm-setting-ip6-config.h"
 #include "nm-setting-ip4-config.h"
 #include "nm-setting-pppoe.h"
+#include "nm-setting-serial.h"
 #include "nm-dbus-glib-types.h"
 
 static void
@@ -133,6 +136,65 @@ test_setting_vpn_items (void)
 	g_object_unref (s_vpn);
 }
 
+static void
+test_setting_vpn_update_secrets (void)
+{
+	NMConnection *connection;
+	NMSettingVPN *s_vpn;
+	GHashTable *settings, *vpn, *secrets;
+	GValue val = { 0 };
+	gboolean success;
+	GError *error = NULL;
+	const char *tmp;
+	const char *key1 = "foobar";
+	const char *key2 = "blahblah";
+	const char *val1 = "value1";
+	const char *val2 = "value2";
+
+	connection = nm_connection_new ();
+	ASSERT (connection != NULL,
+	        "vpn-update-secrets",
+	        "error creating connection");
+
+	s_vpn = (NMSettingVPN *) nm_setting_vpn_new ();
+	ASSERT (s_vpn != NULL,
+	        "vpn-update-secrets",
+	        "error creating vpn setting");
+	nm_connection_add_setting (connection, NM_SETTING (s_vpn));
+
+	settings = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_hash_table_destroy);
+	vpn = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_value_unset);
+	g_hash_table_insert (settings, NM_SETTING_VPN_SETTING_NAME, vpn);
+
+	secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, NULL);
+	g_value_init (&val, DBUS_TYPE_G_MAP_OF_STRING);
+	g_value_take_boxed (&val, secrets);
+	g_hash_table_insert (vpn, NM_SETTING_VPN_SECRETS, &val);
+
+	/* Add some secrets */
+	g_hash_table_insert (secrets, (char *) key1, (char *) val1);
+	g_hash_table_insert (secrets, (char *) key2, (char *) val2);
+
+	success = nm_connection_update_secrets (connection, NM_SETTING_VPN_SETTING_NAME, settings, &error);
+	ASSERT (success == TRUE,
+	        "vpn-update-secrets", "failed to update VPN secrets: %s", error->message);
+
+	/* Read the secrets back out */
+	tmp = nm_setting_vpn_get_secret (s_vpn, key1);
+	ASSERT (tmp != NULL,
+	        "vpn-update-secrets", "unexpected failure getting key #1");
+	ASSERT (strcmp (tmp, val1) == 0,
+	        "vpn-update-secrets", "unexpected key #1 value");
+
+	tmp = nm_setting_vpn_get_secret (s_vpn, key2);
+	ASSERT (tmp != NULL,
+	        "vpn-update-secrets", "unexpected failure getting key #2");
+	ASSERT (strcmp (tmp, val2) == 0,
+	        "vpn-update-secrets", "unexpected key #2 value");
+
+	g_object_unref (connection);
+}
+
 #define OLD_DBUS_TYPE_G_IP6_ADDRESS (dbus_g_type_get_struct ("GValueArray", DBUS_TYPE_G_UCHAR_ARRAY, G_TYPE_UINT, G_TYPE_INVALID))
 #define OLD_DBUS_TYPE_G_ARRAY_OF_IP6_ADDRESS (dbus_g_type_get_collection ("GPtrArray", OLD_DBUS_TYPE_G_IP6_ADDRESS))
 
@@ -292,6 +354,319 @@ test_setting_gsm_apn_bad_chars (void)
 	        "gsm-apn-bad-chars", "unexpectedly valid GSM setting");
 }
 
+static NMSettingWirelessSecurity *
+make_test_wsec_setting (const char *detail)
+{
+	NMSettingWirelessSecurity *s_wsec;
+
+	s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
+	ASSERT (s_wsec != NULL, detail, "error creating setting");
+
+	g_object_set (s_wsec,
+	              NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "wpa-psk",
+	              NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME, "foobarbaz",
+	              NM_SETTING_WIRELESS_SECURITY_PSK, "random psk",
+	              NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, "aaaaaaaaaa",
+	              NULL);
+
+	return s_wsec;
+}
+
+static void
+test_setting_to_hash_all (void)
+{
+	NMSettingWirelessSecurity *s_wsec;
+	GHashTable *hash;
+
+	s_wsec = make_test_wsec_setting ("setting-to-hash-all");
+
+	hash = nm_setting_to_hash (NM_SETTING (s_wsec), NM_SETTING_HASH_FLAG_ALL);
+
+	/* Make sure all keys are there */
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT),
+	        "setting-to-hash-all", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_KEY_MGMT);
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME),
+	        "setting-to-hash-all", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME);
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_PSK),
+	        "setting-to-hash-all", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_PSK);
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0),
+	        "setting-to-hash-all", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_WEP_KEY0);
+
+	g_hash_table_destroy (hash);
+	g_object_unref (s_wsec);
+}
+
+static void
+test_setting_to_hash_no_secrets (void)
+{
+	NMSettingWirelessSecurity *s_wsec;
+	GHashTable *hash;
+
+	s_wsec = make_test_wsec_setting ("setting-to-hash-no-secrets");
+
+	hash = nm_setting_to_hash (NM_SETTING (s_wsec), NM_SETTING_HASH_FLAG_NO_SECRETS);
+
+	/* Make sure non-secret keys are there */
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT),
+	        "setting-to-hash-no-secrets", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_KEY_MGMT);
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME),
+	        "setting-to-hash-no-secrets", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME);
+
+	/* Make sure secrets are not there */
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_PSK) == NULL,
+	        "setting-to-hash-no-secrets", "unexpectedly present " NM_SETTING_WIRELESS_SECURITY_PSK);
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0) == NULL,
+	        "setting-to-hash-no-secrets", "unexpectedly present " NM_SETTING_WIRELESS_SECURITY_WEP_KEY0);
+
+	g_hash_table_destroy (hash);
+	g_object_unref (s_wsec);
+}
+
+static void
+test_setting_to_hash_only_secrets (void)
+{
+	NMSettingWirelessSecurity *s_wsec;
+	GHashTable *hash;
+
+	s_wsec = make_test_wsec_setting ("setting-to-hash-only-secrets");
+
+	hash = nm_setting_to_hash (NM_SETTING (s_wsec), NM_SETTING_HASH_FLAG_ONLY_SECRETS);
+
+	/* Make sure non-secret keys are there */
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_KEY_MGMT) == NULL,
+	        "setting-to-hash-only-secrets", "unexpectedly present " NM_SETTING_WIRELESS_SECURITY_KEY_MGMT);
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME) == NULL,
+	        "setting-to-hash-only-secrets", "unexpectedly present " NM_SETTING_WIRELESS_SECURITY_LEAP_USERNAME);
+
+	/* Make sure secrets are not there */
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_PSK),
+	        "setting-to-hash-only-secrets", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_PSK);
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0),
+	        "setting-to-hash-only-secrets", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_WEP_KEY0);
+
+	g_hash_table_destroy (hash);
+	g_object_unref (s_wsec);
+}
+
+static void
+test_connection_to_hash_setting_name (void)
+{
+	NMConnection *connection;
+	NMSettingWirelessSecurity *s_wsec;
+	GHashTable *hash;
+
+	connection = nm_connection_new ();
+	s_wsec = make_test_wsec_setting ("connection-to-hash-setting-name");
+	nm_connection_add_setting (connection, NM_SETTING (s_wsec));
+
+	hash = nm_connection_to_hash (connection, NM_SETTING_HASH_FLAG_ALL);
+
+	/* Make sure the keys of the first level hash are setting names, not
+	 * the GType name of the setting objects.
+	 */
+	ASSERT (g_hash_table_lookup (hash, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME) != NULL,
+	        "connection-to-hash-setting-name", "unexpectedly missing " NM_SETTING_WIRELESS_SECURITY_SETTING_NAME);
+
+	g_hash_table_destroy (hash);
+	g_object_unref (connection);
+}
+
+static void
+check_permission (NMSettingConnection *s_con,
+                  guint32 idx,
+                  const char *expected_uname,
+                  const char *tag)
+{
+	gboolean success;
+	const char *ptype = NULL, *pitem = NULL, *detail = NULL;
+
+	success = nm_setting_connection_get_permission (s_con, 0, &ptype, &pitem, &detail);
+	ASSERT (success == TRUE, tag, "unexpected failure getting added permission");
+
+	/* Permission type */
+	ASSERT (ptype != NULL, tag, "unexpected failure getting permission type");
+	ASSERT (strcmp (ptype, "user") == 0, tag, "retrieved unexpected permission type");
+
+	/* Permission item */
+	ASSERT (pitem != NULL, tag, "unexpected failure getting permission item");
+	ASSERT (strcmp (pitem, expected_uname) == 0, tag, "retrieved unexpected permission item");
+
+	ASSERT (detail == NULL, tag, "unexpected success getting permission detail");
+}
+
+#define TEST_UNAME "asdfasfasdf"
+
+static void
+test_setting_connection_permissions_helpers (void)
+{
+	NMSettingConnection *s_con;
+	gboolean success;
+	char buf[9] = { 0x61, 0x62, 0x63, 0xff, 0xfe, 0xfd, 0x23, 0x01, 0x00 };
+	GSList *list = NULL;
+	const char *expected_perm = "user:" TEST_UNAME ":";
+
+	s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
+
+	/* Ensure a bad [type] is rejected */
+	success = nm_setting_connection_add_permission (s_con, "foobar", "blah", NULL);
+	ASSERT (success == FALSE,
+	        "setting-connection-permissions-helpers", "unexpected success adding bad permission type #1");
+
+	/* Ensure a bad [type] is rejected */
+	success = nm_setting_connection_add_permission (s_con, NULL, "blah", NULL);
+	ASSERT (success == FALSE,
+	        "setting-connection-permissions-helpers", "unexpected success adding bad permission type #2");
+
+	/* Ensure a bad [item] is rejected */
+	success = nm_setting_connection_add_permission (s_con, "user", NULL, NULL);
+	ASSERT (success == FALSE,
+	        "setting-connection-permissions-helpers", "unexpected success adding bad permission item #1");
+
+	/* Ensure a bad [item] is rejected */
+	success = nm_setting_connection_add_permission (s_con, "user", "", NULL);
+	ASSERT (success == FALSE,
+	        "setting-connection-permissions-helpers", "unexpected success adding bad permission item #2");
+
+	/* Ensure an [item] with ':' is rejected */
+	success = nm_setting_connection_add_permission (s_con, "user", "ad:asdf", NULL);
+	ASSERT (success == FALSE,
+	        "setting-connection-permissions-helpers", "unexpected success adding bad permission item #3");
+
+	/* Ensure a non-UTF-8 [item] is rejected */
+	success = nm_setting_connection_add_permission (s_con, "user", buf, NULL);
+	ASSERT (success == FALSE,
+	        "setting-connection-permissions-helpers", "unexpected success adding bad permission item #4");
+
+	/* Ensure a non-NULL [detail] is rejected */
+	success = nm_setting_connection_add_permission (s_con, "user", "dafasdf", "asdf");
+	ASSERT (success == FALSE,
+	        "setting-connection-permissions-helpers", "unexpected success adding bad detail");
+
+	/* Ensure a valid call results in success */
+	success = nm_setting_connection_add_permission (s_con, "user", TEST_UNAME, NULL);
+	ASSERT (success == TRUE,
+	        "setting-connection-permissions-helpers", "unexpected failure adding valid user permisson");
+
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 1,
+	        "setting-connection-permissions-helpers", "unexpected failure getting number of permissions");
+
+	check_permission (s_con, 0, TEST_UNAME, "setting-connection-permissions-helpers");
+
+	/* Check the actual GObject property just to be paranoid */
+	g_object_get (G_OBJECT (s_con), NM_SETTING_CONNECTION_PERMISSIONS, &list, NULL);
+	ASSERT (list != NULL,
+	        "setting-connection-permissions-helpers", "unexpected failure getting permissions list");
+	ASSERT (g_slist_length (list) == 1,
+	        "setting-connection-permissions-helpers", "unexpected failure getting number of permissions in list");
+	ASSERT (strcmp (list->data, expected_perm) == 0,
+	        "setting-connection-permissions-helpers", "unexpected permission property data");
+
+	/* Now remove that permission and ensure we have 0 permissions */
+	nm_setting_connection_remove_permission (s_con, 0);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-helpers", "unexpected failure removing permission");
+
+	g_object_unref (s_con);
+}
+
+static void
+add_permission_property (NMSettingConnection *s_con,
+                         const char *ptype,
+                         const char *pitem,
+                         int pitem_len,
+                         const char *detail)
+{
+	GString *str;
+	GSList *list = NULL;
+
+	str = g_string_sized_new (50);
+	if (ptype)
+		g_string_append (str, ptype);
+	g_string_append_c (str, ':');
+
+	if (pitem) {
+		if (pitem_len >= 0)
+			g_string_append_len (str, pitem, pitem_len);
+		else
+			g_string_append (str, pitem);
+	}
+
+	g_string_append_c (str, ':');
+
+	if (detail)
+		g_string_append (str, detail);
+
+	list = g_slist_append (list, str->str);
+	g_object_set (G_OBJECT (s_con), NM_SETTING_CONNECTION_PERMISSIONS, list, NULL);
+
+	g_string_free (str, TRUE);
+	g_slist_free (list);
+}
+
+static void
+test_setting_connection_permissions_property (void)
+{
+	NMSettingConnection *s_con;
+	gboolean success;
+	char buf[9] = { 0x61, 0x62, 0x63, 0xff, 0xfe, 0xfd, 0x23, 0x01, 0x00 };
+
+	s_con = NM_SETTING_CONNECTION (nm_setting_connection_new ());
+
+	/* Ensure a bad [type] is rejected */
+	add_permission_property (s_con, "foobar", "blah", -1, NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad permission type #1");
+
+	/* Ensure a bad [type] is rejected */
+	add_permission_property (s_con, NULL, "blah", -1, NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad permission type #2");
+
+	/* Ensure a bad [item] is rejected */
+	add_permission_property (s_con, "user", NULL, -1, NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad permission item #1");
+
+	/* Ensure a bad [item] is rejected */
+	add_permission_property (s_con, "user", "", -1, NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad permission item #2");
+
+	/* Ensure an [item] with ':' in the middle is rejected */
+	add_permission_property (s_con, "user", "ad:asdf", -1, NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad permission item #3");
+
+	/* Ensure an [item] with ':' at the end is rejected */
+	add_permission_property (s_con, "user", "adasdfaf:", -1, NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad permission item #4");
+
+	/* Ensure a non-UTF-8 [item] is rejected */
+	add_permission_property (s_con, "user", buf, (int) sizeof (buf), NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad permission item #5");
+
+	/* Ensure a non-NULL [detail] is rejected */
+	add_permission_property (s_con, "user", "dafasdf", -1, "asdf");
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected success adding bad detail");
+
+	/* Ensure a valid call results in success */
+	success = nm_setting_connection_add_permission (s_con, "user", TEST_UNAME, NULL);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 1,
+	        "setting-connection-permissions-property", "unexpected failure adding valid user permisson");
+
+	check_permission (s_con, 0, TEST_UNAME, "setting-connection-permissions-property");
+
+	/* Now remove that permission and ensure we have 0 permissions */
+	nm_setting_connection_remove_permission (s_con, 0);
+	ASSERT (nm_setting_connection_get_num_permissions (s_con) == 0,
+	        "setting-connection-permissions-property", "unexpected failure removing permission");
+
+	g_object_unref (s_con);
+}
+
 static NMConnection *
 new_test_connection (void)
 {
@@ -385,6 +760,7 @@ test_connection_diff_a_only (void)
 			{ NM_SETTING_CONNECTION_TIMESTAMP,   NM_SETTING_DIFF_RESULT_IN_A },
 			{ NM_SETTING_CONNECTION_AUTOCONNECT, NM_SETTING_DIFF_RESULT_IN_A },
 			{ NM_SETTING_CONNECTION_READ_ONLY,   NM_SETTING_DIFF_RESULT_IN_A },
+			{ NM_SETTING_CONNECTION_PERMISSIONS, NM_SETTING_DIFF_RESULT_IN_A },
 			{ NULL, NM_SETTING_DIFF_RESULT_UNKNOWN }
 		} },
 		{ NM_SETTING_WIRED_SETTING_NAME, {
@@ -526,6 +902,221 @@ test_connection_diff_no_secrets (void)
 	g_object_unref (b);
 }
 
+static void
+add_generic_settings (NMConnection *connection, const char *ctype)
+{
+	NMSetting *setting;
+	char *uuid;
+
+	uuid = nm_utils_uuid_generate ();
+
+	setting = nm_setting_connection_new ();
+	g_object_set (setting,
+	              NM_SETTING_CONNECTION_ID, "asdfasdfadf",
+	              NM_SETTING_CONNECTION_TYPE, ctype,
+	              NM_SETTING_CONNECTION_UUID, uuid,
+	              NULL);
+	nm_connection_add_setting (connection, setting);
+
+	g_free (uuid);
+
+	setting = nm_setting_ip4_config_new ();
+	g_object_set (setting, NM_SETTING_IP4_CONFIG_METHOD, NM_SETTING_IP4_CONFIG_METHOD_AUTO, NULL);
+	nm_connection_add_setting (connection, setting);
+
+	setting = nm_setting_ip6_config_new ();
+	g_object_set (setting, NM_SETTING_IP6_CONFIG_METHOD, NM_SETTING_IP6_CONFIG_METHOD_AUTO, NULL);
+	nm_connection_add_setting (connection, setting);
+}
+
+static void
+test_connection_good_base_types (void)
+{
+	NMConnection *connection;
+	NMSetting *setting;
+	gboolean success;
+	GError *error = NULL;
+	GByteArray *array;
+	const guint8 bdaddr[] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66 };
+
+	/* Try a basic wired connection */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_WIRED_SETTING_NAME);
+	setting = nm_setting_wired_new ();
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_no_error (error);
+	g_assert (success);
+	g_object_unref (connection);
+
+	/* Try a wired PPPoE connection */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_PPPOE_SETTING_NAME);
+	setting = nm_setting_pppoe_new ();
+	g_object_set (setting, NM_SETTING_PPPOE_USERNAME, "bob smith", NULL);
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_no_error (error);
+	g_assert (success);
+	g_object_unref (connection);
+
+	/* Wifi connection */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_WIRELESS_SETTING_NAME);
+
+	setting = nm_setting_wireless_new ();
+	array = g_byte_array_new ();
+	g_byte_array_append (array, (const guint8 *) "1234567", 7);
+	g_object_set (setting,
+	              NM_SETTING_WIRELESS_SSID, array,
+	              NM_SETTING_WIRELESS_MODE, "infrastructure",
+	              NULL);
+	g_byte_array_free (array, TRUE);
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_no_error (error);
+	g_assert (success);
+	g_object_unref (connection);
+
+	/* Bluetooth connection */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_BLUETOOTH_SETTING_NAME);
+
+	setting = nm_setting_bluetooth_new ();
+	array = g_byte_array_new ();
+	g_byte_array_append (array, bdaddr, sizeof (bdaddr));
+	g_object_set (setting,
+	              NM_SETTING_BLUETOOTH_BDADDR, array,
+	              NM_SETTING_CONNECTION_TYPE, NM_SETTING_BLUETOOTH_TYPE_PANU,
+	              NULL);
+	g_byte_array_free (array, TRUE);
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_no_error (error);
+	g_assert (success);
+	g_object_unref (connection);
+
+	/* WiMAX connection */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_WIMAX_SETTING_NAME);
+	setting = nm_setting_wimax_new ();
+	g_object_set (setting, NM_SETTING_WIMAX_NETWORK_NAME, "CLEAR", NULL);
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_no_error (error);
+	g_assert (success);
+	g_object_unref (connection);
+
+	/* GSM connection */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_GSM_SETTING_NAME);
+
+	setting = nm_setting_gsm_new ();
+	g_object_set (setting,
+	              NM_SETTING_GSM_NUMBER, "*99#",
+	              NM_SETTING_GSM_APN, "metered.billing.sucks",
+	              NULL);
+	nm_connection_add_setting (connection, setting);
+
+	/* CDMA connection */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_CDMA_SETTING_NAME);
+
+	setting = nm_setting_cdma_new ();
+	g_object_set (setting,
+	              NM_SETTING_CDMA_NUMBER, "#777",
+	              NM_SETTING_CDMA_USERNAME, "foobar@vzw.com",
+	              NULL);
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_no_error (error);
+	g_assert (success);
+	g_object_unref (connection);
+}
+
+static void
+test_connection_bad_base_types (void)
+{
+	NMConnection *connection;
+	NMSetting *setting;
+	gboolean success;
+	GError *error = NULL;
+
+	/* Test various non-base connection types to make sure they are rejected;
+	 * using a fake 'wired' connection so the rest of it verifies
+	 */
+
+	/* Connection setting */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_CONNECTION_SETTING_NAME);
+	setting = nm_setting_wired_new ();
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID);
+	g_assert (success == FALSE);
+	g_object_unref (connection);
+	g_clear_error (&error);
+
+	/* PPP setting */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_PPP_SETTING_NAME);
+	setting = nm_setting_wired_new ();
+	nm_connection_add_setting (connection, setting);
+	setting = nm_setting_ppp_new ();
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID);
+	g_assert (success == FALSE);
+	g_object_unref (connection);
+	g_clear_error (&error);
+
+	/* Serial setting */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_SERIAL_SETTING_NAME);
+	setting = nm_setting_wired_new ();
+	nm_connection_add_setting (connection, setting);
+	setting = nm_setting_serial_new ();
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID);
+	g_assert (success == FALSE);
+	g_object_unref (connection);
+	g_clear_error (&error);
+
+	/* IP4 setting */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_IP4_CONFIG_SETTING_NAME);
+	setting = nm_setting_wired_new ();
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID);
+	g_assert (success == FALSE);
+	g_object_unref (connection);
+	g_clear_error (&error);
+
+	/* IP6 setting */
+	connection = nm_connection_new ();
+	add_generic_settings (connection, NM_SETTING_IP6_CONFIG_SETTING_NAME);
+	setting = nm_setting_wired_new ();
+	nm_connection_add_setting (connection, setting);
+
+	success = nm_connection_verify (connection, &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_TYPE_INVALID);
+	g_assert (success == FALSE);
+	g_object_unref (connection);
+	g_clear_error (&error);
+}
+
 int main (int argc, char **argv)
 {
 	GError *error = NULL;
@@ -540,13 +1131,22 @@ int main (int argc, char **argv)
 
 	/* The tests */
 	test_setting_vpn_items ();
+	test_setting_vpn_update_secrets ();
 	test_setting_ip6_config_old_address_array ();
 	test_setting_gsm_apn_spaces ();
 	test_setting_gsm_apn_bad_chars ();
+	test_setting_to_hash_all ();
+	test_setting_to_hash_no_secrets ();
+	test_setting_to_hash_only_secrets ();
+	test_connection_to_hash_setting_name ();
+	test_setting_connection_permissions_helpers ();
+	test_setting_connection_permissions_property ();
 	test_connection_diff_a_only ();
 	test_connection_diff_same ();
 	test_connection_diff_different ();
 	test_connection_diff_no_secrets ();
+	test_connection_good_base_types ();
+	test_connection_bad_base_types ();
 
 	base = g_path_get_basename (argv[0]);
 	fprintf (stdout, "%s: SUCCESS\n", base);
diff --git a/libnm-util/tests/test-secrets.c b/libnm-util/tests/test-secrets.c
index da6f610d..6d46f99e 100644
--- a/libnm-util/tests/test-secrets.c
+++ b/libnm-util/tests/test-secrets.c
@@ -155,7 +155,6 @@ test_need_tls_secrets_path (void)
 	NMConnection *connection;
 	const char *setting_name;
 	GPtrArray *hints = NULL;
-	NMSetting8021x *s_8021x;
 
 	connection = make_tls_connection ("need-tls-secrets-path-key", NM_SETTING_802_1X_CK_SCHEME_PATH);
 	ASSERT (connection != NULL,
@@ -171,44 +170,12 @@ test_need_tls_secrets_path (void)
 	        "need-tls-secrets-path-key",
 	        "hints should be NULL since no secrets were required");
 
-	/* Connection is good; clear secrets and ensure private key is then required */
+	/* Connection is good; clear secrets and ensure private key password is then required */
 	nm_connection_clear_secrets (connection);
 
 	hints = NULL;
 	setting_name = nm_connection_need_secrets (connection, &hints);
 	ASSERT (setting_name != NULL,
-	        "need-tls-secrets-path-key",
-	        "unexpected secrets success");
-	ASSERT (strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME) == 0,
-			"need-tls-secrets-path-key",
-			"unexpected setting secrets required");
-
-	ASSERT (hints != NULL,
-	        "need-tls-secrets-path-key",
-	        "expected returned secrets hints");
-	ASSERT (find_hints_item (hints, NM_SETTING_802_1X_PRIVATE_KEY),
-			"need-tls-secrets-path-key",
-			"expected to require private key, but it wasn't");
-
-	g_object_unref (connection);
-
-	/*** Just clear the private key this time ***/
-
-	connection = make_tls_connection ("need-tls-secrets-path-key-password", NM_SETTING_802_1X_CK_SCHEME_PATH);
-	ASSERT (connection != NULL,
-	        "need-tls-secrets-path-key-password",
-	        "error creating test connection");
-
-	s_8021x = (NMSetting8021x *) nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X);
-	ASSERT (s_8021x != NULL,
-	        "need-tls-secrets-path-key-password",
-	        "error getting test 802.1x setting");
-
-	g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD, NULL, NULL);
-
-	hints = NULL;
-	setting_name = nm_connection_need_secrets (connection, &hints);
-	ASSERT (setting_name != NULL,
 	        "need-tls-secrets-path-key-password",
 	        "unexpected secrets success");
 	ASSERT (strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME) == 0,
@@ -231,7 +198,6 @@ test_need_tls_secrets_blob (void)
 	NMConnection *connection;
 	const char *setting_name;
 	GPtrArray *hints = NULL;
-	NMSetting8021x *s_8021x;
 
 	connection = make_tls_connection ("need-tls-secrets-blob-key", NM_SETTING_802_1X_CK_SCHEME_BLOB);
 	ASSERT (connection != NULL,
@@ -247,50 +213,24 @@ test_need_tls_secrets_blob (void)
 	        "need-tls-secrets-blob-key",
 	        "hints should be NULL since no secrets were required");
 
-	/* Connection is good; clear secrets and ensure private key is then required */
+	/* Clear secrets and ensure password is again required */
 	nm_connection_clear_secrets (connection);
 
 	hints = NULL;
 	setting_name = nm_connection_need_secrets (connection, &hints);
 	ASSERT (setting_name != NULL,
-	        "need-tls-secrets-blob-key",
+	        "need-tls-secrets-blob-key-password",
 	        "unexpected secrets success");
 	ASSERT (strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME) == 0,
-			"need-tls-secrets-blob-key",
+			"need-tls-secrets-blob-key-password",
 			"unexpected setting secrets required");
 
 	ASSERT (hints != NULL,
-	        "need-tls-secrets-blob-key",
-	        "expected returned secrets hints");
-	ASSERT (find_hints_item (hints, NM_SETTING_802_1X_PRIVATE_KEY),
-			"need-tls-secrets-blob-key",
-			"expected to require private key, but it wasn't");
-
-	g_object_unref (connection);
-
-	/*** Just clear the private key this time ***/
-
-	connection = make_tls_connection ("need-tls-secrets-blob-key-password", NM_SETTING_802_1X_CK_SCHEME_BLOB);
-	ASSERT (connection != NULL,
-	        "need-tls-secrets-blob-key-password",
-	        "error creating test connection");
-
-	s_8021x = (NMSetting8021x *) nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X);
-	ASSERT (s_8021x != NULL,
-	        "need-tls-secrets-blob-key-password",
-	        "error getting test 802.1x setting");
-
-	g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD, NULL, NULL);
-
-	/* Blobs are already decrypted and don't need a password */
-	hints = NULL;
-	setting_name = nm_connection_need_secrets (connection, &hints);
-	ASSERT (setting_name == NULL,
-	        "need-tls-secrets-blob-key-password",
-	        "unexpected secrets failure");
-	ASSERT (hints == NULL,
 	        "need-tls-secrets-blob-key-password",
-	        "hints should be NULL since no secrets were required");
+	        "expected returned secrets hints");
+	ASSERT (find_hints_item (hints, NM_SETTING_802_1X_PRIVATE_KEY_PASSWORD),
+			"need-tls-secrets-blob-key-password",
+			"expected to require private key password, but it wasn't");
 
 	g_object_unref (connection);
 }
@@ -397,7 +337,6 @@ test_need_tls_phase2_secrets_path (void)
 	NMConnection *connection;
 	const char *setting_name;
 	GPtrArray *hints = NULL;
-	NMSetting8021x *s_8021x;
 
 	connection = make_tls_phase2_connection ("need-tls-phase2-secrets-path-key",
 	                                         NM_SETTING_802_1X_CK_SCHEME_PATH);
@@ -414,45 +353,12 @@ test_need_tls_phase2_secrets_path (void)
 	        "need-tls-phase2-secrets-path-key",
 	        "hints should be NULL since no secrets were required");
 
-	/* Connection is good; clear secrets and ensure private key is then required */
+	/* Connection is good; clear secrets and ensure private key password is then required */
 	nm_connection_clear_secrets (connection);
 
 	hints = NULL;
 	setting_name = nm_connection_need_secrets (connection, &hints);
 	ASSERT (setting_name != NULL,
-	        "need-tls-phase2-secrets-path-key",
-	        "unexpected secrets success");
-	ASSERT (strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME) == 0,
-			"need-tls-phase2-secrets-path-key",
-			"unexpected setting secrets required");
-
-	ASSERT (hints != NULL,
-	        "need-tls-phase2-secrets-path-key",
-	        "expected returned secrets hints");
-	ASSERT (find_hints_item (hints, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY),
-			"need-tls-phase2-secrets-path-key",
-			"expected to require private key, but it wasn't");
-
-	g_object_unref (connection);
-
-	/*** Just clear the private key this time ***/
-
-	connection = make_tls_phase2_connection ("need-tls-phase2-secrets-path-key-password",
-	                                         NM_SETTING_802_1X_CK_SCHEME_PATH);
-	ASSERT (connection != NULL,
-	        "need-tls-phase2-secrets-path-key-password",
-	        "error creating test connection");
-
-	s_8021x = (NMSetting8021x *) nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X);
-	ASSERT (s_8021x != NULL,
-	        "need-tls-phase2-secrets-path-key-password",
-	        "error getting test 802.1x setting");
-
-	g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD, NULL, NULL);
-
-	hints = NULL;
-	setting_name = nm_connection_need_secrets (connection, &hints);
-	ASSERT (setting_name != NULL,
 	        "need-tls-phase2-secrets-path-key-password",
 	        "unexpected secrets success");
 	ASSERT (strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME) == 0,
@@ -475,7 +381,6 @@ test_need_tls_phase2_secrets_blob (void)
 	NMConnection *connection;
 	const char *setting_name;
 	GPtrArray *hints = NULL;
-	NMSetting8021x *s_8021x;
 
 	connection = make_tls_phase2_connection ("need-tls-phase2-secrets-blob-key",
 	                                         NM_SETTING_802_1X_CK_SCHEME_BLOB);
@@ -492,53 +397,79 @@ test_need_tls_phase2_secrets_blob (void)
 	        "need-tls-phase2-secrets-blob-key",
 	        "hints should be NULL since no secrets were required");
 
-	/* Connection is good; clear secrets and ensure private key is then required */
+	/* Connection is good; clear secrets and ensure private key password is then required */
 	nm_connection_clear_secrets (connection);
 
 	hints = NULL;
 	setting_name = nm_connection_need_secrets (connection, &hints);
 	ASSERT (setting_name != NULL,
-	        "need-tls-phase2-secrets-blob-key",
+	        "need-tls-phase2-secrets-blob-key-password",
 	        "unexpected secrets success");
 	ASSERT (strcmp (setting_name, NM_SETTING_802_1X_SETTING_NAME) == 0,
-			"need-tls-phase2-secrets-blob-key",
+			"need-tls-phase2-secrets-blob-key-password",
 			"unexpected setting secrets required");
 
 	ASSERT (hints != NULL,
-	        "need-tls-phase2-secrets-blob-key",
+	        "need-tls-phase2-secrets-blob-key-password",
 	        "expected returned secrets hints");
-	ASSERT (find_hints_item (hints, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY),
-			"need-tls-phase2-secrets-blob-key",
-			"expected to require private key, but it wasn't");
+	ASSERT (find_hints_item (hints, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD),
+			"need-tls-phase2-secrets-blob-key-password",
+			"expected to require private key password, but it wasn't");
 
 	g_object_unref (connection);
+}
 
-	/*** Just clear the private key this time ***/
+static NMConnection *
+wifi_connection_new (void)
+{
+	NMConnection *connection;
+	NMSettingConnection *s_con;
+	NMSettingWireless *s_wifi;
+	NMSettingWirelessSecurity *s_wsec;
+	unsigned char tmpssid[] = { 0x31, 0x33, 0x33, 0x37 };
+	char *uuid;
+	GByteArray *ssid;
 
-	connection = make_tls_phase2_connection ("need-tls-phase2-secrets-blob-key-password",
-	                                         NM_SETTING_802_1X_CK_SCHEME_BLOB);
-	ASSERT (connection != NULL,
-	        "need-tls-phase2-secrets-blob-key-password",
-	        "error creating test connection");
+	connection = nm_connection_new ();
+	g_assert (connection);
 
-	s_8021x = (NMSetting8021x *) nm_connection_get_setting (connection, NM_TYPE_SETTING_802_1X);
-	ASSERT (s_8021x != NULL,
-	        "need-tls-phase2-secrets-blob-key-password",
-	        "error getting test 802.1x setting");
+	/* Connection setting */
+	s_con = (NMSettingConnection *) nm_setting_connection_new ();
+	g_assert (s_con);
 
-	g_object_set (G_OBJECT (s_8021x), NM_SETTING_802_1X_PHASE2_PRIVATE_KEY_PASSWORD, NULL, NULL);
+	uuid = nm_utils_uuid_generate ();
+	g_object_set (s_con,
+	              NM_SETTING_CONNECTION_ID, "Test Wireless",
+	              NM_SETTING_CONNECTION_UUID, uuid,
+	              NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
+	              NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
+	              NULL);
+	g_free (uuid);
+	nm_connection_add_setting (connection, NM_SETTING (s_con));
 
-	/* Blobs are already decrypted and don't need a password */
-	hints = NULL;
-	setting_name = nm_connection_need_secrets (connection, &hints);
-	ASSERT (setting_name == NULL,
-	        "need-tls-phase2-secrets-blob-key-password",
-	        "unexpected secrets failure");
-	ASSERT (hints == NULL,
-	        "need-tls-phase2-secrets-blob-key-password",
-	        "hints should be NULL since no secrets were required");
+	/* Wireless setting */
+	s_wifi = (NMSettingWireless *) nm_setting_wireless_new ();
+	g_assert (s_wifi);
 
-	g_object_unref (connection);
+	ssid = g_byte_array_sized_new (sizeof (tmpssid));
+	g_byte_array_append (ssid, &tmpssid[0], sizeof (tmpssid));
+	g_object_set (s_wifi,
+	              NM_SETTING_WIRELESS_SSID, ssid,
+	              NM_SETTING_WIRELESS_SEC, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
+	              NULL);
+	g_byte_array_free (ssid, TRUE);
+	nm_connection_add_setting (connection, NM_SETTING (s_wifi));
+
+	/* Wifi security */
+	s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
+	g_assert (s_wsec);
+
+	g_object_set (G_OBJECT (s_wsec),
+	              NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "none",
+	              NULL);
+	nm_connection_add_setting (connection, NM_SETTING (s_wsec));
+
+	return connection;
 }
 
 static void
@@ -572,77 +503,100 @@ uint_to_gvalue (guint32 i)
 }
 
 static void
-test_update_secrets_wifi (void)
+test_update_secrets_wifi_single_setting (void)
 {
 	NMConnection *connection;
-	NMSettingConnection *s_con;
-	NMSettingWireless *s_wifi;
 	NMSettingWirelessSecurity *s_wsec;
-	unsigned char tmpssid[] = { 0x31, 0x33, 0x33, 0x37 };
-	const char *wepkey = "11111111111111111111111111";
 	GHashTable *secrets;
 	GError *error = NULL;
-	char *uuid;
-	GByteArray *ssid;
 	gboolean success;
+	const char *wepkey = "11111111111111111111111111";
+	const char *tmp;
 
-	connection = nm_connection_new ();
-	g_assert (connection);
+	connection = wifi_connection_new ();
 
-	/* Connection setting */
-	s_con = (NMSettingConnection *) nm_setting_connection_new ();
-	g_assert (s_con);
+	/* Build up the secrets hash */
+	secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy);
+	g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey));
+	g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, uint_to_gvalue (NM_WEP_KEY_TYPE_KEY));
 
-	uuid = nm_utils_uuid_generate ();
-	g_object_set (s_con,
-	              NM_SETTING_CONNECTION_ID, "Test Wireless",
-	              NM_SETTING_CONNECTION_UUID, uuid,
-	              NM_SETTING_CONNECTION_AUTOCONNECT, FALSE,
-	              NM_SETTING_CONNECTION_TYPE, NM_SETTING_WIRELESS_SETTING_NAME,
-	              NULL);
-	g_free (uuid);
-	nm_connection_add_setting (connection, NM_SETTING (s_con));
+	success = nm_connection_update_secrets (connection,
+	                                        NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
+	                                        secrets,
+	                                        &error);
+	g_assert_no_error (error);
+	g_assert (success);
 
-	/* Wireless setting */
-	s_wifi = (NMSettingWireless *) nm_setting_wireless_new ();
-	g_assert (s_wifi);
+	/* Make sure the secret is now in the connection */
+	s_wsec = (NMSettingWirelessSecurity *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY);
+	g_assert (s_wsec);
+	tmp = nm_setting_wireless_security_get_wep_key (s_wsec, 0);
+	g_assert_cmpstr (tmp, ==, wepkey);
 
-	ssid = g_byte_array_sized_new (sizeof (tmpssid));
-	g_byte_array_append (ssid, &tmpssid[0], sizeof (tmpssid));
-	g_object_set (s_wifi,
-	              NM_SETTING_WIRELESS_SSID, ssid,
-	              NM_SETTING_WIRELESS_SEC, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
-	              NULL);
-	g_byte_array_free (ssid, TRUE);
-	nm_connection_add_setting (connection, NM_SETTING (s_wifi));
+	g_object_unref (connection);
+}
 
-	/* Wifi security */
-	s_wsec = (NMSettingWirelessSecurity *) nm_setting_wireless_security_new ();
-	g_assert (s_wsec);
+static void
+test_update_secrets_wifi_full_hash (void)
+{
+	NMConnection *connection;
+	NMSettingWirelessSecurity *s_wsec;
+	GHashTable *secrets, *all;
+	GError *error = NULL;
+	gboolean success;
+	const char *wepkey = "11111111111111111111111111";
+	const char *tmp;
 
-	g_object_set (G_OBJECT (s_wsec),
-	              NM_SETTING_WIRELESS_SECURITY_KEY_MGMT, "none",
-	              NULL);
-	nm_connection_add_setting (connection, NM_SETTING (s_wsec));
+	connection = wifi_connection_new ();
 
 	/* Build up the secrets hash */
+	all = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, (GDestroyNotify) g_hash_table_destroy);
 	secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy);
 	g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey));
 	g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, uint_to_gvalue (NM_WEP_KEY_TYPE_KEY));
+	g_hash_table_insert (all, NM_SETTING_WIRELESS_SECURITY_SETTING_NAME, secrets);
 
 	success = nm_connection_update_secrets (connection,
 	                                        NM_SETTING_WIRELESS_SECURITY_SETTING_NAME,
-	                                        secrets,
+	                                        all,
 	                                        &error);
-	if (!success) {
-		/* Print the warning message before we assert success */
-		g_assert (error);
-		g_warning ("Error updating connection secrets: %s", error->message);
-		g_clear_error (&error);
-	}
+	g_assert_no_error (error);
 	g_assert (success);
+
+	/* Make sure the secret is now in the connection */
+	s_wsec = (NMSettingWirelessSecurity *) nm_connection_get_setting (connection, NM_TYPE_SETTING_WIRELESS_SECURITY);
+	g_assert (s_wsec);
+	tmp = nm_setting_wireless_security_get_wep_key (s_wsec, 0);
+	g_assert_cmpstr (tmp, ==, wepkey);
+
+	g_object_unref (connection);
 }
 
+static void
+test_update_secrets_wifi_bad_setting_name (void)
+{
+	NMConnection *connection;
+	GHashTable *secrets;
+	GError *error = NULL;
+	gboolean success;
+	const char *wepkey = "11111111111111111111111111";
+
+	connection = wifi_connection_new ();
+
+	/* Build up the secrets hash */
+	secrets = g_hash_table_new_full (g_str_hash, g_str_equal, NULL, value_destroy);
+	g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY0, string_to_gvalue (wepkey));
+	g_hash_table_insert (secrets, NM_SETTING_WIRELESS_SECURITY_WEP_KEY_TYPE, uint_to_gvalue (NM_WEP_KEY_TYPE_KEY));
+
+	success = nm_connection_update_secrets (connection,
+	                                        "asdfasdfasdfasf",
+	                                        secrets,
+	                                        &error);
+	g_assert_error (error, NM_CONNECTION_ERROR, NM_CONNECTION_ERROR_CONNECTION_SETTING_NOT_FOUND);
+	g_assert (success == FALSE);
+
+	g_object_unref (connection);
+}
 
 int main (int argc, char **argv)
 {
@@ -662,7 +616,9 @@ int main (int argc, char **argv)
 	test_need_tls_phase2_secrets_path ();
 	test_need_tls_phase2_secrets_blob ();
 
-	test_update_secrets_wifi ();
+	test_update_secrets_wifi_single_setting ();
+	test_update_secrets_wifi_full_hash ();
+	test_update_secrets_wifi_bad_setting_name ();
 
 	base = g_path_get_basename (argv[0]);
 	fprintf (stdout, "%s: SUCCESS\n", base);
diff --git a/libnm-util/tests/test-setting-8021x.c b/libnm-util/tests/test-setting-8021x.c
index 6202a142..6d1e3bd0 100644
--- a/libnm-util/tests/test-setting-8021x.c
+++ b/libnm-util/tests/test-setting-8021x.c
@@ -15,7 +15,7 @@
  * with this program; if not, write to the Free Software Foundation, Inc.,
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  *
- * Copyright (C) 2008 - 2009 Red Hat, Inc.
+ * Copyright (C) 2008 - 2011 Red Hat, Inc.
  *
  */
 
@@ -30,8 +30,8 @@
 #include "nm-setting-8021x.h"
 
 static void
-compare_decrypted (const char *test,
-                   const char *decrypted_path,
+compare_blob_data (const char *test,
+                   const char *key_path,
                    const GByteArray *key)
 {
 	char *contents = NULL;
@@ -39,32 +39,48 @@ compare_decrypted (const char *test,
 	GError *error = NULL;
 	gboolean success;
 
-	success = g_file_get_contents (decrypted_path, &contents, &len, &error);
+	success = g_file_get_contents (key_path, &contents, &len, &error);
 	ASSERT (success == TRUE,
-	        test, "failed to read decrypted key file: %s", error->message);
+	        test, "failed to read blob key file: %s", error->message);
 
-	ASSERT (len > 0, test, "decrypted key file invalid (size 0)");
+	ASSERT (len > 0, test, "blob key file invalid (size 0)");
 
 	ASSERT (len == key->len,
-	        test, "decrypted key file (%d) and decrypted key data (%d) lengths don't match",
+	        test, "blob key file (%d) and setting key data (%d) lengths don't match",
 	        len, key->len);
 
 	ASSERT (memcmp (contents, key->data, len) == 0,
-	        test, "decrypted key file and decrypted key data don't match");
+	        test, "blob key file and blob key data don't match");
 
 	g_free (contents);
 }
 
+#define SCHEME_PATH "file://"
+
+static void
+check_scheme_path (GByteArray *value, const char *path)
+{
+	guint8 *p = value->data;
+
+	g_assert (memcmp (p, SCHEME_PATH, strlen (SCHEME_PATH)) == 0);
+	p += strlen (SCHEME_PATH);
+	g_assert (memcmp (p, path, strlen (path)) == 0);
+	p += strlen (path);
+	g_assert (*p == '\0');
+}
+
 static void
 test_private_key_import (const char *path,
                          const char *password,
-                         const char *decrypted_path,
                          NMSetting8021xCKScheme scheme)
 {
 	NMSetting8021x *s_8021x;
 	gboolean success;
 	NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	NMSetting8021xCKFormat tmp_fmt;
 	GError *error = NULL;
+	GByteArray *tmp_key = NULL, *client_cert = NULL;
+	const char *pw;
 
 	s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
 	ASSERT (s_8021x != NULL, "private-key-import", "setting was NULL");
@@ -77,16 +93,48 @@ test_private_key_import (const char *path,
 	                                             &error);
 	ASSERT (success == TRUE,
 	        "private-key-import", "error reading private key: %s", error->message);
-
-	if (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
-	    && format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
-		const GByteArray *key;
-
-		ASSERT (decrypted_path != NULL, "private-key-import", "missing decrypted key file");
-
-		key = nm_setting_802_1x_get_private_key_blob (s_8021x);
-		ASSERT (key != NULL, "private-key-import", "missing private key blob");
-		compare_decrypted ("private-key-import", decrypted_path, key);
+	ASSERT (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "private-key-import", "unexpected private key format (got %d)", format);
+	tmp_fmt = nm_setting_802_1x_get_private_key_format (s_8021x);
+	ASSERT (tmp_fmt == format,
+	        "private-key-import", "unexpected re-read private key format (expected %d, got %d)",
+	        format, tmp_fmt);
+
+	/* Make sure the password is what we expect */
+	pw = nm_setting_802_1x_get_private_key_password (s_8021x);
+	ASSERT (pw != NULL,
+	        "private-key-import", "failed to get previous private key password");
+	ASSERT (strcmp (pw, password) == 0,
+	        "private-key-import", "failed to compare private key password");
+
+	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+		tmp_key = (GByteArray *) nm_setting_802_1x_get_private_key_blob (s_8021x);
+		ASSERT (tmp_key != NULL, "private-key-import", "missing private key blob");
+		compare_blob_data ("private-key-import", path, tmp_key);
+	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
+		g_object_get (s_8021x, NM_SETTING_802_1X_PRIVATE_KEY, &tmp_key, NULL);
+		ASSERT (tmp_key != NULL, "private-key-import", "missing private key value");
+		check_scheme_path (tmp_key, path);
+		g_byte_array_free (tmp_key, TRUE);
+	} else
+		g_assert_not_reached ();
+
+	/* If it's PKCS#12 ensure the client cert is the same value */
+	if (format == NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
+		g_object_get (s_8021x, NM_SETTING_802_1X_PRIVATE_KEY, &tmp_key, NULL);
+		ASSERT (tmp_key != NULL, "private-key-import", "missing private key value");
+
+		g_object_get (s_8021x, NM_SETTING_802_1X_CLIENT_CERT, &client_cert, NULL);
+		ASSERT (client_cert != NULL, "private-key-import", "missing client certificate value");
+
+		/* make sure they are the same */
+		ASSERT (tmp_key->len == client_cert->len,
+		        "private-key-import", "unexpected different private key and client cert lengths");
+		ASSERT (memcmp (tmp_key->data, client_cert->data, tmp_key->len) == 0,
+		        "private-key-import", "unexpected different private key and client cert data");
+
+		g_byte_array_free (tmp_key, TRUE);
+		g_byte_array_free (client_cert, TRUE);
 	}
 
 	g_object_unref (s_8021x);
@@ -95,13 +143,15 @@ test_private_key_import (const char *path,
 static void
 test_phase2_private_key_import (const char *path,
                                 const char *password,
-                                const char *decrypted_path,
                                 NMSetting8021xCKScheme scheme)
 {
 	NMSetting8021x *s_8021x;
 	gboolean success;
 	NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	NMSetting8021xCKFormat tmp_fmt;
 	GError *error = NULL;
+	GByteArray *tmp_key = NULL, *client_cert = NULL;
+	const char *pw;
 
 	s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
 	ASSERT (s_8021x != NULL, "phase2-private-key-import", "setting was NULL");
@@ -114,17 +164,242 @@ test_phase2_private_key_import (const char *path,
 	                                                    &error);
 	ASSERT (success == TRUE,
 	        "phase2-private-key-import", "error reading private key: %s", error->message);
+	ASSERT (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "phase2-private-key-import", "unexpected private key format");
+	tmp_fmt = nm_setting_802_1x_get_phase2_private_key_format (s_8021x);
+	ASSERT (tmp_fmt == format,
+	        "phase2-private-key-import", "unexpected re-read private key format (expected %d, got %d)",
+	        format, tmp_fmt);
+
+	/* Make sure the password is what we expect */
+	pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x);
+	ASSERT (pw != NULL,
+	        "phase2-private-key-import", "failed to get previous private key password");
+	ASSERT (strcmp (pw, password) == 0,
+	        "phase2-private-key-import", "failed to compare private key password");
+
+	if (scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB) {
+		tmp_key = (GByteArray *) nm_setting_802_1x_get_phase2_private_key_blob (s_8021x);
+		ASSERT (tmp_key != NULL, "phase2-private-key-import", "missing private key blob");
+		compare_blob_data ("phase2-private-key-import", path, tmp_key);
+	} else if (scheme == NM_SETTING_802_1X_CK_SCHEME_PATH) {
+		g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, &tmp_key, NULL);
+		ASSERT (tmp_key != NULL, "phase2-private-key-import", "missing private key value");
+		check_scheme_path (tmp_key, path);
+	} else
+		g_assert_not_reached ();
+
+	/* If it's PKCS#12 ensure the client cert is the same value */
+	if (format == NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
+		g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_PRIVATE_KEY, &tmp_key, NULL);
+		ASSERT (tmp_key != NULL, "private-key-import", "missing private key value");
+
+		g_object_get (s_8021x, NM_SETTING_802_1X_PHASE2_CLIENT_CERT, &client_cert, NULL);
+		ASSERT (client_cert != NULL, "private-key-import", "missing client certificate value");
+
+		/* make sure they are the same */
+		ASSERT (tmp_key->len == client_cert->len,
+		        "private-key-import", "unexpected different private key and client cert lengths");
+		ASSERT (memcmp (tmp_key->data, client_cert->data, tmp_key->len) == 0,
+		        "private-key-import", "unexpected different private key and client cert data");
+
+		g_byte_array_free (tmp_key, TRUE);
+		g_byte_array_free (client_cert, TRUE);
+	}
 
-	if (   scheme == NM_SETTING_802_1X_CK_SCHEME_BLOB
-	    && format != NM_SETTING_802_1X_CK_FORMAT_PKCS12) {
-		const GByteArray *key;
+	g_object_unref (s_8021x);
+}
 
-		ASSERT (decrypted_path != NULL, "phase2-private-key-import", "missing decrypted key file");
+static void
+test_wrong_password_keeps_data (const char *path, const char *password)
+{
+	NMSetting8021x *s_8021x;
+	gboolean success;
+	NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	GError *error = NULL;
+	const char *pw;
 
-		key = nm_setting_802_1x_get_phase2_private_key_blob (s_8021x);
-		ASSERT (key != NULL, "phase2-private-key-import", "missing private key blob");
-		compare_decrypted ("phase2-private-key-import", decrypted_path, key);
-	}
+	s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
+	ASSERT (s_8021x != NULL, "wrong-password-keeps-data", "setting was NULL");
+
+	success = nm_setting_802_1x_set_private_key (s_8021x,
+	                                             path,
+	                                             password,
+	                                             NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                             &format,
+	                                             &error);
+	ASSERT (success == TRUE,
+	        "wrong-password-keeps-data", "error reading private key: %s", error->message);
+	ASSERT (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "wrong-password-keeps-data", "unexpected private key format (got %d)", format);
+
+	/* Now try to set it to something that's not a certificate */
+	format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	success = nm_setting_802_1x_set_private_key (s_8021x,
+	                                             "Makefile.am",
+	                                             password,
+	                                             NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                             &format,
+	                                             &error);
+	ASSERT (success == FALSE,
+	        "wrong-password-keeps-data", "unexpected success reading private key");
+	ASSERT (error != NULL,
+	        "wrong-password-keeps-data", "unexpected missing error");
+	ASSERT (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "wrong-password-keeps-data", "unexpected success reading private key format");
+
+	/* Make sure the password hasn't changed */
+	pw = nm_setting_802_1x_get_private_key_password (s_8021x);
+	ASSERT (pw != NULL,
+	        "wrong-password-keeps-data", "failed to get previous private key password");
+	ASSERT (strcmp (pw, password) == 0,
+	        "wrong-password-keeps-data", "failed to compare private key password");
+
+	g_object_unref (s_8021x);
+}
+
+static void
+test_clear_private_key (const char *path, const char *password)
+{
+	NMSetting8021x *s_8021x;
+	gboolean success;
+	NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	GError *error = NULL;
+	const char *pw;
+
+	s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
+	ASSERT (s_8021x != NULL, "clear-private-key", "setting was NULL");
+
+	success = nm_setting_802_1x_set_private_key (s_8021x,
+	                                             path,
+	                                             password,
+	                                             NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                             &format,
+	                                             &error);
+	ASSERT (success == TRUE,
+	        "clear-private-key", "error reading private key: %s", error->message);
+	ASSERT (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "clear-private-key", "unexpected private key format (got %d)", format);
+
+	/* Make sure the password is what we expect */
+	pw = nm_setting_802_1x_get_private_key_password (s_8021x);
+	ASSERT (pw != NULL,
+	        "clear-private-key", "failed to get previous private key password");
+	ASSERT (strcmp (pw, password) == 0,
+	        "clear-private-key", "failed to compare private key password");
+
+	/* Now clear it */
+	success = nm_setting_802_1x_set_private_key (s_8021x,
+	                                             NULL,
+	                                             NULL,
+	                                             NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                             NULL,
+	                                             &error);
+	ASSERT (success == TRUE,
+	        "clear-private-key", "unexpected failure clearing private key");
+	ASSERT (error == NULL,
+	        "clear-private-key", "unexpected error clearing private key");
+
+	/* Ensure the password is also now clear */
+	ASSERT (nm_setting_802_1x_get_private_key_password (s_8021x) == NULL,
+	        "clear-private-key", "unexpected private key password");
+
+	g_object_unref (s_8021x);
+}
+
+static void
+test_wrong_phase2_password_keeps_data (const char *path, const char *password)
+{
+	NMSetting8021x *s_8021x;
+	gboolean success;
+	NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	GError *error = NULL;
+	const char *pw;
+
+	s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
+	ASSERT (s_8021x != NULL, "wrong-phase2-password-keeps-data", "setting was NULL");
+
+	success = nm_setting_802_1x_set_phase2_private_key (s_8021x,
+	                                                    path,
+	                                                    password,
+	                                                    NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                                    &format,
+	                                                    &error);
+	ASSERT (success == TRUE,
+	        "wrong-phase2-password-keeps-data", "error reading private key: %s", error->message);
+	ASSERT (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "wrong-phase2-password-keeps-data", "unexpected private key format (got %d)", format);
+
+	/* Now try to set it to something that's not a certificate */
+	format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	success = nm_setting_802_1x_set_phase2_private_key (s_8021x,
+	                                                    "Makefile.am",
+	                                                    password,
+	                                                    NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                                    &format,
+	                                                    &error);
+	ASSERT (success == FALSE,
+	        "wrong-phase2-password-keeps-data", "unexpected success reading private key");
+	ASSERT (error != NULL,
+	        "wrong-phase2-password-keeps-data", "unexpected missing error");
+	ASSERT (format == NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "wrong-phase2-password-keeps-data", "unexpected success reading private key format");
+
+	/* Make sure the password hasn't changed */
+	pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x);
+	ASSERT (pw != NULL,
+	        "wrong-phase2-password-keeps-data", "failed to get previous private key password");
+	ASSERT (strcmp (pw, password) == 0,
+	        "wrong-phase2-password-keeps-data", "failed to compare private key password");
+
+	g_object_unref (s_8021x);
+}
+
+static void
+test_clear_phase2_private_key (const char *path, const char *password)
+{
+	NMSetting8021x *s_8021x;
+	gboolean success;
+	NMSetting8021xCKFormat format = NM_SETTING_802_1X_CK_FORMAT_UNKNOWN;
+	GError *error = NULL;
+	const char *pw;
+
+	s_8021x = (NMSetting8021x *) nm_setting_802_1x_new ();
+	ASSERT (s_8021x != NULL, "clear-phase2-private-key", "setting was NULL");
+
+	success = nm_setting_802_1x_set_phase2_private_key (s_8021x,
+	                                                    path,
+	                                                    password,
+	                                                    NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                                    &format,
+	                                                    &error);
+	ASSERT (success == TRUE,
+	        "clear-phase2-private-key", "error reading private key: %s", error->message);
+	ASSERT (format != NM_SETTING_802_1X_CK_FORMAT_UNKNOWN,
+	        "clear-phase2-private-key", "unexpected private key format (got %d)", format);
+
+	/* Make sure the password is what we expect */
+	pw = nm_setting_802_1x_get_phase2_private_key_password (s_8021x);
+	ASSERT (pw != NULL,
+	        "clear-phase2-private-key", "failed to get previous private key password");
+	ASSERT (strcmp (pw, password) == 0,
+	        "clear-phase2-private-key", "failed to compare private key password");
+
+	/* Now clear it */
+	success = nm_setting_802_1x_set_phase2_private_key (s_8021x,
+	                                                    NULL,
+	                                                    NULL,
+	                                                    NM_SETTING_802_1X_CK_SCHEME_BLOB,
+	                                                    NULL,
+	                                                    &error);
+	ASSERT (success == TRUE,
+	        "clear-phase2-private-key", "unexpected failure clearing private key");
+	ASSERT (error == NULL,
+	        "clear-phase2-private-key", "unexpected error clearing private key");
+
+	/* Ensure the password is also now clear */
+	ASSERT (nm_setting_802_1x_get_phase2_private_key_password (s_8021x) == NULL,
+	        "clear-phase2-private-key", "unexpected private key password");
 
 	g_object_unref (s_8021x);
 }
@@ -134,13 +409,9 @@ int main (int argc, char **argv)
 	GError *error = NULL;
 	DBusGConnection *bus;
 	char *base;
-	const char *decrypted = NULL;
 
 	if (argc < 3)
-		FAIL ("init", "need at least two arguments: <path> <password> [decrypted private key]");
-
-	if (argc == 4)
-		decrypted = argv[3];
+		FAIL ("init", "need at least two arguments: <path> <password>");
 
 	g_type_init ();
 	bus = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
@@ -148,12 +419,21 @@ int main (int argc, char **argv)
 	if (!nm_utils_init (&error))
 		FAIL ("nm-utils-init", "failed to initialize libnm-util: %s", error->message);
 
-	/* The tests */
-	test_private_key_import (argv[1], argv[2], NULL, NM_SETTING_802_1X_CK_SCHEME_PATH);
-	test_phase2_private_key_import (argv[1], argv[2], NULL, NM_SETTING_802_1X_CK_SCHEME_PATH);
+	/* Test phase1 and phase2 path scheme */
+	test_private_key_import (argv[1], argv[2], NM_SETTING_802_1X_CK_SCHEME_PATH);
+	test_phase2_private_key_import (argv[1], argv[2], NM_SETTING_802_1X_CK_SCHEME_PATH);
+
+	/* Test phase1 and phase2 blob scheme */
+	test_private_key_import (argv[1], argv[2], NM_SETTING_802_1X_CK_SCHEME_BLOB);
+	test_phase2_private_key_import (argv[1], argv[2], NM_SETTING_802_1X_CK_SCHEME_BLOB);
+
+	/* Test that using a wrong password does not change existing data */
+	test_wrong_password_keeps_data (argv[1], argv[2]);
+	test_wrong_phase2_password_keeps_data (argv[1], argv[2]);
 
-	test_private_key_import (argv[1], argv[2], decrypted, NM_SETTING_802_1X_CK_SCHEME_BLOB);
-	test_phase2_private_key_import (argv[1], argv[2], decrypted, NM_SETTING_802_1X_CK_SCHEME_BLOB);
+	/* Test clearing the private key */
+	test_clear_private_key (argv[1], argv[2]);
+	test_clear_phase2_private_key (argv[1], argv[2]);
 
 	base = g_path_get_basename (argv[0]);
 	fprintf (stdout, "%s: SUCCESS\n", base);