Blame SOURCES/0015-pam_sss-add-certificate-label-to-reply-to-pam_sss.patch

b833e0
From b8800d3e1b43f2eb28b2df7adb2bcb323bf2d1f1 Mon Sep 17 00:00:00 2001
b833e0
From: Sumit Bose <sbose@redhat.com>
b833e0
Date: Sat, 14 Nov 2020 17:52:35 +0100
b833e0
Subject: [PATCH 15/16] pam_sss: add certificate label to reply to pam_sss
b833e0
b833e0
Add the certificate label to the data send back and forth to the pam
b833e0
module to avoid the ambiguity if two certificates use the same key.
b833e0
b833e0
Resolves: https://github.com/SSSD/sssd/issues/5400
b833e0
b833e0
Reviewed-by: Alexey Tikhonov <atikhono@redhat.com>
b833e0
---
b833e0
 src/responder/pam/pamsrv_p11.c  | 13 ++++++++++---
b833e0
 src/sss_client/pam_sss.c        | 15 +++++++++++++++
b833e0
 src/tests/cmocka/test_pam_srv.c | 20 ++++++++++++++++----
b833e0
 3 files changed, 41 insertions(+), 7 deletions(-)
b833e0
b833e0
diff --git a/src/responder/pam/pamsrv_p11.c b/src/responder/pam/pamsrv_p11.c
b833e0
index 23f94927a..e1fd72e64 100644
b833e0
--- a/src/responder/pam/pamsrv_p11.c
b833e0
+++ b/src/responder/pam/pamsrv_p11.c
b833e0
@@ -1086,11 +1086,13 @@ static errno_t pack_cert_data(TALLOC_CTX *mem_ctx, const char *sysdb_username,
b833e0
     const char *token_name;
b833e0
     const char *module_name;
b833e0
     const char *key_id;
b833e0
+    const char *label;
b833e0
     char *prompt;
b833e0
     size_t user_len;
b833e0
     size_t token_len;
b833e0
     size_t module_len;
b833e0
     size_t key_id_len;
b833e0
+    size_t label_len;
b833e0
     size_t prompt_len;
b833e0
     size_t nss_name_len;
b833e0
     const char *username = "";
b833e0
@@ -1113,16 +1115,18 @@ static errno_t pack_cert_data(TALLOC_CTX *mem_ctx, const char *sysdb_username,
b833e0
     token_name = sss_cai_get_token_name(cert_info);
b833e0
     module_name = sss_cai_get_module_name(cert_info);
b833e0
     key_id = sss_cai_get_key_id(cert_info);
b833e0
+    label = sss_cai_get_label(cert_info);
b833e0
 
b833e0
     user_len = strlen(username) + 1;
b833e0
     token_len = strlen(token_name) + 1;
b833e0
     module_len = strlen(module_name) + 1;
b833e0
     key_id_len = strlen(key_id) + 1;
b833e0
+    label_len = strlen(label) + 1;
b833e0
     prompt_len = strlen(prompt) + 1;
b833e0
     nss_name_len = strlen(nss_username) +1;
b833e0
 
b833e0
-    msg_len = user_len + token_len + module_len + key_id_len + prompt_len
b833e0
-                       + nss_name_len;
b833e0
+    msg_len = user_len + token_len + module_len + key_id_len + label_len
b833e0
+                       + prompt_len + nss_name_len;
b833e0
 
b833e0
     msg = talloc_zero_size(mem_ctx, msg_len);
b833e0
     if (msg == NULL) {
b833e0
@@ -1136,8 +1140,11 @@ static errno_t pack_cert_data(TALLOC_CTX *mem_ctx, const char *sysdb_username,
b833e0
     memcpy(msg + user_len + token_len, module_name, module_len);
b833e0
     memcpy(msg + user_len + token_len + module_len, key_id, key_id_len);
b833e0
     memcpy(msg + user_len + token_len + module_len + key_id_len,
b833e0
+           label, label_len);
b833e0
+    memcpy(msg + user_len + token_len + module_len + key_id_len + label_len,
b833e0
            prompt, prompt_len);
b833e0
-    memcpy(msg + user_len + token_len + module_len + key_id_len + prompt_len,
b833e0
+    memcpy(msg + user_len + token_len + module_len + key_id_len + label_len
b833e0
+               + prompt_len,
b833e0
            nss_username, nss_name_len);
b833e0
     talloc_free(prompt);
b833e0
 
b833e0
diff --git a/src/sss_client/pam_sss.c b/src/sss_client/pam_sss.c
b833e0
index cffbfa770..c539d6de6 100644
b833e0
--- a/src/sss_client/pam_sss.c
b833e0
+++ b/src/sss_client/pam_sss.c
b833e0
@@ -142,6 +142,7 @@ static void free_cai(struct cert_auth_info *cai)
b833e0
         free(cai->token_name);
b833e0
         free(cai->module_name);
b833e0
         free(cai->key_id);
b833e0
+        free(cai->label);
b833e0
         free(cai->prompt_str);
b833e0
         free(cai->choice_list_id);
b833e0
         free(cai);
b833e0
@@ -936,6 +937,20 @@ static int parse_cert_info(struct pam_items *pi, uint8_t *buf, size_t len,
b833e0
         goto done;
b833e0
     }
b833e0
 
b833e0
+    cai->label = strdup((char *) &buf[*p + offset]);
b833e0
+    if (cai->label == NULL) {
b833e0
+        D(("strdup failed"));
b833e0
+        ret = ENOMEM;
b833e0
+        goto done;
b833e0
+    }
b833e0
+
b833e0
+    offset += strlen(cai->label) + 1;
b833e0
+    if (offset >= len) {
b833e0
+        D(("Cert message size mismatch"));
b833e0
+        ret = EINVAL;
b833e0
+        goto done;
b833e0
+    }
b833e0
+
b833e0
     cai->prompt_str = strdup((char *) &buf[*p + offset]);
b833e0
     if (cai->prompt_str == NULL) {
b833e0
         D(("strdup failed"));
b833e0
diff --git a/src/tests/cmocka/test_pam_srv.c b/src/tests/cmocka/test_pam_srv.c
b833e0
index cb05042de..5506fbf34 100644
b833e0
--- a/src/tests/cmocka/test_pam_srv.c
b833e0
+++ b/src/tests/cmocka/test_pam_srv.c
b833e0
@@ -62,13 +62,16 @@
b833e0
 #define TEST_TOKEN_NAME "SSSD Test Token"
b833e0
 #define TEST_TOKEN2_NAME "SSSD Test Token Number 2"
b833e0
 #define TEST_KEY_ID "C554C9F82C2A9D58B70921C143304153A8A42F17"
b833e0
+#define TEST_LABEL "SSSD test cert 0001"
b833e0
 #define TEST_MODULE_NAME SOFTHSM2_PATH
b833e0
 #define TEST_PROMPT "SSSD test cert 0001\nCN=SSSD test cert 0001,OU=SSSD test,O=SSSD"
b833e0
 #define TEST2_PROMPT "SSSD test cert 0002\nCN=SSSD test cert 0002,OU=SSSD test,O=SSSD"
b833e0
 #define TEST5_PROMPT "SSSD test cert 0005\nCN=SSSD test cert 0005,OU=SSSD test,O=SSSD"
b833e0
 
b833e0
 #define TEST2_KEY_ID "5405842D56CF31F0BB025A695C5F3E907051C5B9"
b833e0
+#define TEST2_LABEL "SSSD test cert 0002"
b833e0
 #define TEST5_KEY_ID "1195833C424AB00297F582FC43FFFFAB47A64CC9"
b833e0
+#define TEST5_LABEL "SSSD test cert 0005"
b833e0
 
b833e0
 static char CACHED_AUTH_TIMEOUT_STR[] = "4";
b833e0
 static const int CACHED_AUTH_TIMEOUT = 4;
b833e0
@@ -673,6 +676,7 @@ static int test_pam_cert_check_gdm_smartcard(uint32_t status, uint8_t *body,
b833e0
                                 + sizeof(TEST_TOKEN_NAME)
b833e0
                                 + sizeof(TEST_MODULE_NAME)
b833e0
                                 + sizeof(TEST_KEY_ID)
b833e0
+                                + sizeof(TEST_LABEL)
b833e0
                                 + sizeof(TEST_PROMPT)
b833e0
                                 + sizeof("pamuser")));
b833e0
 
b833e0
@@ -692,6 +696,10 @@ static int test_pam_cert_check_gdm_smartcard(uint32_t status, uint8_t *body,
b833e0
     assert_string_equal(body + rp, TEST_KEY_ID);
b833e0
     rp += sizeof(TEST_KEY_ID);
b833e0
 
b833e0
+    assert_int_equal(*(body + rp + sizeof(TEST_LABEL) - 1), 0);
b833e0
+    assert_string_equal(body + rp, TEST_LABEL);
b833e0
+    rp += sizeof(TEST_LABEL);
b833e0
+
b833e0
     assert_int_equal(*(body + rp + sizeof(TEST_PROMPT) - 1), 0);
b833e0
     assert_string_equal(body + rp, TEST_PROMPT);
b833e0
     rp += sizeof(TEST_PROMPT);
b833e0
@@ -740,6 +748,7 @@ static int test_pam_cert_check_ex(uint32_t status, uint8_t *body, size_t blen,
b833e0
                                     TEST_TOKEN_NAME,
b833e0
                                     TEST_MODULE_NAME,
b833e0
                                     TEST_KEY_ID,
b833e0
+                                    TEST_LABEL,
b833e0
                                     TEST_PROMPT,
b833e0
                                     NULL,
b833e0
                                     NULL };
b833e0
@@ -749,6 +758,7 @@ static int test_pam_cert_check_ex(uint32_t status, uint8_t *body, size_t blen,
b833e0
                                      TEST_TOKEN_NAME,
b833e0
                                      TEST_MODULE_NAME,
b833e0
                                      TEST2_KEY_ID,
b833e0
+                                     TEST2_LABEL,
b833e0
                                      TEST2_PROMPT,
b833e0
                                      NULL,
b833e0
                                      NULL };
b833e0
@@ -756,10 +766,10 @@ static int test_pam_cert_check_ex(uint32_t status, uint8_t *body, size_t blen,
b833e0
     assert_int_equal(status, 0);
b833e0
 
b833e0
     check_strings[0] = name;
b833e0
-    check_strings[5] = nss_name;
b833e0
+    check_strings[6] = nss_name;
b833e0
     check_len = check_string_array_len(check_strings);
b833e0
     check2_strings[0] = name;
b833e0
-    check2_strings[5] = nss_name;
b833e0
+    check2_strings[6] = nss_name;
b833e0
     check2_len = check_string_array_len(check2_strings);
b833e0
 
b833e0
 
b833e0
@@ -843,6 +853,7 @@ static int test_pam_cert2_token2_check_ex(uint32_t status, uint8_t *body,
b833e0
                                      TEST_TOKEN2_NAME,
b833e0
                                      TEST_MODULE_NAME,
b833e0
                                      TEST2_KEY_ID,
b833e0
+                                     TEST2_LABEL,
b833e0
                                      TEST2_PROMPT,
b833e0
                                      NULL,
b833e0
                                      NULL };
b833e0
@@ -850,7 +861,7 @@ static int test_pam_cert2_token2_check_ex(uint32_t status, uint8_t *body,
b833e0
     assert_int_equal(status, 0);
b833e0
 
b833e0
     check2_strings[0] = name;
b833e0
-    check2_strings[5] = nss_name;
b833e0
+    check2_strings[6] = nss_name;
b833e0
     check2_len = check_string_array_len(check2_strings);
b833e0
 
b833e0
     SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
b833e0
@@ -895,7 +906,7 @@ static int test_pam_cert_X_token_X_check_ex(uint32_t status, uint8_t *body,
b833e0
     assert_int_equal(status, 0);
b833e0
 
b833e0
     check_strings[0] = name;
b833e0
-    check_strings[5] = nss_name;
b833e0
+    check_strings[6] = nss_name;
b833e0
     check_len = check_string_array_len(check_strings);
b833e0
 
b833e0
     SAFEALIGN_COPY_UINT32(&val, body + rp, &rp);
b833e0
@@ -946,6 +957,7 @@ static int test_pam_cert5_check(uint32_t status, uint8_t *body, size_t blen)
b833e0
                                      TEST_TOKEN_NAME,
b833e0
                                      TEST_MODULE_NAME,
b833e0
                                      TEST5_KEY_ID,
b833e0
+                                     TEST5_LABEL,
b833e0
                                      TEST5_PROMPT,
b833e0
                                      NULL,
b833e0
                                      NULL };
b833e0
-- 
b833e0
2.21.3
b833e0