306 lines
10 KiB
Nim
306 lines
10 KiB
Nim
{.used.}
|
|
|
|
# Nim-Libp2p
|
|
# Copyright (c) 2023 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
# at your option.
|
|
# This file may not be copied, modified, or distributed except according to
|
|
# those terms.
|
|
|
|
import unittest2
|
|
import ../libp2p/multibase
|
|
import stew/results
|
|
|
|
const GoTestVectors = [
|
|
[
|
|
"identity",
|
|
"\x00Decentralize everything!!!",
|
|
"Decentralize everything!!!"
|
|
],
|
|
# [
|
|
# "base16",
|
|
# "f446563656e7472616c697a652065766572797468696e67212121",
|
|
# "Decentralize everything!!!"
|
|
# ],
|
|
# [
|
|
# "base16upper",
|
|
# "F446563656E7472616C697A652065766572797468696E67212121",
|
|
# "Decentralize everything!!!"
|
|
# ],
|
|
[
|
|
"base32",
|
|
"birswgzloorzgc3djpjssazlwmvzhs5dinfxgoijbee",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32upper",
|
|
"BIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJBEE",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32pad",
|
|
"cirswgzloorzgc3djpjssazlwmvzhs5dinfxgoijbee======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32padupper",
|
|
"CIRSWGZLOORZGC3DJPJSSAZLWMVZHS5DINFXGOIJBEE======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hex",
|
|
"v8him6pbeehp62r39f9ii0pbmclp7it38d5n6e89144",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hexupper",
|
|
"V8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E89144",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hexpad",
|
|
"t8him6pbeehp62r39f9ii0pbmclp7it38d5n6e89144======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base32hexpadupper",
|
|
"T8HIM6PBEEHP62R39F9II0PBMCLP7IT38D5N6E89144======",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base58btc",
|
|
"z36UQrhJq9fNDS7DiAHM9YXqDHMPfr4EMArvt",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64",
|
|
"mRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64url",
|
|
"uRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64pad",
|
|
"MRGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE=",
|
|
"Decentralize everything!!!"
|
|
],
|
|
[
|
|
"base64urlpad",
|
|
"URGVjZW50cmFsaXplIGV2ZXJ5dGhpbmchISE=",
|
|
"Decentralize everything!!!"
|
|
],
|
|
]
|
|
|
|
suite "MultiBase test suite":
|
|
test "Zero-length data encoding/decoding test":
|
|
var enc = newString(1)
|
|
var dec = newSeq[byte]()
|
|
var plain = newSeq[byte]()
|
|
var olens: array[21, int]
|
|
check:
|
|
MultiBase.encodedLength("identity", 0) == 1
|
|
MultiBase.decodedLength('\x00', 0) == -1
|
|
MultiBase.decodedLength('\x00', 1) == 0
|
|
check:
|
|
MultiBase.encode("identity", plain).get() == "\x00"
|
|
# MultiBase.encode("base1", plain) == "1"
|
|
# MultiBase.encode("base2", plain) == "0"
|
|
# MultiBase.encode("base8", plain) == "7"
|
|
# MultiBase.encode("base10", plain) == "9"
|
|
# MultiBase.encode("base16", plain) == "f"
|
|
# MultiBase.encode("base16upper", plain) == "F"
|
|
MultiBase.encode("base32hex", plain).get() == "v"
|
|
MultiBase.encode("base32hexupper", plain).get() == "V"
|
|
MultiBase.encode("base32hexpad", plain).get() == "t"
|
|
MultiBase.encode("base32hexpadupper", plain).get() == "T"
|
|
MultiBase.encode("base32", plain).get() == "b"
|
|
MultiBase.encode("base32upper", plain).get() == "B"
|
|
MultiBase.encode("base32pad", plain).get() == "c"
|
|
MultiBase.encode("base32padupper", plain).get() == "C"
|
|
MultiBase.encode("base58btc", plain).get() == "z"
|
|
MultiBase.encode("base58flickr", plain).get() == "Z"
|
|
MultiBase.encode("base64", plain).get() == "m"
|
|
MultiBase.encode("base64pad", plain).get() == "M"
|
|
MultiBase.encode("base64url", plain).get() == "u"
|
|
MultiBase.encode("base64urlpad", plain).get() == "U"
|
|
check:
|
|
len(MultiBase.decode("\x00").get()) == 0
|
|
# len(MultiBase.decode("1")) == 0
|
|
# len(MultiBase.decode("0")) == 0
|
|
# len(MultiBase.decode("7")) == 0
|
|
# len(MultiBase.decode("9")) == 0
|
|
# len(MultiBase.decode("f")) == 0
|
|
# len(MultiBase.decode("F")) == 0
|
|
len(MultiBase.decode("v").get()) == 0
|
|
len(MultiBase.decode("V").get()) == 0
|
|
len(MultiBase.decode("t").get()) == 0
|
|
len(MultiBase.decode("T").get()) == 0
|
|
len(MultiBase.decode("b").get()) == 0
|
|
len(MultiBase.decode("B").get()) == 0
|
|
len(MultiBase.decode("c").get()) == 0
|
|
len(MultiBase.decode("C").get()) == 0
|
|
len(MultiBase.decode("z").get()) == 0
|
|
len(MultiBase.decode("Z").get()) == 0
|
|
len(MultiBase.decode("m").get()) == 0
|
|
len(MultiBase.decode("M").get()) == 0
|
|
len(MultiBase.decode("u").get()) == 0
|
|
len(MultiBase.decode("U").get()) == 0
|
|
check:
|
|
MultiBase.encode("identity", plain, enc,
|
|
olens[0]) == MultiBaseStatus.Success
|
|
enc == "\x00"
|
|
olens[0] == 1
|
|
# MultiBase.encode("base1", plain, enc,
|
|
# olens[1]) == MultiBaseStatus.Success
|
|
# enc == "1"
|
|
# olens[1] == 1
|
|
# MultiBase.encode("base2", plain, enc,
|
|
# olens[2]) == MultiBaseStatus.Success
|
|
# enc == "0"
|
|
# olens[2] == 1
|
|
# MultiBase.encode("base8", plain, enc,
|
|
# olens[3]) == MultiBaseStatus.Success
|
|
# enc == "7"
|
|
# olens[3] == 1
|
|
# MultiBase.encode("base10", plain, enc,
|
|
# olens[4]) == MultiBaseStatus.Success
|
|
# enc == "9"
|
|
# olens[4] == 1
|
|
# MultiBase.encode("base16", plain, enc,
|
|
# olens[5]) == MultiBaseStatus.Success
|
|
# enc == "f"
|
|
# olens[5] == 1
|
|
# MultiBase.encode("base16upper", plain, enc,
|
|
# olens[6]) == MultiBaseStatus.Success
|
|
# enc == "F"
|
|
# olens[6] == 1
|
|
MultiBase.encode("base32hex", plain, enc,
|
|
olens[7]) == MultiBaseStatus.Success
|
|
enc == "v"
|
|
olens[7] == 1
|
|
MultiBase.encode("base32hexupper", plain, enc,
|
|
olens[8]) == MultiBaseStatus.Success
|
|
enc == "V"
|
|
olens[8] == 1
|
|
MultiBase.encode("base32hexpad", plain, enc,
|
|
olens[9]) == MultiBaseStatus.Success
|
|
enc == "t"
|
|
olens[9] == 1
|
|
MultiBase.encode("base32hexpadupper", plain, enc,
|
|
olens[10]) == MultiBaseStatus.Success
|
|
enc == "T"
|
|
olens[10] == 1
|
|
MultiBase.encode("base32", plain, enc,
|
|
olens[11]) == MultiBaseStatus.Success
|
|
enc == "b"
|
|
olens[11] == 1
|
|
MultiBase.encode("base32upper", plain, enc,
|
|
olens[12]) == MultiBaseStatus.Success
|
|
enc == "B"
|
|
olens[12] == 1
|
|
MultiBase.encode("base32pad", plain, enc,
|
|
olens[13]) == MultiBaseStatus.Success
|
|
enc == "c"
|
|
olens[13] == 1
|
|
MultiBase.encode("base32padupper", plain, enc,
|
|
olens[14]) == MultiBaseStatus.Success
|
|
enc == "C"
|
|
olens[14] == 1
|
|
MultiBase.encode("base58btc", plain, enc,
|
|
olens[15]) == MultiBaseStatus.Success
|
|
enc == "z"
|
|
olens[15] == 1
|
|
MultiBase.encode("base58flickr", plain, enc,
|
|
olens[16]) == MultiBaseStatus.Success
|
|
enc == "Z"
|
|
olens[16] == 1
|
|
check:
|
|
MultiBase.decode("", dec, olens[0]) == MultiBaseStatus.Incorrect
|
|
MultiBase.decode("\x00", dec, olens[0]) == MultiBaseStatus.Success
|
|
olens[0] == 0
|
|
# MultiBase.decode("1", dec, olens[1]) == MultiBaseStatus.Success
|
|
# olens[1] == 0
|
|
# MultiBase.decode("0", dec, olens[2]) == MultiBaseStatus.Success
|
|
# olens[2] == 0
|
|
# MultiBase.decode("7", dec, olens[3]) == MultiBaseStatus.Success
|
|
# olens[3] == 0
|
|
# MultiBase.decode("9", dec, olens[4]) == MultiBaseStatus.Success
|
|
# olens[4] == 0
|
|
# MultiBase.decode("f", dec, olens[5]) == MultiBaseStatus.Success
|
|
# olens[5] == 0
|
|
# MultiBase.decode("F", dec, olens[6]) == MultiBaseStatus.Success
|
|
# olens[6] == 0
|
|
MultiBase.decode("v", dec, olens[7]) == MultiBaseStatus.Success
|
|
olens[7] == 0
|
|
MultiBase.decode("V", dec, olens[8]) == MultiBaseStatus.Success
|
|
olens[8] == 0
|
|
MultiBase.decode("t", dec, olens[9]) == MultiBaseStatus.Success
|
|
olens[9] == 0
|
|
MultiBase.decode("T", dec, olens[10]) == MultiBaseStatus.Success
|
|
olens[10] == 0
|
|
MultiBase.decode("b", dec, olens[11]) == MultiBaseStatus.Success
|
|
olens[11] == 0
|
|
MultiBase.decode("B", dec, olens[12]) == MultiBaseStatus.Success
|
|
olens[12] == 0
|
|
MultiBase.decode("c", dec, olens[13]) == MultiBaseStatus.Success
|
|
olens[13] == 0
|
|
MultiBase.decode("C", dec, olens[14]) == MultiBaseStatus.Success
|
|
olens[14] == 0
|
|
MultiBase.decode("z", dec, olens[15]) == MultiBaseStatus.Success
|
|
olens[15] == 0
|
|
MultiBase.decode("Z", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("m", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("M", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("u", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
MultiBase.decode("U", dec, olens[16]) == MultiBaseStatus.Success
|
|
olens[16] == 0
|
|
test "go-multibase test vectors":
|
|
for item in GoTestVectors:
|
|
let encoding = item[0]
|
|
let encoded = item[1]
|
|
var expect = item[2]
|
|
var bexpect = cast[seq[byte]](expect)
|
|
var outlen = 0
|
|
check:
|
|
MultiBase.encode(encoding, bexpect).get() == encoded
|
|
MultiBase.decode(encoded).get() == bexpect
|
|
|
|
let elength = MultiBase.encodedLength(encoding, len(expect))
|
|
var ebuffer = newString(elength)
|
|
outlen = 0
|
|
check:
|
|
MultiBase.encode(encoding, bexpect, ebuffer,
|
|
outlen) == MultiBaseStatus.Success
|
|
ebuffer.setLen(outlen)
|
|
check:
|
|
encoded == ebuffer
|
|
|
|
let dlength = MultiBase.decodedLength(encoded[0], len(encoded))
|
|
var dbuffer = newSeq[byte](dlength)
|
|
outlen = 0
|
|
check:
|
|
MultiBase.decode(encoded, dbuffer, outlen) == MultiBaseStatus.Success
|
|
dbuffer.setLen(outlen)
|
|
check:
|
|
bexpect == dbuffer
|
|
test "Unknown codec test":
|
|
var data = @[0x00'u8, 0x01'u8]
|
|
var ebuffer = newString(100)
|
|
var dbuffer = newSeq[byte](100)
|
|
var outlen = 0
|
|
check:
|
|
MultiBase.encode("unknown", data, ebuffer,
|
|
outlen) == MultiBaseStatus.BadCodec
|
|
MultiBase.decode("\x01\x00", dbuffer, outlen) == MultiBaseStatus.BadCodec
|
|
MultiBase.encode("unknwon", data).isErr()
|
|
MultiBase.decode("\x01\x00").isErr()
|