iPXE
Data Structures | Macros | Functions | Variables
pccrc.h File Reference

Peer Content Caching and Retrieval: Content Identification [MS-PCCRC]. More...

#include <stdint.h>
#include <byteswap.h>
#include <ipxe/uaccess.h>
#include <ipxe/crypto.h>

Go to the source code of this file.

Data Structures

union  peerdist_info_version
 Content Information version number. More...
 
struct  peerdist_info_v1
 Content Information version 1 data structure header. More...
 
struct  peerdist_info_v1_segment
 Content Information version 1 segment description header. More...
 
struct  peerdist_info_v1_block
 Content Information version 1 block description header. More...
 
struct  peerdist_info_v2
 Content Information version 2 data structure header. More...
 
struct  peerdist_info_v2_chunk
 Content Information version 2 chunk description header. More...
 
struct  peerdist_info_v2_segment
 Content Information version 2 segment description header. More...
 
struct  peerdist_raw
 Raw content information. More...
 
struct  peerdist_range
 A content range. More...
 
struct  peerdist_info
 Content information. More...
 
struct  peerdist_info_segment
 A content information segment. More...
 
struct  peerdist_info_block
 A content information block. More...
 
struct  peerdist_info_operations
 Content information operations. More...
 

Macros

#define PEERDIST_INFO_V1   0x0100
 Content Information version 1. More...
 
#define PEERDIST_INFO_V2   0x0200
 Content Information version 2. More...
 
#define PEERDIST_INFO_V1_HASH_SHA256   0x0000800cUL
 SHA-256 hash algorithm. More...
 
#define PEERDIST_INFO_V1_HASH_SHA384   0x0000800dUL
 SHA-384 hash algorithm. More...
 
#define PEERDIST_INFO_V1_HASH_SHA512   0x0000800eUL
 SHA-512 hash algorithm. More...
 
#define peerdist_info_v1_segment_t(digestsize)
 Content Information version 1 segment description. More...
 
#define peerdist_info_v1_block_t(digestsize, blocks)
 Content Information version 1 block description. More...
 
#define PEERDIST_INFO_V2_HASH_SHA512_TRUNC   0x04
 SHA-512 hash algorithm with output truncated to first 256 bits. More...
 
#define peerdist_info_v2_chunk_t(digestsize)
 Content Information version 2 chunk description. More...
 
#define PEERDIST_INFO_V2_CHUNK_TYPE   0x00
 Chunk type. More...
 
#define peerdist_info_v2_segment_t(digestsize)
 Content Information version 2 segment description. More...
 
#define PEERDIST_DIGEST_MAX_SIZE   64
 Maximum digest size for any supported algorithm. More...
 
#define PEERDIST_SEGMENT_ID_MAGIC   L"MS_P2P_CACHING"
 Magic string constant used to calculate segment identifier. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
int peerdist_info (userptr_t data, size_t len, struct peerdist_info *info)
 Populate content information. More...
 
int peerdist_info_segment (const struct peerdist_info *info, struct peerdist_info_segment *segment, unsigned int index)
 Populate content information segment. More...
 
int peerdist_info_block (const struct peerdist_info_segment *segment, struct peerdist_info_block *block, unsigned int index)
 Populate content information block. More...
 

Variables

struct digest_algorithm sha512_trunc_algorithm
 

Detailed Description

Peer Content Caching and Retrieval: Content Identification [MS-PCCRC].

Definition in file pccrc.h.

Macro Definition Documentation

◆ PEERDIST_INFO_V1

#define PEERDIST_INFO_V1   0x0100

Content Information version 1.

Definition at line 46 of file pccrc.h.

◆ PEERDIST_INFO_V2

#define PEERDIST_INFO_V2   0x0200

Content Information version 2.

Definition at line 49 of file pccrc.h.

◆ PEERDIST_INFO_V1_HASH_SHA256

#define PEERDIST_INFO_V1_HASH_SHA256   0x0000800cUL

SHA-256 hash algorithm.

Definition at line 97 of file pccrc.h.

◆ PEERDIST_INFO_V1_HASH_SHA384

#define PEERDIST_INFO_V1_HASH_SHA384   0x0000800dUL

SHA-384 hash algorithm.

Definition at line 100 of file pccrc.h.

◆ PEERDIST_INFO_V1_HASH_SHA512

#define PEERDIST_INFO_V1_HASH_SHA512   0x0000800eUL

SHA-512 hash algorithm.

