Blame SOURCES/gnutls-3.3.29-pkcs11-retrieve-pin-from-uri-once.patch

519d7d
diff --git a/lib/pkcs11.c b/lib/pkcs11.c
519d7d
index 4fdd58f39..68ee2960a 100644
519d7d
--- a/lib/pkcs11.c
519d7d
+++ b/lib/pkcs11.c
519d7d
@@ -2368,6 +2368,11 @@ retrieve_pin(struct pin_info_st *pin_info, struct p11_kit_uri *info,
519d7d
 	/* First check for pin-value field */
519d7d
 	pinfile = p11_kit_uri_get_pin_value(info);
519d7d
 	if (pinfile != NULL) {
519d7d
+		if (attempts > 0) {
519d7d
+			_gnutls_debug_log("p11: refusing more than a single attempts with pin-value\n");
519d7d
+			return gnutls_assert_val(GNUTLS_E_PKCS11_PIN_ERROR);
519d7d
+		}
519d7d
+
519d7d
 		_gnutls_debug_log("p11: Using pin-value to retrieve PIN\n");
519d7d
 		*pin = p11_kit_pin_new_for_string(pinfile);
519d7d
 		if (*pin != NULL)
519d7d
@@ -2376,6 +2381,11 @@ retrieve_pin(struct pin_info_st *pin_info, struct p11_kit_uri *info,
519d7d
 		/* Check if a pinfile is specified, and use that if possible */
519d7d
 		pinfile = p11_kit_uri_get_pin_source(info);
519d7d
 		if (pinfile != NULL) {
519d7d
+			if (attempts > 0) {
519d7d
+				_gnutls_debug_log("p11: refusing more than a single attempts with pin-source\n");
519d7d
+				return gnutls_assert_val(GNUTLS_E_PKCS11_PIN_ERROR);
519d7d
+			}
519d7d
+
519d7d
 			_gnutls_debug_log("p11: Using pin-source to retrieve PIN\n");
519d7d
 			ret =
519d7d
 			    retrieve_pin_from_source(pinfile, token_info, attempts,
519d7d
diff --git a/tests/pkcs11/pkcs11-import-with-pin.c b/tests/pkcs11/pkcs11-import-with-pin.c
519d7d
index e43591927..ecc98175d 100644
519d7d
--- a/tests/pkcs11/pkcs11-import-with-pin.c
519d7d
+++ b/tests/pkcs11/pkcs11-import-with-pin.c
519d7d
@@ -157,6 +157,16 @@ void doit()
519d7d
 	assert(gnutls_privkey_init(&pkey) == 0);
519d7d
 
519d7d
 	/* Test 1
519d7d
+	 * Try importing with wrong pin-value */
519d7d
+	ret = gnutls_privkey_import_pkcs11_url(pkey, SOFTHSM_URL";object=cert;object-type=private;pin-value=XXXX");
519d7d
+	if (ret != GNUTLS_E_PKCS11_PIN_ERROR) {
519d7d
+		fprintf(stderr, "unexpected error in %d: %s\n", __LINE__, gnutls_strerror(ret));
519d7d
+		exit(1);
519d7d
+	}
519d7d
+	gnutls_privkey_deinit(pkey);
519d7d
+	assert(gnutls_privkey_init(&pkey) == 0);
519d7d
+
519d7d
+	/* Test 2
519d7d
 	 * Try importing with pin-value */
519d7d
 	ret = gnutls_privkey_import_pkcs11_url(pkey, SOFTHSM_URL";object=cert;object-type=private;pin-value="PIN);
519d7d
 	if (ret < 0) {
519d7d
@@ -169,13 +179,26 @@ void doit()
519d7d
 	gnutls_free(sig.data);
519d7d
 	gnutls_privkey_deinit(pkey);
519d7d
 
519d7d
-	/* Test 2
519d7d
-	 * Try importing with pin-source */
519d7d
+	/* Test 3
519d7d
+	 * Try importing with wrong pin-source */
519d7d
 	track_temp_files();
519d7d
 	get_tmpname(file);
519d7d
 
519d7d
-	write_pin(file, PIN);
519d7d
+	write_pin(file, "XXXX");
519d7d
+
519d7d
+	assert(gnutls_privkey_init(&pkey) == 0);
519d7d
+	snprintf(buf, sizeof(buf), "%s;object=cert;object-type=private;pin-source=%s", SOFTHSM_URL, file);
519d7d
+	ret = gnutls_privkey_import_pkcs11_url(pkey, buf);
519d7d
+	if (ret != GNUTLS_E_PKCS11_PIN_ERROR) {
519d7d
+		fprintf(stderr, "error in %d: %s\n", __LINE__, gnutls_strerror(ret));
519d7d
+		exit(1);
519d7d
+	}
519d7d
+
519d7d
+	gnutls_privkey_deinit(pkey);
519d7d
 
519d7d
+	/* Test 4
519d7d
+	 * Try importing with pin-source */
519d7d
+	write_pin(file, PIN);
519d7d
 
519d7d
 	assert(gnutls_privkey_init(&pkey) == 0);
519d7d
 	snprintf(buf, sizeof(buf), "%s;object=cert;object-type=private;pin-source=%s", SOFTHSM_URL, file);
519d7d
-- 
519d7d
2.14.3
519d7d