--- /dev/null
+bin/
+obj/
+
+# Tex
+*.log
+*.aux
+*.bbl
+*.blg
+*.dvi
+*.backup
--- /dev/null
+\r
+Microsoft Visual Studio Solution File, Format Version 12.00\r
+# Visual Studio 2012\r
+Project("{4925A630-B079-445d-BCD4-3A9C94FE9307}") = "labo2-fsharp", "labo2-fsharp\labo2-fsharp.fsproj", "{CDB168EA-04F9-4A8B-A3B4-27D9A6390269}"\r
+EndProject\r
+Global\r
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution\r
+ Debug|x86 = Debug|x86\r
+ Release|x86 = Release|x86\r
+ EndGlobalSection\r
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution\r
+ {CDB168EA-04F9-4A8B-A3B4-27D9A6390269}.Debug|x86.ActiveCfg = Debug|x86\r
+ {CDB168EA-04F9-4A8B-A3B4-27D9A6390269}.Debug|x86.Build.0 = Debug|x86\r
+ {CDB168EA-04F9-4A8B-A3B4-27D9A6390269}.Release|x86.ActiveCfg = Release|x86\r
+ {CDB168EA-04F9-4A8B-A3B4-27D9A6390269}.Release|x86.Build.0 = Release|x86\r
+ EndGlobalSection\r
+ GlobalSection(MonoDevelopProperties) = preSolution\r
+ StartupItem = labo2-fsharp\labo2-fsharp.fsproj\r
+ EndGlobalSection\r
+EndGlobal\r
--- /dev/null
+<Properties>
+ <MonoDevelop.Ide.Workspace ActiveConfiguration="Debug|x86" />
+ <MonoDevelop.Ide.Workbench ActiveDocument="labo2-fsharp/Program.fs">
+ <Files>
+ <File FileName="labo2-fsharp/Program.fs" Line="34" Column="34" />
+ <File FileName="labo2-fsharp/Crypto.fs" Line="105" Column="105" NotebookId="1" />
+ </Files>
+ </MonoDevelop.Ide.Workbench>
+ <MonoDevelop.Ide.DebuggingService.Breakpoints>
+ <BreakpointStore />
+ </MonoDevelop.Ide.DebuggingService.Breakpoints>
+ <MonoDevelop.Ide.DebuggingService.PinnedWatches />
+</Properties>
\ No newline at end of file
--- /dev/null
+module Labo2.AssemblyInfo
+open System.Reflection
+open System.Runtime.CompilerServices
+
+
+[<assembly: AssemblyTitle("labo2-fsharp")>]
+[<assembly: AssemblyDescription("")>]
+[<assembly: AssemblyConfiguration("")>]
+[<assembly: AssemblyCompany("")>]
+[<assembly: AssemblyProduct("")>]
+[<assembly: AssemblyCopyright("gburri")>]
+[<assembly: AssemblyTrademark("")>]
+
+// The assembly version has the format {Major}.{Minor}.{Build}.{Revision}
+
+[<assembly: AssemblyVersion("1.0.0.0")>]
+
+//[<assembly: AssemblyDelaySign(false)>]
+//[<assembly: AssemblyKeyFile("")>]
+
+()
+
--- /dev/null
+module Labo2.Crypto
+
+open System.Security.Cryptography
+open System.IO
+
+type Key = string
+type Data = byte[]
+
+let rsaKeySize = 2048
+
+let generate256Key : Key =
+ null
+
+/// Generate a new RSA key pair: (public * private).
+let generateRSAKeysPair : Key * Key =
+ use rsa = new RSACryptoServiceProvider (rsaKeySize)
+ try
+ rsa.ToXmlString false, rsa.ToXmlString true
+ finally
+ rsa.PersistKeyInCsp <- false
+
+let encryptRSA (publicKey : Key) (plaindata : Data) : Data =
+ use rsa = new RSACryptoServiceProvider (rsaKeySize)
+ try
+ rsa.FromXmlString publicKey
+ rsa.Encrypt (plaindata, false) // Uses PKCS#1 v1.5 padding.
+ finally
+ rsa.PersistKeyInCsp <- false
+
+let decryptRSA (privateKey : Key) (cipherdata : Data) : Data =
+ use rsa = new RSACryptoServiceProvider (rsaKeySize)
+ try
+ rsa.FromXmlString privateKey
+ rsa.Decrypt (cipherdata, false) // Uses PKCS#1 v1.5 padding.
+ finally
+ rsa.PersistKeyInCsp <- false
+
+/// Produces a signature from a given hash.
+let signRSA (privKey : Key) (sha256 : Data) : Data =
+ use rsa = new RSACryptoServiceProvider (rsaKeySize)
+ try
+ rsa.FromXmlString privKey
+ rsa.SignHash (sha256, CryptoConfig.MapNameToOID "SHA256")
+ finally
+ rsa.PersistKeyInCsp <- false
+
+/// Verify a signature against a given hash.
+let verifySignRSA (pubKey : Key) (sha256 : Data) (signature : Data) : bool =
+ use rsa = new RSACryptoServiceProvider (rsaKeySize)
+ try
+ rsa.FromXmlString pubKey
+ rsa.VerifyHash (sha256, CryptoConfig.MapNameToOID "SHA256", signature)
+ finally
+ rsa.PersistKeyInCsp <- false
+
+let decryptAES (key : Key) (inputStream : Stream) (outputStream : Stream) =
+ ()
+
+open System.Text
+
+let testRSA = lazy (
+ let kpub, kpriv = generateRSAKeysPair
+ let plaintext = "Hello, World!"
+ printfn "plaintext: %A" plaintext
+ let cipherdata = encryptRSA kpub (Encoding.UTF8.GetBytes plaintext)
+ printfn "cipherdata: (size: %A) %A" cipherdata.Length cipherdata
+ let decryptedData = decryptRSA kpriv cipherdata
+ let decryptedText = Encoding.UTF8.GetString decryptedData
+ printfn "decryptedtext: %A" decryptedText
+ assert (plaintext = decryptedText)
+ printfn "testRSA OK"
+ )
+
+let testRSASignature = lazy (
+ let kpub, kpriv = generateRSAKeysPair
+ let plaintext = "Hello, World!"
+ let sha256 = new SHA256Managed ()
+ let signature = signRSA kpriv (sha256.ComputeHash (Encoding.UTF8.GetBytes plaintext))
+ assert verifySignRSA kpub (sha256.ComputeHash (Encoding.UTF8.GetBytes plaintext)) signature
+ assert not (verifySignRSA kpub (sha256.ComputeHash (Encoding.UTF8.GetBytes "Hello!")) signature)
+ printfn "testRSASignature OK"
+ )
\ No newline at end of file
--- /dev/null
+(*
+Crypto - Labo n°2.
+*)
+
+module Labo2.Main
+
+open System
+open Crypto
+
+[<EntryPoint>]
+let main args =
+ printfn "Labo n°2"
+
+ if Array.exists ((=) "tests") args then
+ testRSA.Force ()
+ testRSASignature.Force ()
+ 0
--- /dev/null
+<?xml version="1.0" encoding="utf-8"?>\r
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">\r
+ <PropertyGroup>\r
+ <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>\r
+ <Platform Condition=" '$(Platform)' == '' ">x86</Platform>\r
+ <ProjectGuid>{CDB168EA-04F9-4A8B-A3B4-27D9A6390269}</ProjectGuid>\r
+ <OutputType>Exe</OutputType>\r
+ <RootNamespace>labo2fsharp</RootNamespace>\r
+ <AssemblyName>labo2-fsharp</AssemblyName>\r
+ <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|x86' ">\r
+ <DebugSymbols>true</DebugSymbols>\r
+ <DebugType>full</DebugType>\r
+ <OutputPath>bin\Debug</OutputPath>\r
+ <DefineConstants>DEBUG</DefineConstants>\r
+ <ErrorReport>prompt</ErrorReport>\r
+ <PlatformTarget>x86</PlatformTarget>\r
+ <Externalconsole>true</Externalconsole>\r
+ <Optimize>false</Optimize>\r
+ <Tailcalls>false</Tailcalls>\r
+ <EnvironmentVariables>\r
+ <EnvironmentVariables>\r
+ <Variable name="MONO_TRACE_LISTENER" value="Console.Error" />\r
+ </EnvironmentVariables>\r
+ </EnvironmentVariables>\r
+ <Commandlineparameters>tests</Commandlineparameters>\r
+ </PropertyGroup>\r
+ <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|x86' ">\r
+ <DebugSymbols>true</DebugSymbols>\r
+ <DebugType>pdbonly</DebugType>\r
+ <Optimize>true</Optimize>\r
+ <OutputPath>bin\Release</OutputPath>\r
+ <ErrorReport>prompt</ErrorReport>\r
+ <PlatformTarget>x86</PlatformTarget>\r
+ <Externalconsole>true</Externalconsole>\r
+ <Tailcalls>true</Tailcalls>\r
+ <DefineConstants>\r
+ </DefineConstants>\r
+ </PropertyGroup>\r
+ <ItemGroup>\r
+ <Reference Include="mscorlib" />\r
+ <Reference Include="System" />\r
+ <Reference Include="System.Core" />\r
+ <Reference Include="System.Numerics" />\r
+ <Reference Include="System.Security" />\r
+ <Reference Include="FSharp.Core" />\r
+ </ItemGroup>\r
+ <ItemGroup>\r
+ <Compile Include="AssemblyInfo.fs" />\r
+ <Compile Include="Crypto.fs" />\r
+ <Compile Include="Program.fs" />\r
+ </ItemGroup>\r
+ <Import Project="$(MSBuildExtensionsPath32)\..\Microsoft F#\v4.0\Microsoft.FSharp.Targets" />\r
+</Project>
\ No newline at end of file
--- /dev/null
+Labo 2
+======
+
+* Intégrité
+* Authenticité
+* Confidentialité
+
+chiffrer -> signer -> stocker
+
+* Signer les données de manière asymétrique (pair de clefs)
+* Clef symétrique unique par fichier?
+* Pair de clefs asymétrique pour chiffrer les clefs symétriques
+* Vérifier l'intégrité
+* Un seul fichier à protéger
+* Définir un format d'un 'container' avec header et tout le bordel
+* (pour la dernière partie), Comment stocker les clefs?
+
+Attention aux méta-données des fichiers!:
+ * Nom
+ * Taille
+ * Date de modification/création
+
+
+Inputs
+------
+
+Chiffrement :
+ * Le fichier
+ * La clef publique
+
+Déchiffrer :
+ * Le container
+ * La clef privée
+
+Algorithmes et paramètres :
+ RSA-2048 pour la signature
+ RSA-2048 pour le chiffrage des clefs
+ HMAC-SHA256 pour l'intégrité
+ AES-CBC-256 pour le chiffrement symétrique
+
+
+Processus de chiffrement
+------------------------
+
+inputs:
+ d : contenu du fichier
+ metas : métas données associées au fichier
+ kpub : clef publique RSA
+ ksignpriv : clef privé de signature DSA
+
+* Génération d'une clef 256 bits pour AES -> kc
+* Génération d'une clef 256 bits pour MAC -> ka
+* Construction du plaintext, voir format ci dessous
+* Chiffrement du plaintext avec AES-CBC256 et kc -> ciphertext
+* Calcul de MAC de ciphertext -> mac
+* Signature de mac -> sig
+* Chiffrement de kc + ka avec kpub (RSA) -> keys
+* Renvoie mac + sig + keys + ciphertext
+
+
+Processus de déchiffrement
+--------------------------
+
+inputs.
+ d : contenu chiffrées
+ kpriv : clef privée
+ ksignpub : la clef publique de signature
+
+* Déchiffrement de kc + ka avec kpriv (ECDSA)
+* Vérification de l'intégrité avec MAC
+* Vérification de la signature avec ksignpub
+* Déchiffrement du ciphertext
+
+
+Format du container
+===================
+
+container = mac[256], signature[2048], keys[2048], ciphertext
+ciphertext = AES(plaintext)
+plaintext = header, file-content ;
+header = file-size[64], meta-data-size[16], meta-data ;
+meta-data = { key-value-pair } ;
+key-value-pair = key[string], value[string]
+string = size[8], content-utf8 ;
+
--- /dev/null
+\documentclass[a4paper,10pt]{article}
+
+\usepackage[francais]{babel}
+\usepackage[utf8]{inputenc}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+
+\usepackage{graphicx}
+\usepackage{listings}
+\usepackage{url}
+\usepackage{upquote}
+\usepackage{color}
+
+\title{ICR - Labo \#2 : \textit{Conception et implémentation d'un container sécurisé pour des données médicales}}
+\author{G.Burri}
+
+\lstdefinelanguage{FSharp}%
+{morekeywords={let, new, match, with, rec, open, module, namespace, type, of, member, %
+and, for, while, true, false, in, do, begin, end, fun, function, return, yield, try, %
+mutable, if, then, else, cloud, async, static, use, abstract, interface, inherit, finally },
+ otherkeywords={ let!, return!, do!, yield!, use!, var, from, select, where, order, by },
+ keywordstyle=\color{blue}\bfseries,
+ sensitive=true,
+ basicstyle=\ttfamily,
+ breaklines=true,
+ xleftmargin=\parindent,
+ aboveskip=\bigskipamount,
+ tabsize=4,
+ morecomment=[l][\color{greencomments}]{///},
+ morecomment=[l][\color{greencomments}]{//},
+ morecomment=[s][\color{greencomments}]{{(*}{*)}},
+ morestring=[b]",
+ showstringspaces=false,
+ literate={`}{\`}1,
+ stringstyle=\color{redstrings},
+}
+
+\begin{document}
+
+\nocite{*}
+
+\maketitle
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Introduction}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{processus}
+
+\subsection{chiffrement}
+
+\subsection{déchiffrement}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{format du container}
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Niveaux de sécurité}
+
+\subsection{Quel est le niveau de sécurité que l'on souhaite atteindre ?}
+
+\begin{itemize}
+ \item Confidentialité : les données chiffrées ne doivent pas pouvoir être décryptées par un attaquant.
+ \item Authentification : un attaquant ne doit pas pouvoir forger un container, une signature est réalisée à l'aide d'une paire de clef publique-privée.
+ \item Intégrité : il ne faut pas que les données chiffrée aient pu être altérées par un attaquant.
+\end{itemize}
+
+
+\subsection{Comment s'assure-t-on que les données sont stockées de manière confidentielle ? En particulier ce qui concerne les méta-données}
+
+Les méta-données ainsi que les données sont chiffrées ensemble. Voir le format du container décrit précédemment.
+
+
+\subsection{Comment s'assure-t-on que les données stockées sont authentiques ? Quels sont les risques à prendre en compte ?}
+
+L'empreinte des données est signée à l'aide d'une clef privée donnée en paramètre de l'\emph{API}, ceci représente la signature qui est placée dans le container. Lors du déchiffrement, la clef publique correspondante est donnée puis utilisée pour déchiffrer l'empreinte qui est comparée à l'empreinte des données.
+
+
+\subsection{Comment s'assure-t-on que les données stockées sont intègres ?}
+
+Cela est réalisé avec un \emph{MAC}, dans notre nous utilisons \emph{HMAC-SHA256} sur les données chiffrées (\emph{Encrypt-then-MAC}).
+
+
+\subsection{}
+
+
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\section{Conclusion}
+
+% http://stephenhaunts.com/2013/03/04/cryptography-in-net-advanced-encryption-standard-aes/
+% http://stephenhaunts.com/2013/03/26/cryptography-in-net-rsa/
+% http://en.wikipedia.org/wiki/Digital_signature
+%\bibliographystyle{plain}
+%\bibliography{main}
+
+\end{document}