[PD1] Fixed checking certificate NotAfter and NotBefore dates

This commit is contained in:
Afonso Franco 2024-04-28 23:55:03 +01:00
parent 4ea8315aed
commit 91bc887ba5
Signed by: afonso
SSH key fingerprint: SHA256:aiLbdlPwXKJS5wMnghdtod0SPy8imZjlVvCyUX9DJNk
4 changed files with 38 additions and 6 deletions

View file

@ -88,11 +88,16 @@ Tendo em consideração as vulnerabilidades e ameaças identificadas na análise
- A assinatura é anexada ao texto limpo e esse conjunto é cifrado com uma chave de sessão gerada aleatoriamente.
- A chave de sessão é cifrada com a chave pública do destinatário, Isso garante que apenas o destinatário possa decifrar a mensagem.
1. **Visualização de Mensagens**
1. **Visualização da Lista de Mensagens Não Lidas**
- Quando um cliente solicita a sua lista de mensagens não lidas, apenas o assunto é enviado, não o conteúdo cifrado.
- O cliente deve decifrar o assunto para visualizá-lo.
1. **Visualização de Mensagens**
- Quando um cliente solicita uma mensagem, é enviado o conteúdo todo da mensagem.
- O cliente deve decifrar o assunto e o corpo da mensagem para visualizá-los.
1. **Troca de Chaves Públicas**
- Quando um cliente precisa da chave pública de outro cliente, solicita o certificado desse cliente ao servidor.

View file

@ -235,7 +235,7 @@ func (ds DataStore) storeUserCertIfNotExists(uid string, cert x509.Certificate)
`
_, err := ds.db.Exec(insertQuery, uid, cert.Raw)
if err != nil {
return fmt.Errorf("Error storing user certificate for UID %s: %v\n", uid, err)
return fmt.Errorf("error storing user certificate for UID %s: %v", uid, err)
}
log.Printf("User certificate for UID %s stored successfully.\n", uid)
return nil

View file

@ -9,6 +9,7 @@ import (
"crypto/x509"
"encoding/binary"
"errors"
"time"
"log"
"os"
@ -85,6 +86,13 @@ func (k KeyStore) CheckCert(cert *x509.Certificate, uid string) error {
return err
}
if cert.NotAfter.Before(time.Now()) {
return errors.New("certificate has expired")
}
if cert.NotBefore.After(time.Now()) {
return errors.New("certificate is not valid yet")
}
//Check if the pseudonym field is set to UID
oidMap := ExtractAllOIDValues(cert)
if oidMap["2.5.4.65"] != uid {
@ -129,6 +137,14 @@ func (k *KeyStore) GetServerTLSConfig() *tls.Config {
if err != nil {
return err
}
if cert.NotAfter.Before(time.Now()) {
return errors.New("certificate has expired")
}
if cert.NotBefore.After(time.Now()) {
return errors.New("certificate is not valid yet")
}
// Check if the certificate is signed by the specified CA
_, err = cert.Verify(opts)
if err != nil {
@ -160,6 +176,13 @@ func (k *KeyStore) GetClientTLSConfig() *tls.Config {
if err != nil {
return err
}
if cert.NotAfter.Before(time.Now()) {
return errors.New("certificate has expired")
}
if cert.NotBefore.After(time.Now()) {
return errors.New("certificate is not valid yet")
}
oidMap := ExtractAllOIDValues(cert)
// Check if the certificate is signed by the specified CA

View file

@ -32,19 +32,23 @@ func (s *Server[T]) ListenLoop() {
for {
listenerConn, err := s.listener.Accept()
if err != nil {
log.Fatalln("Server could not accept connection")
log.Println("Server could not accept connection")
continue
}
tlsConn, ok := listenerConn.(*tls.Conn)
if !ok {
log.Fatalln("Connection is not a TLS connection")
log.Println("Connection is not a TLS connection")
continue
}
if err := tlsConn.Handshake(); err != nil {
log.Fatalln(err)
log.Println(err)
continue
}
state := tlsConn.ConnectionState()
if len(state.PeerCertificates) == 0 {
log.Fatalln("Client did not provide a certificate")
log.Println("Client did not provide a certificate")
continue
}
conn := NewConnection[T](tlsConn)
s.C <- conn