Keychain Patch Try II

Will M. Farr farr at MIT.EDU
Tue Jan 6 13:30:37 EST 2004


Sorry; here's the message I sent with the Keychain Patch yesterday.  I 
didn't realize that the list wouldn't extract the text parts of the 
message.  Enjoy.



Hey all,

Here's the patch to let SSH store passwords in the Mac OS X Keychain.  
I don't know whether you guys want to include it or not with the 
distribution; some people have said that since Keychain is not an open 
source product, it's not proper to put it in, while others think it's 
OK.  I'll leave it up to you; it's served its purpose to me.

The patch is against the 3.7p1 release because that's the code I was 
using.  If it's doesn't incorporate well into whatever you are working 
on now, let me know, and I'll try to get something from your CVS 
repositories and diff against that.  (I don't think, however, that the 
readpassphrase portion of the code is changing much these days.)

There is one major test which I have been unable to perform: I haven't 
checked to see what happens if you don't have access to a GUI for the 
"unlock keychain prompt" which OS X throws up (i.e. you are logging in 
to an OS X server, and ssh-ing from there).  If someone could try that 
and tell me what the patch does, I'd be really grateful.  Thanks!

Will


-----------------------------------------------------------

diff -u my_openssh-3.7p1/configure.ac openssh-3.7p1/configure.ac
--- my_openssh-3.7p1/configure.ac	Thu Dec 18 09:46:05 2003
+++ openssh-3.7p1/configure.ac	Mon Sep 15 22:48:15 2003
@@ -131,26 +131,7 @@
  }], [AC_MSG_RESULT(working)],
  	[AC_MSG_RESULT(buggy)
  	AC_DEFINE(BROKEN_GETADDRINFO)],
-	[AC_MSG_RESULT(assume it is working)])
-# Check for the Security framework headers that we'll need;
-# if present, then define USE_KEYCHAIN
-	AC_ARG_WITH([[keychain]],[AC_HELP_STRING([[--without-keychain]],[do 
not store passwords in Mac OS X Keychain])],
-	[],
-	[AC_MSG_CHECKING([[for Keychain Services]])
-	OLD_LIBS="$LIBS"
-	LIBS="$LIBS -framework Security"
-	AC_LINK_IFELSE([[#include <Security/Security.h>
-	int main()
-	{
-		UInt32 version;
-		SecKeychainGetVersion(&version);
-		return 0;
-	}]],
-	[AC_DEFINE([USE_KEYCHAIN],[],
-	[Store user passwords in the Mac OS X Keychain])
-	AC_MSG_RESULT([[yes]])],
-	[LIBS="$OLD_LIBS"
-	AC_MSG_RESULT([[no]])])])
+	[AC_MSG_RESULT(assume it is working)])
  	;;
  *-*-hpux10.26)
  	if test -z "$GCC"; then
diff -u my_openssh-3.7p1/readpass.c openssh-3.7p1/readpass.c
--- my_openssh-3.7p1/readpass.c	Fri Dec 19 09:46:44 2003
+++ openssh-3.7p1/readpass.c	Thu Jan 23 16:36:23 2003
@@ -99,7 +99,7 @@
  char *
  read_passphrase(const char *prompt, int flags)
  {
-	char *askpass = NULL, *ret, buf[1024], response;
+	char *askpass = NULL, *ret, buf[1024];
  	int rppflags, use_askpass = 0, ttyfd;

  	rppflags = (flags & RP_ECHO) ? RPP_ECHO_ON : RPP_ECHO_OFF;
@@ -126,60 +126,13 @@
  		return ret;
  	}

-	/* Before reading the passphrase from the user, find it in the
-	   keychain. */
-#ifdef USE_KEYCHAIN
-        if (get_passphrase_from_keychain(prompt, buf, sizeof buf) == 
0) {
-	  /* We got the password; do nothing now that it's in buf */
-	} else {
-#endif /* USE_KEYCHAIN */
-	  if (readpassphrase(prompt, buf, sizeof buf, rppflags) == NULL) {
-	    if (flags & RP_ALLOW_EOF)
-	      return NULL;
-	    return xstrdup("");
-	  }
-#ifdef USE_KEYCHAIN
-	
-	  fprintf(stderr, "Would you like to store this password in your 
keychain (y/n)?\n");
-	  response = fgetc(stdin);
-	  if (response == 'y' || response == 'Y') {
-	    store_passphrase_on_keychain(prompt, buf);
-	  }
+	if (readpassphrase(prompt, buf, sizeof buf, rppflags) == NULL) {
+		if (flags & RP_ALLOW_EOF)
+			return NULL;
+		return xstrdup("");
  	}
-#endif /* USE_KEYCHAIN */

  	ret = xstrdup(buf);
  	memset(buf, 'x', sizeof buf);
  	return ret;
  }
-
-#ifdef USE_KEYCHAIN
-
-int get_passphrase_from_keychain(const char *prompt, char buf[], 
size_t size)
-{
-  void *password_data;
-  UInt32 password_length;
-
-  if (SecKeychainFindGenericPassword(NULL, strlen(prompt), prompt, 
strlen(prompt), prompt, &password_length, &password_data, NULL) == 
noErr) {
-    /* Then we got the password from the Keychain */
-    fprintf(stderr, "%s found in Keychain.", prompt);
-    strncpy(buf, (char *)password_data, (size < password_length+1 ? 
size : password_length + 1));
-    memset(password_data, 'x', password_length);
-    SecKeychainItemFreeContent(NULL, password_data);
-    return 0; /* Success */
-  } else {
-    return -1; /* Couldn't get anything from the keychain */
-  }
-}
-
-int store_passphrase_on_keychain(const char *prompt, const char buf[])
-{
-  if (SecKeychainAddGenericPassword(NULL, strlen(prompt), prompt, 
strlen(prompt), prompt, strlen(buf), (void *)buf, NULL) == noErr) {
-    return 0;
-  } else {
-    return -1;
-  }
-}
-
-
-#endif /* USE_KEYCHAIN */
diff -u my_openssh-3.7p1/readpass.h openssh-3.7p1/readpass.h
--- my_openssh-3.7p1/readpass.h	Thu Dec 18 11:28:29 2003
+++ openssh-3.7p1/readpass.h	Wed Mar 27 09:28:47 2002
@@ -17,18 +17,3 @@
  #define RP_ALLOW_EOF		0x0004

  char	*read_passphrase(const char *, int);
-
-/* These functions use the keychain in Mac OS X to retrieve and store
-   passwords. */
-#ifdef USE_KEYCHAIN
-
-#include<Security/Security.h>
-#include<stdio.h>
-
-/* Both return 0 on success */
-int get_passphrase_from_keychain(const char *prompt, char buf[], 
size_t size);
-int store_passphrase_on_keychain(const char *prompt, const char buf[]);
-
-
-/* ifdef USE_KEYCHAIN */
-#endif




More information about the openssh-unix-dev mailing list