1/* opie.h: Data structures and values for the OPIE authentication
2	system that a program might need.
3
4%%% portions-copyright-cmetz-96
5Portions of this software are Copyright 1996-1999 by Craig Metz, All Rights
6Reserved. The Inner Net License Version 2 applies to these portions of
7the software.
8You should have received a copy of the license with this software. If
9you didn't get a copy, you may request one from <license@inner.net>.
10
11Portions of this software are Copyright 1995 by Randall Atkinson and Dan
12McDonald, All Rights Reserved. All Rights under this copyright are assigned
13to the U.S. Naval Research Laboratory (NRL). The NRL Copyright Notice and
14License Agreement applies to this software.
15
16	History:
17
18	Modified by cmetz for OPIE 2.4. Added sequence number limits. Added
19		struct opie_otpkey and made many functions use it. Added
20		opiestrncpy(). Include header with libmissing prototypes.
21	Modified by cmetz for OPIE 2.32. Added symbolic flag names for
22		opiepasswd(). Added __opieparsechallenge() prototype.
23	Modified by cmetz for OPIE 2.31. Removed active attack protection.
24	Modified by cmetz for OPIE 2.3. Renamed PTR to VOIDPTR. Added
25		re-init key and extension file fields to struct opie. Added
26		opie_ prefix on struct opie members. Added opie_flags field
27		and definitions. Added more prototypes. Changed opiehash()
28		prototype.
29	Modified by cmetz for OPIE 2.22. Define __P correctly if this file
30		is included in a third-party program.
31	Modified by cmetz for OPIE 2.2. Re-did prototypes. Added FUNCTION
32                definition et al. Multiple-include protection. Added struct
33		utsname fake. Got rid of gethostname() cruft. Moved UINT4
34                here. Provide for *seek whence values. Move MDx context here
35                and unify. Re-did prototypes.
36	Modified at NRL for OPIE 2.0.
37	Written at Bellcore for the S/Key Version 1 software distribution
38		(skey.h).
39
40$FreeBSD$
41*/
42#ifndef _OPIE_H
43#define _OPIE_H 1
44
45struct opie {
46  int opie_flags;
47  char opie_buf[256];
48  char *opie_principal;
49  int opie_n;
50  char *opie_seed;
51  char *opie_val;
52  long opie_recstart;
53};
54
55#define __OPIE_FLAGS_RW 1
56#define __OPIE_FLAGS_READ 2
57
58/* Minimum length of a secret password */
59#ifndef OPIE_SECRET_MIN
60#define OPIE_SECRET_MIN 10
61#endif	/* OPIE_SECRET_MIN */
62
63/* Maximum length of a secret password */
64#define OPIE_SECRET_MAX 127
65
66/* Minimum length of a seed */
67#define OPIE_SEED_MIN 5
68
69/* Maximum length of a seed */
70#define OPIE_SEED_MAX 16
71
72/* Max length of hash algorithm name (md4/md5/sha1) */
73#define OPIE_HASHNAME_MAX 4
74
75/* Maximum length of a challenge (otp-md? 9999 seed ext) */
76#define OPIE_CHALLENGE_MAX (4+OPIE_HASHNAME_MAX+1+4+1+OPIE_SEED_MAX+1+3)
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 *));
131int opienewseed __P((char *));
132void opierandomchallenge __P((char *));
133char * opieskipspace __P((register char *));
134void opiestripcrlf __P((char *));
135int  opieverify __P((struct opie *,char *));
136int opiepasswd __P((struct opie *, int, char *, int, char *, char *));
137char *opiereadpass __P((char *, int, int));
138int opielogin __P((char *line, char *name, char *host));
139const char *opie_get_algorithm __P((void));
140int  opie_haskey __P((char *username));
141char *opie_keyinfo __P((char *));
142int  opie_passverify __P((char *username, char *passwd));
143int opieinsecure __P((void));
144void opieversion __P((void));
145__END_DECLS
146
147#if _OPIE
148#define VOIDPTR void *
149#define VOIDRET void
150#define NOARGS  void
151#define FUNCTION(arglist, args) (args)
152#define AND ,
153#define FUNCTION_NOARGS ()
154
155__BEGIN_DECLS
156struct utmp;
157int __opiegetutmpentry __P((char *, struct utmp *));
158#ifdef EOF
159FILE *__opieopen __P((char *, int, int));
160#endif /* EOF */
161int __opiereadrec __P((struct opie *));
162int __opiewriterec __P((struct opie *));
163int __opieparsechallenge __P((char *buffer, int *algorithm, int *sequence, char **seed, int *exts));
164VOIDRET opiehashlen __P((int algorithm, VOIDPTR in, struct opie_otpkey *out, int n));
165__END_DECLS
166
167#define opiestrncpy(dst, src, n) \
168  do { \
169    strncpy(dst, src, n-1); \
170    dst[n-1] = 0; \
171  } while(0)
172
173/* #include "missing.h" */
174#endif /* _OPIE */
175
176#define OPIEPASSWD_CONSOLE 1
177#define OPIEPASSWD_FORCE   2
178
179#endif /* _OPIE_H */
180