]> gitweb.factorcode.org Git - factor.git/commitdiff
Adding the "internet checksum" (RFC 1071).
authorJohn Benediktsson <mrjbq7@gmail.com>
Fri, 13 Aug 2010 21:32:26 +0000 (14:32 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Fri, 13 Aug 2010 21:32:26 +0000 (14:32 -0700)
basis/checksums/internet/authors.txt [new file with mode: 0644]
basis/checksums/internet/internet-tests.factor [new file with mode: 0644]
basis/checksums/internet/internet.factor [new file with mode: 0644]
basis/checksums/internet/summary.txt [new file with mode: 0644]

diff --git a/basis/checksums/internet/authors.txt b/basis/checksums/internet/authors.txt
new file mode 100644 (file)
index 0000000..e091bb8
--- /dev/null
@@ -0,0 +1 @@
+John Benediktsson
diff --git a/basis/checksums/internet/internet-tests.factor b/basis/checksums/internet/internet-tests.factor
new file mode 100644 (file)
index 0000000..b01ba28
--- /dev/null
@@ -0,0 +1,22 @@
+! Copyright (C) 2010 John Benediktsson
+! See http://factorcode.org/license.txt for BSD license
+
+USING: checksums checksums.internet tools.test ;
+
+IN: checksums
+
+[ B{ 255 255 } ] [ { } internet checksum-bytes ] unit-test
+[ B{ 254 255 } ] [ { 1 } internet checksum-bytes ] unit-test
+[ B{ 254 253 } ] [ { 1 2 } internet checksum-bytes ] unit-test
+[ B{ 251 253 } ] [ { 1 2 3 } internet checksum-bytes ] unit-test
+
+: test-data ( -- bytes )
+    B{
+        HEX: 00 HEX: 01
+        HEX: f2 HEX: 03
+        HEX: f4 HEX: f5
+        HEX: f6 HEX: f7
+    } ;
+
+[ B{ 34 13 } ] [ test-data internet checksum-bytes ] unit-test
+
diff --git a/basis/checksums/internet/internet.factor b/basis/checksums/internet/internet.factor
new file mode 100644 (file)
index 0000000..8c60967
--- /dev/null
@@ -0,0 +1,16 @@
+! Copyright (C) 2010 John Benediktsson
+! See http://factorcode.org/license.txt for BSD license
+
+USING: checksums grouping io.binary kernel math sequences ;
+
+IN: checksums.internet
+
+SINGLETON: internet ! RFC 1071
+
+INSTANCE: internet checksum
+
+M: internet checksum-bytes
+    drop 0 swap 2 <sliced-groups> [ le> + ] each
+    [ -16 shift ] [ HEX: ffff bitand ] bi +
+    [ -16 shift ] keep + bitnot 2 >le ;
+
diff --git a/basis/checksums/internet/summary.txt b/basis/checksums/internet/summary.txt
new file mode 100644 (file)
index 0000000..46ed6e3
--- /dev/null
@@ -0,0 +1 @@
+Internet (RFC 1071) checksum algorithm