netatalk  4.5.0
Free and Open Source Apple Filing Protocol (AFP) Server
Loading...
Searching...
No Matches
afppasswd.c File Reference

AFP user password utility. More...

#include <arpa/inet.h>
#include <ctype.h>
#include <errno.h>
#include <fcntl.h>
#include <pwd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <gcrypt.h>
#include <atalk/compat.h>
#include <crack.h>

Macros

#define DES_KEY_SZ   8
#define OPT_ISROOT   (1 << 0)
#define OPT_CREATE   (1 << 1)
#define OPT_FORCE   (1 << 2)
#define OPT_ADDUSER   (1 << 3)
#define OPT_NOCRACK   (1 << 4)
#define OPT_RANDNUM   (1 << 5)
#define PASSWD_ILLEGAL   '*'
#define FORMAT   ":****************:****************:********\n"
#define FORMAT_LEN   44
#define SRP_SALT_LEN   16
#define SRP_NBYTES   192 /* 1536-bit prime */
#define SRP_HEX_SALT_LEN   (SRP_SALT_LEN * 2)
#define SRP_HEX_V_LEN   (SRP_NBYTES * 2)
#define SRP_FORMAT_LEN   (1 + SRP_HEX_SALT_LEN + 1 + SRP_HEX_V_LEN + 1)
#define SRP_SHA1_LEN   20
#define SRP_PASSWDLEN   255
#define USERNAME_MAX_LEN   255
#define UID_START   100
#define HEXPASSWDLEN   16
#define PASSWDLEN   8

Functions

static int unhex (unsigned char x)
static int randnum_make_keypath (const char *path, char *keypath, size_t keypath_size)
static int randnum_read_keyfd (int keyfd, uint8_t key[DES_KEY_SZ], const char *keypath)
static int randnum_open_keyfile (const char *path, int *keyfd_out)
static int randnum_write_keyfile (const char *keypath)
static int randnum_ensure_keyfile (const char *path, int flags)
static int convert_passwd (char *passwd_buf, char *newpwd, const int keyfd)
static int srp_compute_verifier (const char *username, const char *password, const unsigned char *salt, unsigned char *v_out)
static void srp_encode_hex (char *out_hex, const unsigned char *salt, const unsigned char *verifier)
static int update_srp_passwd (const char *path, const char *name, int flags, const char *pass)
static int create_srp_file (const char *path, uid_t minuid)
static int update_passwd (const char *path, const char *name, int flags, const char *pass)
static int create_file (const char *path, uid_t minuid)
static void print_usage (void)
int main (int argc, char **argv)

Variables

static const unsigned char srp_N_bytes [SRP_NBYTES]
static char buf [MAXPATHLEN+1]
static const unsigned char hextable [] = "0123456789ABCDEF"

Detailed Description

AFP user password utility.

Supports two modes:

SRP mode (default): Manages SRP verifier file for use with the SRP UAM. Format: username:hex_salt(32):hex_verifier(384)

RandNum mode (-r flag): Manages legacy password file for use with the RandNum UAM. Format: username:hex_password(16):last_login(16):fail_count(8)

Macro Definition Documentation

◆ DES_KEY_SZ

#define DES_KEY_SZ   8

◆ FORMAT

#define FORMAT   ":****************:****************:********\n"

◆ FORMAT_LEN

#define FORMAT_LEN   44

◆ HEXPASSWDLEN

#define HEXPASSWDLEN   16

◆ OPT_ADDUSER

#define OPT_ADDUSER   (1 << 3)

◆ OPT_CREATE

#define OPT_CREATE   (1 << 1)

◆ OPT_FORCE

#define OPT_FORCE   (1 << 2)

◆ OPT_ISROOT

#define OPT_ISROOT   (1 << 0)

◆ OPT_NOCRACK

#define OPT_NOCRACK   (1 << 4)

◆ OPT_RANDNUM

#define OPT_RANDNUM   (1 << 5)

◆ PASSWD_ILLEGAL

#define PASSWD_ILLEGAL   '*'

◆ PASSWDLEN

#define PASSWDLEN   8

◆ SRP_FORMAT_LEN

#define SRP_FORMAT_LEN   (1 + SRP_HEX_SALT_LEN + 1 + SRP_HEX_V_LEN + 1)

◆ SRP_HEX_SALT_LEN

#define SRP_HEX_SALT_LEN   (SRP_SALT_LEN * 2)

◆ SRP_HEX_V_LEN

#define SRP_HEX_V_LEN   (SRP_NBYTES * 2)

◆ SRP_NBYTES

#define SRP_NBYTES   192 /* 1536-bit prime */

◆ SRP_PASSWDLEN

#define SRP_PASSWDLEN   255

◆ SRP_SALT_LEN

#define SRP_SALT_LEN   16

◆ SRP_SHA1_LEN

