Browse Source

core/crypto/md2: Remove, badly broken

Yawning Angel 1 year ago
parent
commit
97b066f112

+ 0 - 1
core/crypto/README.md

@@ -11,7 +11,6 @@ Please see the chart below for the options.
 | [BLAKE2B](https://datatracker.ietf.org/doc/html/rfc7693)                                                     | ✔️ |
 | [BLAKE2B](https://datatracker.ietf.org/doc/html/rfc7693)                                                     | ✔️ |
 | [BLAKE2S](https://datatracker.ietf.org/doc/html/rfc7693)                                                     | ✔️ |
 | [BLAKE2S](https://datatracker.ietf.org/doc/html/rfc7693)                                                     | ✔️ |
 | [Keccak](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf)                                           | ✔️ |
 | [Keccak](https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf)                                           | ✔️ |
-| [MD2](https://datatracker.ietf.org/doc/html/rfc1319)                                                         | ✔️ |
 | [MD4](https://datatracker.ietf.org/doc/html/rfc1320)                                                         | ✔️ |
 | [MD4](https://datatracker.ietf.org/doc/html/rfc1320)                                                         | ✔️ |
 | [MD5](https://datatracker.ietf.org/doc/html/rfc1321)                                                         | ✔️ |
 | [MD5](https://datatracker.ietf.org/doc/html/rfc1321)                                                         | ✔️ |
 | [RIPEMD](https://homes.esat.kuleuven.be/~bosselae/ripemd160.html)                                            | ✔️ |
 | [RIPEMD](https://homes.esat.kuleuven.be/~bosselae/ripemd160.html)                                            | ✔️ |

+ 0 - 182
core/crypto/md2/md2.odin

@@ -1,182 +0,0 @@
-package md2
-
-/*
-    Copyright 2021 zhibog
-    Made available under the BSD-3 license.
-
-    List of contributors:
-        zhibog, dotbmp:  Initial implementation.
-
-    Implementation of the MD2 hashing algorithm, as defined in RFC 1319 <https://datatracker.ietf.org/doc/html/rfc1319>
-*/
-
-import "core:os"
-import "core:io"
-
-/*
-    High level API
-*/
-
-DIGEST_SIZE :: 16
-
-// hash_string will hash the given input and return the
-// computed hash
-hash_string :: proc(data: string) -> [DIGEST_SIZE]byte {
-    return hash_bytes(transmute([]byte)(data))
-}
-
-// hash_bytes will hash the given input and return the
-// computed hash
-hash_bytes :: proc(data: []byte) -> [DIGEST_SIZE]byte {
-	hash: [DIGEST_SIZE]byte
-	ctx: Md2_Context
-    // init(&ctx) No-op
-    update(&ctx, data)
-    final(&ctx, hash[:])
-    return hash
-}
-
-// hash_string_to_buffer will hash the given input and assign the
-// computed hash to the second parameter.
-// It requires that the destination buffer is at least as big as the digest size
-hash_string_to_buffer :: proc(data: string, hash: []byte) {
-	hash_bytes_to_buffer(transmute([]byte)(data), hash)
-}
-
-// hash_bytes_to_buffer will hash the given input and write the
-// computed hash into the second parameter.
-// It requires that the destination buffer is at least as big as the digest size
-hash_bytes_to_buffer :: proc(data, hash: []byte) {
-	assert(len(hash) >= DIGEST_SIZE, "Size of destination buffer is smaller than the digest size")
-    ctx: Md2_Context
-    // init(&ctx) No-op
-    update(&ctx, data)
-    final(&ctx, hash)
-}
-
-// hash_stream will read the stream in chunks and compute a
-// hash from its contents
-hash_stream :: proc(s: io.Stream) -> ([DIGEST_SIZE]byte, bool) {
-	hash: [DIGEST_SIZE]byte
-	ctx: Md2_Context
-	// init(&ctx) No-op
-	buf := make([]byte, 512)
-	defer delete(buf)
-	read := 1
-	for read > 0 {
-        read, _ = io.read(s, buf)
-	    if read > 0 {
-			update(&ctx, buf[:read])
-	    } 
-	}
-	final(&ctx, hash[:])
-	return hash, true
-}
-
-// hash_file will read the file provided by the given handle
-// and compute a hash
-hash_file :: proc(hd: os.Handle, load_at_once := false) -> ([DIGEST_SIZE]byte, bool) {
-	if !load_at_once {
-        return hash_stream(os.stream_from_handle(hd))
-    } else {
-        if buf, ok := os.read_entire_file(hd); ok {
-            return hash_bytes(buf[:]), ok
-        }
-    }
-    return [DIGEST_SIZE]byte{}, false
-}
-
-hash :: proc {
-    hash_stream,
-    hash_file,
-    hash_bytes,
-    hash_string,
-    hash_bytes_to_buffer,
-    hash_string_to_buffer,
-}
-
-/*
-    Low level API
-*/
-
-@(warning="Init is a no-op for MD2")
-init :: proc(ctx: ^Md2_Context) {
-	// No action needed here
-}
-
-update :: proc(ctx: ^Md2_Context, data: []byte) {
-	for i := 0; i < len(data); i += 1 {
-		ctx.data[ctx.datalen] = data[i]
-		ctx.datalen += 1
-		if (ctx.datalen == DIGEST_SIZE) {
-			transform(ctx, ctx.data[:])
-			ctx.datalen = 0
-		}
-	}
-}
-
-final :: proc(ctx: ^Md2_Context, hash: []byte) {
-	to_pad := byte(DIGEST_SIZE - ctx.datalen)
-    for ctx.datalen < DIGEST_SIZE {
-        ctx.data[ctx.datalen] = to_pad
-		ctx.datalen += 1
-    }
-	transform(ctx, ctx.data[:])
-	transform(ctx, ctx.checksum[:])
-    for i := 0; i < DIGEST_SIZE; i += 1 {
-        hash[i] = ctx.state[i]
-    }
-}
-
-/*
-    MD2 implementation
-*/
-
-Md2_Context :: struct {
-    data:     [DIGEST_SIZE]byte,
-    state:    [DIGEST_SIZE * 3]byte,
-    checksum: [DIGEST_SIZE]byte,
-    datalen:  int,
-}
-
-PI_TABLE := [?]byte {
-	41,  46,  67,  201, 162, 216, 124, 1,   61,  54,  84,  161, 236, 240, 6,
-	19,  98,  167, 5,   243, 192, 199, 115, 140, 152, 147, 43,  217, 188, 76,
-	130, 202, 30,  155, 87,  60,  253, 212, 224, 22,  103, 66,  111, 24,  138, 
-	23,  229, 18,  190, 78,  196, 214, 218, 158, 222, 73,  160, 251, 245, 142,
-	187, 47,  238, 122, 169, 104, 121, 145, 21,  178, 7,   63,  148, 194, 16,
-	137, 11,  34,  95,  33,  128, 127, 93,  154, 90,  144, 50,  39,  53,  62, 
-	204, 231, 191, 247, 151, 3,   255, 25,  48,  179, 72,  165, 181, 209, 215,
-	94,  146, 42,  172, 86,  170, 198, 79,  184, 56,  210, 150, 164, 125, 182,
-	118, 252, 107, 226, 156, 116, 4,   241, 69,  157, 112, 89,  100, 113, 135,
-	32,  134, 91,  207, 101, 230, 45,  168, 2,   27,  96,  37,  173, 174, 176,
-	185, 246, 28,  70,  97,  105, 52,  64,  126, 15,  85,  71,  163, 35,  221,
-	81,  175, 58,  195, 92,  249, 206, 186, 197, 234, 38,  44,  83,  13,  110,
-	133, 40,  132, 9,   211, 223, 205, 244, 65,  129, 77,  82,  106, 220, 55,
-	200, 108, 193, 171, 250, 36,  225, 123, 8,   12,  189, 177, 74,  120, 136,
-	149, 139, 227, 99,  232, 109, 233, 203, 213, 254, 59,  0,   29,  57,  242,
-	239, 183, 14,  102, 88,  208, 228, 166, 119, 114, 248, 235, 117, 75,  10,
-	49,  68,  80,  180, 143, 237, 31,  26,  219, 153, 141, 51,  159, 17,  131,
-	20,
-}
-
-transform :: proc(ctx: ^Md2_Context, data: []byte) {
-    j,k,t: byte
-	for j = 0; j < DIGEST_SIZE; j += 1 {
-		ctx.state[j + DIGEST_SIZE] = data[j]
-		ctx.state[j + DIGEST_SIZE * 2] = (ctx.state[j + DIGEST_SIZE] ~ ctx.state[j])
-	}
-	t = 0
-	for j = 0; j < DIGEST_SIZE + 2; j += 1 {
-		for k = 0; k < DIGEST_SIZE * 3; k += 1 {
-			ctx.state[k] ~= PI_TABLE[t]
-			t = ctx.state[k]
-		}
-		t = (t + j) & 0xff
-	}
-	t = ctx.checksum[DIGEST_SIZE - 1]
-	for j = 0; j < DIGEST_SIZE; j += 1 {
-		ctx.checksum[j] ~= PI_TABLE[data[j] ~ t]
-		t = ctx.checksum[j]
-	}
-}

+ 0 - 2
examples/all/all_main.odin

@@ -28,7 +28,6 @@ import blake2s          "core:crypto/blake2s"
 import chacha20         "core:crypto/chacha20"
 import chacha20         "core:crypto/chacha20"
 import chacha20poly1305 "core:crypto/chacha20poly1305"
 import chacha20poly1305 "core:crypto/chacha20poly1305"
 import keccak           "core:crypto/keccak"
 import keccak           "core:crypto/keccak"
-import md2              "core:crypto/md2"
 import md4              "core:crypto/md4"
 import md4              "core:crypto/md4"
 import md5              "core:crypto/md5"
 import md5              "core:crypto/md5"
 import poly1305         "core:crypto/poly1305"
 import poly1305         "core:crypto/poly1305"
@@ -150,7 +149,6 @@ _ :: blake2s
 _ :: chacha20
 _ :: chacha20
 _ :: chacha20poly1305
 _ :: chacha20poly1305
 _ :: keccak
 _ :: keccak
-_ :: md2
 _ :: md4
 _ :: md4
 _ :: md5
 _ :: md5
 _ :: poly1305
 _ :: poly1305

+ 0 - 21
tests/core/crypto/test_core_crypto.odin

@@ -16,7 +16,6 @@ import "core:testing"
 import "core:fmt"
 import "core:fmt"
 import "core:strings"
 import "core:strings"
 
 
-import "core:crypto/md2"
 import "core:crypto/md4"
 import "core:crypto/md4"
 import "core:crypto/md5"
 import "core:crypto/md5"
 import "core:crypto/sha1"
 import "core:crypto/sha1"
@@ -58,7 +57,6 @@ when ODIN_TEST {
 
 
 main :: proc() {
 main :: proc() {
 	t := testing.T{}
 	t := testing.T{}
-	test_md2(&t)
 	test_md4(&t)
 	test_md4(&t)
 	test_md5(&t)
 	test_md5(&t)
 	test_sha1(&t)
 	test_sha1(&t)
@@ -125,25 +123,6 @@ hex_string :: proc(bytes: []byte, allocator := context.temp_allocator) -> string
 	return string(buf)
 	return string(buf)
 }
 }
 
 
-@(test)
-test_md2 :: proc(t: ^testing.T) {
-	// Official test vectors from https://datatracker.ietf.org/doc/html/rfc1319
-	test_vectors := [?]TestHash {
-		TestHash{"8350e5a3e24c153df2275c9f80692773", ""},
-		TestHash{"32ec01ec4a6dac72c0ab96fb34c0b5d1", "a"},
-		TestHash{"da853b0d3f88d99b30283a69e6ded6bb", "abc"},
-		TestHash{"ab4f496bfb2a530b219ff33031fe06b0", "message digest"},
-		TestHash{"4e8ddff3650292ab5a4108c3aa47940b", "abcdefghijklmnopqrstuvwxyz"},
-		TestHash{"da33def2a42df13975352846c30338cd", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"},
-		TestHash{"d5976f79d83d3a0dc9806c3c66f3efd8", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"},
-	}
-	for v, _ in test_vectors {
-		computed     := md2.hash(v.str)
-		computed_str := hex_string(computed[:])
-		expect(t, computed_str == v.hash, fmt.tprintf("Expected: %s for input of %s, but got %s instead", v.hash, v.str, computed_str))
-	}
-}
-
 @(test)
 @(test)
 test_md4 :: proc(t: ^testing.T) {
 test_md4 :: proc(t: ^testing.T) {
 	// Official test vectors from https://datatracker.ietf.org/doc/html/rfc1320
 	// Official test vectors from https://datatracker.ietf.org/doc/html/rfc1320