Appendix 2.A Message Reference

2.A.1 Messages #

msg_typeMessageDirectionConversationDefined in
0x8001Registersource → authority0§2.8
0x0001Registeredauthority → source0§2.8
0x0002Authenticateauthority → source1+ (opens)§2.11
0x8002CredentialRequestsource → authority1+§2.12
0x0003CredentialResponseauthority → source1+§2.12
0x8003Assertionsource → authority1+ (terminal)§2.13
0x8004Refusalsource → authority1+ (terminal)§2.13
0x0004Abandonauthority → source1+ (terminal)§2.14
0x0005Queryauthority → source1+ (opens)§2.15
0x8005QueryResultsource → authority1+ (terminal)§2.15
0x0006EnumerateSourceauthority → source1+ (opens)§2.16
0x8006EnumerateResultsource → authority1+ (terminal)§2.16
0x8007Changedsource → authority0§2.17

The high bit marks a message sent by the source, which is the authority for its own principals (§2.7).

2.A.2 Protocol constants #

ConstantValueDefined in
Socket paththe implementation's choice§2.6
MagicPPSI (50 50 53 49)§2.7
Version1§2.7
Header size20 bytes§2.7
Maximum message size81920 bytes§2.7
Reserved conversation0§2.7

2.A.3 Field limits #

FieldMaximumDefined in
source_name32 bytes§2.8
domain68 bytes§2.8
max_batch64§2.8
originator68 bytes§2.11
user_sid68 bytes§2.13
canonical_name256 bytes§2.13
groups128 entries, each SID 68 bytes§2.13
primary_group68 bytes§2.13
claims64 entries§2.13
claim name255 bytes§2.13
claim values64 per claim§2.13
claim string value1024 bytes§2.13
claim octet value1024 bytes§2.13
claim SID value68 bytes§2.13
reason512 bytes§2.13
keys64 entries§2.15
key name256 bytes§2.15
results64 entries§2.15
withheld32 entries§2.15
values32 entries§2.15
entries256 entries§2.16
cursor, next256 bytes§2.16

68 bytes is the largest a SID can be: an eight-byte prelude plus fifteen sub-authorities (§2.7).

A claim name is bounded at 255 bytes of UTF-8 while PCDS §5.9 bounds it at 255 UTF-16 code units. A string's UTF-16 length never exceeds its UTF-8 byte length, so the byte bound is the stricter of the two and satisfies PCDS without transcoding to find out.

The claim limits are otherwise tighter than PCDS §5.9 permits — it allows 1024 values per claim. These bound the work an authority does decoding a message it has not yet decided to believe, and nothing needs a thousand-valued claim from a principal source.

Fields inside a nested LogonStart, CredentialRequest, CredentialResponse or profile keep PGSS Logon's limits (PGSS §2.A).

2.A.4 The ceiling that actually binds a page #

None of the entry counts above is the constraint on how much a source may return. An entry that fits a PSI message need not fit the PGSS Logon message the authority must re-encode it into: this chapter's ceiling is 81920 bytes and PGSS Logon's is 65536, and a QueryResult or EnumerateResult entry travels outward inside the smaller one.

A source MUST therefore bound a reply by the smaller of the two ceilings, not by this one, and MUST page rather than fill a PSI message it knows an authority cannot forward. A page that fits here and not there is a page nobody can deliver, and the entry-count bounds do not prevent one — 256 entries of a few hundred bytes each exceeds both.

The margin an implementation leaves for the authority's own framing is its own choice; leaving none is a defect.

Edit this page