]> git.hungrycats.org Git - linux/commitdiff
ncpfs: Verify packet signatures on replies.
authorPetr Vandrovec <vandrove@vc.cvut.cz>
Sat, 21 Sep 2002 00:18:08 +0000 (02:18 +0200)
committerPetr Vandrovec <vandrove@vc.cvut.cz>
Sat, 21 Sep 2002 00:18:08 +0000 (02:18 +0200)
fs/ncpfs/ncpsign_kernel.c
fs/ncpfs/ncpsign_kernel.h
fs/ncpfs/sock.c

index e81bbe7deaa9fa986f7796486c493033eda7fb5c..dcac251c14ff54cb7b02f42d812efabb8e384bcb 100644 (file)
@@ -108,5 +108,21 @@ void __sign_packet(struct ncp_server *server, const char *packet, size_t size, _
        memcpy(sign_buff, server->sign_last, 8);
 }
 
+int sign_verify_reply(struct ncp_server *server, const char *packet, size_t size, __u32 totalsize, const void *sign_buff) {
+       unsigned char data[64];
+       unsigned char hash[16];
+
+       memcpy(data, server->sign_root, 8);
+       *(__u32*)(data + 8) = totalsize;
+       if (size < 52) {
+               memcpy(data + 12, packet, size);
+               memset(data + 12 + size, 0, 52 - size);
+       } else {
+               memcpy(data + 12, packet, 52);
+       }
+       nwsign(server->sign_last, data, hash);
+       return memcmp(sign_buff, hash, 8);
+}
+
 #endif /* CONFIG_NCPFS_PACKET_SIGNING */
 
index 45254e5cf263111c0ee387fe8ab40736b10a329a..6451a68381ccffcefbbfccd928a943a19872e8a6 100644 (file)
@@ -12,6 +12,7 @@
 
 #ifdef CONFIG_NCPFS_PACKET_SIGNING
 void __sign_packet(struct ncp_server *server, const char *data, size_t size, __u32 totalsize, void *sign_buff);
+int sign_verify_reply(struct ncp_server *server, const char *data, size_t size, __u32 totalsize, const void *sign_buff);
 #endif
 
 static inline size_t sign_packet(struct ncp_server *server, const char *data, size_t size, __u32 totalsize, void *sign_buff) {
index 92304ec7103bbcfe3fcb5f552754ff54786bc416..5e11e90ed333fe3f29cee0f44d5a3538a4bd2fec 100644 (file)
@@ -391,7 +391,14 @@ static void __ncpdgram_rcv_proc(void *s) {
                                                if (result < 8 + 8) {
                                                        result = -EIO;
                                                } else {
+                                                       unsigned int hdrl;
+                                                       
                                                        result -= 8;
+                                                       hdrl = sock->sk->family == AF_INET ? 8 : 6;
+                                                       if (sign_verify_reply(server, ((char*)req->reply_buf) + hdrl, result - hdrl, cpu_to_le32(result), ((char*)req->reply_buf) + result)) {
+                                                               printk(KERN_INFO "ncpfs: Signature violation\n");
+                                                               result = -EIO;
+                                                       }
                                                }
                                        }
 #endif
@@ -593,6 +600,15 @@ skipdata:;
                                                return -EIO;
                                        }
                                }
+#ifdef CONFIG_NCPFS_PACKET_SIGNING                             
+                               if (server->sign_active && req->tx_type != NCP_DEALLOC_SLOT_REQUEST) {
+                                       if (sign_verify_reply(server, (unsigned char*)(req->reply_buf) + 6, req->datalen - 6, cpu_to_be32(req->datalen + 16), &server->rcv.buf.type)) {
+                                               printk(KERN_ERR "ncpfs: tcp: Signature violation\n");
+                                               __ncp_abort_request(server, req, -EIO);
+                                               return -EIO;
+                                       }
+                               }
+#endif                         
                                ncp_finish_request(req, req->datalen);
                        nextreq:;
                                __ncp_next_request(server);