Skip to content

Chaine de signatures

Définition

Une chaîne de signature est une série de blocs ordonnés chacun composé d'une transaction et sa signature.

  • Chaque transaction contient une opération, ainsi que sa position dans chaîne, son timestamp de création et le hash de la transaction précédente.
  • Chaque signature de bloc contient le hash de la transaction associée, et la signature de ce hash.

Objectifs

Chaque compte d'utilisateur est associé à une chaîne de signatures, dans laquelle sont consignées toutes les opérations concernant les clés de ce compte. Cela permet à n'importe quel utilisateur de vérifier l'intégrité des clés de n'importe quel compte, sans avoir à faire confiance à une tierce partie. Ainsi, même si Seald est un jour compromis, l'intégrité des comptes utilisateurs est protégée.

Protocole

Chaque bloc de la chaîne de signature Seald est composé d'une transaction, d'une signature, et éventuellement d'informations supplémentaires. La fonction de hachage utilisée pour la chaîne de signature est la fonction SHA-256. Chaque transaction contient une opération, qui peut être l'ajout, le renouvellement, ou la révocation d'une clé. Les clés ont une durée de validité. Cette durée est de cinq ans maximum. Par défaut, Seald utilise une durée de validité de trois ans.

La chaîne de signature est initialisée dès que le compte est créé. Une transaction est créée à la position 0, contenant une opération d'ajout de clés, et doit être signée par la clé de signature de l'appareil ajouté.

Les transactions suivantes peuvent être l'ajout ou la révocation d'un appareil, ou le renouvellement de la paire de clés de privée d'un appareil. L'ajout et le renouvellement doivent être signés par une clé déjà enregistrée dans la chaîne, et en cours de validité.

Lors d'un ajout ou du renouvellement de clés, la clé publique de signature doit être fournie en entier, encodée en base64, dans la partie "extras" du bloc.

Les opérations de révocation peuvent ne pas être signées si elles sont réalisées par un administrateur de l'équipe, ou par le serveur Seald (en cas d'expiration par exemple).

Transaction

Une transaction est composée de deux parties : les propriétés de la transaction dans la chaîne de signature, et l'opération sur les clés.

Proprietés

Les propriétés d'une transaction sont :

  • position : la position dans la chaîne.
  • previous_hash : le hash de la transaction précédente.
  • created_at : le timestamp de création de la transaction, en secondes depuis l'époque UNIX.
  • expire_at : le timestamp d'expiration de la paire de clé, en secondes depuis l'époque UNIX.
  • signer :
    • user : L'identifiant du signataire.
    • device_id : L'identifiant de la clé utilisée pour signer.

Opération

Une opération est composée de :

  • type : le type d'opération, parmi "creation", "renewal" et "revocation".
  • device :
    • id : l'identifiant de la clé concernée par l'opération.
    • encryption_pubkey_hash : Le hash de la clé publique de chiffrement concernée.
    • signing_pubkey_hash : Le hash de la clé publique de signature concernée.

Signature

  • protocol : le protocole de signature.
  • hash : le hash de la transaction associée.
  • signature : La signature du hash, par la clé précisée dans les propriétés de la transaction.

Example de bloc

json
{
  "transaction": {
    "properties": {
      "position": {"type": "integer"},
      "previous_hash": {"type": "string"},
      "timestamp": {"type": "string"},
      "signer": {
        "user": {"type": "string"},
        "device_id": {"type": "string"}
      },
      "created_at": {"type": "integer"},
      "expire_at": {"type": "integer"},
      "operation": {
        "type": {"type": "string", "enum": ["creation", "renewal", "revocation"]},
        "device": {
          "id": {"type": "string"},
          "encryption_pubkey_hash": {"type": "string"},
          "signing_pubkey_hash": {"type": "string"}
        }
      }
    }
  },
  "signature": {
    "protocol": {"type": "string"},
    "hash": {"type": "string"},
    "signature": {"type": "string"}
  },
  "extras": {
    "pubkeys": {"type": "string"}
  }
}
{
  "transaction": {
    "properties": {
      "position": {"type": "integer"},
      "previous_hash": {"type": "string"},
      "timestamp": {"type": "string"},
      "signer": {
        "user": {"type": "string"},
        "device_id": {"type": "string"}
      },
      "created_at": {"type": "integer"},
      "expire_at": {"type": "integer"},
      "operation": {
        "type": {"type": "string", "enum": ["creation", "renewal", "revocation"]},
        "device": {
          "id": {"type": "string"},
          "encryption_pubkey_hash": {"type": "string"},
          "signing_pubkey_hash": {"type": "string"}
        }
      }
    }
  },
  "signature": {
    "protocol": {"type": "string"},
    "hash": {"type": "string"},
    "signature": {"type": "string"}
  },
  "extras": {
    "pubkeys": {"type": "string"}
  }
}