aboutsummaryrefslogtreecommitdiff
path: root/CamilStaps-s4498062-Assignment-2/ex3
diff options
context:
space:
mode:
Diffstat (limited to 'CamilStaps-s4498062-Assignment-2/ex3')
-rw-r--r--CamilStaps-s4498062-Assignment-2/ex3/Makefile5
-rw-r--r--CamilStaps-s4498062-Assignment-2/ex3/login3
-rw-r--r--CamilStaps-s4498062-Assignment-2/ex3/pam_questions.c72
3 files changed, 80 insertions, 0 deletions
diff --git a/CamilStaps-s4498062-Assignment-2/ex3/Makefile b/CamilStaps-s4498062-Assignment-2/ex3/Makefile
new file mode 100644
index 0000000..7ff3de0
--- /dev/null
+++ b/CamilStaps-s4498062-Assignment-2/ex3/Makefile
@@ -0,0 +1,5 @@
+all:
+ gcc -fPIC -DPIC -shared -rdynamic -o pam_questions.so pam_questions.c
+ cp pam_questions.so /lib/security
+ chown root:root /lib/security/pam_questions.so
+ chmod 755 /lib/security/pam_questions.so
diff --git a/CamilStaps-s4498062-Assignment-2/ex3/login b/CamilStaps-s4498062-Assignment-2/ex3/login
new file mode 100644
index 0000000..3e1c3cb
--- /dev/null
+++ b/CamilStaps-s4498062-Assignment-2/ex3/login
@@ -0,0 +1,3 @@
+# PAM configuration file
+auth sufficient pam_questions.so
+
diff --git a/CamilStaps-s4498062-Assignment-2/ex3/pam_questions.c b/CamilStaps-s4498062-Assignment-2/ex3/pam_questions.c
new file mode 100644
index 0000000..b93dc4e
--- /dev/null
+++ b/CamilStaps-s4498062-Assignment-2/ex3/pam_questions.c
@@ -0,0 +1,72 @@
+/* Source code from http://www.rkeene.org/projects/info/wiki/222, adapted by Camil Staps */
+
+/* Define which PAM interfaces we provide */
+#define PAM_SM_ACCOUNT
+#define PAM_SM_AUTH
+#define PAM_SM_PASSWORD
+#define PAM_SM_SESSION
+
+/* Include PAM headers */
+#include <security/pam_appl.h>
+#include <security/pam_modules.h>
+
+/* Other headers */
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+
+/* Our questions and answers */
+const char * const q[5] = {
+ "6*7",
+ "the answer to life the universe and everything",
+ "'forty two' in numbers",
+ "the meaning of 'efa-polo roa' in Malagasi",
+ "not 54" };
+const char a[5] = {42, 42, 42, 42, 42};
+
+/* PAM entry point for session creation */
+int pam_sm_open_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
+ return(PAM_IGNORE);
+}
+
+/* PAM entry point for session cleanup */
+int pam_sm_close_session(pam_handle_t *pamh, int flags, int argc, const char **argv) {
+ return(PAM_IGNORE);
+}
+
+/* PAM entry point for accounting */
+int pam_sm_acct_mgmt(pam_handle_t *pamh, int flags, int argc, const char **argv) {
+ return(PAM_IGNORE);
+}
+
+/* PAM entry point for authentication verification */
+int pam_sm_authenticate(pam_handle_t *pamh, int flags, int argc, const char **argv) {
+ const char* username;
+ pam_get_user(pamh, &username, NULL);
+
+ srand(time(NULL));
+ int r = rand() % 5;
+ printf("What is %s? ", q[r]);
+ int resp;
+ scanf("%d", &resp);
+
+ if (resp == a[r]) {
+ return(PAM_SUCCESS);
+ } else {
+ return(PAM_AUTH_ERR);
+ }
+}
+
+/*
+ PAM entry point for setting user credentials (that is, to actually
+ establish the authenticated user's credentials to the service provider)
+*/
+int pam_sm_setcred(pam_handle_t *pamh, int flags, int argc, const char **argv) {
+ return(PAM_IGNORE);
+}
+
+/* PAM entry point for authentication token (password) changes */
+int pam_sm_chauthtok(pam_handle_t *pamh, int flags, int argc, const char **argv) {
+ return(PAM_IGNORE);
+}
+