feat: implement end-to-end encryption for chat messages and files, including key management and decryption functionality; enhance chat components to support encrypted content display

This commit is contained in:
2025-12-09 01:31:09 -03:00
parent cae6d886de
commit e6f380d7cc
14 changed files with 1443 additions and 203 deletions

View File

@@ -23,12 +23,16 @@ export const chatTables = {
conversaId: v.id('conversas'),
remetenteId: v.id('usuarios'),
tipo: v.union(v.literal('texto'), v.literal('arquivo'), v.literal('imagem')),
conteudo: v.string(), // texto ou nome do arquivo
conteudoBusca: v.optional(v.string()), // versão normalizada para busca
conteudo: v.string(), // texto ou nome do arquivo (pode ser criptografado)
conteudoBusca: v.optional(v.string()), // versão normalizada para busca (não criptografada se mensagem for E2E)
arquivoId: v.optional(v.id('_storage')),
arquivoNome: v.optional(v.string()),
arquivoTamanho: v.optional(v.number()),
arquivoTipo: v.optional(v.string()),
// Campos para criptografia E2E
criptografado: v.optional(v.boolean()), // Indica se a mensagem está criptografada
iv: v.optional(v.string()), // Initialization Vector (base64) para descriptografia
keyId: v.optional(v.string()), // Identificador da chave usada para criptografar
linkPreview: v.optional(
v.object({
url: v.string(),
@@ -169,5 +173,17 @@ export const chatTables = {
atualizadoEm: v.number()
})
.index('by_usuario_conversa', ['usuarioId', 'conversaId'])
.index('by_conversa', ['conversaId'])
.index('by_conversa', ['conversaId']),
// Chaves de Criptografia E2E por Conversa
chavesCriptografia: defineTable({
conversaId: v.id('conversas'),
chaveCompartilhada: v.string(), // Chave criptografada compartilhada (base64)
keyId: v.string(), // Identificador único da chave
criadoPor: v.id('usuarios'), // Usuário que criou/compartilhou a chave
criadoEm: v.number(),
ativo: v.boolean() // Se a chave está ativa (permite rotação de chaves)
})
.index('by_conversa', ['conversaId', 'ativo'])
.index('by_key_id', ['keyId'])
};