Architecture du SDK
Ce document presente l'architecture et les concepts fondamentaux du Secure Exchanges SDK.
Vue d'ensemble
+---------------------+ +------------------------+
| Votre Application | | Secure Exchanges |
| | | Cloud |
| +---------------+ | | +------------------+ |
| | SecureExch. | | <=> | | API REST/SOAP | |
| | SDK | | | +------------------+ |
| | (Chiffrement | | | +------------------+ |
| | cote client) | | | | Stockage | |
| +---------------+ | | | (Donnees | |
| | Signature SDK | | | | chiffrees | |
| +---------------+ | | | uniquement) | |
+---------------------+ | +------------------+ |
+------------------------+
Principes de securite
Architecture Zero-Knowledge
IMPORTANT : Secure Exchanges n'a JAMAIS acces aux cles de chiffrement ni au contenu de vos messages.
Le SDK implemente une architecture "Zero-Knowledge" :
- Le chiffrement s'effectue cote client (dans le SDK, sur votre serveur)
- Les cles ne quittent jamais votre environnement en clair
- Secure Exchanges stocke uniquement des donnees deja chiffrees
- Seuls l'expediteur et le destinataire peuvent dechiffrer le contenu
+------------------+ +------------------+
| EXPEDITEUR | | DESTINATAIRE |
| | | |
| 1. Genere cle AES| | |
| 2. Chiffre msg | Donnees chiffrees | 5. Recoit cle |
| 3. Chiffre cle | ===================> | chiffree |
| pour destinat.| (illisibles pour | 6. Dechiffre cle |
| 4. Envoie | Secure Exchanges) | 7. Dechiffre msg |
+------------------+ +------------------+
|
+------------------+
| SECURE EXCHANGES |
| |
| Stocke UNIQUEMENT|
| des donnees |
| chiffrees |
| (ne peut pas les |
| lire) |
+------------------+
Chiffrement de bout en bout (E2E)
Le SDK utilise un systeme de chiffrement hybride :
- AES-256 pour le chiffrement des donnees (symetrique) - genere cote client
- RSA pour l'echange securise des cles (asymetrique)
- SHA-512 pour la verification d'integrite
// Exemple : Generation de cles AES (cote client uniquement)
var keys = CryptoHelper.GenerateAESKeys();
// keys.Key : Cle AES 256 bits (reste sur votre serveur)
// keys.IV : Vecteur d'initialisation 128 bits
Flux de chiffrement d'un message
COTE CLIENT (Votre application)
================================
1. Generation cles AES (expediteur) --> Cle generee localement
|
v
2. Chiffrement du message avec AES --> Message chiffre localement
|
v
3. Chiffrement de la cle AES avec RSA (cle publique destinataire)
TRANSIT VERS SECURE EXCHANGES
================================
4. Envoi : {message_chiffre, cle_AES_chiffree}
--> Secure Exchanges recoit UNIQUEMENT des donnees chiffrees
--> Secure Exchanges ne possede PAS la cle privee pour dechiffrer
COTE DESTINATAIRE
================================
5. Dechiffrement cle AES avec RSA (cle privee destinataire)
|
v
6. Dechiffrement message avec AES --> Message lisible uniquement par le destinataire
Structure des namespaces
SecureExchangesSDK
SecureExchangesSDK
├── Helpers/ # Classes principales d'operation
│ ├── MessageHelper # Envoi/reception de messages
│ ├── CryptoHelper # Operations cryptographiques
│ ├── SignHelper # Signatures numeriques
│ ├── LicenceHelper # Gestion des licences
│ ├── MessengingHelper # Workflows SESAR
│ ├── LogsHelper # Journalisation
│ ├── FileHelper # Operations fichiers
│ ├── ContactHelper # Gestion contacts
│ ├── EmailHelper # Validation emails
│ ├── PhoneHelper # Validation telephones
│ └── SerializationHelper # JSON/XML
│
├── Models/
│ ├── Args/ # Parametres d'entree (56 classes)
│ │ ├── MutliRecipientArgs
│ │ ├── GetMessageArgs
│ │ ├── GetEnveloppeArgs
│ │ └── ...
│ │
│ ├── Answer/ # Reponses (24 classes)
│ │ ├── BaseAnswer
│ │ ├── MultiRecipientAnswer
│ │ ├── GetMessageResponse
│ │ └── ...
│ │
│ ├── Entity/ # Entites metier (31 classes)
│ │ ├── RecipientInfo
│ │ ├── FileArgs
│ │ ├── Licence
│ │ └── ...
│ │
│ ├── Transport/ # DTOs (46 classes)
│ │ ├── SecureExchangesMessage
│ │ ├── Keys
│ │ ├── FileMetaData
│ │ └── ...
│ │
│ └── Contract/ # Interfaces (14 interfaces)
│ ├── IEndPointConfiguration
│ └── ...
│
└── CallBack/ # Callbacks asynchrones
├── ISecureExchangesCallBack
└── CallBackObject
SecureExchangesSignatureSDK
SecureExchangesSignatureSDK
├── Helpers/
│ └── PkiFileHelper # Certification PDF avec PKI
│
└── Models/
├── Args/
│ └── CertifyPdfArgs # Parametres de certification
├── Transport/
│ └── ZoneDetails # Details des zones de signature
└── Factory/
└── ZoneDetailsFactory # Creation de zones
Classes principales
MessageHelper
Point d'entree principal pour l'envoi et la reception de messages.
public static class MessageHelper
{
// Envoyer a plusieurs destinataires
public static MultiRecipientAnswer MultiRecipientMessage(MutliRecipientArgs args);
// Recuperer un message
public static GetMessageResponse GetMessage(GetMessageArgs args);
// Creer une enveloppe de reponse
public static GetEnveloppeResponse GetEnveloppe(GetEnveloppeArgs args);
// Parser un lien Secure Exchanges
public static SecureExchangesMessage GetSecureExchangesMessageFromLink(string link);
}
CryptoHelper
Operations cryptographiques centralisees.
public static class CryptoHelper
{
// Generation de cles
public static Keys GenerateAESKeys();
public static byte[] GenerateSecureRandomByteArray(int length);
// Chiffrement/Dechiffrement
public static byte[] EncryptBinary(byte[] data, byte[] key, byte[] iv);
public static byte[] DecryptBinary(byte[] data, byte[] key, byte[] iv);
// Chiffrement fichiers
public static bool EncryptSecfFile(string path, byte[] key, byte[] iv);
public static bool DecryptSecfFile(string path, byte[] key, byte[] iv);
// Hachage
public static string GetSHA512OfFile(string path);
public static string GetSHA512HashOfBytes(byte[] data);
public static string GetMD5HashOfFile(string path);
// RSA
public static byte[] EncryptRSAContent(string xmlPublicKey, string content);
public static string DecryptRSAContentToString(string xmlPrivateKey, byte[] data, bool useOAEP);
}
SignHelper
Gestion des zones de signature electronique et validation de l'integrite des documents.
public static class SignHelper
{
// Helpers de creation de zones
public static SignZoneDetails CreateSignatureZone(string fieldName, int page,
float x, float y, float width, float height,
float pageWidth, float pageHeight, bool required = true);
public static SignZoneDetails CreateTextZone(string fieldName, int page,
float x, float y, float width, float height,
float pageWidth, float pageHeight,
string defaultValue = "", float fontSize = 12, bool required = true);
public static SignZoneDetails CreateDateZone(string fieldName, int page,
float x, float y, float width, float height,
float pageWidth, float pageHeight,
string dateFormat = "yyyy-MM-dd", bool required = true);
public static SignZoneDetails CreateCheckboxZone(string fieldName, int page,
float x, float y, float size,
float pageWidth, float pageHeight,
bool isChecked = false, bool required = false);
public static SignZoneDetails CreateInitialsZone(string fieldName, int page,
float x, float y, float width, float height,
float pageWidth, float pageHeight, bool required = true);
// Conversion de templates de zones
public static Dictionary<RecipientInfo, List<FileZoneDefinition>> AddFileZoneDefToRecipientIndex(
Dictionary<RecipientInfo, List<FileZoneDefinition>> recipientIndex,
IEnumerable<SignTemplateRecipient> templateZones,
string SHA512,
params KeyValuePair<string, RecipientInfo>[] recipientsMatch);
// Gestion des zones par destinataire
public static List<RecipientZoneDefinition> ConvertRecipientIndexToList(
Dictionary<RecipientInfo, List<FileZoneDefinition>> recipientIndex);
public static List<RecipientZoneDefinition> ConcatRecipientZoneDefinitionLists(
List<RecipientZoneDefinition> list1, List<RecipientZoneDefinition> list2);
// Validation de document
public static ValidateDocumentSignatureIntegrityResponse ValidateDocumentSignatureIntegrity(
ValidateDocumentSignatureIntegrity_args args);
// Token de certification PKI
public static GetCertificationTokenResponse GetCertificationToken(
GetCertificationTokenSDKArgs args, CertificationMetadata metadata = null);
}
Modeles de donnees cles
MutliRecipientArgs
Arguments pour l'envoi de messages multi-destinataires.
var args = new MutliRecipientArgs(
endPointConfigurationName, // Configuration endpoint
serial, // Numero de serie licence
apiUser, // Identifiant API
apiPassword, // Mot de passe API
recipients, // Liste RecipientInfo
message, // Corps du message (HTML)
subject, // Sujet
password, // Mot de passe (optionnel)
binaryFiles, // Fichiers en memoire
sendMethod, // Email, SMS, ou hybride
sendByMyOwnSMTPServer, // Utiliser SMTP propre
showSubject, // Afficher le sujet
getNotify, // Notification a l'ouverture
culture, // fr-CA ou en-CA
maxOpeningTime, // Nombre max d'ouvertures
expirationMinutes // Duree de validite
);
// Proprietes additionnelles
args.FilesPath = new List<string>(); // Chemins de fichiers
args.FileToSign = new List<SignFilesRequired>(); // Fichiers a signer
args.CallBackParameters = "..."; // Parametres callback
MultiRecipientAnswer
Reponse apres envoi de message.
public class MultiRecipientAnswer : BaseAnswer
{
public int Status { get; set; } // Code statut (200 = succes)
public string Data { get; set; } // Message d'erreur si echec
public List<RecipientAnswer> RecipientsAnswer { get; set; }
}
public class RecipientAnswer
{
public SendMessageAnswer Answer { get; set; }
}
public class SendMessageAnswer
{
public int Status { get; set; }
public string URL { get; set; } // Lien du message
public string HtmlMsg { get; set; } // HTML de notification
public string DefaultOpeningCode { get; set; } // Code d'ouverture
}
Flux de travail typiques
Envoi simple
Application -> MutliRecipientArgs -> MessageHelper.MultiRecipientMessage()
|
v
MultiRecipientAnswer
|
v
URL du message
Envoi avec signature
1. Preparer fichiers PDF
|
v
2. Creer zones de signature avec SignHelper
|
v
3. Configurer MutliRecipientArgs avec FileToSign
|
v
4. Envoyer avec MessageHelper.MultiRecipientMessage()
|
v
5. Destinataire signe via interface web
|
v
6. Recuperer document signe via callback ou API
Workflow SESAR (Messenging)
1. InitializeSesar() - Initialiser la session
|
v
2. CreateRestoreRequest() - Creer demande de restauration
|
v
3. GetMessenging() - Recuperer les messages
|
v
4. Traiter les callbacks chiffres
Configuration de l'endpoint
// Utilisation de l'environnement de production
Uri endpoint = new Uri("https://www.secure-exchanges.com/_api/0217/0217.asmx");
var args = new MutliRecipientArgs(endpoint, serial, apiUser, apiPassword, ...);