// Copyright 2021-2022 Signal Messenger, LLC // SPDX-License-Identifier: AGPL-3.0-only package signalservice; message CDSClientRequest { // Each ACI/UAK pair is a 32-byte buffer, containing the 16-byte ACI followed // by its 16-byte UAK. optional bytes aci_uak_pairs = 1; // Each E164 is an 8-byte big-endian number, as 8 bytes. optional bytes prev_e164s = 2; optional bytes new_e164s = 3; optional bytes discard_e164s = 4; // If true, the client has more pairs or e164s to send. If false or unset, // this is the client's last request, and processing should commence. optional bool has_more = 5; // If set, a token which allows rate limiting to discount the e164s in // the request's prev_e164s, only counting new_e164s. If not set, then // rate limiting considers both prev_e164s' and new_e164s' size. optional bytes token = 6; // After receiving a new token from the server, send back a message just // containing a token_ack. optional bool token_ack = 7; // Request that, if the server allows, both ACI and PNI be returned even // if the aci_uak_pairs don't match. optional bool return_acis_without_uaks = 8; } message CDSClientResponse { // Each triple is an 8-byte e164, a 16-byte PNI, and a 16-byte ACI. // If the e164 was not found, PNI and ACI are all zeros. If the PNI // was found but the ACI was not, the PNI will be non-zero and the ACI // will be all zeros. ACI will be returned if one of the returned // PNIs has an ACI/UAK pair that matches. // // Should the request be successful (IE: a successful status returned), // |e164_pni_aci_triple| will always equal |e164| of the request, // so the entire marshalled size of the response will be (2+32)*|e164|, // where the additional 2 bytes are the id/type/length additions of the // protobuf marshaling added to each byte array. This avoids any data // leakage based on the size of the encrypted output. optional bytes e164_pni_aci_triples = 1; // If the user has run out of quota for lookups, they will receive // a response with just the following field set, followed by a websocket // closure of type 4008 (RESOURCE_EXHAUSTED). Should they retry exactly // the same request after the provided number of seconds has passed, // we expect it should work. optional int32 retry_after_secs = 2; // A token which allows subsequent calls' rate limiting to discount the // e164s sent up in this request, only counting those in the next // request's new_e164s. optional bytes token = 3; }