package cipher_test import ( "bytes" "encoding/hex" "testing" "github.com/emmansun/gmsm/cipher" "github.com/emmansun/gmsm/sm4" ) var xtsTestVectors = []struct { key string sector uint64 plaintext string ciphertext string }{ { // XTS-SM4-128 applied for a data unit of 32 bytes "0000000000000000000000000000000000000000000000000000000000000000", 0, "0000000000000000000000000000000000000000000000000000000000000000", "d9b421f731c894fdc35b77291fe4e3b02a1fb76698d59f0e51376c4ada5bc75d", }, { "1111111111111111111111111111111122222222222222222222222222222222", 0x3333333333, "4444444444444444444444444444444444444444444444444444444444444444", "a74d726c11196a32be04e001ff29d0c7932f9f3ec29bfcb64dd17f63cbd3ea31", }, { "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f022222222222222222222222222222222", 0x3333333333, "4444444444444444444444444444444444444444444444444444444444444444", "7f76088effadf70c02ea9f95da0628d351bfcb9eac0563bcf17b710dab0a9826", }, { // XTS-SM4-128 applied for a data unit of 512 bytes "2718281828459045235360287471352631415926535897932384626433832795", 0, "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", "54dd65b6326faea8fad1a83c63614af39f721d8dfe177a30b66abf6a449980e1cdbe06afb73336f37a4d39de964a30d7d04a3799169c60258f6b748a61861aa5ec92a2c15b2b7c615a42aba499bbd6b71db9c789b2182089a25dd3df800ed1864d19f7ed45fd17a9480b0fb82d9b7fc3ed57e9a1140eaa778dd2dd679e3edc3dc4d55c950ebc531d9592f7c4638256d56518292a20af98fdd3a63600350a70ab5a40f4c285037ca01f251f19ecae0329ff77ad88cd5a4cdea2aeabc22148ffbd239bd10515bde1131dec8404e443dc763140d5f22bf33e0c6872d6b81d630f6f00cdd058fe80f9cbfb77707f93cee2ca92b915b8304027c190a84e2d65e018cc6a387d3766acdb28253284e8db9acf8f52280ddc6d0033d2ccaaa4f9aeff123669bc024fd6768edf8bc1f8d622c19c609ef97f609190cd110241e7fb084ed8942da1f9b9cf1b514b61a388b30ea61a4a745b381ee7ad6c4db1275453b8413f98df6e4a40986ee4b59af5dfaecd301265179067a00d7ca35ab95abd617adea28ec1c26a97de28b8bfe30120d6aefbd258c59e42d161e8065a78106bdca5cd90fb3aac4e93866c8a7f9676860a79145bd92e02e819a90be0b97cc522b32106856fdf0e54d88e4624155a2f1c14eaeaa163f858e99a806e791acd82f1b0e29f0028a4c38e976f571a93f4fd57d787c24db0e01ca304e5a5c4dd50cf8bdbf491e57c", }, { // Vector 5 "2718281828459045235360287471352631415926535897932384626433832795", 1, "27a7479befa1d476489f308cd4cfa6e2a96e4bbe3208ff25287dd3819616e89cc78cf7f5e543445f8333d8fa7f56000005279fa5d8b5e4ad40e736ddb4d35412328063fd2aab53e5ea1e0a9f332500a5df9487d07a5c92cc512c8866c7e860ce93fdf166a24912b422976146ae20ce846bb7dc9ba94a767aaef20c0d61ad02655ea92dc4c4e41a8952c651d33174be51a10c421110e6d81588ede82103a252d8a750e8768defffed9122810aaeb99f9172af82b604dc4b8e51bcb08235a6f4341332e4ca60482a4ba1a03b3e65008fc5da76b70bf1690db4eae29c5f1badd03c5ccf2a55d705ddcd86d449511ceb7ec30bf12b1fa35b913f9f747a8afd1b130e94bff94effd01a91735ca1726acd0b197c4e5b03393697e126826fb6bbde8ecc1e08298516e2c9ed03ff3c1b7860f6de76d4cecd94c8119855ef5297ca67e9f3e7ff72b1e99785ca0a7e7720c5b36dc6d72cac9574c8cbbc2f801e23e56fd344b07f22154beba0f08ce8891e643ed995c94d9a69c9f1b5f499027a78572aeebd74d20cc39881c213ee770b1010e4bea718846977ae119f7a023ab58cca0ad752afe656bb3c17256a9f6e9bf19fdd5a38fc82bbe872c5539edb609ef4f79c203ebb140f2e583cb2ad15b4aa5b655016a8449277dbd477ef2c8d6c017db738b18deb4a427d1923ce3ff262735779a418f20a282df920147beabe421ee5319d0568", "0e36ba273dd121afc77e0d8c00aa4a662b21f363470d333f2fe2ddcbcc51ecd523022f5fa7970062800cd3859cacead369263681543db431f3844a3638e837cf025cecc3b778e14ac1fd02bb684d0e3cc3d05758cf4b3827bae92f9f09a45487e0a830154a4206a14c4077bcc928e6039b78cdf8f915236c5a4efc21a0ba7173232cef6f18f8b53be5e1eb37282bed31a24f322cf1bba02dfd2583ce216a73726915116fd8ce46d58aa562b5a5d88076792d6e35cba40552db6a19776eaf255c3fc927adc41cb83a83884f98176267f37e543ce34fa32960d1d05aa05ff04103037a730175f1d59a32b64f308925fc9fa9c60421b4ab438e14504227cba20c8c06b508554fb02e52b92a1cd0a8e386511bc4c2fb62998d0ac5d9e7614080a10039b8cddf24a644b3e0aa02bb5d6c0897a84bfe0d12690cbd9fb92fd39b5b9504deeeaab0c5b9839b6283b87abe6439d28f0afb0508104fd4db9fd6e0301c6a488e76fd2a4801d2b7df57e0179506e9a8dbd7312be3922ea4e7339227061485452296dabc3b0f178a2e4ba012bbb6e836dec5d25abaa0f399ca622c5f075dfae7b2ffef4e396cd74b9bc3aeb7c212a5fd5c42b73fcf92e1f4ca458bb50e7257c4ffea253f30f7eaf9a6762ce15177f55ba250a4293d6ecdbd2e9a80c942b38dbdbd74773245a7a7db6b91d1f6c74bd32b7a7a193a2d260d266b64dd19b959ae42", }, { // XTS-SM4-128 applied for a data unit that is not a multiple of 16 bytes, but should be a complte byte "c46acc2e7e013cb71cdbf750cf76b000249fbf4fb6cd17607773c23ffa2c4330", 94, "7e9c2289cba460e470222953439cdaa892a5433d4dab2a3f67", "c3cf5445c64aa518f4abce2848faddfb4605d9fb66f1f12c0c", }, { "56ffcc9bbbdf413f0fc0f888f44b7493bb1925a39b8adf02d9009bb16db0a887", 144, "9a839cc14363bafcfc0cc93b14f8e769d35b94cc98267438e3", "af027012c829206c32a31706999d046f10a83bcacbc5c96353", }, { "7454a43b87b1cf0dec95032c22873be3cace3bb795568854c1a008c07c5813f3", 108, "41088fa15195b2733fe824d2c1fdc8306080863945fb2a73cf", "614ee9311a53791889338eb2f66fedff7dc15126349bed1465", }, } func fromHex(s string) []byte { ret, err := hex.DecodeString(s) if err != nil { panic("xts: invalid hex in test") } return ret } func TestXTS(t *testing.T) { for i, test := range xtsTestVectors { key := fromHex(test.key) encrypter, err := cipher.NewXTSEncrypterWithSector(sm4.NewCipher, key[:len(key)/2], key[len(key)/2:], test.sector) if err != nil { t.Errorf("#%d: failed to create encrypter: %s", i, err) continue } decrypter, err := cipher.NewXTSDecrypterWithSector(sm4.NewCipher, key[:len(key)/2], key[len(key)/2:], test.sector) if err != nil { t.Errorf("#%d: failed to create decrypter: %s", i, err) continue } plaintext := fromHex(test.plaintext) ciphertext := make([]byte, len(plaintext)) encrypter.CryptBlocks(ciphertext, plaintext) expectedCiphertext := fromHex(test.ciphertext) if !bytes.Equal(ciphertext, expectedCiphertext) { t.Errorf("#%d: encrypted failed, got: %x, want: %x", i, ciphertext, expectedCiphertext) continue } decrypted := make([]byte, len(ciphertext)) decrypter.CryptBlocks(decrypted, ciphertext) if !bytes.Equal(decrypted, plaintext) { t.Errorf("#%d: decryption failed, got: %x, want: %x", i, decrypted, plaintext) } } } // Test data is from GB/T 17964-2021 B.7 var xtsGBTestVectors = []struct { key string tweak string plaintext string ciphertext string }{ { "2B7E151628AED2A6ABF7158809CF4F3C000102030405060708090A0B0C0D0E0F", "F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF", "6BC1BEE22E409F96E93D7E117393172AAE2D8A571E03AC9C9EB76FAC45AF8E5130C81C46A35CE411E5FBC1191A0A52EFF69F2445DF4F9B17", "E9538251C71D7B80BBE4483FEF497BD12C5C581BD6242FC51E08964FB4F60FDB0BA42F63499279213D318D2C11F6886E903BE7F93A1B3479", }, { "44d5ed13a49771e27533cc8ece9489d757a55435b1871352ec0a08ac1933ae17", "d2aa700ffb6a92b265b6177810bd5980", "c36f981fc08308ff509d99149481edc2", "5da5ce300ef7719ca2d833f7d0662a13", }, { "8583df5ade22061e556877d84a55fe4110fd4e49920b4b5ae6813e63b87df7d3", "0bd7289a5be4b3558dacb96a7ecf36a7", "754b7c9c907cd7ae5b13239e8e03494c513480f5e83ea4c93addb18f316e32b4", "9debcabe66ca3a018197b61eff3381d5cdb0e9452fc959f3693d6218eafc6d30", }, { "2b92fe8bd1bb3da729cc98ad5f2b8a4ce2709a585d0094c5c67c2876f1f028bb", "89d8ac4a045b0e3b9b74ca6f81f13da2", "5b3191257435aa4600a385baf825e15c7fbac6bd7ba98a0ba1d0ffbfc92a71a507c0949ceef4df11bbf0db2d2ec056c2", "148ada33a84e4a4dc4c79ad03e69622d1597fb50ddf1a66b52adae76af0c868d7b29bf1befb5d795dc494c947e5aec52", }, { "be9bdf5cf12600b7412366a15253806cde35bb38e576eb2047eec5b821368cd0", "cbe9e40015df52bdd394603ed11d0cc7", "7695db9a872fa6c315ff47a94b6957d3c5737e5538c3161d5d8f71a70b30c1cac8a8d91cc85dea460aaf36d5e272debc15c6a0c41bc522d826e555be48bf046e", "e5e810c239019cf50135acd60e30f3f10981486cb5f60f220966e54e71f676c6d529d74ee902e16dc0021c009c26a5e143c4ebb7429720e4a1527c3fdec7e058", }, { "dacb6342586202826d4078a20579951f21396c4ed74efda349e557b0bce0c15f", "5e1d5f6eed82c04da8abeee6f416cf88", "6e857aeac5f36165222eed4077df4c74327360cd5050112de5445cf4299e692608754c94a1c8c6cd985513d3df26e5780a6a286baa0679f8af0487297d89e83cdc61571635238145880542e0a0b0cb9d", "9b2adabe119edf424b25ff31c952307408c145d7cd7ae83a8fc7a79c387118fb0be89e9658e1d9a83d7919dd9d195a3621237d3baaef3525a58b56519ac64d1f62144450238c7e3a0edc9e1fcb54bfee", }, { "333acfd23c56069a1fa847b203c7cdcb0a58b24c56bc314a21d4970a9157b389", "945169fe067e7b1086867109d8b7aeab", "522e5cc779fa9e2b6f63cc24f8473199", "23dddf9157de113632cece38f08ac559", }, { "a9393c96678a8c1229c0ef2ad15be58f4e6dc7c98491eb8e03c8cd7e0f63d3c8", "f7f270e9982f98ea035088338efddae8", "4ff591ca8f2344328bd14dc1128639d793bd913d9f0f6bc45e323e3077e61bda", "87f1e44f90a4075c60466628c7815bb786483f1954c54c37ff2bd4f98b2a912b", }, { "9426c54c418d07f100f26016c5cad1cb2f469216d9bda47c6866c9f85521d7f8", "e28a14e9c764a78a1e7354130ddcd7cc", "2d3ed9737dbdf5bffd5742cc02f873fbc1c8d1491dd56f7f3e6d5aaaec2fb445921f6c452eb1c25504036a208ee90a76", "68365d5c967d148a15ee0bbb9ee8638ec650c7a15958dc62f3e4022a1124f70261fbe1e63ce0285c44adae5913d6cba7", }, { "dacb6342586202826d4078a20579951f21396c4ed74efda349e557b0bce0c15f", "5e1d5f6eed82c04da8abeee6f416cf88", "6e857aeac5f36165222eed4077df4c74327360cd5050112de5445cf4299e692608754c94a1c8c6cd985513d3df26e5780a6a286baa0679f8af0487297d89e83cdc61571635238145880542e0a0b0cb9d", "9b2adabe119edf424b25ff31c952307408c145d7cd7ae83a8fc7a79c387118fb0be89e9658e1d9a83d7919dd9d195a3621237d3baaef3525a58b56519ac64d1f62144450238c7e3a0edc9e1fcb54bfee", }, { "ea48a93f24aea80baa23e8a67dcca012a0465da1ac5e7e0ee93ec7b1df9cba0c", "7d9b9bd09442c0247e1460c7527c00fa", "76bc9058ee987a66b2d4241a964a8f68ef3736ee1f7338df6ddf9332edc0b098a305625c0cd137cf9177ba65c4bed39a26bf08435dcf94a504f7090abf162cd3", "563fdbdca43ef880a814ee8a0bd3982626e537841a6553f7f3622cabf3890a6b7e1ba948316fb3b3b85c07be461e77de1efdc82aeea94d2dc17e4f4b2cbcf46f", }, { "8453754ae26dc10d9f916104e179fe21ef55250225d294767cb85f45e355ea29", "00c04c0cc23599e2688db0e21f29e7a0", "28143fd3a0692a616d786c604f0ecb18e211e4842e14a06a45292c87995d01a456d4b77ad2a6570956ba78dc5714c8f8f5176cf75be8f57c2d5a415a6b159ae6c1b333d0e59dab354ee6d190d41bff6b", "622cc9a0fdbd33b9181c2f7da010b293cbe5f984391c749d69cd0d2da738e020c5a1e705e8ce0469ceab96bca14d659be4bc00ae29018a919a3d94d34fe14ec63d63d801384f9ba92f590fff2b1b7935", }, { "6b78efdd766e4860577f60994c22a82c265c5c285487c45ffc59bee4388ba8ed", "d2da470cbfa01095f9973031863002bc", "73eb1e74f32b3059085058dcde1c5d037b20a072f9de27c5d6cc68e6d75a00f005f93706677dbe057d95bddeacad3791f35f20f48318badfee515b3ce87de3d9d8559541ca418b8110e1706752e40cad09fcb44a9b7a1b8d8c61f2859e2ed398", "1db52c865a5ba9eac18ce21e16781f5c571625fd505a726f6d2136e2cef4ac85046b6d9d9d2c344505600cecbb0c52f402c8709e640df765939c783b93d3a5344920d6df581b8a65830eb6438fbc7dffe91344dbe215df0820f355000e4ff8bd", }, { "2107c4d9ac6dc4a5274929ffb4fee356a18b02038186d843cb857a0c30196cbc", "7f08d8067ba0e4e253702a047948c469", "3966a773061ba822b5b6c46e9e6bec26cad2c6d9d272036d041668a3b72873975e2ea659c3127e335e1cff722539f1700a0e486cacfc11ef62c2047fb6a971b04bc07f017e8302a965adc034cb1353292e5ffd27583f1765e35f569f85f2b363f486cd84e38860700209fc5a29cbc888", "892488ad84b4a7a49b0120281c57e772464f52689f3a8c83fcc8025c5e16cc69611bae4820ceb4028b94ef1ea745a15a77a513f8fda65f374af39e1a7d65bf905530d31e1607a972e351146d7767f523e8b8fe17cf0e184500f7164694b76ad1c301dae2b281d7c72806794aac5eeee7", }, { "5ff77a1d5b9014ccdddbc6d88d77d2b4d9294a8fcc38304badc9df2eb2eb7ffd", "504fbb648d2f0c956634e4035f7d3385", "5223813f694cf0ecbab8f20432e6a9a7edbd869b5633c2a37cca1ae39e3ce9a1800ce0e0311ce9891c27b10f587b510b3b1e2bbfd91cdc2fea9409e50eaf85937d28912113f245cb7986e04f40911c1b85151318abb1c07b32cfb1628d31758e188853f7e38557635b6b1cfc71349f38e817f86c664b28dddee10400f509d006", "d17913f3ff7b7f1ffe8a8ae69175910931806a1b092bd5e367914580277a91c28fc6dd8a528d5e93d8fd4152563253635f1bd55a499a3c19edebe7b1267832c3d7ce9be8d51825cec10c71fee07ec2b1ccd0ede6911369da03ff86ccc39048d0f8988db2dc1769041891a2d9b6fd105b3457e24b059c9f9b50e40fdb8168391b", }, { "d1bf307714dba0903d05c2f6b0c940f6c52c8ae41f6d5e9e97cfb1230765ea6f", "ad075974df40dca987931b83e3b250ce", "14d27a0ca66a9bc97ab129d4a67c5e0ec7abf912e45b33136d950015a8bc359249ec916f7c39b555133a2db47be7e31ec719543f2eac0366d3d245f6e51b951094caa25b8bf5266ba8cfa4ce0eba9b2e1a2d95e10ff657d934535ec133ea86b5213c58165e3e839d30d301c7b08d6a79bf8c4c5525edfd48c2516b786f6f03fad48203d1a236ceb3cf2b2ec4facabb82", "e1d22f6e294a054fd997e0037f31371c7cff1e2f17b7f78116e27d1697a62148294891ed5ecb0fce17bf94a354eb2d33227dd82ccabc2d81faa958b66e157466bb451c31668cdbba500d2db9a63e983e1e840bcd68793963e65e9780b4104f29cd641b7200ac9a2ed0a1230954bb106e161d35f2f7f1b778d7a5b1f9d1f80466a8139934dc41f681552b7f3103bee382", }, { "7b3e0ecb0299ec8dde73fa9568f65d8068759f6e85b34b74150865c430292d6f", "68ad0e0a86af7016ee00a4bd43a1a7b7", "4e11179e9b4c1920b44799f78f6dd67a20dee26323ccf6c5db0fed1231b0a6929c4f46448129206dd024e0ce121d93fc0a9649d828e70b9a74ecee2257bfe6277956769a41f43c58795d13e25c02004144d296032278c4e1780501289ae4c62e30a5ebf65344ddaa89fa9d97d2f556d6f5a3cc7960c55c8f95c713dd2b1c2bdd4f777bcde460d1a408f2ffb6ad1102ae660119bed54513197c2829261146ab39", "7fe1e5951cf0f68f6c3c4c2cae41717f6e4ff0e93988d60a4532649f67a74cda58eec3ea0a67d1358cbf1a79eacf0ac75dd1c41dd1421be841039a1085a743c537b724408f960280f8e3db7a9288b34591ff4cef8da526e560a93feec36ac7e4da5051db968fead6ba2ae21b9f7c84ae022d46603d5d27f6368ff159d07f34dc260ff0e1334ecd467b0ab494551de76bad99fbe101f32b5e99d4c9d860303377", }, } func TestGBXTSSample(t *testing.T) { for i, test := range xtsGBTestVectors { key := fromHex(test.key) tweak := fromHex(test.tweak) encrypter, err := cipher.NewGBXTSEncrypter(sm4.NewCipher, key[:len(key)/2], key[len(key)/2:], tweak) if err != nil { t.Errorf("#%d: failed to create encrypter: %s", i, err) continue } decrypter, err := cipher.NewGBXTSDecrypter(sm4.NewCipher, key[:len(key)/2], key[len(key)/2:], tweak) if err != nil { t.Errorf("#%d: failed to create decrypter: %s", i, err) continue } plaintext := fromHex(test.plaintext) ciphertext := make([]byte, len(plaintext)) encrypter.CryptBlocks(ciphertext, plaintext) expectedCiphertext := fromHex(test.ciphertext) if !bytes.Equal(ciphertext, expectedCiphertext) { t.Errorf("#%d: encrypted failed, got: %x, want: %x", i, ciphertext, expectedCiphertext) continue } decrypted := make([]byte, len(ciphertext)) decrypter.CryptBlocks(decrypted, ciphertext) if !bytes.Equal(decrypted, plaintext) { t.Errorf("#%d: decryption failed, got: %x, want: %x", i, decrypted, plaintext) } } } var gbXtsTestVectors = []struct { key string sector uint64 plaintext string ciphertext string }{ { // XTS-SM4-128 applied for a data unit of 32 bytes "0000000000000000000000000000000000000000000000000000000000000000", 0, "0000000000000000000000000000000000000000000000000000000000000000", "d9b421f731c894fdc35b77291fe4e3b0e58e55e613a862b4d2b0f1073b4b4fd0", }, { "1111111111111111111111111111111122222222222222222222222222222222", 0x3333333333, "4444444444444444444444444444444444444444444444444444444444444444", "a74d726c11196a32be04e001ff29d0c7724feef81d666ae5afdfe4649544fcf5", }, { "fffefdfcfbfaf9f8f7f6f5f4f3f2f1f022222222222222222222222222222222", 0x3333333333, "4444444444444444444444444444444444444444444444444444444444444444", "7f76088effadf70c02ea9f95da0628d3ef2d6a77004beaa9016001d6789dd5a0", }, { // XTS-SM4-128 applied for a data unit of 512 bytes "2718281828459045235360287471352631415926535897932384626433832795", 0, "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff", "54dd65b6326faea8fad1a83c63614af398bddb6824735dab93ec4e75734215d463f67daf53742fb2a2847d5fde3984f8882cfd5fa9d6642e1e871c155202440044251465211628ba86f8d2998387a685edde23c07610b7388aab17f205aa5dada33c0a8a4225bc114254c796f800c638e016d199cd21dc28e92dc2b8587545509a8e1d659c596d3f6c8c225a27bdb2b02fe5a0c0183a592b396d32765fe733afb438a6ffb305ae1377c56d872badcebbd37812ff79f0571b3f977537570a1f76b9a50c49ab8d867fa024ea4483a25f7947b07885bb839e777abe76af11adf3108d1195933f96b7949b0664bdb89beb3bc48fb5f5d2109d32332f17c9a6ddea55441d1bbf43280ec7e75791e234d651a0716209eb21ae06061e33a72b0c530cb15fe0b55016b188dad75c4c50232dce1f5df61911c79bee60397b64bb914c0f26efcfb6ffab2bb33bdfd8db98c44debbd4ca865d41cbe1d0801b01aba2603cbea599b32c836789deeb9a3c18f3cae977b42ec81f1dfef6e098dd9e9dd6c1822bb938b08641bb72461f8d38c1724a43ae1254b9223e2270cf9f7d71a6bf093df2079fd2cc2fe87e846d799de30483f80164c31e65d8aae5f72d6dc71118932a008df547c712bee45ddebcdce098d673ef5ede91edfd45d17cb90963d3e2e2e2508a376a7b1af4d69e756ea5df52ac440791d57d56b5e057ad00e077d2df5009416", }, { // Vector 5 "2718281828459045235360287471352631415926535897932384626433832795", 1, "27a7479befa1d476489f308cd4cfa6e2a96e4bbe3208ff25287dd3819616e89cc78cf7f5e543445f8333d8fa7f56000005279fa5d8b5e4ad40e736ddb4d35412328063fd2aab53e5ea1e0a9f332500a5df9487d07a5c92cc512c8866c7e860ce93fdf166a24912b422976146ae20ce846bb7dc9ba94a767aaef20c0d61ad02655ea92dc4c4e41a8952c651d33174be51a10c421110e6d81588ede82103a252d8a750e8768defffed9122810aaeb99f9172af82b604dc4b8e51bcb08235a6f4341332e4ca60482a4ba1a03b3e65008fc5da76b70bf1690db4eae29c5f1badd03c5ccf2a55d705ddcd86d449511ceb7ec30bf12b1fa35b913f9f747a8afd1b130e94bff94effd01a91735ca1726acd0b197c4e5b03393697e126826fb6bbde8ecc1e08298516e2c9ed03ff3c1b7860f6de76d4cecd94c8119855ef5297ca67e9f3e7ff72b1e99785ca0a7e7720c5b36dc6d72cac9574c8cbbc2f801e23e56fd344b07f22154beba0f08ce8891e643ed995c94d9a69c9f1b5f499027a78572aeebd74d20cc39881c213ee770b1010e4bea718846977ae119f7a023ab58cca0ad752afe656bb3c17256a9f6e9bf19fdd5a38fc82bbe872c5539edb609ef4f79c203ebb140f2e583cb2ad15b4aa5b655016a8449277dbd477ef2c8d6c017db738b18deb4a427d1923ce3ff262735779a418f20a282df920147beabe421ee5319d0568", "0e36ba273dd121afc77e0d8c00aa4a665f801f3607af61b61058b2f5d007310822200eaaeef759d515ebd032dad4235f5cd2dc735b57b56e003bce3f56890618877db69aa4519edcf681c6fc19c9c4a5655372d1549148c759efba00140275b46b6a5f6522de1702c48ff209a1dd7d1f56e775252796a09c20f903bfb3935bc79c0cdcaa9d2f30e616160e0662fb35311676e86e18d7d90d4203bc6862a9187b8657162143ce914750a86f984cf660311917e00fcf450ee188f088b4222522276bf3391e94de4fdad4134dfc7d08113c65e1b103bd3ad75fb13bba7f842451f9023ed21f1d23bc1c57d593932e021548bbff61ea9a24f359b4f7a8f2a998587495b726411f84734b189f65c4e79f09c7875f9c924b32e5bf2785a9935854e08ce86f5a4a399af6731099a13e10db0b32b888865b4416d69014a8cdb28b3912ec0b832835df7b59637d0687747815ba7cf9efae862dd6e80763acb50898fe1b3ba13a39d81b20d6d50613fbb5fbdcae2a7a87b9377eec455a8bae5102d5e6a7bea9b6b77d3f9895b277a55a524721cd0e59ce35e915de622480c5e0d31d153282dd832278fd2b795933f5dc591c17bd6d7f38fcd6afce551e8485109673881519d2845395ce9ceaea6306e38a73f9bb990931323a3136d18ee76c3e727cfb07cf386519313e1c44adcc50ae79bfac6952e3b98948206fb3dc3ebaed556bf27f16", }, { // XTS-SM4-128 applied for a data unit that is not a multiple of 16 bytes, but should be a complte byte "c46acc2e7e013cb71cdbf750cf76b000249fbf4fb6cd17607773c23ffa2c4330", 94, "7e9c2289cba460e470222953439cdaa892a5433d4dab2a3f67", "4d5501ea41cf6b6532b4b7129c6f6ee74605d9fb66f1f12c0c", }, { "56ffcc9bbbdf413f0fc0f888f44b7493bb1925a39b8adf02d9009bb16db0a887", 144, "9a839cc14363bafcfc0cc93b14f8e769d35b94cc98267438e3", "f04f3f16b354cccdc39fc664ec7f8db010a83bcacbc5c96353", }, { "7454a43b87b1cf0dec95032c22873be3cace3bb795568854c1a008c07c5813f3", 108, "41088fa15195b2733fe824d2c1fdc8306080863945fb2a73cf", "791a9469ed5a22d8195ac37c43c1b0377dc15126349bed1465", }, } func TestGBXTS(t *testing.T) { for i, test := range gbXtsTestVectors { key := fromHex(test.key) encrypter, err := cipher.NewGBXTSEncrypterWithSector(sm4.NewCipher, key[:len(key)/2], key[len(key)/2:], test.sector) if err != nil { t.Errorf("#%d: failed to create encrypter: %s", i, err) continue } decrypter, err := cipher.NewGBXTSDecrypterWithSector(sm4.NewCipher, key[:len(key)/2], key[len(key)/2:], test.sector) if err != nil { t.Errorf("#%d: failed to create decrypter: %s", i, err) continue } plaintext := fromHex(test.plaintext) ciphertext := make([]byte, len(plaintext)) encrypter.CryptBlocks(ciphertext, plaintext) expectedCiphertext := fromHex(test.ciphertext) if !bytes.Equal(ciphertext, expectedCiphertext) { t.Errorf("#%d: encrypted failed, got: %x, want: %x", i, ciphertext, expectedCiphertext) continue } decrypted := make([]byte, len(ciphertext)) decrypter.CryptBlocks(decrypted, ciphertext) if !bytes.Equal(decrypted, plaintext) { t.Errorf("#%d: decryption failed, got: %x, want: %x", i, decrypted, plaintext) } } }