summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Cost.hs33
-rw-r--r--Tunables.hs3
2 files changed, 34 insertions, 2 deletions
diff --git a/Cost.hs b/Cost.hs
index 99baa33..de5a82d 100644
--- a/Cost.hs
+++ b/Cost.hs
@@ -6,7 +6,10 @@ import Utility.HumanTime
import Data.Monoid
-- | An estimated cost to perform an operation.
-data Cost op = CPUCost Seconds | GPUCost Seconds | CombinedCost (Cost op) (Cost op)
+data Cost op
+ = CPUCost Seconds
+ | GPUCost Seconds
+ | CombinedCost (Cost op) (Cost op)
deriving (Show)
newtype Seconds = Seconds Integer
@@ -80,5 +83,33 @@ bruteForceLinearSearch stepcost e =
class Bruteforceable t a where
getBruteCostCalc :: t -> CostCalc BruteForceOp a
+-- | Estimate of cost of a brute force attack.
estimateBruteforceOf :: Bruteforceable t a => t -> Entropy a -> Cost BruteForceOp
estimateBruteforceOf t e = getBruteCostCalc t e
+
+-- | Estimate of cost of brute force attack using AWS Spot instances,
+-- in US dollars.
+--
+-- August 2016 spot pricing: 36 CPU core c4.8xlarge at 33c/hour
+--
+-- Note that less GPU time is available on these instances;
+-- there are not 36 GPU cores. But for simplicity we assume there are
+-- that many GPU cores. So, this underestimates the price to brute
+-- force such operations.
+estimateAWSSpotAttack :: Cost BruteForceOp -> Dollars
+estimateAWSSpotAttack opcost = centsToDollars $ costcents
+ where
+ (Seconds cpuseconds) = fst (totalCost opcost)
+ cpuyears = cpuseconds `div` (60*60*24*365)
+ cpucores = 36
+ costpercpuyear = Cents (33*24*365 `div` cpucores)
+ costcents = Cents cpuyears * costpercpuyear
+
+newtype Cents = Cents Integer
+ deriving (Num, Integral, Enum, Real, Ord, Eq, Show)
+
+newtype Dollars = Dollars Integer
+ deriving (Num, Integral, Enum, Real, Ord, Eq, Show)
+
+centsToDollars :: Cents -> Dollars
+centsToDollars (Cents c) = Dollars (c `div` 100)
diff --git a/Tunables.hs b/Tunables.hs
index 5c39a2d..f5832b4 100644
--- a/Tunables.hs
+++ b/Tunables.hs
@@ -23,7 +23,8 @@ defaultTunables = Tunables
-- argon2 is GPU and ASIC resistent, so it uses CPU time.
-- The above HashOptions were benchmarked at 661 seconds CPU time
-- on a 2 core Intel(R) Core(TM) i5-4210Y CPU @ 1.50GHz.
- , argonCost = CPUCost (Seconds 600)
+ -- Since cost is measured per core, we double that.
+ , argonCost = CPUCost (Seconds (2*600))
-- AES can be calculated more efficiently by a GPU, so this
-- cost is a GPU cost.
-- This is set to only 1 minute because GPUs are quite a lot