Definition at line 103 of file pccrc.h.

◆ peerdist_info_v1_segment_t

#define peerdist_info_v1_segment_t (   digestsize)
Value:
struct { \
uint8_t hash[digestsize]; \
uint8_t secret[digestsize]; \
} __attribute__ (( packed ))
#define __attribute__(x)
Definition: compiler.h:10
uint16_t segment
Code segment.
Definition: librm.h:252
pseudo_bit_t hash[0x00010]
Definition: arbel.h:13
Content Information version 1 segment description header.
Definition: pccrc.h:109
uint32_t digestsize
Digest size (i.e.
Definition: pccrr.h:14

Content Information version 1 segment description.

Parameters
digestsizeDigest size

Definition at line 146 of file pccrc.h.

◆ peerdist_info_v1_block_t

#define peerdist_info_v1_block_t (   digestsize,
  blocks 
)
Value:
struct { \
uint8_t hash[blocks][digestsize]; \
} __attribute__ (( packed ))
#define __attribute__(x)
Definition: compiler.h:10
pseudo_bit_t hash[0x00010]
Definition: arbel.h:13
Content Information version 1 block description header.
Definition: pccrc.h:157
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
uint32_t digestsize
Digest size (i.e.
Definition: pccrr.h:14

Content Information version 1 block description.

Parameters
digestsizeDigest size
blocksNumber of blocks

Definition at line 179 of file pccrc.h.

◆ PEERDIST_INFO_V2_HASH_SHA512_TRUNC

#define PEERDIST_INFO_V2_HASH_SHA512_TRUNC   0x04

SHA-512 hash algorithm with output truncated to first 256 bits.

Definition at line 225 of file pccrc.h.

◆ peerdist_info_v2_chunk_t

#define peerdist_info_v2_chunk_t (   digestsize)
Value:
struct { \
struct peerdist_info_v2_chunk chunk; \
peerdist_info_v2_segment_t ( digestsize ) segment[0]; \
} __attribute__ (( packed ))
#define __attribute__(x)
Definition: compiler.h:10
uint16_t segment
Code segment.
Definition: librm.h:252
uint32_t digestsize
Digest size (i.e.
Definition: pccrr.h:14
Content Information version 2 chunk description header.
Definition: pccrc.h:231

Content Information version 2 chunk description.

Parameters
digestsizeDigest size

Definition at line 250 of file pccrc.h.

◆ PEERDIST_INFO_V2_CHUNK_TYPE

#define PEERDIST_INFO_V2_CHUNK_TYPE   0x00

Chunk type.

Definition at line 257 of file pccrc.h.

◆ peerdist_info_v2_segment_t

#define peerdist_info_v2_segment_t (   digestsize)
Value:
struct { \
uint8_t hash[digestsize]; \
uint8_t secret[digestsize]; \
} __attribute__ (( packed ))
#define __attribute__(x)
Definition: compiler.h:10
uint16_t segment
Code segment.
Definition: librm.h:252
pseudo_bit_t hash[0x00010]
Definition: arbel.h:13
Content Information version 2 segment description header.
Definition: pccrc.h:263
uint32_t digestsize
Digest size (i.e.
Definition: pccrr.h:14

Content Information version 2 segment description.

Parameters
digestsizeDigest size

Definition at line 280 of file pccrc.h.

◆ PEERDIST_DIGEST_MAX_SIZE

#define PEERDIST_DIGEST_MAX_SIZE   64

Maximum digest size for any supported algorithm.

The largest digest size that we support is for SHA-512 at 64 bytes

Definition at line 298 of file pccrc.h.

◆ PEERDIST_SEGMENT_ID_MAGIC

#define PEERDIST_SEGMENT_ID_MAGIC   L"MS_P2P_CACHING"

Magic string constant used to calculate segment identifier.

Note that the MS-PCCRC specification states that this constant is

"the null-terminated ASCII string constant "MS_P2P_CACHING"; string literals are all ASCII strings with NULL terminators unless otherwise noted."

The specification lies. This constant is a UTF-16LE string, not an ASCII string. The terminating wNUL is included within the constant.

Definition at line 391 of file pccrc.h.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ peerdist_info()

int peerdist_info ( userptr_t  data,
size_t  len,
struct peerdist_info info 
)

Populate content information.

Parameters
dataRaw data
lenLength of raw data
infoContent information to fill in
Return values
rcReturn status code

Definition at line 670 of file pccrc.c.

670  {
672  int rc;
673 
674  /* Initialise structure */
675  memset ( info, 0, sizeof ( *info ) );
676  info->raw.data = data;
677  info->raw.len = len;
678 
679  /* Get version */
680  if ( ( rc = peerdist_info_get ( info, &version, 0,
681  sizeof ( version ) ) ) != 0 ) {
682  DBGC ( info, "PCCRC %p could not get version: %s\n",
683  info, strerror ( rc ) );
684  return rc;
685  }
686  DBGC2 ( info, "PCCRC %p version %d.%d\n",
687  info, version.major, version.minor );
688 
689  /* Determine version */
690  switch ( version.raw ) {
691  case cpu_to_le16 ( PEERDIST_INFO_V1 ) :
693  break;
694  case cpu_to_le16 ( PEERDIST_INFO_V2 ) :
696  break;
697  default:
698  DBGC ( info, "PCCRC %p unsupported version %d.%d\n",
699  info, version.major, version.minor );
700  return -ENOTSUP;
701  }
702  assert ( info->op != NULL );
703  assert ( info->op->info != NULL );
704 
705  /* Populate content information */
706  if ( ( rc = info->op->info ( info ) ) != 0 )
707  return rc;
708 
709  DBGC2 ( info, "PCCRC %p range [%08zx,%08zx) covers [%08zx,%08zx) with "
710  "%d segments\n", info, info->range.start, info->range.end,
711  info->trim.start, info->trim.end, info->segments );
712  return 0;
713 }
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
u32 info
Definition: ar9003_mac.h:67
#define DBGC(...)
Definition: compiler.h:505
#define ENOTSUP
Operation not supported.
Definition: errno.h:589
static struct peerdist_info_operations peerdist_info_v1_operations
Content information version 1 operations.
Definition: pccrc.c:391
u32 version
Driver version.
Definition: ath9k_hw.c:1983
#define PEERDIST_INFO_V2
Content Information version 2.
Definition: pccrc.h:49
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
char * strerror(int errno)
Retrieve string representation of error number.
Definition: strerror.c:78
static int peerdist_info_get(const struct peerdist_info *info, void *data, size_t offset, size_t len)
Get raw data.
Definition: pccrc.c:79
static uint16_t struct vmbus_xfer_pages_operations * op
Definition: netvsc.h:327
#define DBGC2(...)
Definition: compiler.h:522
static struct peerdist_info_operations peerdist_info_v2_operations
Content information version 2 operations.
Definition: pccrc.c:649
#define cpu_to_le16(value)
Definition: byteswap.h:106
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint32_t len
Length.
Definition: ena.h:14
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
#define PEERDIST_INFO_V1
Content Information version 1.
Definition: pccrc.h:46
Content Information version number.
Definition: pccrc.h:28
void * memset(void *dest, int character, size_t len) __nonnull

References assert(), cpu_to_le16, data, DBGC, DBGC2, ENOTSUP, info, len, memset(), NULL, peerdist_info_get(), PEERDIST_INFO_V1, peerdist_info_v1_operations, PEERDIST_INFO_V2, peerdist_info_v2_operations, rc, strerror(), and version.

◆ peerdist_info_segment()

int peerdist_info_segment ( const struct peerdist_info info,
struct peerdist_info_segment segment,
unsigned int  index 
)

Populate content information segment.

Parameters
infoContent information
segmentContent information segment to fill in
indexSegment index
Return values
rcReturn status code

Definition at line 723 of file pccrc.c.

725  {
726  int rc;
727 
728  /* Sanity checks */
729  assert ( info != NULL );
730  assert ( info->op != NULL );
731  assert ( info->op->segment != NULL );
732  if ( index >= info->segments ) {
733  DBGC ( info, "PCCRC %p segment %d of [0,%d) out of range\n",
734  info, index, info->segments );
735  return -ERANGE;
736  }
737 
738  /* Initialise structure */
739  memset ( segment, 0, sizeof ( *segment ) );
740  segment->info = info;
741  segment->index = index;
742 
743  /* Populate content information segment */
744  if ( ( rc = info->op->segment ( segment ) ) != 0 )
745  return rc;
746 
747  DBGC2 ( info, "PCCRC %p segment %d range [%08zx,%08zx) with %d "
748  "blocks\n", info, segment->index, segment->range.start,
749  segment->range.end, segment->blocks );
750  DBGC2 ( info, "PCCRC %p segment %d digest %s\n", info, segment->index,
751  peerdist_info_hash_ntoa ( info, segment->hash ) );
752  DBGC2 ( info, "PCCRC %p segment %d secret %s\n", info, segment->index,
753  peerdist_info_hash_ntoa ( info, segment->secret ) );
754  DBGC2 ( info, "PCCRC %p segment %d identf %s\n", info, segment->index,
756  return 0;
757 }
uint16_t segment
Code segment.
Definition: librm.h:252
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static const char * peerdist_info_hash_ntoa(const struct peerdist_info *info, const void *hash)
Transcribe hash value (for debugging)
Definition: pccrc.c:56
u32 info
Definition: ar9003_mac.h:67
#define DBGC(...)
Definition: compiler.h:505
long index
Definition: bigint.h:62
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define ERANGE
Result too large.
Definition: errno.h:639
#define DBGC2(...)
Definition: compiler.h:522
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
void * memset(void *dest, int character, size_t len) __nonnull

References assert(), DBGC, DBGC2, ERANGE, index, info, memset(), NULL, peerdist_info_hash_ntoa(), rc, and segment.

◆ peerdist_info_block()

int peerdist_info_block ( const struct peerdist_info_segment segment,
struct peerdist_info_block block,
unsigned int  index 
)

Populate content information block.

Parameters
segmentContent information segment
blockContent information block to fill in
indexBlock index
Return values
rcReturn status code

Definition at line 767 of file pccrc.c.

769  {
770  const struct peerdist_info *info = segment->info;
771  size_t start;
772  size_t end;
773  int rc;
774 
775  /* Sanity checks */
776  assert ( segment != NULL );
777  assert ( info != NULL );
778  assert ( info->op != NULL );
779  assert ( info->op->block != NULL );
780  if ( index >= segment->blocks ) {
781  DBGC ( info, "PCCRC %p segment %d block %d of [0,%d) out of "
782  "range\n", info, segment->index, index, segment->blocks);
783  return -ERANGE;
784  }
785 
786  /* Initialise structure */
787  memset ( block, 0, sizeof ( *block ) );
788  block->segment = segment;
789  block->index = index;
790 
791  /* Populate content information block */
792  if ( ( rc = info->op->block ( block ) ) != 0 )
793  return rc;
794 
795  /* Calculate trimmed range */
796  start = block->range.start;
797  if ( start < info->trim.start )
798  start = info->trim.start;
799  end = block->range.end;
800  if ( end > info->trim.end )
801  end = info->trim.end;
802  if ( end < start )
803  end = start;
804  block->trim.start = start;
805  block->trim.end = end;
806 
807  DBGC2 ( info, "PCCRC %p segment %d block %d hash %s\n",
808  info, segment->index, block->index,
809  peerdist_info_hash_ntoa ( info, block->hash ) );
810  DBGC2 ( info, "PCCRC %p segment %d block %d range [%08zx,%08zx) covers "
811  "[%08zx,%08zx)\n", info, segment->index, block->index,
812  block->range.start, block->range.end, block->trim.start,
813  block->trim.end );
814  return 0;
815 }
uint16_t segment
Code segment.
Definition: librm.h:252
struct arbelprm_rc_send_wqe rc
Definition: arbel.h:14
static const char * peerdist_info_hash_ntoa(const struct peerdist_info *info, const void *hash)
Transcribe hash value (for debugging)
Definition: pccrc.c:56
u32 info
Definition: ar9003_mac.h:67
size_t start
Start offset.
Definition: pccrc.h:311
#define DBGC(...)
Definition: compiler.h:505
long index
Definition: bigint.h:62
uint32_t start
Starting offset.
Definition: netvsc.h:12
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
struct peerdist_range trim
Trimmed content range.
Definition: pccrc.h:341
Content information.
Definition: pccrc.h:317
#define ERANGE
Result too large.
Definition: errno.h:639
#define DBGC2(...)
Definition: compiler.h:522
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
uint32_t end
Ending offset.
Definition: netvsc.h:18
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
void * memset(void *dest, int character, size_t len) __nonnull

References assert(), block, DBGC, DBGC2, end, ERANGE, index, info, memset(), NULL, peerdist_info_hash_ntoa(), rc, segment, start, peerdist_range::start, and peerdist_info::trim.

Variable Documentation

◆ sha512_trunc_algorithm

struct digest_algorithm sha512_trunc_algorithm