]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Modified rip to new password handling in nest. Now it at least compiles.
authorPavel Machek <pavel@ucw.cz>
Mon, 31 May 1999 17:12:38 +0000 (17:12 +0000)
committerPavel Machek <pavel@ucw.cz>
Mon, 31 May 1999 17:12:38 +0000 (17:12 +0000)
proto/rip/auth.c
proto/rip/rip.h

index bffade30733a1ac59fb4522a2492f442e85a2f2e..24774480528e2d653d926e9c4faf91f49d50a4a6 100644 (file)
 #define P ((struct rip_proto *) p)
 #define P_CF ((struct rip_proto_config *)p->cf)
 
+/* 1 == failed, 0 == ok */
 int
-rip_incoming_authentication( struct proto *p, struct rip_block *block, struct rip_packet *packet, int num )
+rip_incoming_authentication( struct proto *p, struct rip_block_auth *block, struct rip_packet *packet, int num )
 {
   DBG( "Incoming authentication: " );
 
-  switch (block->tag) {        /* Authentication type */
+  switch (block->authtype) {   /* Authentication type */
   case AT_PLAINTEXT:
     DBG( "Plaintext passwd" );
-    if (strncmp( (char *) (&block->network), P_CF->password, 16)) {
+    if (!P_CF->passwords) {
+      log( L_AUTH "no passwords set and password authentication came\n" );
+      return 1;
+    }
+    if (strncmp( (char *) (&block->packetlen), P_CF->passwords->password, 16)) {
       log( L_AUTH, "Passwd authentication failed!\n" );
       return 1;
     }
     return 0;
+  case AT_MD5:
+    DBG( "md5 password" );
+    {
+      struct password_item *head;
+      head = P_CF->passwords;
+      while (head) {
+       if (head->id == block->keyid)
+         /* Perform md5 + compare */;
+       head = head->next;
+      }
+      return 1;
+    }
   }
     
   return 0;
 }
 
 void
-rip_outgoing_authentication( struct proto *p, struct rip_block *block, struct rip_packet *packet, int num )
+rip_outgoing_authentication( struct proto *p, struct rip_block_auth *block, struct rip_packet *packet, int num )
 {
   DBG( "Outgoing authentication: " );
 
-  block->tag = P_CF->authtype;
+  block->authtype = P_CF->authtype;
   switch (P_CF->authtype) {
   case AT_PLAINTEXT:
-    strncpy( (char *) (&block->network), P_CF->password, 16);
+    if (!P_CF->passwords) {
+      log( L_ERR "no passwords set and password authentication requested\n" );
+      return;
+    }
+    strncpy( (char *) (&block->packetlen), P_CF->passwords->password, 16);
     return;
   }
 }
index efad4a6de2821a53f22deff4b55b4ee2bdb97d74..53e1f205272b61fe97c9ee3a81b671a11c8ac712 100644 (file)
@@ -42,6 +42,17 @@ struct rip_block {
   u32 metric;
 };
 
+struct rip_block_auth {
+  u16 mustbeFFFF;
+  u16 authtype;
+  u16 packetlen;
+  u8 keyid;
+  u8 authlen;
+  u32 seq;
+  u32 zero0;
+  u32 zero1;
+};
+
 struct rip_entry {
   struct fib_node n;
 
@@ -97,7 +108,7 @@ struct rip_proto_config {
   int authtype;
 #define AT_NONE 0
 #define AT_PLAINTEXT 2
-#define AT_MD5 1234    /* FIXME: get a real number for this one */
+#define AT_MD5 3
 };
 
 struct rip_proto {
@@ -120,5 +131,5 @@ struct rip_interface *new_iface(struct proto *p, struct iface *new, unsigned lon
 
 /* Authentication functions */
 
-int rip_incoming_authentication( struct proto *p, struct rip_block *block, struct rip_packet *packet, int num );
-void rip_outgoing_authentication( struct proto *p, struct rip_block *block, struct rip_packet *packet, int num );
+int rip_incoming_authentication( struct proto *p, struct rip_block_auth *block, struct rip_packet *packet, int num );
+void rip_outgoing_authentication( struct proto *p, struct rip_block_auth *block, struct rip_packet *packet, int num );