1/* 2 * Copyright (c) 2019 Conrad Meyer <cem@FreeBSD.org>. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 14 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 16 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 17 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 18 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 19 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 20 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 21 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 22 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 23 * SUCH DAMAGE. 24 */ 25 26#include <sys/cdefs.h> 27#include <assert.h> 28#include <err.h> 29#include <errno.h> 30#include <stdbool.h> 31#include <stdint.h> 32#include <stdio.h> 33#include <stdlib.h> 34#include <string.h> 35 36#include "fstyp.h" 37 38/* 39 * This really detects the container format, which might be best supported by 40 * geom_part or a special GEOM class. 41 * 42 * https://developer.apple.com/support/downloads/Apple-File-System-Reference.pdf 43 */ 44 45#define NX_CKSUM_SZ 8 46 47typedef uint64_t nx_oid_t; 48 49typedef uint64_t nx_xid_t; 50 51struct nx_obj { 52 uint8_t o_cksum[NX_CKSUM_SZ]; /* Fletcher 64 */ 53 nx_oid_t o_oid; 54 nx_xid_t o_xid; 55 uint32_t o_type; 56 uint32_t o_subtype; 57}; 58 59/* nx_obj::o_oid */ 60#define OID_NX_SUPERBLOCK 1 61 62/* nx_obj::o_type: */ 63#define OBJECT_TYPE_MASK 0x0000ffff 64#define OBJECT_TYPE_NX_SUPERBLOCK 0x00000001 65#define OBJECT_TYPE_FLAGS_MASK 0xffff0000 66#define OBJ_STORAGETYPE_MASK 0xc0000000 67#define OBJECT_TYPE_FLAGS_DEFINED_MASK 0xf8000000 68#define OBJ_STORAGE_VIRTUAL 0x00000000 69#define OBJ_STORAGE_EPHEMERAL 0x80000000 70#define OBJ_STORAGE_PHYSICAL 0x40000000 71#define OBJ_NOHEADER 0x20000000 72#define OBJ_ENCRYPTED 0x10000000 73#define OBJ_NONPERSISTENT 0x08000000 74 75struct nx_superblock { 76 struct nx_obj nx_o; 77 char nx_magic[4]; 78 /* ... other stuff that doesn't matter */ 79}; 80 81int 82fstyp_apfs(FILE *fp, char *label, size_t size) 83{ 84 struct nx_superblock *csb; 85 int retval; 86 87 retval = 1; 88 csb = read_buf(fp, 0, sizeof(*csb)); 89 if (csb == NULL) 90 goto fail; 91 92 /* Ideally, checksum the SB here. */ 93 if (strncmp(csb->nx_magic, "NXSB", 4) != 0 || 94 csb->nx_o.o_oid != OID_NX_SUPERBLOCK || 95 (csb->nx_o.o_type & OBJECT_TYPE_MASK) != OBJECT_TYPE_NX_SUPERBLOCK) 96 goto fail; 97 98 retval = 0; 99 100 /* No label support yet. */ 101 (void)size; 102 (void)label; 103 104fail: 105 free(csb); 106 return (retval); 107} 108