diff options
Diffstat (limited to 'proto')
-rw-r--r-- | proto/ospf/config.Y | 3 | ||||
-rw-r--r-- | proto/ospf/packet.c | 25 |
2 files changed, 18 insertions, 10 deletions
diff --git a/proto/ospf/config.Y b/proto/ospf/config.Y index c595175..87a97bc 100644 --- a/proto/ospf/config.Y +++ b/proto/ospf/config.Y @@ -1,7 +1,7 @@ /* * BIRD -- OSPF Configuration * - * (c) 1999 - 2000 Ondrej Filip <feela@network.cz> + * (c) 1999--2004 Ondrej Filip <feela@network.cz> * * Can be freely distributed and used under the terms of the GNU GPL. */ @@ -98,6 +98,7 @@ ospf_vlink_item: | DEAD COUNT expr { OSPF_PATT->deadc = $3 ; if ($3<=1) cf_error("Dead count must be greater than one"); } | AUTHENTICATION NONE { OSPF_PATT->autype = OSPF_AUTH_NONE ; } | AUTHENTICATION SIMPLE { OSPF_PATT->autype = OSPF_AUTH_SIMPLE ; } + | AUTHENTICATION CRYPTOGRAPHIC { OSPF_PATT->autype = OSPF_AUTH_CRYPT ; } | password_list {OSPF_PATT->passwords = $1; } ; diff --git a/proto/ospf/packet.c b/proto/ospf/packet.c index 888fa66..9d5a924 100644 --- a/proto/ospf/packet.c +++ b/proto/ospf/packet.c @@ -48,15 +48,20 @@ ospf_pkt_finalize(struct ospf_iface *ifa, struct ospf_packet *pkt) char password[OSPF_AUTH_CRYPT_SIZE]; pkt->autype = htons(ifa->autype); - bzero(&pkt->u, sizeof(union ospf_auth)); switch(ifa->autype) { case OSPF_AUTH_SIMPLE: - password_cpy(pkt->u.password, passwd->password, 8); + bzero(&pkt->u, sizeof(union ospf_auth)); + if (!passwd) + { + log( L_ERR "No suitable password found for authentication" ); + return; + } + password_cpy(pkt->u.password, passwd->password, sizeof(union ospf_auth)); case OSPF_AUTH_NONE: - pkt->checksum = ipsum_calculate(pkt, sizeof(struct ospf_packet) - 8, - (pkt + 1), + pkt->checksum = ipsum_calculate(pkt, sizeof(struct ospf_packet) - + sizeof(union ospf_auth), (pkt + 1), ntohs(pkt->length) - sizeof(struct ospf_packet), NULL); break; @@ -127,15 +132,17 @@ ospf_pkt_checkauth(struct ospf_neighbor *n, struct ospf_iface *ifa, struct ospf_ OSPF_TRACE(D_PACKETS, "OSPF_auth: no password found"); return 0; } + password_cpy(password, pass->password, sizeof(union ospf_auth)); - if (memcmp(pkt->u.password,pass, 8)) + if (memcmp(pkt->u.password, password, sizeof(union ospf_auth))) { - OSPF_TRACE(D_PACKETS, "OSPF_auth: different passwords"); + char ppass[sizeof(union ospf_auth) + 1]; + bzero(ppass, (sizeof(union ospf_auth) + 1)); + memcpy(ppass, pkt->u.password, sizeof(union ospf_auth)); + OSPF_TRACE(D_PACKETS, "OSPF_auth: different passwords (%s)", ppass); return 0; } - - else - return 1; + return 1; break; case OSPF_AUTH_CRYPT: if (pkt->u.md5.len != OSPF_AUTH_CRYPT_SIZE) |