/*      $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 <sys/types.h>

#include <fcntl.h>
#include <stdint.h>
#include <stdint.h>
#include <stdio.h>
#include <unistd.h>
#include <util.h>

#include <dev/cgdvar.h>

#include <rump/rump.h>
#include <rump/rump_syscalls.h>

#include <atf-c.h>

#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();
}