profile
viewpoint
If you are wondering where the data of this site comes from, please visit https://api.github.com/users/axman6/events. GitMemory does not store any data, but only uses NGINX to cache data for a period of time. The idea behind GitMemory is simply to give users a better reading experience.
Alex Mason axman6 Canberra, Australia https://axman6.com Haskell developer for over a decade, Currently working at the ASX/Digital Asset

axman6/amazonka-s3-streaming 19

Provides a conduit based interface to uploading data to S3 using the Multipart API

axman6/BitParser 5

A parsing library for parsing ByteStrings at the bit level, a la Erlang's bit syntax.

axman6/array-utils 2

A library of utility functions for working with Arrays in Haskell (Hopefully for future inclusion into GHC's array package)

axman6/Curve25519 2

A Pure Haskell implementation of Curve25519

axman6/friday-scale-dct 2

Uses discrete cosine transform to rescale images from the Haskell Friday image library.

axman6/blaze-html 1

A blazingly fast HTML combinator library for Haskell.

axman6/digestive-functors 1

A general way to consume input using applicative functors

axman6/ElectionGuard 1

An implementation of Microsoft's ElectionGuard (v0.95) in Haskell

push eventaxman6/ElectionGuard

Alex Mason

commit sha 68aa6ebf623599539302b94f67fcb188abbc33ba

Add Election module

view details

Alex Mason

commit sha 4fdfd56d57bf2c1da68112cb1dbecd0ba5aa8c92

Add bits and pieces to Group

view details

Alex Mason

commit sha 7dc4c48ebc5e95d70eae31fadf6713c63120f4f6

Add Schnorr proofs

view details

Alex Mason

commit sha 6f2911bc83f16b7cdb1b90fe28a1d17c7adf9799

More Hash work

view details

Alex Mason

commit sha b9a36ecde16cec25a4fb3575252277fb75b4cc37

Initial Nonces

view details

Alex Mason

commit sha 842784c3f3cee1b1f0f4a4ee20a806f34133cea3

Make Int in DLog lazy

view details

push time in 2 months

issue commentmicrosoft/electionguard-python

hashing doesn't correctly handle some corner cases

Thanks @rc-ms, I'm looking forward to seeing it. Do you have any indication of roughly how far away that is likely to be?

danwallach

comment created time in 3 months

issue commentmicrosoft/electionguard-python

hashing doesn't correctly handle some corner cases

I think I finally got an implementation that works in a similar way to the python implementation, but some of the decisions are just bizarre. I see no reason why the integer 0 should be hashed as the string null instead of the sensible 00. Relying on the truthiness of python in the specification seems like it;'s just asking for problems, particularly when porting to other languages. And with the above integer issue, I would argue that the python implementation doesn't meet the specification.

I would also really like to see some unit tests that have exact values that are expected for example hashes - I'm getting the following for a hash of the ElementModQ 1, but have no idea if that matches the expected value: ElementMod 40677219090659355057937666039608240739439661729487310312972515788410031365428.

danwallach

comment created time in 3 months

push eventaxman6/ElectionGuard

Alex Mason

commit sha c489bf10621a05cc9ae297193a309eaa90c9d643

Hashes???

view details

push time in 3 months

issue commentmicrosoft/electionguard-python

hashing doesn't correctly handle some corner cases

I took your advice and I've decided to use a type of S-Expressions, that should give me what's needed to match the behaviour here.

danwallach

comment created time in 3 months

push eventaxman6/ElectionGuard

Alex Mason

commit sha 10659c0976b519947a820e41e70832d7ad54e88f

Add missing deps

view details

push time in 3 months

issue commentmicrosoft/electionguard-python

hashing doesn't correctly handle some corner cases

Yeah I did think about what you happen if you happened to have the same sequence of hashable items in different structures, but I can't see this would be easily exploited, you still need to be able to produce the same hashable items, which is what the hash is supposed to check anyway. The problem comes when using languages which don't have variadic functions, where multiple arguments would be passed in using tuples, and the handling of these functions would be different depending on if this is the top level call or a recursive one.

danwallach

comment created time in 3 months

push eventaxman6/ElectionGuard

Alex Mason

commit sha 33ebd080294fdba8b6d5fcbb8ab3f01488de648f

Rename pad to pubKey to be more explicit

view details

Alex Mason

commit sha 07693ab50d5e5b1a633ad2389403afee71e6b01d

toHex and toBytes

view details

Alex Mason

commit sha 2964b21b0d4d404a6440448119384536b60d5a95

WIP hashing

view details

Alex Mason

commit sha d05c71efd14bf567f4d9430915eff84f62f24e99

Some hashbing tests, pending MS response

view details

push time in 3 months

issue commentmicrosoft/electionguard-python

hashing doesn't correctly handle some corner cases

I've also been trying to implement hashing in another language, and am finding the way that hashes work in this repo quite odd.

The decision to treat hash_elems with three arguments differently to hash_elems with a three-tuple with the same three elements seems odd to me. I had assumed that the final hash would be constructed from all the values contributing to the hash separated by "|", but in cases where the input is a sequence, we have to compute the hash of that whole structure. What I would have expected was something like the following (which is untested, my python is pretty rusty)


def hash_elems(*a: CRYPTO_HASHABLE_ALL) -> ElementModQ:
    """
    Given zero or more elements, calculate their cryptographic hash
    using SHA256. Allowed element types are `ElementModP`, `ElementModQ`,
    `str`, or `int`, anything implementing `CryptoHashable`, and lists
    or optionals of any of those types.

    :param a: Zero or more elements of any of the accepted types.
    :return: A cryptographic hash of these elements, concatenated.
    """
    h = sha256()
    h.update("|".encode("utf-8"))
    for x in a:
        hash_update_elems(h,x)

    # We don't need the checked version of int_to_q, because the
    # modulo operation here guarantees that we're in bounds.
    return int_to_q_unchecked(int.from_bytes(h.digest(), byteorder="big") % Q_MINUS_ONE)

def hash_update_elems(h,*a: CRYPTO_HASHABLE_ALL) -> ElementModQ:
    """
    Given zero or more elements, calculate their cryptographic hash
    using SHA256, updating a given hash context. Allowed element types
    are `ElementModP`, `ElementModQ`, `str`, or `int`, anything
    implementing `CryptoHashable`, and lists or optionals of any of
    those types.

    :param h: A SHA256 context
    :param a: Zero or more elements of any of the accepted types.
    :return: A cryptographic hash of these elements, concatenated.
    """

    for x in a:
        # We could just use str(x) for everything, but then we'd have a resulting string
        # that's a bit Python-specific, and we'd rather make it easier for other languages
        # to exactly match this hash function.

        if not x:
            # This case captures empty lists and None, nicely guaranteeing that we don't
            # need to do a recursive call if the list is empty. So we need a string to
            # feed in for both of these cases. "None" would be a Python-specific thing,
            # so we'll go with the more JSON-ish "null".
            hash_me = "null"

        elif isinstance(x, (ElementModP, ElementModQ)):
            hash_me = x.to_hex()
        elif isinstance(x, CryptoHashable):
            hash_me = x.crypto_hash().to_hex()
        elif isinstance(x, str):
            # strings are iterable, so it's important to handle them before the following check
            hash_me = x
        elif isinstance(x, Sequence):
            # The simplest way to deal with lists, tuples, and such are to crunch them recursively.
            hash_update_elems(h,*x)
            hash_me = nil
        else:
            hash_me = str(x)

        if hash_me: h.update((hash_me + "|").encode("utf-8"))

Doing this would mean that hashing something like [1,(2,3),[(4,5),6] would be equivalent to performing a hash over the single string|01|02|03|04|05|06| rather than some somewhat arbitrary choice of returning the result of |01|<hash of (2,3) in hex>| <hash of <hash of (3,4)>, 6>|

What I'm not sure about is how important the structure is in the hashes being constructed, but I wouldn't have thought this were particularly important.

danwallach

comment created time in 3 months

push eventaxman6/ElectionGuard

Alex Mason

commit sha 3f21f18e27d6ecc94910adab7daa328ebb534992

Initial hash functions

view details

push time in 3 months

push eventaxman6/ElectionGuard

Alex Mason

commit sha 1b4f4a5f5afad3c304d811f4cb5cb47ba7183c9a

Implement dlog using MemoTrie, fix g'

view details

Alex Mason

commit sha b02a78c1bded09c53abe8d56ede58d911594f002

add multInv, use String instead of Text

view details

Alex Mason

commit sha 147a5816d2e7714f7eb4f7feb3dac48581dea5c6

Implement ElGamal and add tests to show it works

view details

Alex Mason

commit sha 8aaeebd485b4a2b71f7f705540eecc387fc5fe67

Use arbitrary private key in test

view details

Alex Mason

commit sha 7e3dcee0064e9ed8ddca17a9e94c43504b7a7423

Simplify mult, add some basic ElGamal funcs

view details

Alex Mason

commit sha 7530a291affbc66b45080754965d215d7a4c1f6e

Add json stuff

view details

push time in 3 months

push eventaxman6/ElectionGuard

Alex Mason

commit sha 4d589f4092320447fdeabac4de4994d61bdb6796

Disable stack

view details

Alex Mason

commit sha 0546fa1ed5426569caa27aacd486187cb2089f3b

ElementMod to Group

view details

Alex Mason

commit sha d3532c51f77225941691b5c636dc4f6674661e0b

Add Auxiliary keys

view details

Alex Mason

commit sha e85caee2b51975584fc9fda058091497bda8b882

Initial DLog

view details

Alex Mason

commit sha f6131eb594f131a1df9dcec179617aa57a149b2f

Initial baseline param tests

view details

push time in 3 months

PR opened microsoft/electionguard

Fix constants in spec

It looks like something for truncated when specifying the constant for r, my calculations show that there's a 1 missing definition:

r' :: Integer
r' = ((p - 1) * inverseCoprimes q p) `mod` p
r'' :: Integer
r'' = 0x00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000001_00000000_00000000_00000000_00000000_00000000_00000000_00000000_000000BC_93C467E3_7DB0C7A4_D1BE3F81_0152CB56_A1CECC3A_F65CC019_0C03DF34_709B8AF6_A64C0CED_CF2D559D_A9D97F09_5C3076C6_86037619_148D2C86_C317102A_FA214803_1F04440A_C0FF0C9A_417A8921_2512E760_7B2501DA_A4D38A2C_1410C483_6149E2BD_B8C8260E_627C4646_963EFFE9_E16E495D_48BD215C_6D8EC9D1_667657A2_A1C8506F_2113FFAD_19A6B2BC_7C457604_56719183_309F874B_C9ACE570_FFDA877A_A2B23A2D_6F291C15_54CA2EB1_2F12CD00_9B8B8734_A64AD51E_B893BD89_1750B851_62241D90_8F0C9709_879758E7_E8233EAB_3BF2D6AB_53AFA32A_A153AD66_82E5A064_8897C9BE_18A0D50B_ECE030C3_432336AD_9163E33F_8E7DAF49_8F14BB28_52AFFA81_4841EB18_DD5F0E89_516D5577_76285C16_071D2111_94EE1C3F_34642036_AB886E3E_C28882CE_4003DEA3_35B4D935_BAE4B582_35B9FB2B_AB713C8F_705A1C7D_E4222020_9D6BBCAC_C4673186_01565272_E4A63E38_E2499754_AE493AC1_A8E83469_EEF35CA2_7C271BC7_92EEE211_56E617B9_22EA8F71_3C22CF28_2DC5D638_5BB12868_EB781278_FA0AB2A8_958FCCB5_FFE2E5C3_61FC1744_20122B01_63CA4A46_308C8C46_C91EA745_7C1AD0D6_9FD4A7F5_29FD4A7F_529FD4A7_F529FD4A_7F529FD4_A7F529FD_4A7F529F_D4A7F52A
r :: Integer
r   =                                                                         0x00000000_00000000_00000000_00000000_00000000_00000000_00000000_000000BC_93C467E3_7DB0C7A4_D1BE3F81_0152CB56_A1CECC3A_F65CC019_0C03DF34_709B8AF6_A64C0CED_CF2D559D_A9D97F09_5C3076C6_86037619_148D2C86_C317102A_FA214803_1F04440A_C0FF0C9A_417A8921_2512E760_7B2501DA_A4D38A2C_1410C483_6149E2BD_B8C8260E_627C4646_963EFFE9_E16E495D_48BD215C_6D8EC9D1_667657A2_A1C8506F_2113FFAD_19A6B2BC_7C457604_56719183_309F874B_C9ACE570_FFDA877A_A2B23A2D_6F291C15_54CA2EB1_2F12CD00_9B8B8734_A64AD51E_B893BD89_1750B851_62241D90_8F0C9709_879758E7_E8233EAB_3BF2D6AB_53AFA32A_A153AD66_82E5A064_8897C9BE_18A0D50B_ECE030C3_432336AD_9163E33F_8E7DAF49_8F14BB28_52AFFA81_4841EB18_DD5F0E89_516D5577_76285C16_071D2111_94EE1C3F_34642036_AB886E3E_C28882CE_4003DEA3_35B4D935_BAE4B582_35B9FB2B_AB713C8F_705A1C7D_E4222020_9D6BBCAC_C4673186_01565272_E4A63E38_E2499754_AE493AC1_A8E83469_EEF35CA2_7C271BC7_92EEE211_56E617B9_22EA8F71_3C22CF28_2DC5D638_5BB12868_EB781278_FA0AB2A8_958FCCB5_FFE2E5C3_61FC1744_20122B01_63CA4A46_308C8C46_C91EA745_7C1AD0D6_9FD4A7F5_29FD4A7F_529FD4A7_F529FD4A_7F529FD4_A7F529FD_4A7F529F_D4A7F52A
>>> r' == r''
True
-- g = g = 2^r mod p
g :: Integer
g = 0x037DE384_F98F6E03_8D2A3141_825B33D5_D45EC4CC_64CFD15E_750D6798_F5196CF2_A142CDF3_3F6EF853_840EC7D4_EC804794_CFB0CFB6_5363B256_6387B98E_E0E3DEF1_B706FA55_D5038FFB_4A62DCBB_93B1DDD8_D3B308DA_86D1C3A5_25EF356F_E5BB5931_4E656334_80B396E1_DD4B795F_78DE07D8_6B0E2A05_BE6AF78F_D7F736FC_BA6C032E_26E050AF_50A03C65_FA7B6C87_F4554CB5_7F3DABCB_AD8EB9D8_FDEBEEF5_8570669A_CC3EDA17_DBFC47B8_B3C39AA0_8B829B28_872E62B5_D1B13A98_F09D40AC_20C2AB74_A6750E7C_8750B514_1E221C41_F55BBA31_D8E41422_B64D2CBA_7AAA0E9F_D8785702_F6932825_BF45DE83_86D24900_742062C1_322B37C5_0AF18215_8090C35D_A9355E6C_F7F72DA3_9A2284FD_FB1918B2_A2A30E69_501FA234_2B728263_DF23F1DB_8355BDE1_EB276FB3_685F3716_72CEB313_FDAB069C_C9B11AB6_C59BCE62_BAAD96AA_C96B0DBE_0C7E71FC_B2255254_5A5D1CED_EEE01E4B_C0CDBDB7_6B6AD45F_09AF5E71_114A005F_93AD97B8_FE09274E_76C94B20_08926B38_CAEC94C9_5E96D628_F6BC8066_2BA06207_801328B2_C6A60526_BF7CD02D_9661385A_C3B1CBDB_50F759D0_E9F61C11_A07BF421_8F299BCB_29005200_76EBD2D9_5A3DEE96_D4809EF3_4ABEB83F_DBA8A12C_5CA82757_288A89C9_31CF564F_00E8A317_AE1E1D82_8E61369B_A0DDBADB_10C136F8_691101AD_82DC5477_5AB83538_40D99921_97D80A6E_94B38AC4_17CDDF40_B0C73ABF_03E8E0AA

gCalc :: Integer
gCalc = expFast 2 r' p

>>> g == expFast 2 r p
False
>>> g == expFast 2 r' p
True

Issue

Link your PR to an issue

Fixes #___

Description

Please describe your pull request.

Testing

Describe the best way to test or validate your PR.

Checklist

🚨Please review the guidelines for contributing to this repository.

  • [ ] 🤔 CONSIDER adding a unit test if your PR resolves an issue.
  • [ ] ✅ DO check open PR's to avoid duplicates.
  • [ ] ✅ DO keep pull requests small so they can be easily reviewed.
  • [ ] ✅ DO build locally before pushing.
  • [ ] ✅ DO make sure tests pass.
  • [ ] ✅ DO make sure any new changes are documented.
  • [ ] ✅ DO make sure not to introduce any compiler warnings.
  • [ ] ❌AVOID breaking the continuous integration build.
  • [ ] ❌AVOID making significant changes to the overall architecture.

💔Thank you!

+4 -4

0 comment

1 changed file

pr created time in 3 months

push eventaxman6/ElectionGuard

Alex Mason

commit sha ac56fe814ae843e593eaad26587c29866317425f

Add deps

view details

Alex Mason

commit sha 09778809030c7a56313830ea1868de6755b8cdd4

implement Baseline Parameters

view details

push time in 3 months

push eventaxman6/ms-electionguard

Alex Mason

commit sha 10d821357b165ca4e8f0e1305e56579daa70d666

Fix constants in spec It looks like something for truncated when specifying the constant for `r`, my calculations show that there's a 1 missing definition: ```haskell r' :: Integer r' = ((p - 1) * inverseCoprimes q p) `mod` p r'' :: Integer r'' = 0x00000000_00000000_00000000_00000000_00000000_00000000_00000000_00000001_00000000_00000000_00000000_00000000_00000000_00000000_00000000_000000BC_93C467E3_7DB0C7A4_D1BE3F81_0152CB56_A1CECC3A_F65CC019_0C03DF34_709B8AF6_A64C0CED_CF2D559D_A9D97F09_5C3076C6_86037619_148D2C86_C317102A_FA214803_1F04440A_C0FF0C9A_417A8921_2512E760_7B2501DA_A4D38A2C_1410C483_6149E2BD_B8C8260E_627C4646_963EFFE9_E16E495D_48BD215C_6D8EC9D1_667657A2_A1C8506F_2113FFAD_19A6B2BC_7C457604_56719183_309F874B_C9ACE570_FFDA877A_A2B23A2D_6F291C15_54CA2EB1_2F12CD00_9B8B8734_A64AD51E_B893BD89_1750B851_62241D90_8F0C9709_879758E7_E8233EAB_3BF2D6AB_53AFA32A_A153AD66_82E5A064_8897C9BE_18A0D50B_ECE030C3_432336AD_9163E33F_8E7DAF49_8F14BB28_52AFFA81_4841EB18_DD5F0E89_516D5577_76285C16_071D2111_94EE1C3F_34642036_AB886E3E_C28882CE_4003DEA3_35B4D935_BAE4B582_35B9FB2B_AB713C8F_705A1C7D_E4222020_9D6BBCAC_C4673186_01565272_E4A63E38_E2499754_AE493AC1_A8E83469_EEF35CA2_7C271BC7_92EEE211_56E617B9_22EA8F71_3C22CF28_2DC5D638_5BB12868_EB781278_FA0AB2A8_958FCCB5_FFE2E5C3_61FC1744_20122B01_63CA4A46_308C8C46_C91EA745_7C1AD0D6_9FD4A7F5_29FD4A7F_529FD4A7_F529FD4A_7F529FD4_A7F529FD_4A7F529F_D4A7F52A r :: Integer r = 0x00000000_00000000_00000000_00000000_00000000_00000000_00000000_000000BC_93C467E3_7DB0C7A4_D1BE3F81_0152CB56_A1CECC3A_F65CC019_0C03DF34_709B8AF6_A64C0CED_CF2D559D_A9D97F09_5C3076C6_86037619_148D2C86_C317102A_FA214803_1F04440A_C0FF0C9A_417A8921_2512E760_7B2501DA_A4D38A2C_1410C483_6149E2BD_B8C8260E_627C4646_963EFFE9_E16E495D_48BD215C_6D8EC9D1_667657A2_A1C8506F_2113FFAD_19A6B2BC_7C457604_56719183_309F874B_C9ACE570_FFDA877A_A2B23A2D_6F291C15_54CA2EB1_2F12CD00_9B8B8734_A64AD51E_B893BD89_1750B851_62241D90_8F0C9709_879758E7_E8233EAB_3BF2D6AB_53AFA32A_A153AD66_82E5A064_8897C9BE_18A0D50B_ECE030C3_432336AD_9163E33F_8E7DAF49_8F14BB28_52AFFA81_4841EB18_DD5F0E89_516D5577_76285C16_071D2111_94EE1C3F_34642036_AB886E3E_C28882CE_4003DEA3_35B4D935_BAE4B582_35B9FB2B_AB713C8F_705A1C7D_E4222020_9D6BBCAC_C4673186_01565272_E4A63E38_E2499754_AE493AC1_A8E83469_EEF35CA2_7C271BC7_92EEE211_56E617B9_22EA8F71_3C22CF28_2DC5D638_5BB12868_EB781278_FA0AB2A8_958FCCB5_FFE2E5C3_61FC1744_20122B01_63CA4A46_308C8C46_C91EA745_7C1AD0D6_9FD4A7F5_29FD4A7F_529FD4A7_F529FD4A_7F529FD4_A7F529FD_4A7F529F_D4A7F52A ``` ```haskell >>> r' == r'' True -- g = g = 2^r mod p g :: Integer g = 0x037DE384_F98F6E03_8D2A3141_825B33D5_D45EC4CC_64CFD15E_750D6798_F5196CF2_A142CDF3_3F6EF853_840EC7D4_EC804794_CFB0CFB6_5363B256_6387B98E_E0E3DEF1_B706FA55_D5038FFB_4A62DCBB_93B1DDD8_D3B308DA_86D1C3A5_25EF356F_E5BB5931_4E656334_80B396E1_DD4B795F_78DE07D8_6B0E2A05_BE6AF78F_D7F736FC_BA6C032E_26E050AF_50A03C65_FA7B6C87_F4554CB5_7F3DABCB_AD8EB9D8_FDEBEEF5_8570669A_CC3EDA17_DBFC47B8_B3C39AA0_8B829B28_872E62B5_D1B13A98_F09D40AC_20C2AB74_A6750E7C_8750B514_1E221C41_F55BBA31_D8E41422_B64D2CBA_7AAA0E9F_D8785702_F6932825_BF45DE83_86D24900_742062C1_322B37C5_0AF18215_8090C35D_A9355E6C_F7F72DA3_9A2284FD_FB1918B2_A2A30E69_501FA234_2B728263_DF23F1DB_8355BDE1_EB276FB3_685F3716_72CEB313_FDAB069C_C9B11AB6_C59BCE62_BAAD96AA_C96B0DBE_0C7E71FC_B2255254_5A5D1CED_EEE01E4B_C0CDBDB7_6B6AD45F_09AF5E71_114A005F_93AD97B8_FE09274E_76C94B20_08926B38_CAEC94C9_5E96D628_F6BC8066_2BA06207_801328B2_C6A60526_BF7CD02D_9661385A_C3B1CBDB_50F759D0_E9F61C11_A07BF421_8F299BCB_29005200_76EBD2D9_5A3DEE96_D4809EF3_4ABEB83F_DBA8A12C_5CA82757_288A89C9_31CF564F_00E8A317_AE1E1D82_8E61369B_A0DDBADB_10C136F8_691101AD_82DC5477_5AB83538_40D99921_97D80A6E_94B38AC4_17CDDF40_B0C73ABF_03E8E0AA gCalc :: Integer gCalc = expFast 2 r' p >>> g == expFast 2 r p False >>> g == expFast 2 r' p True ```

view details

push time in 3 months

push eventaxman6/ms-electionguard

Alex Mason

commit sha e5c13c7957e0c402dfab8e6a92b9d3e5ac0965c4

Fix definition of r

view details

push time in 3 months

PR opened microsoft/electionguard

q -> p

Issue

Appears to be another typo, as q is defined earlier to be 0xFFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFFFF_FFFFFF43

+2 -2

0 comment

1 changed file

pr created time in 3 months

create barnchaxman6/ms-electionguard

branch : axman6-patch-2

created branch time in 3 months

create barnchaxman6/ElectionGuard

branch : master

created branch time in 3 months

created repositoryaxman6/ElectionGuard

An implementation of Microsoft's ElectionGuard (v0.95) in Haskell

created time in 3 months

delete branch axman6/electionguard

delete branch : master

delete time in 3 months

create barnchaxman6/electionguard

branch : master

created branch time in 3 months

PR opened microsoft/electionguard

Fix typo in definition of q

Description

Simply typo, the parameter q is defined as 2256 − 189 instead of 2^256 − 189.

Testing

+2 -2

0 comment

1 changed file

pr created time in 3 months

push eventaxman6/electionguard

Alex Mason

commit sha 1273fcf710d2df45a8c1bb414ff5c87d26c49816

Fix typo in definition of q

view details

push time in 3 months

fork axman6/electionguard

ElectionGuard is a set of open source software components that can be used to create and publish end to end verifiable elections as well create a publishable artifact for ballot comparison audits.

fork in 3 months