-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | TLS/SSL protocol native implementation (Server and Client) -- -- Native Haskell TLS and SSL protocol implementation for server and -- client. -- -- This provides a high-level implementation of a sensitive security -- protocol, eliminating a common set of security issues through the use -- of the advanced type system, high level constructions and common -- Haskell features. -- -- Currently implement the SSL3.0, TLS1.0, TLS1.1, TLS1.2 and TLS 1.3 -- protocol, and support RSA and Ephemeral (Elliptic curve and regular) -- Diffie Hellman key exchanges, and many extensions. -- -- Some debug tools linked with tls, are available through the -- http://hackage.haskell.org/package/tls-debug/. @package tls @version 1.5.2 -- | Finite Field Diffie-Hellman Ephemeral Parameters defined in RFC 7919. module Network.TLS.Extra.FFDHE -- | 2048 bits finite field Diffie-Hellman ephemeral parameters defined in -- RFC 7919. The estimated symmetric-equivalent strength is 103 bits. ffdhe2048 :: DHParams -- | 3072 bits finite field Diffie-Hellman ephemeral parameters defined in -- RFC 7919. The estimated symmetric-equivalent strength is 125 bits. ffdhe3072 :: DHParams -- | 4096 bits finite field Diffie-Hellman ephemeral parameters defined in -- RFC 7919. The estimated symmetric-equivalent strength is 150 bits. ffdhe4096 :: DHParams -- | 6144 bits finite field Diffie-Hellman ephemeral parameters defined in -- RFC 7919. The estimated symmetric-equivalent strength is 175 bits. ffdhe6144 :: DHParams -- | 8192 bits finite field Diffie-Hellman ephemeral parameters defined in -- RFC 7919. The estimated symmetric-equivalent strength is 192 bits. ffdhe8192 :: DHParams module Network.TLS.Extra.Cipher -- | All AES and ChaCha20-Poly1305 ciphers supported ordered from strong to -- weak. This choice of ciphersuites should satisfy most normal needs. -- For otherwise strong ciphers we make little distinction between AES128 -- and AES256, and list each but the weakest of the AES128 ciphers ahead -- of the corresponding AES256 ciphers, with the ChaCha20-Poly1305 -- variant placed just after. -- -- The CCM ciphers all come together after the GCM variants due to their -- relative performance cost. ciphersuite_default :: [Cipher] -- | The default ciphersuites + some not recommended last resort ciphers. -- | Warning: This ciphersuite list contains RC4. Use ciphersuite_strong -- or ciphersuite_default instead. ciphersuite_all :: [Cipher] -- | list of medium ciphers. -- | Deprecated: Use ciphersuite_strong or ciphersuite_default -- instead. ciphersuite_medium :: [Cipher] -- | The strongest ciphers supported. For ciphers with PFS, AEAD and SHA2, -- we list each AES128 variant after the corresponding AES256 and -- ChaCha20-Poly1305 variants. For weaker constructs, we use just the -- AES256 form. -- -- The CCM ciphers come just after the corresponding GCM ciphers despite -- their relative performance cost. ciphersuite_strong :: [Cipher] -- | all unencrypted ciphers, do not use on insecure network. ciphersuite_unencrypted :: [Cipher] -- | DHE-RSA cipher suite. This only includes ciphers bound specifically to -- DHE-RSA so TLS 1.3 ciphers must be added separately. ciphersuite_dhe_rsa :: [Cipher] ciphersuite_dhe_dss :: [Cipher] -- | unencrypted cipher using RSA for key exchange and SHA1 for digest cipher_null_SHA1 :: Cipher -- | AES cipher (128 bit key), RSA key exchange and SHA1 for digest cipher_AES128_SHA1 :: Cipher -- | AES cipher (256 bit key), RSA key exchange and SHA1 for digest cipher_AES256_SHA1 :: Cipher -- | AES cipher (128 bit key), RSA key exchange and SHA256 for digest cipher_AES128_SHA256 :: Cipher -- | AES cipher (256 bit key), RSA key exchange and SHA256 for digest cipher_AES256_SHA256 :: Cipher -- | AESCCM cipher (128 bit key), RSA key exchange. The SHA256 digest is -- used as a PRF, not as a MAC. cipher_AES128CCM_SHA256 :: Cipher -- | AESCCM8 cipher (128 bit key), RSA key exchange. The SHA256 digest is -- used as a PRF, not as a MAC. cipher_AES128CCM8_SHA256 :: Cipher -- | AESGCM cipher (128 bit key), RSA key exchange. The SHA256 digest is -- used as a PRF, not as a MAC. cipher_AES128GCM_SHA256 :: Cipher -- | AESCCM cipher (256 bit key), RSA key exchange. The SHA256 digest is -- used as a PRF, not as a MAC. cipher_AES256CCM_SHA256 :: Cipher -- | AESCCM8 cipher (256 bit key), RSA key exchange. The SHA256 digest is -- used as a PRF, not as a MAC. cipher_AES256CCM8_SHA256 :: Cipher -- | AESGCM cipher (256 bit key), RSA key exchange. The SHA384 digest is -- used as a PRF, not as a MAC. cipher_AES256GCM_SHA384 :: Cipher -- | AES cipher (128 bit key), DHE key exchanged signed by RSA and SHA1 for -- digest cipher_DHE_RSA_AES128_SHA1 :: Cipher -- | AES cipher (256 bit key), DHE key exchanged signed by RSA and SHA1 for -- digest cipher_DHE_RSA_AES256_SHA1 :: Cipher cipher_DHE_RSA_AES128_SHA256 :: Cipher cipher_DHE_RSA_AES256_SHA256 :: Cipher -- | AES cipher (128 bit key), DHE key exchanged signed by DSA and SHA1 for -- digest cipher_DHE_DSS_AES128_SHA1 :: Cipher -- | AES cipher (256 bit key), DHE key exchanged signed by DSA and SHA1 for -- digest cipher_DHE_DSS_AES256_SHA1 :: Cipher cipher_DHE_RSA_AES128CCM_SHA256 :: Cipher cipher_DHE_RSA_AES128CCM8_SHA256 :: Cipher cipher_DHE_RSA_AES128GCM_SHA256 :: Cipher cipher_DHE_RSA_AES256CCM_SHA256 :: Cipher cipher_DHE_RSA_AES256CCM8_SHA256 :: Cipher cipher_DHE_RSA_AES256GCM_SHA384 :: Cipher cipher_DHE_RSA_CHACHA20POLY1305_SHA256 :: Cipher cipher_ECDHE_RSA_AES128GCM_SHA256 :: Cipher cipher_ECDHE_RSA_AES256GCM_SHA384 :: Cipher cipher_ECDHE_RSA_AES128CBC_SHA256 :: Cipher cipher_ECDHE_RSA_AES128CBC_SHA :: Cipher cipher_ECDHE_RSA_AES256CBC_SHA :: Cipher cipher_ECDHE_RSA_AES256CBC_SHA384 :: Cipher cipher_ECDHE_RSA_CHACHA20POLY1305_SHA256 :: Cipher cipher_ECDHE_ECDSA_AES128CBC_SHA :: Cipher cipher_ECDHE_ECDSA_AES256CBC_SHA :: Cipher cipher_ECDHE_ECDSA_AES128CBC_SHA256 :: Cipher cipher_ECDHE_ECDSA_AES256CBC_SHA384 :: Cipher cipher_ECDHE_ECDSA_AES128CCM_SHA256 :: Cipher cipher_ECDHE_ECDSA_AES128CCM8_SHA256 :: Cipher cipher_ECDHE_ECDSA_AES128GCM_SHA256 :: Cipher cipher_ECDHE_ECDSA_AES256CCM_SHA256 :: Cipher cipher_ECDHE_ECDSA_AES256CCM8_SHA256 :: Cipher cipher_ECDHE_ECDSA_AES256GCM_SHA384 :: Cipher cipher_ECDHE_ECDSA_CHACHA20POLY1305_SHA256 :: Cipher cipher_TLS13_AES128GCM_SHA256 :: Cipher cipher_TLS13_AES256GCM_SHA384 :: Cipher cipher_TLS13_CHACHA20POLY1305_SHA256 :: Cipher cipher_TLS13_AES128CCM_SHA256 :: Cipher cipher_TLS13_AES128CCM8_SHA256 :: Cipher -- | 3DES cipher (168 bit key), RSA key exchange and SHA1 for digest cipher_RSA_3DES_EDE_CBC_SHA1 :: Cipher -- | RC4 cipher, RSA key exchange and MD5 for digest cipher_RC4_128_MD5 :: Cipher -- | RC4 cipher, RSA key exchange and SHA1 for digest cipher_RC4_128_SHA1 :: Cipher -- | unencrypted cipher using RSA for key exchange and MD5 for digest cipher_null_MD5 :: Cipher cipher_DHE_DSS_RC4_SHA1 :: Cipher -- | default values and ciphers module Network.TLS.Extra module Network.TLS -- | A TLS Context keep tls specific state, parameters and backend -- information. data Context -- | create a new context using the backend and parameters specified. contextNew :: (MonadIO m, HasBackend backend, TLSParams params) => backend -> params -> m Context -- | Handshake for a new TLS connection This is to be called at the -- beginning of a connection, and during renegotiation handshake :: MonadIO m => Context -> m () -- | sendData sends a bunch of data. It will automatically chunk data to -- acceptable packet size sendData :: MonadIO m => Context -> ByteString -> m () -- | Get data out of Data packet, and automatically renegotiate if a -- Handshake ClientHello is received. An empty result means EOF. recvData :: MonadIO m => Context -> m ByteString -- | notify the context that this side wants to close connection. this is -- important that it is called before closing the handle, otherwise the -- session might not be resumable (for version < TLS1.2). -- -- this doesn't actually close the handle bye :: MonadIO m => Context -> m () class HasBackend a initializeBackend :: HasBackend a => a -> IO () getBackend :: HasBackend a => a -> Backend -- | Connection IO backend data Backend Backend :: IO () -> IO () -> (ByteString -> IO ()) -> (Int -> IO ByteString) -> Backend -- | Flush the connection sending buffer, if any. [backendFlush] :: Backend -> IO () -- | Close the connection. [backendClose] :: Backend -> IO () -- | Send a bytestring through the connection. [backendSend] :: Backend -> ByteString -> IO () -- | Receive specified number of bytes from the connection. [backendRecv] :: Backend -> Int -> IO ByteString class TLSParams a data ClientParams ClientParams :: Maybe MaxFragmentEnum -> (HostName, ByteString) -> Bool -> Maybe (SessionID, SessionData) -> Shared -> ClientHooks -> Supported -> DebugParams -> Maybe ByteString -> ClientParams [clientUseMaxFragmentLength] :: ClientParams -> Maybe MaxFragmentEnum -- | Define the name of the server, along with an extra service -- identification blob. this is important that the hostname part is -- properly filled for security reason, as it allow to properly associate -- the remote side with the given certificate during a handshake. -- -- The extra blob is useful to differentiate services running on the same -- host, but that might have different certificates given. It's only used -- as part of the X509 validation infrastructure. [clientServerIdentification] :: ClientParams -> (HostName, ByteString) -- | Allow the use of the Server Name Indication TLS extension during -- handshake, which allow the client to specify which host name, it's -- trying to access. This is useful to distinguish CNAME aliasing (e.g. -- web virtual host). [clientUseServerNameIndication] :: ClientParams -> Bool -- | try to establish a connection using this session. [clientWantSessionResume] :: ClientParams -> Maybe (SessionID, SessionData) [clientShared] :: ClientParams -> Shared [clientHooks] :: ClientParams -> ClientHooks -- | In this element, you'll need to override the default empty value of of -- supportedCiphers with a suitable cipherlist. [clientSupported] :: ClientParams -> Supported [clientDebug] :: ClientParams -> DebugParams -- | Client tries to send this early data in TLS 1.3 if possible. If not -- accepted by the server, it is application's responsibility to re-sent -- it. [clientEarlyData] :: ClientParams -> Maybe ByteString defaultParamsClient :: HostName -> ByteString -> ClientParams data ServerParams ServerParams :: Bool -> [SignedCertificate] -> Maybe DHParams -> Shared -> ServerHooks -> Supported -> DebugParams -> Int -> Int -> ServerParams -- | request a certificate from client. [serverWantClientCert] :: ServerParams -> Bool -- | This is a list of certificates from which the disinguished names are -- sent in certificate request messages. For TLS1.0, it should not be -- empty. [serverCACertificates] :: ServerParams -> [SignedCertificate] -- | Server Optional Diffie Hellman parameters. Setting parameters is -- necessary for FFDHE key exchange when clients are not compatible with -- RFC 7919. -- -- Value can be one of the standardized groups from module -- Network.TLS.Extra.FFDHE or custom parameters generated with -- generateParams. [serverDHEParams] :: ServerParams -> Maybe DHParams [serverShared] :: ServerParams -> Shared [serverHooks] :: ServerParams -> ServerHooks [serverSupported] :: ServerParams -> Supported [serverDebug] :: ServerParams -> DebugParams -- | Server accepts this size of early data in TLS 1.3. 0 (or lower) means -- that the server does not accept early data. [serverEarlyDataSize] :: ServerParams -> Int -- | Lifetime in seconds for session tickets generated by the server. -- Acceptable value range is 0 to 604800 (7 days). The default lifetime -- is 86400 seconds (1 day). [serverTicketLifetime] :: ServerParams -> Int -- | List all the supported algorithms, versions, ciphers, etc supported. data Supported Supported :: [Version] -> [Cipher] -> [Compression] -> [HashAndSignatureAlgorithm] -> Bool -> Bool -> Bool -> Bool -> Bool -> [Group] -> Supported -- | Supported versions by this context. On the client side, the highest -- version will be used to establish the connection. On the server side, -- the highest version that is less or equal than the client version will -- be chosen. -- -- Versions should be listed in preference order, i.e. higher versions -- first. [supportedVersions] :: Supported -> [Version] -- | Supported cipher methods. The default is empty, specify a suitable -- cipher list. ciphersuite_default is often a good choice. [supportedCiphers] :: Supported -> [Cipher] -- | Supported compressions methods. By default only the "null" compression -- is supported, which means no compression will be performed. Allowing -- other compression method is not advised as it causes a connection -- failure when TLS 1.3 is negotiated. [supportedCompressions] :: Supported -> [Compression] -- | All supported hash/signature algorithms pair for client certificate -- verification and server signature in (EC)DHE, ordered by decreasing -- priority. -- -- This list is sent to the peer as part of the "signature_algorithms" -- extension. It is used to restrict accepted signatures received from -- the peer at TLS level (not in X.509 certificates), but only when the -- TLS version is 1.2 or above. In order to disable SHA-1 one must then -- also disable earlier protocol versions in supportedVersions. -- -- The list also impacts the selection of possible algorithms when -- generating signatures. -- -- Note: with TLS 1.3 some algorithms have been deprecated and will not -- be used even when listed in the parameter: MD5, SHA-1, SHA-224, RSA -- PKCS#1, DSS. [supportedHashSignatures] :: Supported -> [HashAndSignatureAlgorithm] -- | Secure renegotiation defined in RFC5746. If True, clients send -- the renegotiation_info extension. If True, servers handle the -- extension or the renegotiation SCSV then send the renegotiation_info -- extension. [supportedSecureRenegotiation] :: Supported -> Bool -- | If True, renegotiation is allowed from the client side. This is -- vulnerable to DOS attacks. If False, renegotiation is allowed -- only from the server side via HelloRequest. [supportedClientInitiatedRenegotiation] :: Supported -> Bool -- | Set if we support session. [supportedSession] :: Supported -> Bool -- | Support for fallback SCSV defined in RFC7507. If True, servers -- reject handshakes which suggest a lower protocol than the highest -- protocol supported. [supportedFallbackScsv] :: Supported -> Bool -- | In ver <= TLS1.0, block ciphers using CBC are using CBC residue as -- IV, which can be guessed by an attacker. Hence, an empty packet is -- normally sent before a normal data packet, to prevent guessability. -- Some Microsoft TLS-based protocol implementations, however, consider -- these empty packets as a protocol violation and disconnect. If this -- parameter is False, empty packets will never be added, which is -- less secure, but might help in rare cases. [supportedEmptyPacket] :: Supported -> Bool -- | A list of supported elliptic curves and finite-field groups in the -- preferred order. -- -- The list is sent to the server as part of the "supported_groups" -- extension. It is used in both clients and servers to restrict accepted -- groups in DH key exchange. -- -- The default value is -- [X25519,P256,P384,P521]. X25519 and -- P256 provide 128-bit security which is strong enough until -- 2030. Both curves are fast because their backends are written in C. [supportedGroups] :: Supported -> [Group] -- | Parameters that are common to clients and servers. data Shared Shared :: Credentials -> SessionManager -> CertificateStore -> ValidationCache -> Shared -- | The list of certificates and private keys that a server will use as -- part of authentication to clients. Actual credentials that are used -- are selected dynamically from this list based on client capabilities. -- Additional credentials returned by onServerNameIndication are -- also considered. -- -- When credential list is left empty (the default value), no key -- exchange can take place. [sharedCredentials] :: Shared -> Credentials -- | Callbacks used by clients and servers in order to resume TLS sessions. -- The default implementation never resumes sessions. Package -- tls-session-manager provides an in-memory implementation. [sharedSessionManager] :: Shared -> SessionManager -- | A collection of trust anchors to be used by a client as part of -- validation of server certificates. This is set as first argument to -- function onServerCertificate. Package x509-system gives -- access to a default certificate store configured in the system. [sharedCAStore] :: Shared -> CertificateStore -- | Callbacks that may be used by a client to cache certificate validation -- results (positive or negative) and avoid expensive signature check. -- The default implementation does not have any caching. [sharedValidationCache] :: Shared -> ValidationCache -- | All settings should not be used in production data DebugParams DebugParams :: Maybe Seed -> (Seed -> IO ()) -> Maybe Version -> (String -> IO ()) -> DebugParams -- | Disable the true randomness in favor of deterministic seed that will -- produce a deterministic random from. This is useful for tests and -- debugging purpose. Do not use in production [debugSeed] :: DebugParams -> Maybe Seed -- | Add a way to print the seed that was randomly generated. re-using the -- same seed will reproduce the same randomness with debugSeed [debugPrintSeed] :: DebugParams -> Seed -> IO () -- | Force to choose this version in the server side. [debugVersionForced] :: DebugParams -> Maybe Version -- | Printing master keys. The default is no printing. [debugKeyLogger] :: DebugParams -> String -> IO () -- | A set of callbacks run by the clients for various corners of TLS -- establishment data ClientHooks ClientHooks :: OnCertificateRequest -> OnServerCertificate -> IO (Maybe [ByteString]) -> (DHParams -> DHPublic -> IO GroupUsage) -> ClientHooks -- | This action is called when the a certificate request is received from -- the server. The callback argument is the information from the request. -- The server, at its discretion, may be willing to continue the -- handshake without a client certificate. Therefore, the callback is -- free to return Nothing to indicate that no client certificate -- should be sent, despite the server's request. In some cases it may be -- appropriate to get user consent before sending the certificate; the -- content of the user's certificate may be sensitive and intended only -- for specific servers. -- -- The action should select a certificate chain of one of the given -- certificate types and one of the certificates in the chain should (if -- possible) be signed by one of the given distinguished names. Some -- servers, that don't have a narrow set of preferred issuer CAs, will -- send an empty DistinguishedName list, rather than send all the -- names from their trusted CA bundle. If the client does not have a -- certificate chaining to a matching CA, it may choose a default -- certificate instead. -- -- Each certificate except the last should be signed by the following -- one. The returned private key must be for the first certificates in -- the chain. This key will be used to signing the certificate verify -- message. -- -- The public key in the first certificate, and the matching returned -- private key must be compatible with one of the list of -- HashAndSignatureAlgorithm value when provided. TLS 1.3 changes -- the meaning of the list elements, adding explicit code points for each -- supported pair of hash and signature (public key) algorithms, rather -- than combining separate codes for the hash and key. For details see -- RFC 8446 section 4.2.3. When no compatible certificate chain is -- available, return Nothing if it is OK to continue without a -- client certificate. Returning a non-matching certificate should result -- in a handshake failure. -- -- While the TLS version is not provided to the callback, the content of -- the signature_algorithms list provides a strong hint, since -- TLS 1.3 servers will generally list RSA pairs with a hash component of -- Intrinsic (0x08). -- -- Note that is is the responsibility of this action to select a -- certificate matching one of the requested certificate types (public -- key algorithms). Returning a non-matching one will lead to handshake -- failure later. [onCertificateRequest] :: ClientHooks -> OnCertificateRequest -- | Used by the client to validate the server certificate. The default -- implementation calls validateDefault which validates according -- to the default hooks and checks provided by -- Data.X509.Validation. This can be replaced with a custom -- validation function using different settings. -- -- The function is not expected to verify the key-usage extension of the -- end-entity certificate, as this depends on the dynamically-selected -- cipher and this part should not be cached. Key-usage verification is -- performed by the library internally. [onServerCertificate] :: ClientHooks -> OnServerCertificate -- | This action is called when the client sends ClientHello to determine -- ALPN values such as '["h2", "http/1.1"]'. [onSuggestALPN] :: ClientHooks -> IO (Maybe [ByteString]) -- | This action is called to validate DHE parameters when the server -- selected a finite-field group not part of the "Supported Groups -- Registry" or not part of supportedGroups list. -- -- With TLS 1.3 custom groups have been removed from the protocol, so -- this callback is only used when the version negotiated is 1.2 or -- below. -- -- The default behavior with (dh_p, dh_g, dh_size) and pub as follows: -- --
    --
  1. rejecting if dh_p is even
  2. --
  3. rejecting unless 1 < dh_g && dh_g < dh_p - 1
  4. --
  5. rejecting unless 1 < dh_p && pub < dh_p - 1
  6. --
  7. rejecting if dh_size < 1024 (to prevent Logjam attack)
  8. --
