1244557Sbrooks/* opie.h: Data structures and values for the OPIE authentication
2244557Sbrooks	system that a program might need.
3244557Sbrooks
4244557Sbrooks%%% portions-copyright-cmetz-96
5244557SbrooksPortions of this software are Copyright 1996-1999 by Craig Metz, All Rights
6244557SbrooksReserved. The Inner Net License Version 2 applies to these portions of
7244557Sbrooksthe software.
8244557SbrooksYou should have received a copy of the license with this software. If
9244557Sbrooksyou didn't get a copy, you may request one from <license@inner.net>.
10244557Sbrooks
11244557SbrooksPortions of this software are Copyright 1995 by Randall Atkinson and Dan
12244557SbrooksMcDonald, All Rights Reserved. All Rights under this copyright are assigned
13244557Sbrooksto the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
14244557SbrooksLicense Agreement applies to this software.
15244557Sbrooks
16244557Sbrooks	History:
17244557Sbrooks
18244557Sbrooks	Modified by cmetz for OPIE 2.4. Added sequence number limits. Added
19244557Sbrooks		struct opie_otpkey and made many functions use it. Added
20244557Sbrooks		opiestrncpy(). Include header with libmissing prototypes.
21244557Sbrooks	Modified by cmetz for OPIE 2.32. Added symbolic flag names for
22244557Sbrooks		opiepasswd(). Added __opieparsechallenge() prototype.
23244557Sbrooks	Modified by cmetz for OPIE 2.31. Removed active attack protection.
24244557Sbrooks	Modified by cmetz for OPIE 2.3. Renamed PTR to VOIDPTR. Added
25244557Sbrooks		re-init key and extension file fields to struct opie. Added
26244557Sbrooks		opie_ prefix on struct opie members. Added opie_flags field
27244557Sbrooks		and definitions. Added more prototypes. Changed opiehash()
28244557Sbrooks		prototype.
29244557Sbrooks	Modified by cmetz for OPIE 2.22. Define __P correctly if this file
30244557Sbrooks		is included in a third-party program.
31244557Sbrooks	Modified by cmetz for OPIE 2.2. Re-did prototypes. Added FUNCTION
32244557Sbrooks                definition et al. Multiple-include protection. Added struct
33244557Sbrooks		utsname fake. Got rid of gethostname() cruft. Moved UINT4
34244557Sbrooks                here. Provide for *seek whence values. Move MDx context here
35244557Sbrooks                and unify. Re-did prototypes.
36244557Sbrooks	Modified at NRL for OPIE 2.0.
37244557Sbrooks	Written at Bellcore for the S/Key Version 1 software distribution
38244557Sbrooks		(skey.h).
39244557Sbrooks
40244557Sbrooks$FreeBSD$
41244557Sbrooks*/
42244557Sbrooks#ifndef _OPIE_H
43244557Sbrooks#define _OPIE_H 1
44244557Sbrooks
45244557Sbrooksstruct opie {
46244557Sbrooks  int opie_flags;
47244557Sbrooks  char opie_buf[256];
48244557Sbrooks  char *opie_principal;
49244557Sbrooks  int opie_n;
50244557Sbrooks  char *opie_seed;
51244557Sbrooks  char *opie_val;
52244557Sbrooks  long opie_recstart;
53244557Sbrooks};
54244557Sbrooks
55244557Sbrooks#define __OPIE_FLAGS_RW 1
56244557Sbrooks#define __OPIE_FLAGS_READ 2
57244557Sbrooks
58244557Sbrooks/* Minimum length of a secret password */
59244557Sbrooks#ifndef OPIE_SECRET_MIN
60244557Sbrooks#define OPIE_SECRET_MIN 10
61244557Sbrooks#endif	/* OPIE_SECRET_MIN */
62244557Sbrooks
63244557Sbrooks/* Maximum length of a secret password */
64244557Sbrooks#define OPIE_SECRET_MAX 127
65244557Sbrooks
66244557Sbrooks/* Minimum length of a seed */
67244557Sbrooks#define OPIE_SEED_MIN 5
68244557Sbrooks
69244557Sbrooks/* Maximum length of a seed */
70244557Sbrooks#define OPIE_SEED_MAX 16
71
72/* Max length of hash algorithm name (md4/md5) */
73#define OPIE_HASHNAME_MAX 3
74
75/* Maximum length of a challenge (otp-md? 9999 seed) */
76#define OPIE_CHALLENGE_MAX (4+OPIE_HASHNAME_MAX+1+4+1+OPIE_SEED_MAX)
77
78/* Maximum length of a response that we allow */
79#define OPIE_RESPONSE_MAX (9+1+19+1+9+OPIE_SEED_MAX+1+19+1+19+1+19)
80
81/* Maximum length of a principal (read: user name) */
82#define OPIE_PRINCIPAL_MAX 32
83
84/* Maximum sequence number */
85#ifndef OPIE_SEQUENCE_MAX
86#define OPIE_SEQUENCE_MAX 9999
87#endif /* OPIE_SEQUENCE_MAX */
88
89/* Restricted sequence number */
90#ifndef OPIE_SEQUENCE_RESTRICT
91#define OPIE_SEQUENCE_RESTRICT 9
92#endif /* OPIE_SEQUENCE_RESTRICT */
93
94#define UINT4 u_int32_t
95
96struct opie_otpkey {
97	UINT4 words[2];
98};
99
100#ifndef SEEK_SET
101#define SEEK_SET 0
102#endif /* SEEK_SET */
103
104#ifndef SEEK_END
105#define SEEK_END 2
106#endif /* SEEK_END */
107
108__BEGIN_DECLS
109int  opieaccessfile __P((char *));
110int  rdnets __P((long));
111int  isaddr __P((register char *));
112int  opiealways __P((char *));
113char *opieatob8 __P((struct opie_otpkey *, char *));
114void opiebackspace __P((char *));
115char *opiebtoa8 __P((char *, struct opie_otpkey *));
116char *opiebtoe __P((char *, struct opie_otpkey *));
117char *opiebtoh __P((char *, struct opie_otpkey *));
118int  opieetob __P((struct opie_otpkey *, char *));
119int  opiechallenge __P((struct opie *,char *,char *));
120int  opiegenerator __P((char *,char *,char *));
121int  opiegetsequence __P((struct opie *));
122void opiehash __P((struct opie_otpkey *, unsigned));
123int  opiehtoi __P((register char));
124int  opiekeycrunch __P((int, struct opie_otpkey *, char *, char *));
125int  opielock __P((char *));
126int  opieunlock __P((void));
127void opieunlockaeh __P((void));
128void opiedisableaeh __P((void));
129int  opielookup __P((struct opie *,char *));
130int  opiepasscheck __P((char *));
131void opierandomchallenge __P((char *));
132char * opieskipspace __P((register char *));
133void opiestripcrlf __P((char *));
134int  opieverify __P((struct opie *,char *));
135int opiepasswd __P((struct opie *, int, char *, int, char *, char *));
136char *opiereadpass __P((char *, int, int));
137int opielogin __P((char *line, char *name, char *host));
138const char *opie_get_algorithm __P((void));
139int  opie_haskey __P((char *username));
140char *opie_keyinfo __P((char *));
141int  opie_passverify __P((char *username, char *passwd));
142__END_DECLS
143
144#if _OPIE
145#define VOIDPTR void *
146#define VOIDRET void
147#define NOARGS  void
148#define FUNCTION(arglist, args) (args)
149#define AND ,
150#define FUNCTION_NOARGS ()
151
152__BEGIN_DECLS
153struct utmp;
154int __opiegetutmpentry __P((char *, struct utmp *));
155#ifdef EOF
156FILE *__opieopen __P((char *, int, int));
157#endif /* EOF */
158int __opiereadrec __P((struct opie *));
159int __opiewriterec __P((struct opie *));
160int __opieparsechallenge __P((char *buffer, int *algorithm, int *sequence, char **seed, int *exts));
161__END_DECLS
162
163#define opiestrncpy(dst, src, n) \
164  do { \
165    strncpy(dst, src, n-1); \
166    dst[n-1] = 0; \
167  } while(0)
168
169/* #include "missing.h" */
170#endif /* _OPIE */
171
172#define OPIEPASSWD_CONSOLE 1
173#define OPIEPASSWD_FORCE   2
174
175#endif /* _OPIE_H */
176