18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Utility program for generating entries in /etc/ppp/srp-secrets
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (c) 2001 by Sun Microsystems, Inc.
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * All rights reserved.
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Non-exclusive rights to redistribute, modify, translate, and use
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * this software in source and binary forms, in whole or in part, is
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * hereby granted, provided that the above copyright notice is
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * duplicated in any source form, and that neither the name of the
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * copyright holder nor the author is used to endorse or promote
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * products derived from this software.
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Original version by James Carlson
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Usage:
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	srp-entry [-i index] [clientname]
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Index, if supplied, is the modulus/generator index from
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * /etc/tpasswd.conf.  If not supplied, then the last (highest
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * numbered) entry from that file is used.  If the file doesn't exist,
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * then the default "well known" EAP SRP-SHA1 modulus/generator is
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * used.
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * The default modulus/generator can be requested as index 0.
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdio.h>
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <stdlib.h>
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <unistd.h>
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <string.h>
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <ctype.h>
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <t_pwd.h>
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#ifndef	SOL2
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define	getpassphrase	getpass
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#endif
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define	HAS_SPACE	1
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define	HAS_DQUOTE	2
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define	HAS_SQUOTE	4
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#define	HAS_BACKSLASH	8
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic const u_char wkmodulus[] = {
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xAC, 0x6B, 0xDB, 0x41, 0x32, 0x4A, 0x9A, 0x9B,
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xF1, 0x66, 0xDE, 0x5E, 0x13, 0x89, 0x58, 0x2F,
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xAF, 0x72, 0xB6, 0x65, 0x19, 0x87, 0xEE, 0x07,
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xFC, 0x31, 0x92, 0x94, 0x3D, 0xB5, 0x60, 0x50,
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xA3, 0x73, 0x29, 0xCB, 0xB4, 0xA0, 0x99, 0xED,
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x81, 0x93, 0xE0, 0x75, 0x77, 0x67, 0xA1, 0x3D,
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xD5, 0x23, 0x12, 0xAB, 0x4B, 0x03, 0x31, 0x0D,
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xCD, 0x7F, 0x48, 0xA9, 0xDA, 0x04, 0xFD, 0x50,
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xE8, 0x08, 0x39, 0x69, 0xED, 0xB7, 0x67, 0xB0,
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xCF, 0x60, 0x95, 0x17, 0x9A, 0x16, 0x3A, 0xB3,
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x66, 0x1A, 0x05, 0xFB, 0xD5, 0xFA, 0xAA, 0xE8,
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x29, 0x18, 0xA9, 0x96, 0x2F, 0x0B, 0x93, 0xB8,
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x55, 0xF9, 0x79, 0x93, 0xEC, 0x97, 0x5E, 0xEA,
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xA8, 0x0D, 0x74, 0x0A, 0xDB, 0xF4, 0xFF, 0x74,
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x73, 0x59, 0xD0, 0x41, 0xD5, 0xC3, 0x3E, 0xA7,
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x1D, 0x28, 0x1E, 0x44, 0x6B, 0x14, 0x77, 0x3B,
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xCA, 0x97, 0xB4, 0x3A, 0x23, 0xFB, 0x80, 0x16,
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x76, 0xBD, 0x20, 0x7A, 0x43, 0x6C, 0x64, 0x81,
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xF1, 0xD2, 0xB9, 0x07, 0x87, 0x17, 0x46, 0x1A,
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x5B, 0x9D, 0x32, 0xE6, 0x88, 0xF8, 0x77, 0x48,
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x54, 0x45, 0x23, 0xB5, 0x24, 0xB0, 0xD5, 0x7D,
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x5E, 0xA7, 0x7A, 0x27, 0x75, 0xD2, 0xEC, 0xFA,
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x03, 0x2C, 0xFB, 0xDB, 0xF5, 0x2F, 0xB3, 0x78,
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x61, 0x60, 0x27, 0x90, 0x04, 0xE5, 0x7A, 0xE6,
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0xAF, 0x87, 0x4E, 0x73, 0x03, 0xCE, 0x53, 0x29,
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x9C, 0xCC, 0x04, 0x1C, 0x7B, 0xC3, 0x08, 0xD8,
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x2A, 0x56, 0x98, 0xF3, 0xA8, 0xD0, 0xC3, 0x82,
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x71, 0xAE, 0x35, 0xF8, 0xE9, 0xDB, 0xFB, 0xB6,
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x94, 0xB5, 0xC8, 0x03, 0xD8, 0x9F, 0x7A, 0xE4,
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x35, 0xDE, 0x23, 0x6D, 0x52, 0x5F, 0x54, 0x75,
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x9B, 0x65, 0xE3, 0x72, 0xFC, 0xD6, 0x8E, 0xF2,
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	0x0F, 0xA7, 0x11, 0x1F, 0x9E, 0x4A, 0xFF, 0x73
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project};
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic const char *myname;
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic void
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectusage(void)
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	(void) fprintf(stderr, "Usage:\n\t%s [-i index] [clientname]\n",
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    myname);
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	exit(1);
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectmain(int argc, char **argv)
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct t_conf *tc;
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct t_confent *tcent, mytce;
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	struct t_pw pwval;
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *name;
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char pname[256];
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *pass1, *pass2;
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int flags, idx;
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char *cp;
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char delimit;
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char strbuf[MAXB64PARAMLEN];
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char saltbuf[MAXB64SALTLEN];
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((myname = *argv) == NULL)
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		myname = "srp-entry";
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	else
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		argv++;
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	idx = -1;
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (*argv != NULL && strcmp(*argv, "-i") == 0) {
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (*++argv == NULL)
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			usage();
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		idx = atoi(*argv++);
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	tcent = NULL;
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (idx != 0 && (tc = t_openconf(NULL)) != NULL) {
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (idx == -1)
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			tcent = t_getconflast(tc);
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			tcent = t_getconfbyindex(tc, idx);
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (idx <= 0 && tcent == NULL) {
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		mytce.index = 0;
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		mytce.modulus.data = (u_char *)wkmodulus;
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		mytce.modulus.len = sizeof (wkmodulus);
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		mytce.generator.data = (u_char *)"\002";
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		mytce.generator.len = 1;
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		tcent = &mytce;
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (tcent == NULL) {
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		(void) fprintf(stderr, "SRP modulus/generator %d not found\n",
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    idx);
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		exit(1);
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((name = *argv) == NULL) {
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		(void) printf("Client name: ");
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (fgets(pname, sizeof (pname), stdin) == NULL)
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			exit(1);
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if ((cp = strchr(pname, '\n')) != NULL)
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			*cp = '\0';
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		name = pname;
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (;;) {
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if ((pass1 = getpassphrase("Pass phrase: ")) == NULL)
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			exit(1);
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		pass1 = strdup(pass1);
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if ((pass2 = getpassphrase("Re-enter phrase: ")) == NULL)
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			exit(1);
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (strcmp(pass1, pass2) == 0)
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		free(pass1);
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		(void) printf("Phrases don't match; try again.\n");
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	memset(&pwval, 0, sizeof (pwval));
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	t_makepwent(&pwval, name, pass1, NULL, tcent);
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	flags = 0;
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (cp = name; *cp != '\0'; cp++)
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (isspace(*cp))
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			flags |= HAS_SPACE;
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else if (*cp == '"')
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			flags |= HAS_DQUOTE;
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else if (*cp == '\'')
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			flags |= HAS_SQUOTE;
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else if (*cp == '\\')
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			flags |= HAS_BACKSLASH;
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	delimit = flags == 0 ? '\0' : (flags & HAS_DQUOTE) ? '\'' : '"';
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (delimit != '\0')
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		(void) putchar(delimit);
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	for (cp = name; *cp != '\0'; cp++) {
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (*cp == delimit || *cp == '\\')
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			(void) putchar('\\');
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		(void) putchar(*cp);
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (delimit != '\0')
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		(void) putchar(delimit);
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	(void) printf(" * %d:%s:%s *\n",
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    pwval.pebuf.index, t_tob64(strbuf,
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		(char *)pwval.pebuf.password.data, pwval.pebuf.password.len),
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    t_tob64(saltbuf, (char *)pwval.pebuf.salt.data,
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		pwval.pebuf.salt.len));
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return 0;
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
191