summaryrefslogtreecommitdiff
path: root/src/nshd/hackers_git/check_password.go
diff options
context:
space:
mode:
Diffstat (limited to 'src/nshd/hackers_git/check_password.go')
-rw-r--r--src/nshd/hackers_git/check_password.go50
1 files changed, 50 insertions, 0 deletions
diff --git a/src/nshd/hackers_git/check_password.go b/src/nshd/hackers_git/check_password.go
new file mode 100644
index 0000000..81ad932
--- /dev/null
+++ b/src/nshd/hackers_git/check_password.go
@@ -0,0 +1,50 @@
+// Copyright 2015 Luke Shumaker <lukeshu@sbcglobal.net>.
+//
+// This is free software; you can redistribute it and/or
+// modify it under the terms of the GNU General Public License as
+// published by the Free Software Foundation; either version 2 of
+// the License, or (at your option) any later version.
+//
+// The GNU General Public License's references to "object code" and
+// "executables" are to be interpreted to also include the output of
+// any document formatting or typesetting system, including
+// intermediate and printed output.
+//
+// This software is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public
+// License along with this manual; if not, see
+// <http://www.gnu.org/licenses/>.
+
+package hackers_git
+
+import "unsafe"
+
+/*
+#cgo LDFLAGS: -lcrypt
+#define _GNU_SOURCE // for crypt_r(3) in crypt.h
+#include <stdlib.h> // for free(3)
+#include <crypt.h> // for crypt_r(3)
+#include <string.h> // for strcmp(3) and memset(3)
+int check_password(const char *password, const char *hash)
+{
+ int ret;
+ struct crypt_data data;
+ data.initialized = 0;
+ ret = (strcmp(crypt_r(password, hash, &data), hash) == 0);
+ memset(&data, 0, sizeof(data));
+ return ret;
+}
+*/
+import "C"
+
+func check_password(password string, hash string) bool {
+ cpassword := C.CString(password)
+ defer C.free(unsafe.Pointer(cpassword))
+ chash := C.CString(hash)
+ defer C.free(unsafe.Pointer(chash))
+ return C.check_password(cpassword, chash) != 0
+}