/* $NetBSD: t_cgd_adiantum.c,v 1.5 2020/08/20 13:33:54 riastradh Exp $ */ /*- * Copyright (c) 2020 The NetBSD Foundation, Inc. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include #include #include #include #include #include #include #include #include #include #include #include "h_macros.h" #define MAXSECSIZE 512 /* for now; should be cgd parameter */ #define IMGSIZE 0x101*512 /* Used as buffer for cgd device I/O, must be at least 32-bit aligned. */ static const uint8_t zerosector[512] __aligned(4); static const struct { uint8_t key[32]; uint64_t blkno; unsigned secsize; const uint8_t *ptxt; const uint8_t *ctxt; } C[] = { [0] = { .key = {0}, .blkno = 0, .secsize = 512, .ptxt = zerosector, .ctxt = (const uint8_t[512]) { 0x51,0x6d,0xe2,0x81, 0x26,0xd5,0xc8,0xd7, 0xff,0xc6,0xc2,0xff, 0x39,0xbf,0x15,0x15, 0x46,0x80,0x44,0x65, 0x76,0xa1,0x56,0xae, 0xa0,0xb6,0x44,0x05, 0xb7,0xb1,0x32,0x23, 0x80,0x07,0xdd,0x31, 0x57,0x69,0xf5,0x10, 0x2d,0x53,0x54,0x8a, 0x1c,0x30,0x15,0x53, 0x40,0xb4,0x75,0xb2, 0xa1,0x8a,0xbe,0xdf, 0xf7,0x10,0xe0,0x38, 0xf9,0x70,0x29,0xda, 0xf0,0x95,0xcd,0xe9, 0x47,0xa1,0x32,0xa3, 0x83,0xca,0xe3,0x36, 0xc3,0x21,0x00,0xc2, 0x0a,0xb4,0x0e,0x67, 0x69,0xe6,0xe8,0x14, 0x74,0x98,0x69,0xd0, 0x6e,0xab,0x23,0xbc, 0xa9,0x1e,0xf8,0x2d, 0x98,0x59,0x98,0x81, 0x29,0x70,0xa8,0x1e, 0x26,0x13,0xba,0x53, 0x9e,0x83,0xe9,0x35, 0x73,0x8c,0xf9,0xb6, 0x10,0x17,0xda,0xe8, 0x21,0xcc,0x7d,0xd2, 0x8e,0x23,0xb9,0x63, 0xde,0xcf,0xa7,0x53, 0x56,0x1c,0xc8,0x53, 0x91,0x17,0x8f,0xec, 0x93,0x66,0x8b,0x0f, 0x18,0x6e,0xa5,0x9d, 0x8e,0x99,0x36,0x1c, 0x23,0xb6,0x0f,0x5d, 0x75,0xc3,0xfd,0x35, 0xc5,0x68,0x9c,0xe1, 0xba,0x19,0x1a,0x09, 0xca,0x40,0x1f,0xee, 0x0f,0x76,0x84,0x92, 0x72,0xdf,0x62,0x1b, 0x2e,0xa9,0x36,0xbe, 0xca,0x7e,0xc6,0x69, 0xc6,0x27,0xf8,0x12, 0xbf,0x6e,0xd3,0xf0, 0xb0,0x10,0x9c,0x67, 0x76,0x40,0xc8,0x36, 0x8e,0x73,0xec,0xa2, 0xdb,0x4a,0x0a,0xd9, 0x1b,0xa3,0x28,0x30, 0x84,0xa4,0xff,0xa0, 0xe7,0x1e,0xf4,0xb2, 0xfe,0x59,0x79,0xdf, 0x8d,0x66,0x12,0xac, 0xf6,0x1a,0x0f,0xa6, 0x4e,0x86,0x8c,0x80, 0x95,0x11,0xee,0x55, 0xe3,0xe0,0x43,0x56, 0xa2,0xfc,0xa2,0xbd, 0xad,0x6f,0xfc,0xf9, 0x4c,0x04,0x51,0xf4, 0xd9,0x17,0x96,0xdc, 0xd3,0xd0,0xd7,0xeb, 0xa8,0xdc,0x34,0x65, 0xc7,0xcf,0xed,0x06, 0xf8,0xa3,0xff,0x31, 0x3e,0x15,0x2f,0x62, 0x8c,0x73,0x7f,0x8c, 0x80,0x4d,0x4b,0x6d, 0xcf,0xc6,0xd0,0xdd, 0x7e,0x3a,0x1e,0x88, 0xb7,0xdd,0x23,0xa6, 0xa0,0x0d,0x6c,0xaf, 0xd6,0x5b,0xfd,0x76, 0x66,0xee,0x02,0xa6, 0x10,0xda,0x42,0xfb, 0x15,0xc3,0xe4,0xa7, 0x8b,0x2b,0xfa,0x5d, 0xba,0xce,0xcd,0x9f, 0x76,0x38,0x66,0xff, 0x74,0x08,0x34,0xf3, 0x3d,0x12,0xf4,0x8d, 0x5e,0x54,0x2b,0x37, 0x06,0xd3,0x03,0xc9, 0xd9,0x29,0x53,0x65, 0x76,0x00,0x24,0x50, 0x30,0x06,0x6c,0x69, 0x31,0xcc,0x89,0x7c, 0x97,0xae,0xac,0x74, 0x35,0x43,0xa3,0xe5, 0x40,0x58,0x3d,0xb9, 0x08,0x46,0x5e,0x5f, 0x07,0xc5,0x41,0x32, 0xab,0xa4,0x5a,0xab, 0x59,0x2b,0x54,0xee, 0x24,0x92,0xd3,0x08, 0xb8,0x99,0x9e,0x13, 0x3c,0x2c,0x05,0xe6, 0xc1,0x6f,0xa1,0x5d, 0xa9,0x09,0x1a,0x96, 0x76,0xe4,0x31,0xc6, 0xcc,0xad,0x28,0x58, 0x73,0x4d,0x1a,0x19, 0x3d,0xcd,0xaf,0x8c, 0xd8,0x24,0xff,0x72, 0xdc,0x4e,0x07,0x6e, 0xd8,0xbc,0x3b,0x2b, 0xf5,0xe5,0xfa,0x30, 0x7d,0xaa,0x59,0x40, 0x78,0x01,0xa4,0x55, 0xdc,0xe6,0x7b,0xae, 0x87,0x8e,0x11,0xbb, 0x65,0xf7,0x8a,0x4f, 0x37,0x7e,0xe1,0xac, 0x62,0xf1,0x64,0x8f, 0xc1,0xfd,0x3e,0x34, 0x1f,0x60,0xba,0x61, 0x98,0xae,0x19,0xce, 0x54,0x22,0x64,0x09, 0x67,0x82,0x6b,0x4b, 0xdf,0x26,0x77,0xde, 0xd6,0x13,0x00,0xee, 0x2c,0x18,0x49,0xd9, }, }, [1] = { .key = {0}, .blkno = 1, .secsize = 512, .ptxt = zerosector, .ctxt = (const uint8_t[512]) { 0xf2,0x23,0x68,0x5a, 0x15,0x11,0x56,0xa1, 0x71,0x57,0x5c,0x5e, 0x32,0xd4,0xdd,0xbb, 0x7a,0x0c,0x84,0x23, 0xe9,0x2f,0x1b,0x63, 0x3c,0x4d,0xad,0xfd, 0x6e,0xc0,0xdb,0x79, 0x23,0xa5,0x13,0xfe, 0x17,0x3c,0x4a,0x27, 0xb9,0xbc,0xf0,0xf6, 0x67,0x98,0xa8,0x64, 0xce,0xf0,0x17,0x0a, 0xa8,0x05,0x0f,0xf2, 0xff,0xb0,0x7a,0x9e, 0x1a,0xcf,0x5d,0x0e, 0x9f,0xb0,0x9a,0xd0, 0x7c,0xf2,0x88,0x96, 0xe2,0x8d,0xdb,0xa2, 0x19,0x30,0x3d,0x5d, 0x66,0x28,0x40,0x53, 0xb9,0x8d,0xbb,0x24, 0x3a,0x4c,0x00,0xac, 0x20,0x86,0x96,0x83, 0x2c,0x77,0x5e,0x18, 0x0c,0xfa,0x27,0x51, 0xe1,0x5d,0xd3,0xd9, 0xe1,0x5d,0x27,0x1f, 0x49,0x74,0xfd,0x2a, 0xc3,0xe5,0xa0,0xf6, 0x5a,0x58,0xe3,0x1f, 0x4a,0xa6,0xc2,0x25, 0xe4,0xb5,0xc8,0x0d, 0x9f,0xa7,0xc0,0x6e, 0xab,0xb3,0xfc,0x9f, 0xe1,0x72,0x8a,0x69, 0xf1,0xc6,0x54,0xb8, 0xeb,0x70,0xed,0xfe, 0x95,0xf7,0x0d,0x55, 0x95,0x13,0x7a,0x82, 0xac,0x83,0xd2,0xa3, 0xdc,0x5b,0xba,0x4e, 0xae,0xdd,0xe9,0x22, 0x9e,0xe2,0x72,0xaf, 0x9a,0xc0,0x53,0x96, 0xb9,0x7d,0x47,0x28, 0x4a,0x93,0x6a,0xfb, 0x59,0x25,0x49,0x39, 0xda,0x23,0xe8,0x28, 0x42,0xba,0x58,0x26, 0x29,0xf5,0x4c,0x85, 0xbb,0x62,0xfc,0x12, 0x28,0xbd,0xec,0x3f, 0xf4,0x86,0x80,0xf0, 0x69,0x81,0x99,0xe3, 0x95,0x0d,0xe8,0x8f, 0xeb,0x60,0xb6,0x2a, 0xbf,0xf1,0x41,0xe4, 0x68,0x4f,0x4b,0xe3, 0x49,0x2c,0x1e,0xad, 0x0d,0x8f,0x63,0x40, 0xb9,0xee,0x4d,0x09, 0x12,0x45,0x97,0x64, 0x97,0xd5,0x5f,0xa3, 0xb0,0x4b,0xdf,0x3f, 0x59,0x9f,0xab,0x12, 0x3d,0x4b,0x54,0xdc, 0xea,0xe0,0x55,0x5e, 0x1c,0xfd,0xe9,0x7e, 0x40,0x24,0x88,0x6c, 0x8d,0xfc,0xc2,0x57, 0xd2,0x37,0xb2,0x12, 0xc2,0x03,0x0d,0xac, 0xb8,0x9b,0x62,0x61, 0x23,0xc0,0x7a,0x06, 0xdb,0x62,0x86,0x06, 0xaf,0xa5,0x98,0x75, 0xd9,0x4e,0x8a,0xf2, 0xc5,0x64,0xad,0xf2, 0xf4,0xc2,0x7f,0xa2, 0x25,0xf4,0xd0,0x44, 0x57,0x8b,0x89,0xe2, 0x08,0xea,0x86,0x72, 0x37,0xe3,0x7e,0x92, 0x22,0xa0,0x32,0x05, 0x30,0x90,0xcc,0x44, 0x6f,0x2c,0x75,0xae, 0x28,0x90,0x34,0xe3, 0x05,0x88,0xcd,0x77, 0x1d,0x6a,0x72,0x56, 0x49,0x3f,0x3d,0x0b, 0x49,0x04,0x98,0x65, 0x66,0x0e,0xfd,0x7d, 0xca,0x32,0x74,0x66, 0xa0,0xd7,0x04,0xdb, 0x83,0x4b,0x7f,0x83, 0x22,0x43,0x98,0x93, 0x0d,0x0b,0xb1,0x8d, 0x8c,0x8b,0x9e,0x08, 0xb9,0xb0,0xd9,0x82, 0xcd,0x20,0x5e,0x19, 0x5d,0xa0,0x6a,0x71, 0x05,0xf9,0x18,0x3d, 0x6b,0xb7,0xb6,0x56, 0x03,0xa3,0x53,0x58, 0x7d,0xf8,0x25,0xca, 0x26,0x02,0xc1,0xa6, 0x72,0x70,0xc3,0xe3, 0x59,0x64,0xe1,0x25, 0x34,0x79,0xb3,0x5e, 0x08,0xe9,0xb8,0x91, 0xb6,0x5d,0x3a,0x44, 0x20,0x60,0x61,0xf4, 0x28,0x93,0x8f,0x89, 0xbe,0xea,0x55,0xda, 0x43,0x38,0x96,0xc8, 0x50,0x01,0x09,0xaf, 0x76,0x92,0x83,0xae, 0x3b,0x82,0x6f,0x49, 0x0b,0x18,0x9c,0xef, 0x92,0x06,0x11,0xeb, 0x41,0x34,0xf4,0x7b, 0xc4,0x9a,0x9f,0xe4, 0xb4,0xe7,0x1a,0x84, 0xd8,0x8b,0x3a,0x29, 0xb5,0x4e,0xf3,0x97, 0x6c,0xef,0xe9,0x62, 0x21,0x89,0x23,0xfd, }, }, [2] = { .key = {0}, .blkno = 0x100, .secsize = 512, .ptxt = zerosector, .ctxt = (const uint8_t[512]) { 0x32,0x26,0xaf,0x56, 0xbc,0x43,0xac,0x37, 0xb2,0x8d,0xa4,0xfb, 0x32,0xdc,0x09,0x03, 0xd9,0x44,0xce,0x4e, 0x70,0xaf,0xed,0x83, 0x4b,0x9c,0x85,0x11, 0xd2,0x6a,0x70,0x15, 0xea,0x7b,0x5e,0xac, 0x5d,0x08,0x25,0xd7, 0x8c,0x23,0x7c,0x15, 0xb7,0x20,0xd1,0x08, 0xe0,0x81,0x71,0xbe, 0x68,0xca,0xe2,0xcd, 0x98,0xe5,0x40,0xe0, 0xf5,0x84,0xcc,0x6a, 0x3c,0xa0,0xe8,0x2c, 0x02,0x4c,0x95,0xb5, 0x58,0x86,0x86,0x61, 0x71,0x7f,0xd7,0xf9, 0xd9,0x64,0x80,0xf6, 0xea,0x92,0xbc,0x65, 0x3b,0x07,0x77,0xaa, 0xb1,0xb1,0xf5,0xd6, 0x6d,0x89,0x63,0x14, 0xc0,0xcc,0x7a,0x2b, 0xc4,0x32,0x63,0xda, 0xa6,0xc6,0xc8,0xc6, 0x4c,0x4e,0x10,0x63, 0x3b,0x93,0x80,0x77, 0x3e,0x54,0xd2,0x38, 0x13,0x79,0xbc,0x6c, 0x0b,0xd4,0x71,0x5c, 0x26,0xc0,0x81,0x09, 0xc7,0xd8,0x7a,0x04, 0x58,0x2e,0x50,0x6a, 0x3d,0xca,0xa1,0x66, 0x72,0xca,0xee,0x5a, 0xdd,0x13,0x67,0xb1, 0x54,0x72,0x41,0x2d, 0xfd,0x95,0x24,0xe3, 0x96,0x4a,0x41,0x03, 0xeb,0xeb,0x99,0x49, 0x52,0xac,0x3a,0x28, 0x81,0x54,0x1a,0xfb, 0xc3,0xcd,0x8e,0x9d, 0x0c,0x64,0x95,0xbb, 0x27,0xb8,0x6b,0x51, 0x7b,0xc4,0x57,0xc9, 0x29,0x4e,0x85,0x31, 0x1c,0xaa,0x63,0x2e, 0x7a,0x37,0x2e,0x06, 0xdc,0x58,0x39,0x3b, 0x60,0x34,0x59,0x15, 0x4f,0xba,0x33,0x52, 0x13,0xb0,0x7b,0x7c, 0x7e,0x00,0x0b,0x49, 0x15,0x9c,0x48,0xf4, 0x67,0xdd,0xc6,0x72, 0x87,0xbe,0xe7,0xf7, 0x21,0x95,0x82,0xc3, 0x41,0x3b,0x19,0xe3, 0xf3,0x28,0xcc,0x14, 0x5f,0xae,0x6f,0x07, 0x35,0x94,0x05,0x46, 0x02,0x5c,0x3c,0x46, 0xb1,0x2d,0xeb,0x6e, 0xa0,0x0f,0xea,0x40, 0x3e,0x35,0x6e,0x50, 0xc4,0x22,0xeb,0x93, 0xba,0x49,0xfb,0xf0, 0x8e,0x2a,0xa1,0xaf, 0xf4,0x91,0xb2,0xc5, 0x7d,0x8e,0xba,0x45, 0x53,0x75,0xc3,0xcc, 0x3e,0x02,0x0e,0x4d, 0x2e,0xda,0x45,0xd2, 0x31,0xc7,0x1b,0x6b, 0x99,0x71,0x8d,0xd8, 0x8c,0x94,0xa2,0x02, 0x6c,0xb0,0x32,0x8f, 0xce,0x04,0x61,0x0a, 0x3f,0x17,0x3a,0x28, 0xda,0x31,0xdc,0xec, 0xbc,0xea,0x1b,0x37, 0x9b,0x36,0x04,0xb1, 0xb5,0x7f,0xfe,0x1a, 0xd8,0x11,0xb7,0x0a, 0x77,0x2e,0x6d,0x22, 0x79,0x9e,0x54,0x47, 0xea,0xf5,0x17,0x38, 0xd0,0xe2,0x23,0x68, 0x92,0x88,0x42,0x59, 0x2c,0x61,0x53,0x2b, 0x99,0xed,0x7b,0x85, 0xfb,0xb8,0xe8,0x0c, 0x4b,0x81,0x1e,0x0f, 0x42,0x04,0x8b,0x55, 0x2c,0x34,0x46,0x98, 0x9c,0x47,0x08,0x70, 0x46,0x45,0x5e,0xa8, 0x62,0x92,0x94,0xcd, 0x73,0x1c,0xef,0x8b, 0x96,0x5f,0x6d,0x76, 0x07,0x99,0x6f,0xe0, 0x1d,0xdc,0x1d,0x1c, 0x3f,0xb4,0x5f,0x9b, 0x34,0x0c,0x75,0x10, 0x7e,0x0d,0xf8,0xbb, 0xc3,0x8a,0x2a,0x15, 0x01,0x3a,0x56,0x73, 0x5b,0xe9,0x5f,0xf2, 0x6a,0x1b,0x17,0xce, 0xf3,0x3e,0xc9,0xdf, 0x76,0xe8,0xcd,0xf2, 0x6d,0xb1,0xdc,0x29, 0x8c,0xa3,0x89,0x73, 0x69,0x86,0xa9,0x05, 0xbe,0x63,0xc8,0x7c, 0x36,0xc0,0x88,0x74, 0x64,0x91,0xdd,0xb7, 0x92,0x73,0x7e,0xc1, 0x01,0x95,0xb3,0x95, 0x53,0x33,0x16,0xcd, 0xe9,0xd7,0x56,0x61, 0x71,0x49,0x24,0x9b, 0x9a,0x10,0x7e,0x50, 0x7e,0xd3,0xe2,0x9d, }, }, }; static void hexdump(const void *buf, size_t len) { const unsigned char *p = buf; size_t i; for (i = 0; i < len; i++) { if (i % 16 == 8) printf(" "); printf(" %02hhx", p[i]); if ((i + 1) % 16 == 0) printf("\n"); } if (i % 16) printf("\n"); } static int configure_cgd(int fd, const char *dkpath, const char *alg, const char *ivmethod, const void *key, size_t keybytes) { struct cgd_ioctl ci; memset(&ci, 0, sizeof(ci)); ci.ci_disk = dkpath; ci.ci_alg = alg; ci.ci_ivmethod = ivmethod; ci.ci_keylen = 8*keybytes; ci.ci_key = key; ci.ci_blocksize = (size_t)-1; return rump_sys_ioctl(fd, CGDIOCSET, &ci); } static int unconfigure_cgd(int fd) { struct cgd_ioctl ci; return rump_sys_ioctl(fd, CGDIOCCLR, &ci); } ATF_TC(cgd_adiantum); ATF_TC_HEAD(cgd_adiantum, tc) { atf_tc_set_md_var(tc, "descr", "Adiantum tests"); } ATF_TC_BODY(cgd_adiantum, tc) { static uint8_t buf[MAXSECSIZE]; static const char imgpath[] = "adiantum.img"; static const char dkpath[] = "/dev/dk"; char cgdpath[MAXPATHLEN]; int dkfd, cgdfd; unsigned i; ssize_t nwrit, nread; rump_init(); RL(dkfd = open(imgpath, O_CREAT|O_RDWR|O_TRUNC, 0600)); RL(ftruncate(dkfd, IMGSIZE)); RL(rump_pub_etfs_register_withsize(dkpath, imgpath, RUMP_ETFS_BLK, 0, IMGSIZE)); snprintf(cgdpath, sizeof cgdpath, "/dev/rcgd0%c", getrawpartition() + 'a'); RL(cgdfd = rump_sys_open(cgdpath, O_RDWR)); for (i = 0; i < __arraycount(C); i++) { /* write the plaintext out via cgd */ RL(configure_cgd(cgdfd, dkpath, "adiantum", "encblkno1", C[i].key, 32)); RL(nwrit = rump_sys_pwrite(cgdfd, C[i].ptxt, C[i].secsize, C[i].blkno * C[i].secsize)); RL(unconfigure_cgd(cgdfd)); if ((size_t)nwrit != C[i].secsize) { atf_tc_fail_nonfatal("truncated write: %zd != %u", nwrit, C[i].secsize); continue; } /* read the ciphertext out from the underlying file */ RL(nread = pread(dkfd, buf, C[i].secsize, C[i].blkno * C[i].secsize)); if ((size_t)nread != C[i].secsize) { atf_tc_fail_nonfatal("truncated read: %zd != %u", nread, C[i].secsize); continue; } if (memcmp(buf, C[i].ctxt, C[i].secsize)) { hexdump(buf, C[i].secsize); hexdump(C[i].ctxt, C[i].secsize); atf_tc_fail_nonfatal("case %u ctxt mismatch", i); continue; } /* read the plaintext back via cgd */ RL(configure_cgd(cgdfd, dkpath, "adiantum", "encblkno1", C[i].key, 32)); RL(nread = rump_sys_pread(cgdfd, buf, C[i].secsize, C[i].blkno * C[i].secsize)); RL(unconfigure_cgd(cgdfd)); if ((size_t)nread != C[i].secsize) { atf_tc_fail_nonfatal("truncated read: %zd != %u", nread, C[i].secsize); continue; } if (memcmp(buf, C[i].ptxt, C[i].secsize)) { hexdump(buf, C[i].secsize); atf_tc_fail_nonfatal("case %u ptxt mismatch", i); continue; } } RL(rump_sys_close(cgdfd)); RL(close(dkfd)); } ATF_TP_ADD_TCS(tp) { ATF_TP_ADD_TC(tp, cgd_adiantum); return atf_no_error(); }