some prototyping and fiddling around with ASN.1
This commit is contained in:
parent
992320b67b
commit
7e6c4985ce
|
@ -46,7 +46,7 @@ category: Network
|
||||||
extra-source-files: CHANGELOG.md
|
extra-source-files: CHANGELOG.md
|
||||||
|
|
||||||
common deps
|
common deps
|
||||||
build-depends: base ^>=4.12.0.0, containers ^>=0.6.0.1, bytestring, utf8-string ^>=1.0.1.1, network ^>=2.8.0.1, time ^>=1.8.0.2, cmdargs ^>= 0.10, cryptonite ^>= 0.25, memory, binary-strict, async, asn1-encoding, asn1-types, asn1-parse
|
build-depends: base ^>=4.12.0.0, containers ^>=0.6.0.1, bytestring, utf8-string ^>=1.0.1.1, network ^>=2.8.0.1, time ^>=1.8.0.2, cmdargs ^>= 0.10, cryptonite ^>= 0.25, memory, async, asn1-encoding, asn1-types, asn1-parse
|
||||||
ghc-options: -Wall
|
ghc-options: -Wall
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
{ pkgs ? import (
|
{ pkgs ? import (
|
||||||
builtins.fetchGit {
|
builtins.fetchGit {
|
||||||
name = "nixpkgs-pinned";
|
name = "nixpkgs-pinned";
|
||||||
url = https://github.com/NixOS/nixpkgs/;
|
#url = https://github.com/NixOS/nixpkgs/;
|
||||||
ref = "refs/heads/release-20.03";
|
url = https://github.com/schmittlauch/nixpkgs/;
|
||||||
rev = "c778e137bdf921e7574f37f96874c247c5df768e";
|
#ref = "refs/heads/release-20.03";
|
||||||
|
ref = "refs/heads/bump-asn1-types";
|
||||||
|
#rev = "10100a97c8964e82b30f180fda41ade8e6f69e41";
|
||||||
|
rev = "cb0e38127c7a66c292e60d7e8c1ab4eeb26c44a4";
|
||||||
}) {},
|
}) {},
|
||||||
compiler ? "ghc865"
|
compiler ? "ghc865"
|
||||||
}:
|
}:
|
||||||
|
|
|
@ -3,16 +3,43 @@ module Main where
|
||||||
|
|
||||||
import qualified Data.ASN1.Encoding as ASN1 -- asn1-encoding package
|
import qualified Data.ASN1.Encoding as ASN1 -- asn1-encoding package
|
||||||
import qualified Data.ASN1.BinaryEncoding as ASN1
|
import qualified Data.ASN1.BinaryEncoding as ASN1
|
||||||
|
import qualified Data.ASN1.Error as ASN1
|
||||||
import qualified Data.ASN1.Types as ASN1 -- asn1-types package
|
import qualified Data.ASN1.Types as ASN1 -- asn1-types package
|
||||||
|
import qualified Data.ASN1.Parse as ASN1P
|
||||||
|
import qualified Data.ByteString as BS
|
||||||
|
import Data.Maybe (fromMaybe)
|
||||||
|
|
||||||
-- import Hash2Pub.Fedichord
|
-- import Hash2Pub.Fedichord
|
||||||
|
|
||||||
-- encoding values as ASN.1 types is done using Data.ASN1.Prim
|
-- encoding values as ASN.1 types is done using Data.ASN1.Prim
|
||||||
someASN1 = ASN1.encodeASN1' ASN1.DER $ ASN1.Start ASN1.Sequence : ASN1.ASN1String (ASN1.asn1CharacterString ASN1.Visible domain) : ASN1.ASN1String (ASN1.asn1CharacterString ASN1.UTF8 unicode) : map ASN1.IntVal xs ++ [ASN1.End ASN1.Sequence]
|
someASN1 :: [ASN1.ASN1]
|
||||||
|
someASN1 = ASN1.Start ASN1.Sequence : ASN1.ASN1String (ASN1.asn1CharacterString ASN1.Visible domain) : ASN1.ASN1String (ASN1.asn1CharacterString ASN1.UTF8 unicode) : map ASN1.IntVal xs ++ [ASN1.End ASN1.Sequence]
|
||||||
where
|
where
|
||||||
domain = "domains.are.ascii.on.ly"
|
domain = "domains.are.ascii.on.ly"
|
||||||
unicode = "Hähä, but unicode string!"
|
unicode = "Hähä, but unicode string!"
|
||||||
xs = [ 23, 42, 2342 ]
|
xs = [ 23, 42, 2342 ]
|
||||||
|
|
||||||
|
asn1AsDer :: [ASN1.ASN1] -> BS.ByteString
|
||||||
|
asn1AsDer = ASN1.encodeASN1' ASN1.DER
|
||||||
|
|
||||||
|
derToAsn1 :: BS.ByteString -> Either ASN1.ASN1Error [ASN1.ASN1]
|
||||||
|
derToAsn1 = ASN1.decodeASN1' ASN1.DER
|
||||||
|
|
||||||
|
getUnicodeField :: [ASN1.ASN1] -> String
|
||||||
|
getUnicodeField ((ASN1.Start ASN1.Sequence) : _ : (ASN1.ASN1String strASN1) : _) = fromMaybe "" $ ASN1.asn1CharacterToString strASN1
|
||||||
|
|
||||||
|
testParser :: ASN1P.ParseASN1 String
|
||||||
|
testParser = do
|
||||||
|
show <$> ASN1P.getNext
|
||||||
|
|
||||||
|
--stringParser asn1obj =
|
||||||
|
-- fmap (fromMaybe "" $ ASN1.asn1CharacterToString) ASN1P.getNext
|
||||||
|
|
||||||
main = do
|
main = do
|
||||||
print someASN1
|
print someASN1
|
||||||
|
print $ asn1AsDer someASN1
|
||||||
|
print $ derToAsn1 . asn1AsDer $ someASN1
|
||||||
|
putStrLn $ getUnicodeField someASN1
|
||||||
|
print $ ASN1.decodeASN1Repr' ASN1.DER $ asn1AsDer someASN1
|
||||||
|
putStrLn "\nLet's try a real parser combinator:"
|
||||||
|
print $ ASN1P.runParseASN1State testParser someASN1
|
||||||
|
|
Loading…
Reference in a new issue