source: EcnlProtoTool/trunk/asp3_dcre/tinet/net/ppp_upap.c@ 270

Last change on this file since 270 was 270, checked in by coas-nagasima, 7 years ago

mruby版ECNLプロトタイピング・ツールを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 13.7 KB
Line 
1/*
2 * TINET (TCP/IP Protocol Stack)
3 *
4 * Copyright (C) 2001-2009 by Dep. of Computer Science and Engineering
5 * Tomakomai National College of Technology, JAPAN
6 *
7 * 上記著作権者
8は,以下の (1)~(4) の条件か,Free Software Foundation
9 * によってå…
10¬è¡¨ã•ã‚Œã¦ã„ã‚‹ GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再é…
13å¸ƒï¼ˆä»¥ä¸‹ï¼Œ
14 * 利用と呼ぶ)することを無償で許諾する.
15 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
16 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * スコード中に含まれていること.
18 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
19 * 用できる形で再é…
20å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
21å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
22 * 者
23マニュアルなど)に,上記の著作権表示,この利用条件および下記
24 * の無保証規定を掲載すること.
25 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
26 * 用できない形で再é…
27å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®æ¡ä»¶ã‚’満たすこと.
28 * (a) 再é…
29å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
30マニュアルなど)に,上記の著
31 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
32 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
33 * 害からも,上記著作権者
34およびTOPPERSプロジェクトをå…
35è²¬ã™ã‚‹ã“と.
36 *
37 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
38お
39 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
40 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
41 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
42 *
43 * @(#) $Id: ppp_upap.c 270 2017-02-09 04:03:47Z coas-nagasima $
44 */
45
46/*
47 * upap.c - User/Password Authentication Protocol.
48 *
49 * Copyright (c) 1989 Carnegie Mellon University.
50 * All rights reserved.
51 *
52 * Redistribution and use in source and binary forms are permitted
53 * provided that the above copyright notice and this paragraph are
54 * duplicated in all such forms and that any documentation,
55 * advertising materials, and other materials related to such
56 * distribution and use acknowledge that the software was developed
57 * by Carnegie Mellon University. The name of the
58 * University may not be used to endorse or promote products derived
59 * from this software without specific prior written permission.
60 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
61 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
62 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
63 */
64
65/*
66 * PPP PAP Module
67 *
68 * Written by Toshiharu OHNO (tony-o@iij.ad.jp)
69 *
70 * Copyright (C) 1993-94, Internet Initiative Japan, Inc.
71 * All rights reserverd.
72 *
73 * Redistribution and use in source and binary forms are permitted
74 * provided that the above copyright notice and this paragraph are
75 * duplicated in all such forms and that any documentation,
76 * advertising materials, and other materials related to such
77 * distribution and use acknowledge that the software was developed
78 * by the Internet Initiative Japan, Inc. The name of the
79 * IIJ may not be used to endorse or promote products derived
80 * from this software without specific prior written permission.
81 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
82 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
83 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
84 *
85 * $FreeBSD: src/usr.sbin/ppp/pap.c,v 1.42.2.1 2000/08/19 09:30:05 brian Exp $
86 *
87 * TODO:
88 */
89
90#include <string.h>
91
92#include <s_services.h>
93#include <t_services.h>
94
95#include <tinet_defs.h>
96#include <tinet_config.h>
97
98#include <net/if.h>
99#include <net/if_ppp.h>
100#include <net/net.h>
101#include <net/net_buf.h>
102#include <net/net_timer.h>
103#include <net/net_count.h>
104#include <net/ppp.h>
105#include <net/ppp_var.h>
106#include <net/ppp_hdlc.h>
107#include <net/ppp_auth.h>
108#include <net/ppp_fsm.h>
109#include <net/ppp_lcp.h>
110#include <net/ppp_upap.h>
111
112#ifdef SUPPORT_PPP
113
114/*
115 * 関数
116 */
117
118static void upap_init (void);
119static void upap_input (T_NET_BUF *input);
120static void upap_protrej (void);
121static void upap_lowerup (void);
122static void upap_lowerdown (void);
123static bool_t compare (uint8_t *rstr, uint8_t *lstr, uint8_t rlen);
124
125#ifdef AUTH_CFG_CLIENT
126
127static void upap_sauthreq (void);
128static void upap_rauthack (void);
129static void upap_rauthnak (void);
130
131#if defined(DEF_PAP_TIMEOUT)
132
133static void upap_timeout(void *arg);
134
135#endif /* of #if defined(DEF_PAP_TIMEOUT) */
136
137#endif /* of #ifdef AUTH_CFG_CLIENT */
138
139#ifdef AUTH_CFG_SERVER
140
141static void upap_rauthreq (T_NET_BUF *input);
142static void upap_sresp (uint8_t code, uint8_t id);
143
144#if defined(DEF_PAP_REQTIME)
145
146static void upap_reqtimeout(void *arg);
147
148#endif /* of #if defined(DEF_PAP_REQTIME) */
149
150#endif /* of #ifdef AUTH_CFG_SERVER */
151
152/*
153 * å…
154¨åŸŸå¤‰æ•°
155 */
156
157T_PPP_PROTENT pap_protent = {
158 PPP_PAP,
159 upap_init, /* 初期化 */
160 upap_input, /* å…
161¥åŠ› */
162 upap_protrej, /* Proto-REJ 受信処理 */
163 upap_lowerup, /* 下位層を起動する */
164 upap_lowerdown, /* 下位層を停止する */
165 NULL, /* オープンする */
166 NULL, /* クローズする */
167 NULL, /* データå…
168¥åŠ› */
169 };
170
171/*
172 * 変数
173 */
174
175#ifdef AUTH_CFG_CLIENT
176
177static uint8_t client_state;
178static uint8_t client_cp_id;
179
180#if defined(DEF_PAP_TIMEOUT)
181
182static uint8_t client_rexmt = 0;
183
184#endif /* of #if defined(DEF_PAP_TIMEOUT) */
185
186#endif /* of #ifdef AUTH_CFG_CLIENT */
187
188#ifdef AUTH_CFG_SERVER
189
190static uint8_t server_state;
191
192#endif /* of #ifdef AUTH_CFG_SERVER */
193
194/*
195 * upap_init -- UPAP モジュールの初期化
196 */
197
198static void
199upap_init (void)
200{
201#ifdef AUTH_CFG_CLIENT
202
203 client_cp_id = 0;
204 client_state = PAP_CS_INIT;
205
206#endif /* of #ifdef AUTH_CFG_CLIENT */
207
208#ifdef AUTH_CFG_SERVER
209
210 server_state = PAP_SS_INIT;
211
212#endif /* of #ifdef AUTH_CFG_SERVER */
213 }
214
215/*
216 * upap_input -- UPAP å…
217¥åŠ›
218 */
219
220static void
221upap_input (T_NET_BUF *input)
222{
223 T_PPP_CP_HDR *hdr;
224
225 NET_COUNT_PPP_PAP(net_count_ppp_upap_in_octets, input->len);
226 NET_COUNT_PPP_PAP(net_count_ppp_upap_in_packets, 1);
227
228 /* PPP リンク制御 (CP) ヘッダより短ければエラー */
229 if (input->len < (sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR))) {
230 syslog(LOG_WARNING, "[PPP/PAP] short hdr: %d.", input->len);
231 return;
232 }
233
234 hdr = GET_PPP_CP_HDR(input);
235
236 /* ヘッダの長さとå…
237¥åŠ›ãƒ‡ãƒ¼ã‚¿ã‚µã‚¤ã‚ºãŒä¸€è‡´ã—なければエラー */
238 if (hdr->len != input->len - sizeof(T_PPP_HDR)) {
239 syslog(LOG_WARNING, "[PPP/PAP] bad len: %d.", hdr->len);
240 return;
241 }
242
243 /*
244 * 制御コードにより適当な関数を呼出す
245 */
246
247 switch (hdr->code) {
248
249#ifdef AUTH_CFG_CLIENT
250
251 case PAP_AUTHACK:
252 upap_rauthack();
253 break;
254
255 case PAP_AUTHNAK:
256 upap_rauthnak();
257 break;
258
259#endif /* of #ifdef AUTH_CFG_CLIENT */
260
261#ifdef AUTH_CFG_SERVER
262
263 case PAP_AUTHREQ:
264 upap_rauthreq(input);
265 break;
266
267#endif /* of #ifdef AUTH_CFG_SERVER */
268
269 }
270 }
271
272/*
273 * upap_protrej -- Proto-REJ を受信したときの処理
274 */
275
276static void
277upap_protrej (void)
278{
279#ifdef AUTH_CFG_CLIENT
280
281 if (client_state == PAP_CS_AUTHREQ)
282 syslog(LOG_WARNING, "[PPP/PAP] proto-rej recved.");
283
284#endif /* of #ifdef AUTH_CFG_CLIENT */
285
286#ifdef AUTH_CFG_SERVER
287
288 if (server_state == PAP_SS_LISTEN) {
289 syslog(LOG_WARNING, "[PPP/PAP] proto-rej recved.");
290 lcp_close();
291 }
292
293#endif /* of #ifdef AUTH_CFG_SERVER */
294
295 upap_lowerdown();
296 }
297
298/*
299 * upap_lowerup -- UPAP 下位層を起動する。
300 */
301
302static void
303upap_lowerup (void)
304{
305#ifdef AUTH_CFG_CLIENT
306
307 if (client_state == PAP_CS_INIT)
308 client_state = PAP_CS_CLOSED;
309 else if (client_state == PAP_CS_PENDING)
310 upap_sauthreq();
311
312#endif /* of #ifdef AUTH_CFG_CLIENT */
313
314#ifdef AUTH_CFG_SERVER
315
316 if (server_state == PAP_SS_INIT)
317 server_state = PAP_SS_CLOSED;
318 else if (server_state == PAP_SS_PENDING) {
319 server_state = PAP_SS_LISTEN;
320
321#if defined(DEF_PAP_REQTIME)
322
323 timeout((FP)upap_reqtimeout, NULL, DEF_PAP_REQTIME);
324
325#endif /* of #if defined(DEF_PAP_REQTIME) */
326
327 }
328
329#endif /* of #ifdef AUTH_CFG_SERVER */
330 }
331
332/*
333 * upap_lowerdown -- UPAP 下位層を停止する。
334 */
335
336static void
337upap_lowerdown (void)
338{
339#ifdef AUTH_CFG_CLIENT
340
341#if defined(DEF_PAP_TIMEOUT)
342
343 if (client_state == PAP_CS_AUTHREQ)
344 untimeout((FP)upap_timeout, NULL);
345
346#endif /* of #if defined(DEF_PAP_TIMEOUT) */
347
348 client_state = PAP_CS_INIT;
349
350#endif /* of #ifdef AUTH_CFG_CLIENT */
351
352#ifdef AUTH_CFG_SERVER
353
354#if defined(DEF_PAP_REQTIME)
355
356 if (server_state == PAP_SS_LISTEN)
357 untimeout((FP)upap_reqtimeout, NULL);
358
359#endif /* of #if defined(DEF_PAP_REQTIME) */
360
361 server_state = PAP_SS_INIT;
362
363#endif /* of #ifdef AUTH_CFG_SERVER */
364 }
365#ifdef AUTH_CFG_CLIENT
366
367/*
368 * クライアントモードで PAP 認証を開始する。
369 */
370
371void
372upap_auth_client (void)
373{
374#if defined(DEF_PAP_TIMEOUT)
375
376 client_rexmt = 0;
377
378#endif /* of #if defined(DEF_PAP_TIMEOUT) */
379
380 if (client_state == PAP_CS_INIT || client_state == PAP_CS_PENDING) {
381 client_state = PAP_CS_PENDING;
382 return;
383 }
384
385 upap_sauthreq();
386 }
387
388/*
389 * upap_rauthack -- 認証 ACK 処理
390 */
391
392static void
393upap_rauthack (void)
394{
395 if (client_state == PAP_CS_AUTHREQ) {
396 client_state = PAP_CS_OPEN;
397 network_phase();
398 }
399 }
400
401/*
402 * upap_rauthnak -- 認証 NAK 処理
403 */
404
405static void
406upap_rauthnak (void)
407{
408 syslog(LOG_WARNING, "[PPP/PAP] auth-req NAKed.");
409 client_state = PAP_CS_BADAUTH;
410 }
411
412/*
413 * upap_sauthreq -- 認証要求処理
414 */
415
416static void
417upap_sauthreq (void)
418{
419 T_NET_BUF *output;
420 uint8_t *data;
421
422 syscall(get_net_buf(&output, sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR)
423 + sizeof(AUTH_REMOTE_USER) + sizeof(AUTH_REMOTE_PASSWD)));
424
425 data = output->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
426
427 /* ユーザ名を設定する。*/
428 *data = sizeof(AUTH_REMOTE_USER) - 1;
429 strcpy(data + 1, AUTH_REMOTE_USER);
430
431 /* パスワードを設定する。*/
432 *(data + sizeof(AUTH_REMOTE_USER)) = sizeof(AUTH_REMOTE_PASSWD) - 1;
433 strcpy(data + sizeof(AUTH_REMOTE_USER) + 1, AUTH_REMOTE_PASSWD);
434
435 /* 送信する */
436 IF_SET_PROTO(output, PPP_PAP);
437 ppp_cp_output(PAP_AUTHREQ, ++ client_cp_id, output);
438
439#if defined(DEF_PAP_TIMEOUT)
440
441 timeout((FP)upap_timeout, NULL, DEF_PAP_TIMEOUT);
442 client_rexmt ++;
443
444#endif /* of #if defined(DEF_PAP_TIMEOUT) */
445
446 client_state = PAP_CS_AUTHREQ;
447 }
448
449#if defined(DEF_PAP_TIMEOUT)
450
451/*
452 * upap_timeout -- タイムアウト処理
453 */
454
455static void
456upap_timeout (void *arg)
457{
458 if (client_state != PAP_CS_AUTHREQ)
459 return;
460
461 if (client_rexmt >= MAX_PAP_REXMT) {
462 syslog(LOG_WARNING, "[PPP/PAP] no reply auth-req.");
463 client_state = PAP_CS_BADAUTH;
464 return;
465 }
466
467 upap_sauthreq();
468 }
469
470#endif /* of #if defined(DEF_PAP_TIMEOUT) */
471
472#endif /* of #ifdef AUTH_CFG_CLIENT */
473
474#ifdef AUTH_CFG_SERVER
475
476/*
477 * サーバモードで PAP 認証を開始する。
478 */
479
480void
481upap_auth_server (void)
482{
483 if (server_state == PAP_SS_INIT || server_state == PAP_SS_PENDING) {
484 server_state = PAP_SS_PENDING;
485 return;
486 }
487
488 server_state = PAP_SS_LISTEN;
489
490#if defined(DEF_PAP_REQTIME)
491
492 timeout((FP)upap_reqtimeout, NULL, DEF_PAP_REQTIME);
493
494#endif /* of #if defined(DEF_PAP_REQTIME) */
495 }
496
497/*
498 * upap_rauthreq -- 認証要求応答処理
499 */
500
501static void
502upap_rauthreq (T_NET_BUF *input)
503{
504 int16_t cplen;
505 uint8_t *data, *user, ulen, plen, code, id;
506
507 if (server_state < PAP_SS_LISTEN)
508 return;
509
510 /*
511 * 再要求があったときの処理
512 */
513 id = GET_PPP_CP_HDR(input)->id;
514 if (server_state == PAP_SS_OPEN) {
515 upap_sresp(PAP_AUTHACK, id);
516 return;
517 }
518
519 if (server_state == PAP_SS_BADAUTH) {
520 upap_sresp(PAP_AUTHNAK, id);
521 return;
522 }
523
524 cplen = GET_PPP_CP_HDR(input)->len;
525 data = input->buf + sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR);
526
527 /*
528 * ユーザ名を特定する。
529 */
530 ulen = *data;
531 if (cplen < sizeof(T_PPP_CP_HDR) + ulen + sizeof(uint8_t)) {
532 syslog(LOG_WARNING, "[PPP/PAP] bad req len: %d.", cplen);
533 return;
534 }
535 user = ++ data;
536 data += ulen;
537
538 /*
539 * パスワードを特定する。
540 */
541 plen = *data;
542 if (cplen < sizeof(T_PPP_CP_HDR) + ulen + plen + sizeof(uint8_t) * 2) {
543 syslog(LOG_WARNING, "[PPP/PAP] bad req len: %d.", cplen);
544 return;
545 }
546
547 /*
548 * ユーザ名とパスワードをチェックする。
549 */
550 if (compare(user, AUTH_LOCAL_USER, ulen) &&
551 compare(data + 1, AUTH_LOCAL_PASSWD, plen))
552 code = PAP_AUTHACK;
553 else
554 code = PAP_AUTHNAK;
555
556 upap_sresp(code, id);
557
558 if (code == PAP_AUTHACK) {
559 network_phase();
560 server_state = PAP_SS_OPEN;
561 }
562 else {
563 lcp_close();
564 server_state = PAP_SS_BADAUTH;
565 }
566
567#if defined(DEF_PAP_REQTIME)
568
569 untimeout((FP)upap_reqtimeout, NULL);
570
571#endif /* of #if defined(DEF_PAP_REQTIME) */
572 }
573
574/*
575 * upap_sresp -- 応答を返す。
576 */
577
578static void
579upap_sresp (uint8_t code, uint8_t id)
580{
581 T_NET_BUF *output;
582
583 /* 送信する */
584 syscall(get_net_buf(&output, sizeof(T_PPP_HDR) + sizeof(T_PPP_CP_HDR)));
585 IF_SET_PROTO(output, PPP_PAP);
586 ppp_cp_output(code, id, output);
587 }
588
589/*
590 * compare -- ユーザ名とパスワードの比較
591 */
592
593static bool_t
594compare (uint8_t *rstr, uint8_t *lstr, uint8_t rlen)
595{
596 while (rlen -- > 0) {
597 if (*rstr != *lstr)
598 return false;
599 rstr ++;
600 lstr ++;
601 }
602 return *lstr ? false : true;
603 }
604
605#if defined(DEF_PAP_REQTIME)
606
607/*
608 * upap_reqtimeout -- 要求タイムアウト処理
609 */
610
611static void
612upap_reqtimeout (void *arg)
613{
614 if (server_state == PAP_SS_LISTEN) {
615 lcp_close();
616 server_state = PAP_SS_BADAUTH;
617 }
618 }
619
620#endif /* of #if defined(DEF_PAP_REQTIME) */
621
622#endif /* of #ifdef AUTH_CFG_SERVER */
623
624#endif /* fo #ifdef SUPPORT_PPP */
Note: See TracBrowser for help on using the repository browser.