From c3045005ef5e3f513b3ddc0e9879b1875037d2cb Mon Sep 17 00:00:00 2001 From: John Benediktsson Date: Fri, 13 Aug 2010 14:32:26 -0700 Subject: [PATCH] Adding the "internet checksum" (RFC 1071). --- basis/checksums/internet/authors.txt | 1 + .../checksums/internet/internet-tests.factor | 22 +++++++++++++++++++ basis/checksums/internet/internet.factor | 16 ++++++++++++++ basis/checksums/internet/summary.txt | 1 + 4 files changed, 40 insertions(+) create mode 100644 basis/checksums/internet/authors.txt create mode 100644 basis/checksums/internet/internet-tests.factor create mode 100644 basis/checksums/internet/internet.factor create mode 100644 basis/checksums/internet/summary.txt diff --git a/basis/checksums/internet/authors.txt b/basis/checksums/internet/authors.txt new file mode 100644 index 0000000000..e091bb8164 --- /dev/null +++ b/basis/checksums/internet/authors.txt @@ -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 index 0000000000..b01ba28001 --- /dev/null +++ b/basis/checksums/internet/internet-tests.factor @@ -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 index 0000000000..8c609674b1 --- /dev/null +++ b/basis/checksums/internet/internet.factor @@ -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 [ 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 index 0000000000..46ed6e3d54 --- /dev/null +++ b/basis/checksums/internet/summary.txt @@ -0,0 +1 @@ +Internet (RFC 1071) checksum algorithm