summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Arbitrary.patch11
-rw-r--r--Data/OpenPGP.hs41
2 files changed, 48 insertions, 4 deletions
diff --git a/Arbitrary.patch b/Arbitrary.patch
index f1f3824..fa78846 100644
--- a/Arbitrary.patch
+++ b/Arbitrary.patch
@@ -1,6 +1,6 @@
1--- Data/OpenPGP/Arbitrary.hs 2012-04-27 12:38:11.492411339 -0500 1--- Data/OpenPGP/Arbitrary.hs 2012-04-27 12:38:11.492411339 -0500
2+++ arb.s 2012-04-27 12:37:57.176469214 -0500 2+++ arb.s 2012-04-27 12:37:57.176469214 -0500
3@@ -14,13 +14,11 @@ 3@@ -14,13 +14,18 @@
4 0 -> do x1 <- arbitrary 4 0 -> do x1 <- arbitrary
5 x2 <- arbitrary 5 x2 <- arbitrary
6 x3 <- arbitrary 6 x3 <- arbitrary
@@ -13,7 +13,14 @@
13- x8 <- arbitrary 13- x8 <- arbitrary
14- x9 <- arbitrary 14- x9 <- arbitrary
15- return (SignaturePacket x1 x2 x3 x4 x5 x6 x7 x8 x9) 15- return (SignaturePacket x1 x2 x3 x4 x5 x6 x7 x8 x9)
16+ return (signaturePacket 4 x1 x2 x3 x4 x5 x6 x7) 16+ version <- choose (2 :: Word8, 4)
17+ case version of
18+ 4 ->
19+ return (signaturePacket 4 x1 x2 x3 x4 x5 x6 x7)
20+ _ -> do
21+ creation_time <- arbitrary
22+ keyid <- vectorOf 16 (elements (['0'..'9'] ++ ['A'..'F']))
23+ return (signaturePacket version x1 x2 x3 [] [SignatureCreationTimePacket creation_time, IssuerPacket keyid] x6 x7)
17 1 -> do x1 <- arbitrary 24 1 -> do x1 <- arbitrary
18 x2 <- arbitrary 25 x2 <- arbitrary
19 x3 <- arbitrary 26 x3 <- arbitrary
diff --git a/Data/OpenPGP.hs b/Data/OpenPGP.hs
index 5e735d0..e6076fa 100644
--- a/Data/OpenPGP.hs
+++ b/Data/OpenPGP.hs
@@ -65,6 +65,7 @@ import Data.Bits
65import Data.Word 65import Data.Word
66import Data.Char 66import Data.Char
67import Data.Maybe 67import Data.Maybe
68import Data.List
68import Data.OpenPGP.Internal 69import Data.OpenPGP.Internal
69import qualified Data.ByteString.Lazy as LZ 70import qualified Data.ByteString.Lazy as LZ
70 71
@@ -308,15 +309,51 @@ signature_packet_start x =
308 309
309-- The trailer is just the top of the body plus some crap 310-- The trailer is just the top of the body plus some crap
310calculate_signature_trailer :: Packet -> B.ByteString 311calculate_signature_trailer :: Packet -> B.ByteString
311calculate_signature_trailer p = 312calculate_signature_trailer (SignaturePacket { version = v,
313 signature_type = signature_type,
314 unhashed_subpackets = unhashed_subpackets
315 }) | v `elem` [2,3] =
316 B.concat [
317 encode signature_type,
318 encode creation_time
319 ]
320 where
321 Just (SignatureCreationTimePacket creation_time) = find isCreation unhashed_subpackets
322 isCreation (SignatureCreationTimePacket {}) = True
323 isCreation _ = False
324calculate_signature_trailer p@(SignaturePacket {version = 4}) =
312 B.concat [ 325 B.concat [
313 signature_packet_start p, 326 signature_packet_start p,
314 encode (0x04 :: Word8), 327 encode (0x04 :: Word8),
315 encode (0xff :: Word8), 328 encode (0xff :: Word8),
316 encode (fromIntegral (B.length $ signature_packet_start p) :: Word32) 329 encode (fromIntegral (B.length $ signature_packet_start p) :: Word32)
317 ] 330 ]
331calculate_signature_trailer x =
332 error ("Trying to calculate signature trailer for: " ++ show x)
318 333
319put_packet :: (Num a) => Packet -> (B.ByteString, a) 334put_packet :: (Num a) => Packet -> (B.ByteString, a)
335put_packet (SignaturePacket { version = v,
336 unhashed_subpackets = unhashed_subpackets,
337 key_algorithm = key_algorithm,
338 hash_algorithm = hash_algorithm,
339 hash_head = hash_head,
340 signature = signature,
341 trailer = trailer }) | v `elem` [2,3] =
342 -- TODO: Assert that there are no subpackets we cannot encode?
343 (B.concat $ [
344 B.singleton v,
345 B.singleton 0x05,
346 trailer, -- signature_type and creation_time
347 encode keyid,
348 encode key_algorithm,
349 encode hash_algorithm,
350 encode hash_head
351 ] ++ map encode signature, 2)
352 where
353 keyid = fst $ head $ readHex keyidS :: Word64
354 Just (IssuerPacket keyidS) = find isIssuer unhashed_subpackets
355 isIssuer (IssuerPacket {}) = True
356 isIssuer _ = False
320put_packet (SignaturePacket { version = 4, 357put_packet (SignaturePacket { version = 4,
321 unhashed_subpackets = unhashed_subpackets, 358 unhashed_subpackets = unhashed_subpackets,
322 hash_head = hash_head, 359 hash_head = hash_head,
@@ -407,7 +444,7 @@ parse_packet 2 = do
407 _ <- fmap (assertProp (==5)) (get :: Get Word8) 444 _ <- fmap (assertProp (==5)) (get :: Get Word8)
408 signature_type <- get 445 signature_type <- get
409 creation_time <- get :: Get Word32 446 creation_time <- get :: Get Word32
410 key_id <- get :: Get Word64 447 keyid <- get :: Get Word64
411 key_algorithm <- get 448 key_algorithm <- get
412 hash_algorithm <- get 449 hash_algorithm <- get
413 hash_head <- get 450 hash_head <- get