/*
* This file is part of libaacs
* Copyright (C) 2009-2010 Obliter0n
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library. If not, see
* .
*/
#ifndef MKB_H_
#define MKB_H_
#include "util/attributes.h"
#include
#include
typedef struct mkb MKB;
struct aacs_file_s;
AACS_PRIVATE MKB *mkb_read(struct aacs_file_s *fp); // init MKB
AACS_PRIVATE MKB *mkb_init(uint8_t *data, int len); // init MKB from data
AACS_PRIVATE void mkb_close(MKB *mkb); // free MKB
AACS_PRIVATE const uint8_t *mkb_data(MKB *mkb);
AACS_PRIVATE size_t mkb_data_size(MKB *mkb);
// returns type
AACS_PRIVATE uint8_t mkb_type(MKB *mkb);
// returns version
AACS_PRIVATE uint32_t mkb_version(MKB *mkb);
// returns type and version record (required to verify signatures)
AACS_PRIVATE const uint8_t *mkb_type_and_version_record(MKB *mkb);
// returns list of revoked host entries
AACS_PRIVATE const uint8_t *mkb_host_revokation_entries(MKB *mkb, size_t *len);
// returns list of revoked drive entries
AACS_PRIVATE const uint8_t *mkb_drive_revokation_entries(MKB *mkb, size_t *len);
// returns subset-diff records
AACS_PRIVATE const uint8_t *mkb_subdiff_records(MKB *mkb, size_t *len);
// returns list of subset-diff offsets
AACS_PRIVATE const uint8_t *mkb_subdiff_offsets(MKB *mkb, size_t *len);
// returns list of cvalues
AACS_PRIVATE const uint8_t *mkb_cvalues(MKB *mkb, size_t *len);
// media key verification data return in param (always 16 bytes)
AACS_PRIVATE const uint8_t *mkb_mk_dv(MKB *mkb);
// returns MKB signature
AACS_PRIVATE const uint8_t *mkb_signature(MKB *mkb, size_t *len);
AACS_PRIVATE int mkb_host_cert_is_revoked(MKB *mkb, const uint8_t *cert_id);
AACS_PRIVATE int mkb_drive_cert_is_revoked(MKB *mkb, const uint8_t *cert_id);
/* The Media Key block is of variable size but must be a multiple of 4
* MKB Structure:
* Type and Version record (12 bytes)
* 0 | type = 0x10
* 1-3 | length = 0x00000c
* 4-7 | MKB type = 0x000?1003
* 8-11| MKB version
*
* Host Revokation List record (variable - multiple of 4 bytes)
* 0 | type = 0x21
* 1-3 | length
* 4-7 | total entries
* 8-11 | entires in signature block 1 (N1)
* 12-19 | host revokation list entry 0
* .
* .
* (12+(N1-1)*8)-(12+N1*8)-1| entry n
* (12+ N1*8)-(52+ N1*8)-1 | block 1 signature
* (52+ N1*8)-(length-1) | more signature blocks
*
* Host Rekovation List entry (8 bytes)
* 0-1| range
* 2-7| host id
*
* Drive Revokation List record (variable - multiple of 4 bytes)
* 0 | type = 0x20
* 1-3 | length
* 4-7 | total entries
* 8-11 | entires in signature block 1 (N1)
* 12-19 | drive revokation list entry 0
* .
* .
* (12+(N1-1)*8)-(12+N1*8)-1| entry n
* (12+ N1*8)-(52+ N1*8)-1 | block 1 signature
* (52+ N1*8)-(length-1) | more signature blocks
*
* Drive Rekovation List entry (8 bytes)
* 0-1| range
* 2-7| host id
*
* Verify Media Key record
* 0 | type = 0x81
* 1-3 | length = 0x14
* 4-19| verification data (Dv)
*
* Explicit Subset-Difference record (variable - multiple of 4 bytes)
* 0 | type = 0x04
* 1-3 | length
* 4 | uv mask 0
* 5-8 | uv number 0
* .
* .
* length-1| end of uv number n
*
* Subset-Difference Index record (variable, padded - multiple of 4 bytes)
* 0 | type = 0x07
* 1-3 | length
* 4-7 | span (number of devices)
* 8-10 | offset 0
* .
* .
* length-1| end of offset n
*
* Media Key Data / cvalue record (variable - muliple of 4 bytes)
* 0 | type = 0x05
* 1-3 | length
* 4-19 | media key data 0
* .
* .
* length-1| end of media key data n
*
* End of Media Key Block record (variable - multiple of 4 bytes)
* 0 | type = 0x02
* 1-3 | length
* 4-length-1| signature
*/
#endif /* MKB_H_ */