-- -- See RFC 7919 section 3.1 for recommandations. [onCustomFFDHEGroup] :: ClientHooks -> DHParams -> DHPublic -> IO GroupUsage -- | Type for onCertificateRequest. This type synonym is to make -- document readable. type OnCertificateRequest = ([CertificateType], Maybe [HashAndSignatureAlgorithm], [DistinguishedName]) -> IO (Maybe (CertificateChain, PrivKey)) -- | Type for onServerCertificate. This type synonym is to make -- document readable. type OnServerCertificate = CertificateStore -> ValidationCache -> ServiceID -> CertificateChain -> IO [FailedReason] -- | A set of callbacks run by the server for various corners of the TLS -- establishment data ServerHooks ServerHooks :: (CertificateChain -> IO CertificateUsage) -> IO Bool -> (Version -> [Cipher] -> Cipher) -> (Maybe HostName -> IO Credentials) -> (Measurement -> IO Bool) -> Maybe ([ByteString] -> IO ByteString) -> ServerHooks -- | This action is called when a client certificate chain is received from -- the client. When it returns a CertificateUsageReject value, the -- handshake is aborted. -- -- The function is not expected to verify the key-usage extension of the -- certificate. This verification is performed by the library internally. [onClientCertificate] :: ServerHooks -> CertificateChain -> IO CertificateUsage -- | This action is called when the client certificate cannot be verified. -- Return True to accept the certificate anyway, or False -- to fail verification. [onUnverifiedClientCert] :: ServerHooks -> IO Bool -- | Allow the server to choose the cipher relative to the the client -- version and the client list of ciphers. -- -- This could be useful with old clients and as a workaround to the BEAST -- (where RC4 is sometimes prefered with TLS < 1.1) -- -- The client cipher list cannot be empty. [onCipherChoosing] :: ServerHooks -> Version -> [Cipher] -> Cipher -- | Allow the server to indicate additional credentials to be used -- depending on the host name indicated by the client. -- -- This is most useful for transparent proxies where credentials must be -- generated on the fly according to the host the client is trying to -- connect to. -- -- Returned credentials may be ignored if a client does not support the -- signature algorithms used in the certificate chain. [onServerNameIndication] :: ServerHooks -> Maybe HostName -> IO Credentials -- | at each new handshake, we call this hook to see if we allow handshake -- to happens. [onNewHandshake] :: ServerHooks -> Measurement -> IO Bool -- | Allow the server to choose an application layer protocol suggested -- from the client through the ALPN (Application Layer Protocol -- Negotiation) extensions. [onALPNClientSuggest] :: ServerHooks -> Maybe ([ByteString] -> IO ByteString) newtype Credentials Credentials :: [Credential] -> Credentials type Credential = (CertificateChain, PrivKey) -- | try to create a new credential object from a public certificate and -- the associated private key that are stored on the filesystem in PEM -- format. credentialLoadX509 :: FilePath -> FilePath -> IO (Either String Credential) -- | similar to credentialLoadX509 but take the certificate and -- private key from memory instead of from the filesystem. credentialLoadX509FromMemory :: ByteString -> ByteString -> Either String Credential -- | similar to credentialLoadX509 but also allow specifying chain -- certificates. credentialLoadX509Chain :: FilePath -> [FilePath] -> FilePath -> IO (Either String Credential) -- | similar to credentialLoadX509FromMemory but also allow -- specifying chain certificates. credentialLoadX509ChainFromMemory :: ByteString -> [ByteString] -> ByteString -> Either String Credential -- | A session ID type SessionID = ByteString -- | Session data to resume data SessionData SessionData :: Version -> CipherID -> CompressionID -> Maybe HostName -> ByteString -> Maybe Group -> Maybe TLS13TicketInfo -> Maybe ByteString -> Int -> SessionData [sessionVersion] :: SessionData -> Version [sessionCipher] :: SessionData -> CipherID [sessionCompression] :: SessionData -> CompressionID [sessionClientSNI] :: SessionData -> Maybe HostName [sessionSecret] :: SessionData -> ByteString [sessionGroup] :: SessionData -> Maybe Group [sessionTicketInfo] :: SessionData -> Maybe TLS13TicketInfo [sessionALPN] :: SessionData -> Maybe ByteString [sessionMaxEarlyDataSize] :: SessionData -> Int -- | A session manager data SessionManager SessionManager :: (SessionID -> IO (Maybe SessionData)) -> (SessionID -> IO (Maybe SessionData)) -> (SessionID -> SessionData -> IO ()) -> (SessionID -> IO ()) -> SessionManager -- | used on server side to decide whether to resume a client session. [sessionResume] :: SessionManager -> SessionID -> IO (Maybe SessionData) -- | used on server side to decide whether to resume a client session for -- TLS 1.3 0RTT. For a given SessionID, the implementation must -- return its SessionData only once and must not return the same -- SessionData after the call. [sessionResumeOnlyOnce] :: SessionManager -> SessionID -> IO (Maybe SessionData) -- | used when a session is established. [sessionEstablish] :: SessionManager -> SessionID -> SessionData -> IO () -- | used when a session is invalidated. [sessionInvalidate] :: SessionManager -> SessionID -> IO () noSessionManager :: SessionManager data TLS13TicketInfo -- | A collection of hooks actions. data Hooks Hooks :: (Handshake -> IO Handshake) -> (Handshake13 -> IO Handshake13) -> (CertificateChain -> IO ()) -> Logging -> Hooks -- | called at each handshake message received [hookRecvHandshake] :: Hooks -> Handshake -> IO Handshake -- | called at each handshake message received for TLS 1.3 [hookRecvHandshake13] :: Hooks -> Handshake13 -> IO Handshake13 -- | called at each certificate chain message received [hookRecvCertificates] :: Hooks -> CertificateChain -> IO () -- | hooks on IO and packets, receiving and sending. [hookLogging] :: Hooks -> Logging data Handshake -- | Hooks for logging -- -- This is called when sending and receiving packets and IO data Logging Logging :: (String -> IO ()) -> (String -> IO ()) -> (ByteString -> IO ()) -> (Header -> ByteString -> IO ()) -> Logging [loggingPacketSent] :: Logging -> String -> IO () [loggingPacketRecv] :: Logging -> String -> IO () [loggingIOSent] :: Logging -> ByteString -> IO () [loggingIORecv] :: Logging -> Header -> ByteString -> IO () contextHookSetHandshakeRecv :: Context -> (Handshake -> IO Handshake) -> IO () contextHookSetHandshake13Recv :: Context -> (Handshake13 -> IO Handshake13) -> IO () contextHookSetCertificateRecv :: Context -> (CertificateChain -> IO ()) -> IO () contextHookSetLogging :: Context -> Logging -> IO () contextModifyHooks :: Context -> (Hooks -> Hooks) -> IO () type HostName = String type DHParams = Params type DHPublic = PublicNumber -- | record some data about this connection. data Measurement Measurement :: !Word32 -> !Word32 -> !Word32 -> Measurement -- | number of handshakes on this context [nbHandshakes] :: Measurement -> !Word32 -- | bytes received since last handshake [bytesReceived] :: Measurement -> !Word32 -- | bytes sent since last handshake [bytesSent] :: Measurement -> !Word32 -- | Group usage callback possible return values. data GroupUsage -- | usage of group accepted GroupUsageValid :: GroupUsage -- | usage of group provides insufficient security GroupUsageInsecure :: GroupUsage -- | usage of group rejected for other reason (specified as string) GroupUsageUnsupported :: String -> GroupUsage -- | usage of group with an invalid public value GroupUsageInvalidPublic :: GroupUsage -- | Certificate Usage callback possible returns values. data CertificateUsage -- | usage of certificate accepted CertificateUsageAccept :: CertificateUsage -- | usage of certificate rejected CertificateUsageReject :: CertificateRejectReason -> CertificateUsage -- | Certificate and Chain rejection reason data CertificateRejectReason CertificateRejectExpired :: CertificateRejectReason CertificateRejectRevoked :: CertificateRejectReason CertificateRejectUnknownCA :: CertificateRejectReason CertificateRejectAbsent :: CertificateRejectReason CertificateRejectOther :: String -> CertificateRejectReason data MaxFragmentEnum MaxFragment512 :: MaxFragmentEnum MaxFragment1024 :: MaxFragmentEnum MaxFragment2048 :: MaxFragmentEnum MaxFragment4096 :: MaxFragmentEnum type HashAndSignatureAlgorithm = (HashAlgorithm, SignatureAlgorithm) data HashAlgorithm HashNone :: HashAlgorithm HashMD5 :: HashAlgorithm HashSHA1 :: HashAlgorithm HashSHA224 :: HashAlgorithm HashSHA256 :: HashAlgorithm HashSHA384 :: HashAlgorithm HashSHA512 :: HashAlgorithm HashIntrinsic :: HashAlgorithm HashOther :: Word8 -> HashAlgorithm data SignatureAlgorithm SignatureAnonymous :: SignatureAlgorithm SignatureRSA :: SignatureAlgorithm SignatureDSS :: SignatureAlgorithm SignatureECDSA :: SignatureAlgorithm SignatureRSApssRSAeSHA256 :: SignatureAlgorithm SignatureRSApssRSAeSHA384 :: SignatureAlgorithm SignatureRSApssRSAeSHA512 :: SignatureAlgorithm SignatureEd25519 :: SignatureAlgorithm SignatureEd448 :: SignatureAlgorithm SignatureRSApsspssSHA256 :: SignatureAlgorithm SignatureRSApsspssSHA384 :: SignatureAlgorithm SignatureRSApsspssSHA512 :: SignatureAlgorithm SignatureOther :: Word8 -> SignatureAlgorithm -- | Some of the IANA registered code points for CertificateType are -- not currently supported by the library. Nor should they be, they're -- are either unwise, obsolete or both. There's no point in conveying -- these to the user in the client certificate request callback. The -- request callback will be filtered to exclude unsupported values. If -- the user cannot find a certificate for a supported code point, we'll -- go ahead without a client certificate and hope for the best, unless -- the user's callback decides to throw an exception. data CertificateType -- | TLS10 and up, RFC5246 CertificateType_RSA_Sign :: CertificateType -- | TLS10 and up, RFC5246 CertificateType_DSS_Sign :: CertificateType -- | TLS10 and up, RFC8422 CertificateType_ECDSA_Sign :: CertificateType -- | TLS13 and up, synthetic CertificateType_Ed25519_Sign :: CertificateType -- | TLS13 and up, synthetic | None of the below will ever be presented to -- the callback. Any future public key algorithms valid for client -- certificates go above this line. CertificateType_Ed448_Sign :: CertificateType CertificateType_RSA_Fixed_DH :: CertificateType CertificateType_DSS_Fixed_DH :: CertificateType CertificateType_RSA_Ephemeral_DH :: CertificateType CertificateType_DSS_Ephemeral_DH :: CertificateType CertificateType_fortezza_dms :: CertificateType CertificateType_RSA_Fixed_ECDH :: CertificateType CertificateType_ECDSA_Fixed_ECDH :: CertificateType CertificateType_Unknown :: Word8 -> CertificateType -- | A set of checks to activate or parametrize to perform on certificates. -- -- It's recommended to use defaultChecks to create the structure, -- to better cope with future changes or expansion of the structure. data ValidationChecks ValidationChecks :: Bool -> Maybe DateTime -> Bool -> Bool -> Bool -> Bool -> [ExtKeyUsageFlag] -> [ExtKeyUsagePurpose] -> Bool -> ValidationChecks -- | check time validity of every certificate in the chain. the make sure -- that current time is between each validity bounds in the certificate [checkTimeValidity] :: ValidationChecks -> Bool -- | The time when the validity check happens. When set to Nothing, the -- current time will be used [checkAtTime] :: ValidationChecks -> Maybe DateTime -- | Check that no certificate is included that shouldn't be included. -- unfortunately despite the specification violation, a lots of real -- world server serves useless and usually old certificates that are not -- relevant to the certificate sent, in their chain. [checkStrictOrdering] :: ValidationChecks -> Bool -- | Check that signing certificate got the CA basic constraint. this is -- absolutely not recommended to turn it off. [checkCAConstraints] :: ValidationChecks -> Bool -- | Check the whole certificate chain without stopping at the first -- failure. Allow gathering a exhaustive list of failure reasons. if this -- is turn off, it's absolutely not safe to ignore a failed reason even -- it doesn't look serious (e.g. Expired) as other more serious checks -- would not have been performed. [checkExhaustive] :: ValidationChecks -> Bool -- | Check that the leaf certificate is version 3. If disable, version 2 -- certificate is authorized in leaf position and key usage cannot be -- checked. [checkLeafV3] :: ValidationChecks -> Bool -- | Check that the leaf certificate is authorized to be used for certain -- usage. If set to empty list no check are performed, otherwise all the -- flags is the list need to exists in the key usage extension. If the -- extension is not present, the check will pass and behave as if the -- certificate key is not restricted to any specific usage. [checkLeafKeyUsage] :: ValidationChecks -> [ExtKeyUsageFlag] -- | Check that the leaf certificate is authorized to be used for certain -- purpose. If set to empty list no check are performed, otherwise all -- the flags is the list need to exists in the extended key usage -- extension if present. If the extension is not present, then the check -- will pass and behave as if the certificate is not restricted to any -- specific purpose. [checkLeafKeyPurpose] :: ValidationChecks -> [ExtKeyUsagePurpose] -- | Check the top certificate names matching the fully qualified hostname -- (FQHN). it's not recommended to turn this check off, if no other name -- checks are performed. [checkFQHN] :: ValidationChecks -> Bool -- | A set of hooks to manipulate the way the verification works. -- -- BEWARE, it's easy to change behavior leading to compromised security. data ValidationHooks ValidationHooks :: (DistinguishedName -> Certificate -> Bool) -> (DateTime -> Certificate -> [FailedReason]) -> (HostName -> Certificate -> [FailedReason]) -> ([FailedReason] -> [FailedReason]) -> ValidationHooks -- | check whether a given issuer DistinguishedName matches the -- subject DistinguishedName of a candidate issuer certificate. [hookMatchSubjectIssuer] :: ValidationHooks -> DistinguishedName -> Certificate -> Bool -- | check whether the certificate in the second argument is valid at the -- time provided in the first argument. Return an empty list for success -- or else one or more failure reasons. [hookValidateTime] :: ValidationHooks -> DateTime -> Certificate -> [FailedReason] -- | validate the certificate leaf name with the DNS named used to connect [hookValidateName] :: ValidationHooks -> HostName -> Certificate -> [FailedReason] -- | user filter to modify the list of failure reasons [hookFilterReason] :: ValidationHooks -> [FailedReason] -> [FailedReason] -- | All the callbacks needed for querying and adding to the cache. data ValidationCache ValidationCache :: ValidationCacheQueryCallback -> ValidationCacheAddCallback -> ValidationCache -- | cache querying callback [cacheQuery] :: ValidationCache -> ValidationCacheQueryCallback -- | cache adding callback [cacheAdd] :: ValidationCache -> ValidationCacheAddCallback -- | The result of a cache query data ValidationCacheResult -- | cache allow this fingerprint to go through ValidationCachePass :: ValidationCacheResult -- | cache denied this fingerprint for further validation ValidationCacheDenied :: String -> ValidationCacheResult -- | unknown fingerprint in cache ValidationCacheUnknown :: ValidationCacheResult -- | create a simple constant cache that list exceptions to the -- certification validation. Typically this is use to allow self-signed -- certificates for specific use, with out-of-bounds user checks. -- -- No fingerprints will be added after the instance is created. -- -- The underlying structure for the check is kept as a list, as usually -- the exception list will be short, but when the list go above a dozen -- exceptions it's recommended to use another cache mechanism with a -- faster lookup mechanism (hashtable, map, etc). -- -- Note that only one fingerprint is allowed per ServiceID, for other -- use, another cache mechanism need to be use. exceptionValidationCache :: [(ServiceID, Fingerprint)] -> ValidationCache -- | return the backend object associated with this context ctxConnection :: Context -> Backend -- | A shortcut for 'backendFlush . ctxConnection'. contextFlush :: Context -> IO () -- | A shortcut for 'backendClose . ctxConnection'. contextClose :: Context -> IO () -- | Information related to a running context, e.g. current cipher data Information Information :: Version -> Cipher -> Compression -> Maybe ByteString -> Maybe ClientRandom -> Maybe ServerRandom -> Maybe Group -> Maybe HandshakeMode13 -> Bool -> Information [infoVersion] :: Information -> Version [infoCipher] :: Information -> Cipher [infoCompression] :: Information -> Compression [infoMasterSecret] :: Information -> Maybe ByteString [infoClientRandom] :: Information -> Maybe ClientRandom [infoServerRandom] :: Information -> Maybe ServerRandom [infoNegotiatedGroup] :: Information -> Maybe Group [infoTLS13HandshakeMode] :: Information -> Maybe HandshakeMode13 [infoIsEarlyDataAccepted] :: Information -> Bool -- | Information about the current context contextGetInformation :: Context -> IO (Maybe Information) data ClientRandom data ServerRandom unClientRandom :: ClientRandom -> ByteString unServerRandom :: ServerRandom -> ByteString -- | If the ALPN extensions have been used, this will return get the -- protocol agreed upon. getNegotiatedProtocol :: MonadIO m => Context -> m (Maybe ByteString) -- | If the Server Name Indication extension has been used, return the -- hostname specified by the client. getClientSNI :: MonadIO m => Context -> m (Maybe HostName) -- | Updating appication traffic secrets for TLS 1.3. If this API is called -- for TLS 1.3, True is returned. Otherwise, False is -- returned. updateKey :: MonadIO m => Context -> KeyUpdateRequest -> m Bool -- | How to update keys in TLS 1.3 data KeyUpdateRequest -- | Unidirectional key update OneWay :: KeyUpdateRequest -- | Bidirectional key update (normal case) TwoWay :: KeyUpdateRequest -- | Post-handshake certificate request with TLS 1.3. Returns True -- if the request was possible, i.e. if TLS 1.3 is used and the remote -- client supports post-handshake authentication. requestCertificate :: MonadIO m => Context -> m Bool data ProtocolType ProtocolType_ChangeCipherSpec :: ProtocolType ProtocolType_Alert :: ProtocolType ProtocolType_Handshake :: ProtocolType ProtocolType_AppData :: ProtocolType ProtocolType_DeprecatedHandshake :: ProtocolType data Header Header :: ProtocolType -> Version -> Word16 -> Header -- | Versions known to TLS -- -- SSL2 is just defined, but this version is and will not be supported. data Version SSL2 :: Version SSL3 :: Version TLS10 :: Version TLS11 :: Version TLS12 :: Version TLS13 :: Version -- | every compression need to be wrapped in this, to fit in structure data Compression Compression :: a -> Compression -- | supported compression algorithms need to be part of this class class CompressionC a compressionCID :: CompressionC a => a -> CompressionID compressionCDeflate :: CompressionC a => a -> ByteString -> (a, ByteString) compressionCInflate :: CompressionC a => a -> ByteString -> (a, ByteString) -- | default null compression nullCompression :: Compression -- | Compression identification type CompressionID = Word8 data CipherKeyExchangeType CipherKeyExchange_RSA :: CipherKeyExchangeType CipherKeyExchange_DH_Anon :: CipherKeyExchangeType CipherKeyExchange_DHE_RSA :: CipherKeyExchangeType CipherKeyExchange_ECDHE_RSA :: CipherKeyExchangeType CipherKeyExchange_DHE_DSS :: CipherKeyExchangeType CipherKeyExchange_DH_DSS :: CipherKeyExchangeType CipherKeyExchange_DH_RSA :: CipherKeyExchangeType CipherKeyExchange_ECDH_ECDSA :: CipherKeyExchangeType CipherKeyExchange_ECDH_RSA :: CipherKeyExchangeType CipherKeyExchange_ECDHE_ECDSA :: CipherKeyExchangeType CipherKeyExchange_TLS13 :: CipherKeyExchangeType data Bulk Bulk :: String -> Int -> Int -> Int -> Int -> Int -> BulkFunctions -> Bulk [bulkName] :: Bulk -> String [bulkKeySize] :: Bulk -> Int [bulkIVSize] :: Bulk -> Int [bulkExplicitIV] :: Bulk -> Int [bulkAuthTagLen] :: Bulk -> Int [bulkBlockSize] :: Bulk -> Int [bulkF] :: Bulk -> BulkFunctions data BulkFunctions BulkBlockF :: (BulkDirection -> BulkKey -> BulkBlock) -> BulkFunctions BulkStreamF :: (BulkDirection -> BulkKey -> BulkStream) -> BulkFunctions BulkAeadF :: (BulkDirection -> BulkKey -> BulkAEAD) -> BulkFunctions data BulkDirection BulkEncrypt :: BulkDirection BulkDecrypt :: BulkDirection data BulkState BulkStateStream :: BulkStream -> BulkState BulkStateBlock :: BulkBlock -> BulkState BulkStateAEAD :: BulkAEAD -> BulkState BulkStateUninitialized :: BulkState newtype BulkStream BulkStream :: (ByteString -> (ByteString, BulkStream)) -> BulkStream type BulkBlock = BulkIV -> ByteString -> (ByteString, BulkIV) type BulkAEAD = BulkNonce -> ByteString -> BulkAdditionalData -> (ByteString, AuthTag) bulkInit :: Bulk -> BulkDirection -> BulkKey -> BulkState data Hash MD5 :: Hash SHA1 :: Hash SHA224 :: Hash SHA256 :: Hash SHA384 :: Hash SHA512 :: Hash SHA1_MD5 :: Hash -- | Cipher algorithm data Cipher Cipher :: CipherID -> String -> Hash -> Bulk -> CipherKeyExchangeType -> Maybe Version -> Maybe Hash -> Cipher [cipherID] :: Cipher -> CipherID [cipherName] :: Cipher -> String [cipherHash] :: Cipher -> Hash [cipherBulk] :: Cipher -> Bulk [cipherKeyExchange] :: Cipher -> CipherKeyExchangeType [cipherMinVer] :: Cipher -> Maybe Version [cipherPRFHash] :: Cipher -> Maybe Hash -- | Cipher identification type CipherID = Word16 cipherKeyBlockSize :: Cipher -> Int type BulkKey = ByteString type BulkIV = ByteString type BulkNonce = ByteString type BulkAdditionalData = ByteString -- | Check if a specific Cipher is allowed to be used with the -- version specified cipherAllowedForVersion :: Version -> Cipher -> Bool hasMAC :: BulkFunctions -> Bool hasRecordIV :: BulkFunctions -> Bool -- | Public key types known and used in X.509 data PubKey -- | RSA public key PubKeyRSA :: PublicKey -> PubKey -- | DSA public key PubKeyDSA :: PublicKey -> PubKey -- | DH format with (p,g,q,j,(seed,pgenCounter)) PubKeyDH :: (Integer, Integer, Integer, Maybe Integer, ([Word8], Integer)) -> PubKey -- | EC public key PubKeyEC :: PubKeyEC -> PubKey -- | X25519 public key PubKeyX25519 :: PublicKey -> PubKey -- | X448 public key PubKeyX448 :: PublicKey -> PubKey -- | Ed25519 public key PubKeyEd25519 :: PublicKey -> PubKey -- | Ed448 public key PubKeyEd448 :: PublicKey -> PubKey -- | unrecognized format PubKeyUnknown :: OID -> ByteString -> PubKey -- | Private key types known and used in X.509 data PrivKey -- | RSA private key PrivKeyRSA :: PrivateKey -> PrivKey -- | DSA private key PrivKeyDSA :: PrivateKey -> PrivKey -- | EC private key PrivKeyEC :: PrivKeyEC -> PrivKey -- | X25519 private key PrivKeyX25519 :: SecretKey -> PrivKey -- | X448 private key PrivKeyX448 :: SecretKey -> PrivKey -- | Ed25519 private key PrivKeyEd25519 :: SecretKey -> PrivKey -- | Ed448 private key PrivKeyEd448 :: SecretKey -> PrivKey data Group P256 :: Group P384 :: Group P521 :: Group X25519 :: Group X448 :: Group FFDHE2048 :: Group FFDHE3072 :: Group FFDHE4096 :: Group FFDHE6144 :: Group FFDHE8192 :: Group -- | Type to show which handshake mode is used in TLS 1.3. data HandshakeMode13 -- | Full handshake is used. FullHandshake :: HandshakeMode13 -- | Full handshake is used with hello retry reuest. HelloRetryRequest :: HandshakeMode13 -- | Server authentication is skipped. PreSharedKey :: HandshakeMode13 -- | Server authentication is skipped and early data is sent. RTT0 :: HandshakeMode13 -- | TLSError that might be returned through the TLS stack data TLSError -- | mainly for instance of Error Error_Misc :: String -> TLSError Error_Protocol :: (String, Bool, AlertDescription) -> TLSError Error_Certificate :: String -> TLSError -- | handshake policy failed. Error_HandshakePolicy :: String -> TLSError Error_EOF :: TLSError Error_Packet :: String -> TLSError Error_Packet_unexpected :: String -> String -> TLSError Error_Packet_Parsing :: String -> TLSError data KxError RSAError :: Error -> KxError KxUnsupported :: KxError data AlertDescription CloseNotify :: AlertDescription UnexpectedMessage :: AlertDescription BadRecordMac :: AlertDescription -- | deprecated alert, should never be sent by compliant implementation DecryptionFailed :: AlertDescription RecordOverflow :: AlertDescription DecompressionFailure :: AlertDescription HandshakeFailure :: AlertDescription BadCertificate :: AlertDescription UnsupportedCertificate :: AlertDescription CertificateRevoked :: AlertDescription CertificateExpired :: AlertDescription CertificateUnknown :: AlertDescription IllegalParameter :: AlertDescription UnknownCa :: AlertDescription AccessDenied :: AlertDescription DecodeError :: AlertDescription DecryptError :: AlertDescription ExportRestriction :: AlertDescription ProtocolVersion :: AlertDescription InsufficientSecurity :: AlertDescription InternalError :: AlertDescription InappropriateFallback :: AlertDescription UserCanceled :: AlertDescription NoRenegotiation :: AlertDescription MissingExtension :: AlertDescription UnsupportedExtension :: AlertDescription CertificateUnobtainable :: AlertDescription UnrecognizedName :: AlertDescription BadCertificateStatusResponse :: AlertDescription BadCertificateHashValue :: AlertDescription UnknownPskIdentity :: AlertDescription CertificateRequired :: AlertDescription NoApplicationProtocol :: AlertDescription -- | TLS Exceptions related to bad user usage or asynchronous errors data TLSException -- | Early termination exception with the reason and the error associated Terminated :: Bool -> String -> TLSError -> TLSException -- | Handshake failed for the reason attached HandshakeFailed :: TLSError -> TLSException -- | Usage error when the connection has not been established and the user -- is trying to send or receive data ConnectionNotEstablished :: TLSException -- | same as recvData but returns a lazy bytestring. -- | Deprecated: use recvData that returns strict bytestring recvData' :: MonadIO m => Context -> m ByteString -- | create a new context on an handle. -- | Deprecated: use contextNew contextNewOnHandle :: (MonadIO m, TLSParams params) => Handle -> params -> m Context -- | create a new context on a socket. -- | Deprecated: use contextNew contextNewOnSocket :: (MonadIO m, TLSParams params) => Socket -> params -> m Context -- | Deprecated: Use Data.ByteString.Bytestring instead of Bytes. type Bytes = ByteString