diff -3Nur ssh-1.2.27-fresh/ssh_sc.c ssh-1.2.27/ssh_sc.c
--- ssh-1.2.27-fresh/ssh_sc.c	Wed Dec 31 19:00:00 1969
+++ ssh-1.2.27/ssh_sc.c	Fri Jul 28 17:06:30 2000
@@ -0,0 +1,267 @@
+#ifdef SC_SSH
+
+#include "ssh_sc.h"
+#include <stdlib.h>
+#include <assert.h>
+
+int printKey = 0;
+
+void setPrintKeyFlag ()
+{
+  printf ("setting printKey flag...\n");
+  printKey = 1;
+}
+
+void printMPInt (FILE * fd, MP_INT * mpint, char * msg) 
+{
+  int i0, j0;
+  printf ("%s:\n", msg);
+  for (i0=abs(mpint->_mp_size)-1; i0>=0; i0--)
+    for (j0=3; j0>=0; j0--)
+    //printf ("%02x", a[i0]);
+    //printf ("(byte)0x%02x, ", a[i0]);
+    printf ("%02x ", (mpint->_mp_d[i0]>>(j0*8)) & 0xff);
+  printf ("\n\n");
+}
+
+void printRSAPrivateKey (RSAPrivateKey * key)
+{
+  printf ("\n-------------printing key---------------\n");
+  printf ("bits=%d\n", key->bits);
+  printMPInt (stdout, &key->n, "n");
+  printMPInt (stdout, &key->e, "e");
+  printMPInt (stdout, &key->d, "d");
+  printMPInt (stdout, &key->u, "u");
+  printMPInt (stdout, &key->p, "p");
+  printMPInt (stdout, &key->q, "q");
+  printf ("\n-------------printing key done---------------\n");
+}
+
+
+void printArray (unsigned char a[], int n, char * msg)
+{
+  int i0;
+  printf ("%s:\n", msg);
+  printf ("printArray a[0]=%02x\n", a[0]);
+  for (i0=0; i0<n; i0++)
+    //printf ("%02x", a[i0]);
+    printf ("%02x ", (unsigned int) a[i0]);
+  //printf ("(byte)0x%02x, ", a[i0]);
+  printf ("\n");
+}
+
+
+
+#define wordToByte(x) 4*(x)
+
+void initHdr (unsigned char hdr[], int pktsize)
+{
+  hdr[0] = 0xc2;
+  hdr[1] = wordToByte (pktsize) + 1;
+  hdr[2] = 0x0;
+}
+
+
+
+int computeAndPrintDmodX (MP_INT * dx, MP_INT * x, MP_INT * d, char * name,
+			  int offset, FILE * fd)
+{
+  mpz_init(dx);
+  mpz_sub_ui(dx, x, 1);
+  mpz_mod(dx, d, dx);
+  /* offset = printMPIntAndHdr (dx, name, offset, fd); */
+  printMPInt (fd, dx, name);
+  mpz_clear(dx);
+  return offset;
+}
+
+
+int printHdr (unsigned char * buf, int len, int offset, char * msg)
+{
+  printf ("printHdr buf[0]=%x, buf=%d\n", (unsigned int)buf[0], (int)buf);
+  printArray (buf, len, msg);
+  return offset + len;
+}
+
+
+int printMPIntAndHdr (MP_INT * mpint, char * name, int offset, FILE * fd)
+{
+  unsigned char hdr[BUFLEN];
+  char buf[BUFLEN];
+  initHdr (hdr, mpint->_mp_size);
+
+  sprintf (buf, "%s hdr (offset=0x%x)", name, offset);
+  offset = printHdr (hdr, HDRSIZE, offset, buf);
+
+  sprintf (buf, "%s value(offset=0x%x)", name, offset);
+  /*
+  return printHdr ((unsigned char*)mpint->_mp_d, wordToByte(mpint->_mp_size),
+		     offset, buf);
+  */
+  /* return sendMPIntToCard (fd, mpint, offset, buf); */
+  printMPInt (fd, mpint, buf);
+  return offset + abs(mpint->_mp_size);
+}
+
+void printPrivateKeyForCyberflex (RSAPrivateKey * key)
+{
+  MP_INT dp, dq;
+  int offset = 0;
+
+  /*
+  unsigned char keyHdr[BUFLEN]
+    = {0xc1, 0x01, 0x02};
+  
+  printf ("\n\nprinting key\n\n");
+  offset = printHdr (keyHdr, 3, offset, "");
+  offset = printMPIntAndHdr (&key->n, "n", offset);
+  offset = printMPIntAndHdr (&key->d, "d", offset);
+  */
+/*
+  unsigned char keyHdr[BUFLEN]
+    = {(unsigned char)0xc2, (unsigned char)0x6, (unsigned char)0xc1,
+	 (unsigned char)0x8, (unsigned char)0x13, (unsigned char)0x0,
+	 (unsigned char)0x0, (unsigned char)0x5};
+  char buf[BUFLEN];
+  */
+  FILE * fd = stdout;
+
+  if (!printKey)
+    return;
+
+  /* printf ("printPrivateKey *keyHdr=%02x, keyHdr=%d\n", *keyHdr, keyHdr);*/
+
+  /* printMPInt (keyHdr, KEYHDRSIZE, "\nkey header"); */
+
+  printf ("\n\n------------printing key\n");
+  /* sprintf (buf, "\n%s hdr (offset=0x%x)", "key", offset);
+  offset = printHdr (keyHdr, KEYHDRSIZE, offset, buf);
+
+  printf ("printPrivateKey AFTER printHdr *keyHdr=%02x, keyHdr=%d\n", *keyHdr, keyHdr);
+*/
+  /*
+  offset = printMPIntAndHdr (&key->p, "p", offset, fd);
+  offset = printMPIntAndHdr (&key->q, "q", offset, fd);
+  offset = printMPIntAndHdr (&key->u, "u", offset, fd);
+*/
+  printMPInt (fd, &key->p, "p");
+  printMPInt (fd, &key->q, "q");
+  printMPInt (fd, &key->u, "1/p mod q");
+  /* Compute dp = d mod p-1. */
+  offset = computeAndPrintDmodX (&dp, &key->p, &key->d, "dp", offset, fd);
+  /* Compute dq = d mod q-1. */
+  offset = computeAndPrintDmodX (&dq, &key->q, &key->d, "dq", offset, fd);
+
+  printMPInt (fd, &key->n, "n");
+  printf ("\n----------------------printing key done\n\n");
+
+}
+
+#define sc_assert(x, msg, buf, size, r1, r2) {\
+  if(!(x)) {\
+	    fprintf (stderr, "Error: %s failed\n", msg);\
+            dump_reply(buf, size, r1, r2);\
+            exit(0);}\
+  }
+
+int fdsc = -1;
+#ifdef IGNORE
+unsigned char * putMPIntToBuf (MP_INT * mpint, unsigned char buf[] )
+{
+  int i0, j0, ind;
+  int size = abs(mpint->_mp_size);
+  for (i0=size-1, ind=0; i0>=0; i0--)
+    for (j0=3; j0>=0; j0--, ind++)
+      buf[ind] = (mpint->_mp_d[i0]>>(j0*8)) & 0xff;
+  return buf;
+}
+
+void putBufToMPInt (unsigned char buf[], MP_INT * mpint, int bufsize)
+{
+  int i0, j0, ind;
+  int size = mpint->_mp_size = bufsize/4;
+  
+  assert (mpint->_mp_alloc>=size);
+
+  for (i0=0; i0<size; i0++)
+    mpint->_mp_d[i0] = 0;
+
+  for (i0=size-1, ind=0; i0>=0; i0--){
+    for (j0=3; j0>=0; j0--, ind++) {
+      mpint->_mp_d[i0] |= buf[ind] << (j0*8);
+      /*
+      printf ("ind=%d, %02x, int=%x\n",
+	      ind, buf[ind], mpint->_mp_d[i0]);
+      */
+    }
+  }
+}
+#endif /* IGNORE */
+
+#ifdef TIMING
+
+#include <sys/time.h>
+void timersub(struct timeval * tv1, struct timeval * tv0, struct timeval * tv2)
+{
+  int temp = (tv1->tv_sec - tv0->tv_sec) * 1000 * 1000 +
+    tv1->tv_usec - tv0->tv_usec;
+
+  tv2->tv_sec = temp / (1000 * 1000);
+  tv2->tv_usec = temp % (1000 * 1000);
+}
+
+#endif
+
+void rsa_private_sc (MP_INT * output, MP_INT * input)
+{
+  int r1, r2;
+  int numBytes = abs(input->_mp_size)*4;
+  unsigned char buf[256];
+#ifdef TIMING
+  struct timeval tv[3];
+#endif
+  /* putMPIntToBuf (input, buf); */
+  mp_linearize_msb_first (buf, numBytes, input);
+  /*
+  printMPInt (fd, input, msg); 
+  printArray (buf, numBytes, msg);
+  */
+
+  debug ("sending decrypt APDU...\n");
+#ifdef TIMING
+  gettimeofday (&tv[0], NULL);
+#endif
+  sc_assert (scwrite(fdsc, CLA, DECRYPT, 0, 0, numBytes, buf, &r1, &r2)!=-1,
+	     "scwrite", buf, numBytes, r1, r2);
+  /* dump_reply(buf, numBytes, r1, r2); */
+  /* print_r1r2(r1, r2); */
+#ifdef TIMING
+  gettimeofday (&tv[1], NULL);
+#endif
+  
+  debug ("sending get response APDU...\n");
+  sc_assert (scread(fdsc, CLA, GET_RESPONSE, 0, 0, numBytes, buf, &r1,&r2)!=-1,
+	     "scread", buf, numBytes, r1, r2);
+#ifdef TIMING
+  gettimeofday (&tv[2], NULL);
+
+  timersub (&tv[1], &tv[0], &tv[0]);
+  debug ("decrypt: (%d.%06d)\n", tv[0].tv_sec, tv[0].tv_usec);
+
+  timersub (&tv[2], &tv[1], &tv[0]);
+  debug ("get_reponse: (%d.%06d)\n", tv[0].tv_sec, tv[0].tv_usec);
+#endif
+
+  /* dump_reply(buf, numBytes, r1, r2); */
+  /* print_r1r2(r1, r2); */
+
+  /* putBufToMPInt (buf, output, numBytes); */
+  mp_unlinearize_msb_first (output, buf, numBytes);
+  
+  /*
+  printArray (buf, numBytes, "decrypted buf");
+  printMPInt (fd, output, "decrypted mpint");
+  */
+}
+
+#endif SC_SSH