#define SRP_SHA1_LEN   20

◆ UID_START

#define UID_START   100

◆ USERNAME_MAX_LEN

#define USERNAME_MAX_LEN   255

Function Documentation

◆ convert_passwd()

int convert_passwd ( char * passwd_buf,
char * newpwd,
const int keyfd )
static

◆ create_file()

int create_file ( const char * path,
uid_t minuid )
static

◆ create_srp_file()

int create_srp_file ( const char * path,
uid_t minuid )
static

◆ main()

int main ( int argc,
char ** argv )

◆ print_usage()

void print_usage ( void )
static

◆ randnum_ensure_keyfile()

int randnum_ensure_keyfile ( const char * path,
int flags )
static

◆ randnum_make_keypath()

int randnum_make_keypath ( const char * path,
char * keypath,
size_t keypath_size )
static

◆ randnum_open_keyfile()

int randnum_open_keyfile ( const char * path,
int * keyfd_out )
static

◆ randnum_read_keyfd()

int randnum_read_keyfd ( int keyfd,
uint8_t key[DES_KEY_SZ],
const char * keypath )
static

◆ randnum_write_keyfile()

int randnum_write_keyfile ( const char * keypath)
static

◆ srp_compute_verifier()

int srp_compute_verifier ( const char * username,
const char * password,
const unsigned char * salt,
unsigned char * v_out )
static

◆ srp_encode_hex()

void srp_encode_hex ( char * out_hex,
const unsigned char * salt,
const unsigned char * verifier )
static

◆ unhex()

int unhex ( unsigned char x)
static

◆ update_passwd()

int update_passwd ( const char * path,
const char * name,
int flags,
const char * pass )
static

◆ update_srp_passwd()

int update_srp_passwd ( const char * path,
const char * name,
int flags,
const char * pass )
static

Variable Documentation

◆ buf

char buf[MAXPATHLEN+1]
static

◆ hextable

const unsigned char hextable[] = "0123456789ABCDEF"
static

◆ srp_N_bytes

const unsigned char srp_N_bytes[SRP_NBYTES]
static
Initial value:
= {
0x9D, 0xEF, 0x3C, 0xAF, 0xB9, 0x39, 0x27, 0x7A,
0xB1, 0xF1, 0x2A, 0x86, 0x17, 0xA4, 0x7B, 0xBB,
0xDB, 0xA5, 0x1D, 0xF4, 0x99, 0xAC, 0x4C, 0x80,
0xBE, 0xEE, 0xA9, 0x61, 0x4B, 0x19, 0xCC, 0x4D,
0x5F, 0x4F, 0x5F, 0x55, 0x6E, 0x27, 0xCB, 0xDE,
0x51, 0xC6, 0xA9, 0x4B, 0xE4, 0x60, 0x7A, 0x29,
0x15, 0x58, 0x90, 0x3B, 0xA0, 0xD0, 0xF8, 0x43,
0x80, 0xB6, 0x55, 0xBB, 0x9A, 0x22, 0xE8, 0xDC,
0xDF, 0x02, 0x8A, 0x7C, 0xEC, 0x67, 0xF0, 0xD0,
0x81, 0x34, 0xB1, 0xC8, 0xB9, 0x79, 0x89, 0x14,
0x9B, 0x60, 0x9E, 0x0B, 0xE3, 0xBA, 0xB6, 0x3D,
0x47, 0x54, 0x83, 0x81, 0xDB, 0xC5, 0xB1, 0xFC,
0x76, 0x4E, 0x3F, 0x4B, 0x53, 0xDD, 0x9D, 0xA1,
0x15, 0x8B, 0xFD, 0x3E, 0x2B, 0x9C, 0x8C, 0xF5,
0x6E, 0xDF, 0x01, 0x95, 0x39, 0x34, 0x96, 0x27,
0xDB, 0x2F, 0xD5, 0x3D, 0x24, 0xB7, 0xC4, 0x86,
0x65, 0x77, 0x2E, 0x43, 0x7D, 0x6C, 0x7F, 0x8C,
0xE4, 0x42, 0x73, 0x4A, 0xF7, 0xCC, 0xB7, 0xAE,
0x83, 0x7C, 0x26, 0x4A, 0xE3, 0xA9, 0xBE, 0xB8,
0x7F, 0x8A, 0x2F, 0xE9, 0xB8, 0xB5, 0x29, 0x2E,
0x5A, 0x02, 0x1F, 0xFF, 0x5E, 0x91, 0x47, 0x9E,
0x8C, 0xE7, 0xA2, 0x8C, 0x24, 0x42, 0xC6, 0xF3,
0x15, 0x18, 0x0F, 0x93, 0x49, 0x9A, 0x23, 0x4D,
0xCF, 0x76, 0xE3, 0xFE, 0xD1, 0x35, 0xF9, 0xBB,
}