 Donc, je présente un nouveau projet que j'ai commencé, qui s'appelle l'Ada KeyStore. Ma motivation pour cet projet était d'être capable de stocker des informations de sécurité sensibles, comme des connectants de database, de passwords, des paramètres sensibles d'un serveur d'AdaWeb. Et c'était ma main concern, d'être capable d'assurer que les files de configuration que j'utilise pour mon serveur soient safe et sécurisés, qui signifie que les passwords ne sont pas clairement visibles. Et puis, quand j'ai commencé cet projet, j'ai découvert que j'ai besoin d'un outil pour aussi aller plus loin et pouvoir stocker mon propre password et les accounts et stocker un document, un complet document, pour exemple, nous utilisons beaucoup le système cloud, Amazon, Google, mais ils ne sont pas safe. Et ce que j'ai voulu c'est d'être capable de stocker certains documents dans ce système cloud, et seulement stocker un document encrypted, mais ne pas stocker des clés d'encryption. Donc, j'ai implementé un système qui me permet de séparer le data qui est encrypté de la clé qui est utilisée pour encrypter le data. Et tout ceci est construit en Ada avec la libraire. Donc, la libraire peut être utilisée. Donc, ici, vous avez un exemple simple de la libraire. Donc, vous avez... C'est très simple. Vous avez juste une opération open où vous donnez le nom du file que vous voulez ouvrir. Et vous donnez un password. Et ici, c'est un exemple simple où vous créez un password. Le password, ici, est clairement disponible dans le code. Donc, ce n'est pas vraiment safe, mais c'est pour le purpose de l'exemple. Donc, avec ce petit subset d'Ada code, vous ouvrez le keystore, ce qui est secure. Et ensuite, vous pouvez obtenir la valeur qui est installée dans le keystore. Donc, ce qui est le keystore est juste un nom-value keystore pour que vous puissiez stocker tout. Donc, en Aida, nous pouvons très facilement avec ce schéma accéder à un password secure de l'Ada code. Un autre exemple est plus secure. Nous pouvons protéger le keystore en utilisant le GPG, ce qui signifie que le keystore est protégé par l'utilisateur privé. Donc, en ce cas, l'initialisation est presque similaire. C'est un petit peu complexe parce que pour le GPG, nous devons donner plus de contexte. Mais à la fin, quand vous ouvrez le keystore avec l'utilisateur secrète, vous avez le même API et vous pouvez récupérer l'information scientifique qui est installée dans le keystore. Donc, sur le top de le keystore, j'ai l'Ada keystore, qui est la libraire. J'ai rétellé le tool, qui est AKT. Donc, ce que le tool fait, c'est que c'est le document et les installe dans le file keystore. Et chaque document, en fait, est protégé par sa propre clé. Et tous les clés sont ensuite portés dans le keystore, qui est aussi protégé par un autre clé, qui est installé par l'utilisateur privé ou le GPG protégé. J'ai été inspiré par LUX, le système d'encryption disponible dans Linux. Donc, juste pour vous montrer un exemple, j'ai deux documents. Les deux documents sont split dans un fragment de data. Chaque fragment est autour de 4 kilobytes. Et chaque fragment, chaque fragment de data est encrypté par sa propre clé. Donc, ici c'est le premier document. J'ai trois clés d'encryption, et pour le deuxième document, j'ai deux fragments de data, donc deux clés d'encryption. Ces clés d'encryption sont associées avec un nom que j'ai donné à mon document. Et ils sont protégés par une clé directrice. Et puis la clé directrice est protégée par un bloc master qui est protégé par l'utilisateur privé ou par la clé de protection de la clé de protection. Le bloc master, en fait, peut être bloqué par des 7 clés qui vous permettent de bloquer le bloc master. Ce qui signifie que, comme sur Lux, vous pouvez définir plusieurs passwords pour pouvoir bloquer la clé store. Ce que nous pouvons faire avec le bloc de protection est de pouvoir partager la clé store avec plusieurs personnes. Vous créez la clé store et vous initialisez par le bloc de protection de chaque participant. Donc chaque participant aura sa propre clé de protection de la clé de protection et chaque participant va pouvoir bloquer la clé store par sa propre clé de protection privée. Et nous pouvons aller à 7 personnes. Donc, à la clé store, les files sont organisées dans les blocs. Donc, nous avons plusieurs blocs, des blocs de protection avec chaque bloc il y a des blocs de protection à la clé store, qui est une signature HMAC qui permet de faire sure que la clé store n'est pas corruptée et est signée par la clé store et par la signature que vous avez offert. Toutes les clés sont installées dans deux blocs, le bloc de protection et le bloc de protection qui contient les clés primaires pour bloquer la clé store donc vous avez 7 blocs qui vous permettent de bloquer la clé store. Et puis le bloc de direction contient ce qui nous dit quelles sont les noms dans la clé store et quelles sont les index et où sont les données à chaque des noms. Et puis les données sont installées dans des blocs séparés avec des fragments et des informations sur les fragments et chaque fragment est installé par sa propre clé qui est installée dans cette zone. Donc ce que nous pouvons faire c'est prendre le bloc data et le mettre dans la clé. Vous n'exposerez pas la clé store que l'on peut utiliser d'encrire les données sont en fait installées dans le bloc directeur qui vous pouvez séparer. Donc ce sont les algorithmes de la clé protection donc elle utilise AUS et HMIC 255 avec un base password qui est dérivéative ce sont les gpgs de la base password encryption ce sont les gpgs donc c'est chaque fois un nouveau algorithme ici vous avez les gpgs de la data puis vous avez les gpgs puis les gpgs des gpgs de la data bien, beaucoup de gpgs mais sur les gpgs que j'ai rapidement indiqué vous avez beaucoup de complexité en fait complexité en managant la clé store quand vous installez la data quand vous updatez la data quand vous voulez avoir un éclairage de la data j'ai voulu avoir un API safe et aussi pouvoir utiliser une encryption multi-task et une décryption pour tout le système. Donc tous ces sont nouveaux constraints pour la mutation. Donc maintenant je vais décrire un nombre de items qui m'aident à réussir dans ce projet. Donc j'ai utilisé les types limités pour décrire comment la clé secure est représentée. Donc ça veut dire que la clé secret en fait, quand c'est initialisé personne d'autre peut compter mon clé secret en fait, c'est important. La deuxième chose c'est que le contenu de clé secret est visible seulement dans le package d'encryption qui va utiliser et décrypter le contenu. Donc c'est une autre propriété d'adapte qui est importante. Et la dernière chose c'est le type secret contrôlant qui me permet de décrire le contenu de clé secret dès que le objectif est élevé. Donc ça veut dire que en termes de mémoire quand j'ai créé un clé secret je suis sûr que c'est élevé quand le objectif n'est plus nécessaire. Ça peut être étrange parce que le type sub est très commun. Il n'est pas nouveau à Ada qui m'a aidé signifiquement dans le projet. Au début j'ai utilisé 3 millimètres d'office pour compter les indexes. Donc j'ai des blocs et parfois je dois initialiser les blocs par exemple. Donc vous avez accès les blocs, les données à une position d'adapte. Alors bien sûr, à Ada si la position d'adapte est d'autres blocs mais dans mon cas la position d'adapte est compétue quelque part, peut-être dans d'autres tasks. Et quand l'exception est élevé à un endroit où vous utilisez vous ne savez pas pourquoi la compétition la calculation que vous avez faite est faite. En utilisant les types sub je pouvais être sûr que la construction de la position d'adapte de la position d'adapte de la position d'adapte d'un endroit où je fais des computations. Donc dans ce cas il s'est passé beaucoup de temps pour faire une erreur dans ce genre de compétition et donc avoir une exception à cette position où je fais des computations et pas à un endroit où je utilise. Une autre simple chose qui m'a aidé était les packages privées. Ça m'a aidé à faire... En bleu, j'ai les packages publics. Donc Keystore est le nom de la première packages. Donc elle a les files de l'enseignement. J'ai les passwords de l'enseignement de l'enseignement de l'enseignement Les packages de l'enseignement en bleu besojovent le API de Keystore. Et puis en bleu on a les packaged privées qui pointin身ages. Ce ce sont des packages privées qui ne peuvent pas être use à l'extérieur de l'application. Ce ce sont des packages nulles non publiques, donc qui ne peuvent pas être reuse sur l'équipe et en même dans l'un des applications Pour exemple, j'ai ce paket de représentation qui est responsable pour managir le contenu de la keystore avec des noms et des valeurs, donc il y a une représentation qui permet d'insérer des noms et d'entrer des noms une partie qui permet de managir les noms et une autre partie qui permet d'entrer et d'entrer des données Toutes ces packages sont privées, donc je suis sûr qu'il y a des refactories ou quelque chose que l'opération qui est dans ces packages ne peut pas être utilisée au-delà de ce programme C'est-à-dire que ça aide dans la décision de refactories parce que si vous voulez changer quelque chose autour de ces packages, organiser des packages, vous savez que l'impact sera limité J'ai aussi utilisé des pre-conditions, donc ça m'a aidé à définir les consignes de l'API Par exemple, j'ai une opération qui est contente, donc je peux définir les pre-conditions donc ça peut être utilisé seulement si le contenu est ouvert, vous ne pouvez pas vérifier si le contenu est ouvert, si il est ouvert, par exemple Et interne, j'ai utilisé aussi, j'ai utilisé pour garantir que j'ai eu plusieurs preuves j'ai eu plusieurs preuves quand j'ai fait des opérations les consignes ici sur l'objet sont vérifiées Les post-conditions, elles sont utilisées aussi pour clarifier un API Par exemple, j'ai eu un API interne qui est, non, un API public qui est des clés et cet API doit accomplir ce requin, ce qui est que les clés, les clés IV, les clés de signes qui sont out-paramètres, doivent rétablir une valeur qui est exactement cette ligne comme paramètre, comme valeur J'ai utilisé aussi des types protégés pour garantir que le contenu et toute l'opération d'insertation, l'opération de removal est multi-task safe En fait, en faisant ça avec AIDA, c'est très simple, en fait parce que cet objet s'occupe de toutes les structures d'interne qui sont nécessaires pour s'assurer les keystores et ce fait très facilement avec AIDA Les tasques sont utilisées pour la encryption et la décryption donc la bibliothèque, en soi-même, n'a pas créé des tasques mais ça vous permet de configurer un nombre de tasques avant-end et d'indiquer à la bibliothèque un nombre de tasques que la bibliothèque, la bibliothèque AIDA, peut utiliser pour décrypter et décrypter le contenu en parallèle Pour être très vite, c'est le processus de décryption Vous avez un trait qui veut, pour exemple, extracter un document qui est composé d'un nombre de tasques donc nous allons commencer par préparer des work queues et pour chaque work queue, nous allons indiquer à l'exécuteur des tasques le nombre de blocs que il doit décrypter un peu d'informations sur la clé, où sont les clés et il va mettre le travail dans l'exécuteur queues et puis l'un des tasques ici, il va décrypter le travail et en fait, il y a tout le processus de décryption les blocs, la décryption, la vérification de la signature HMAC et à la fin, il va mettre le résultat dans l'exécuteur queues alors qu'à la fin, nous devons décrypter les données dans l'exécuteur ce qui veut dire que les blocs ici sont procédés indépendamment de l'ordre que nous n'avons pas besoin mais quand nous voulons les lire, nous voulons réconcilier l'ordre de notre bloc, ce qui veut dire que nous voulons mettre le 1er bloc, le 2e bloc et tout ce qui est pourquoi il y a cette séquence queues donc, c'était difficile, le projet était difficile difficile parce que quand vous vous insèrez ou l'update, l'update d'insert et de rembourse de données est difficile parce que vous devez bouger les données dans les blocs et vous faites surement que les offsets sont corrects et quand vous regardez les données, parce qu'elles sont incriptes c'est random, donc c'est très difficile la langue en fait aide beaucoup pour faire surement que beaucoup d'erreurs sont préventées parce que la langue ok ok, donc, et selon cette complexité vous avez une simple API que vous pouvez utiliser merci la question est l'algorithme AES oui, j'ai lu l'algorithme AES non, non, non, non c'est complètement portable, c'est rendu en intel et en armes ok, la question est sur l'APG et la limitation sur les 7 blocs l'APG permet d'avoir plus d'obtenir ce nombre de blocs ok l'issue avec les 7 blocs est qu'on doit récupérer la clé de master et cette clé de master doit être incripte par quelque chose quelque chose est différent entre l'utilisateur 1, l'utilisateur 2 et l'utilisateur 3 c'est pourquoi c'est incripté par un autre contenu qui est en fait retiré par le GPG qui est retiré par la description de GPG faite par l'utilisateur privé vous avez dit que je pouvais partager ceci entre chaque utilisateur mais pour moi ce serait un peu de sécurité parce que ici je peux retirer par exemple, en utilisant différents blocs j'ai 3 utilisateurs, par exemple chaque des 3 utilisateurs a sa propre GPG je peux décider de redrawer l'accès d'un utilisateur par redrawer l'accès qui correspond à l'utilisateur je ne pourrais pas pouvoir le faire si j'ai utilisé les mêmes clés ici pour protéger ma clé de master oui la question est-ce que c'est disponible à l'aéroport? quand vous accédez ma clé l'idée d'utiliser les fragments de données c'est plus avant la parallelisation oui pourquoi utilisez-vous une autre clé pour chaque fragment? pourquoi utilisez-vous une autre clé pour chaque fragment? la question c'est la sécurité si j'ai une clé qui est installée, qui est gueste pour pouvoir décrypter les documents vous devez savoir toutes les clés pas seulement une pour moi c'est une meilleure sécurité pour avoir chaque fragment qui a sa propre clé aussi, une autre raison c'est si vous updatesz un document j'ai aussi créé une nouvelle clé pour la même raison si une clé est installée un jour et l'autre est installée créé une autre clé c'est seulement pour la sécurité et la dernière raison c'est que je n'aime pas que ces clés soient utilisées j'ai besoin de sécurité ma question c'est de s'assurer que j'ai mis beaucoup d'aspects de sécurité et c'est pourquoi j'ai utilisé Aida pour s'assurer que je n'ai pas de mémoire ou de buffer overflow pour réduire le scope de vulnérabilité en fait je sais que la question est comment je peux s'assurer que la finaise s'assure que la finaise s'assure que la finaise s'assure et que la finaise n'est pas optimisée c'est vrai que je ne fais pas le correct que possible dans la implementation je ne check mais je dois faire ce qui a été proposé dans Aida Europe en 2016 ou 17 il y a eu une présentation à Aida Europe longtemps avant qui explique comment faire la finaise et basiquement vous devez ajouter des contraintes volatiles quelque part dans la finaise pour protéger le compiler pour retirer le code mais je ne le fais pas point de langage si c'est un type de contrôle limité le compiler n'est pas allowed pour retirer la finaise mais vous devez protéger le compiler mais selon les règles du langage si c'est un type de contrôle limité il ne peut pas se faire mais le optimiste et le compiler ne peut pas décider que la finaise n'est pas utilisée pour protéger le code il n'y a pas de formule et il y a un bunch de tests sur l'edition 3 comment vous testez-vous ? si c'est un type de contrôle limité vous ne pouvez pas tester la finaise mais la finaise est allowed tu trophoires silencieux ou je révèle tous les programmes de la finaise la finaise la Ferrari, séquence et estab theology est par et c'est tenu oui je ne suis pas peu preocupé Filter du code on ne parle pas de modules on ne parle pas de cartes opklogs mais les tests du test sont exercés oui nulle�ment Il y a des extra-characters à l'endroit d'un buffer. Et quand le programme termine, il faut vérifier que le régime resultant a exactement l'une de l'explication de l'explication. Vous pouvez juste dire d'autres. Ou vous dites bouillons, des variables globales, il y a plein de choses. Je vous remercie d'un papier. La question est, est-ce possible d'utiliser un pool de storage séparé ? Oui, c'est une bonne question. En fait, le tool AKT, en fait, vous permet d'utiliser un store séparé par couper ces files et d'avoir des blocs de data dans plusieurs files. Je suis désolé, je dois y aller. Donc oui, vous pouvez le faire.