This file is indexed.

/usr/include/signal/group_cipher.h is in libsignal-protocol-c-dev 2.3.1+git20171007-3.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#ifndef GROUP_CIPHER_H
#define GROUP_CIPHER_H

#include <stdint.h>
#include <stddef.h>
#include "signal_protocol_types.h"

#ifdef __cplusplus
extern "C" {
#endif

/*
 * The main entry point for Signal Protocol group encrypt/decrypt operations.
 *
 * Once a session has been established with group_session_builder and a
 * sender_key_distribution_message has been distributed to each member of
 * the group, this class can be used for all subsequent encrypt/decrypt
 * operations within that session (i.e. until group membership changes).
 */

/**
 * Construct a group cipher for encrypt/decrypt operations.
 *
 * The store and global contexts must remain valid for the lifetime of the
 * group cipher.
 *
 * When finished, free the returned instance by calling group_cipher_free().
 *
 * @param cipher set to a freshly allocated group cipher instance
 * @param store the signal_protocol_store_context to store all state information in
 * @param sender_key_id the sender that messages will be encrypted to or decrypted from
 * @param global_context the global library context
 * @return 0 on success, or negative on failure
 */
int group_cipher_create(group_cipher **cipher,
        signal_protocol_store_context *store, const signal_protocol_sender_key_name *sender_key_id,
        signal_context *global_context);

/**
 * Set the optional user data pointer for the group cipher.
 *
 * This is to give callback functions a way of accessing app specific
 * context information for this cipher.
 */
void group_cipher_set_user_data(group_cipher *cipher, void *user_data);

/**
 * Get the optional user data pointer for the group cipher.
 *
 * This is to give callback functions a way of accessing app specific
 * context information for this cipher.
 */
void *group_cipher_get_user_data(group_cipher *cipher);

/**
 * Set the callback function that is called during the decrypt process.
 *
 * The callback function is called from within group_cipher_decrypt() after
 * decryption is complete but before the updated session state has been
 * committed to the session store. If the callback function returns a
 * negative value, then the decrypt function will immediately fail with
 * an error.
 *
 * This a callback allows some implementations to store the committed plaintext
 * to their local message store first, in case they are concerned with a crash
 * or write error happening between the time the session state is updated but
 * before they're able to successfully store the plaintext to disk.
 *
 * @param callback the callback function to set
 * @param user_data user data pointer provided to the callback
 */
void group_cipher_set_decryption_callback(group_cipher *cipher,
        int (*callback)(group_cipher *cipher, signal_buffer *plaintext, void *decrypt_context));

/**
 * Encrypt a message.
 *
 * @param padded_message The plaintext message bytes, optionally padded to a constant multiple.
 * @param padded_message_len The length of the data pointed to by padded_message
 * @param encrypted_message Set to a ciphertext message encrypted to the group+sender+device tuple.
 *
 * @retval SG_SUCCESS Success
 * @retval SG_ERR_NO_SESSION if there is no established session for this contact.
 * @retval SG_ERR_INVALID_KEY if there is no valid private key for this session.
 */
int group_cipher_encrypt(group_cipher *cipher,
        const uint8_t *padded_plaintext, size_t padded_plaintext_len,
        ciphertext_message **encrypted_message);

/**
 * Decrypt a message.
 *
 * @param ciphertext The sender_key_message to decrypt.
 * @param decrypt_context Optional context pointer associated with the
 *   ciphertext, which is passed to the decryption callback function
 * @param plaintext Set to a newly allocated buffer containing the plaintext.
 *
 * @retval SG_SUCCESS Success
 * @retval SG_ERR_INVALID_MESSAGE if the input is not valid ciphertext.
 * @retval SG_ERR_DUPLICATE_MESSAGE if the input is a message that has already been received.
 * @retval SG_ERR_LEGACY_MESSAGE if the input is a message formatted by a protocol version that
 *                               is no longer supported.
 * @retval SG_ERR_NO_SESSION if there is no established session for this contact.
 */
int group_cipher_decrypt(group_cipher *cipher,
        sender_key_message *ciphertext, void *decrypt_context,
        signal_buffer **plaintext);

void group_cipher_free(group_cipher *cipher);

#ifdef __cplusplus
}
#endif

#endif /* GROUP_CIPHER_H */