draft 7/10/2023
- Hashing follows the 1.9 spec in section 1.5.1.
- Coefficients.json (lagrange coefficients) are no longer needed and are removed.
- Context.json divided into two parts:
- election_config.json has the configuration parameters input to the KeyCeremony.
- election_initialized.json is the output of the KeyCeremony, including the guardians (separate guardian files are not needed).
- Renaming of fields to closer match the 1.9 spec vocabulary.
- ContestData is more fully specified.
- Preencrypted Ballots are new.
{
"name": "production group, low memory use, 4096 bits",
"large_prime": "FFFFFFFF...FFFFFFFFF",
"small_prime": "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF43",
"cofactor": "100000000...B6B9D8AE0F",
"generator": "36036FED2...B6B9D8AE0F"
}
- addition of a "name" field, contests are implementation dependent
- unchanged
@Serializable
data class ElectionConfigJson(
val config_version: String,
val number_of_guardians: Int,
val quorum: Int,
val election_date: String,
val jurisdiction_info: String,
val parameter_base_hash: UInt256Json, // Hp
val manifest_hash: UInt256Json, // Hm
val election_base_hash: UInt256Json, // Hb
val baux0: ByteArray, // B_aux,0 from eq 59,60
val voting_device: String, // the device information from eq 61, and section 3.7
val chain_confirmation_codes: Boolean,
val metadata: Map<String, String> = emptyMap(), // arbitrary key, value pairs
)
Example:
{
"config_version": "v2.0",
"number_of_guardians": 3,
"quorum": 3,
"election_date": "2023-07-08T10:03:21.866816846",
"jurisdiction_info": "N/A",
"parameter_base_hash": "AB91D83C3DC3FEB76E57C2783CFE2CA85ADB4BC01FC5123EEAE3124CC3FB6CDE",
"manifest_hash": "E69B574C48087CF4E4914C3C4CDBBCB9368255F9373EFCF9EE923AF6B23C7CD2",
"election_base_hash": "C7C5EC51E7CB411F4CDCEDF891203B1B6A18DEF7178B1584A30F8578C611801D",
"baux0": [ 100, 101, 118, 105, 99, 101, 32, 105, 110, 102, 111, 114, 109, 97, 116, 105, 111, 110 ],
"device": "device information"
}
- as specified in section 3.1
@Serializable
data class ElectionInitializedJson(
val joint_public_key: ElementModPJson, // aka K
val extended_base_hash: UInt256Json, // aka He
val guardians: List<GuardianJson>, // size = number_of_guardians
val metadata: Map<String, String> = emptyMap(),
)
@Serializable
data class GuardianJson(
val guardian_id: String,
val x_coordinate: Int, // use sequential numbering starting at 1; == i of T_i, K_i
val coefficient_proofs: List<SchnorrProofJson> // size = quorum
)
@Serializable
data class SchnorrProofJson(
val public_key : ElementModPJson,
val challenge : ElementModQJson,
val response : ElementModQJson,
)
- as specified in section 3.2
Example:
{
"joint_public_key": "A344E61C4578173BDC615F1EB277B3F8EF0499F72491EF6C7ABA56839A08270E754752A8B75FA385C258B539EA1B637CE6C48D85532236E259245A257C3ACD6222CF0630DBD533210D7BD1ABD54040BE4BEC4625B3038F6FADE9DBD9A126D0FA1F8D8DBB00E6EE631F6151AC079230FEE6867E181E5BEC1A4FD76E97DC072A172723DCC6272A2B9515EF1E530AB362447DAFE30C8E70A1074CD29143497015B22D9660218FCD076ACFC29B03F460E62B26357F556D407CC43A1FC3E2EF159995BC5D869CF46E9B64D64DE7F73512C4509DA3E2B1CF0F04ECC810C3FB5AE18A2267A19709061355E1DF8EAAC0CF1B316F7E1A24681C1ACCBE26EA630F3AD04D07ECCB4BD95928F95DF26F197EAE03A0675F5F578C8A0C41D50F3D51A83DAA0DE2C7C8FAF2D0885C934B6E276692B457D443A8EB502C10D9FA436D968F3AF467C7BF7FAA547DC450D4FEE3AE0E1E36C54584B816056867617D0EE998AABCEE2A95DEF07109D98E48407AF5CEB196FBCCB4EE06FF0A6E06091565C176E7F12A35625287DE903A8C90D63614BF72ACCCA91E763FF85F79881F559C09BC6CCF321FDE9F44DC5BB25C1D4D148B7F40869CB324C24E63BFE8F8280FA323682F2F500B708F6E79EE5897ED2E49E62E7F9C572141010F6FE9421537CC0B4B58D37CF03E8F14E368F87154A56349DE535974A6A48282206F84EEAAFFEDD4F148307C8F9065",
"extended_base_hash": "25CC99F007D158D7E661E660CACBC190497623FFDD15B7FFFB0E3939A2E5CA29",
"guardians": [
{
"guardian_id": "guardian1",
"x_coordinate": 1,
"coefficient_proofs": [
{
"public_key": "E56EE02FD7CA9A9628FE9FC41659465DCFD8628632179F7543CADC6F9C3D71260F30D5FF561FD831C09263AF181B953A91E17B77883F98E9E24CB869AA5028D127C4DBACDFE2E2111F368F7D576F5CB0DECF18DBBCE9FF4208EA59CD5FD4EEB61264969087D04C98A3EFB297AC357B1058A83553EE7FE20D1A53065EDF65D372DD50A08EDC10FC2BB6AF20047E827CE87CB47D71B6856CC9AFE0332E7B81DB0DEA93AFBD6F093643BFB440CDFA1F8192EE06A47DD67377BC7404C1D2D4931BFFC6EE48EFDC4C4800338B4A34A458B56B7E2BE14E86BCFCC8B0CDFF9D98ECDE5023210379C3C74C6C8DEC52ABC2077251C6E8C918E60CFA302E2A80F5F004D1D63DADD75061CA991B532C26521C653D5E585E87CEE891E291F220C50369D02B157E9BBE0908C21473E9722D9429C4FC8D6DB8B3C04F2CC6D19F9CA619AF59BE855C08D588068111DAFF62646D4483E8087EDCF6775AA52C69500040FF78C299762F3B2548F59E562AE58CEDA2A1BC09778203956EF5118BCF3DC4F57C4EAD70C704B29F7628C1A708C76AC919DB87712B0902D0F0C5F921190296C861FCB3B702E1B086A2729DE0BBA42D1B4BC72B7574A0595851C7AE2C4C81B6ECE88815213CD51167AB244E950A3D0408DAD1F570AFB8CA65C940A1138E1F7C5A5710C943D2FA0D7B99CC46C29603F3D1A829958C7DB5C4085B2469EF469A1015EAEE47E927",
"challenge": "45DBF0A739D987C7AD07A56CD067BBBA92199917813F26E8CB353A20D4E1AC93",
"response": "7B55A0BE4C0E65F14E4AE9D2EA1B262926450D6ABE4B8A5F335647AEDCB72615"
},
...
]
},
{
"guardian_id": "guardian2",
"x_coordinate": 2,
"coefficient_proofs": [
{
"public_key": "508DC269D9F4A2049C0AC67C7E7F2292AB03A6027C9F3A620C462C7CDFFCF09DDFC6E7E9B9978B8722BE447DED0593E4B1261584BEB7DE78E3D2DB2629010D71325D3EBC1415B9358A00FCACC8450C12D3014B59E14DB1E0A1262A8C49E16C6B06C6BD9E6C5E0EE8A1E3BC99F2F5CF1D3D757F62E86AE94F993C75480A15FFA12A364CFBD14DDF490648B8A17FD8C94E5298399E6B0FC8526385AB185D05929012DC4F79327E651E4DFE3772514456F52B508E6166B98013A64E9A44D9E0C6D2A895928B1194BB1974F8FCB659515815AE1A851B96E51946790F193887B304BC11774FB5CD7042AF1D26DAD5DE0B0A7C9493BC39437EAE61097FE37A418CFB367DF8E5C8F584716B323E086E88E8F5D704184CEC22AEC9A575F84C75F9450B92AF64507E82D68ACC2F3C699B86C2E991B74A319F3E26A46BCCA2300E9751717382F69BEADB23B6C8BE3BE163F144351C2DD89D2903D588DE6DF3E0CCF668E879EB284E54B4BA124DFFDC920E24F1A5E57DECF37607B65CD11021DE7257335B1C7A33DAC6A78008B8D7DD773F039E8641528B5E49CFE9552563C83498B7732BAF28AF9DF548387573C0066090BD5B93087A47CE432FB9862A8F7BD83EA788E822C96226F1F7764863F7117E2471D6132E39896607949CA719D0D6CBB07B95F713C8D1F8E19133B1573B319775EDB047830026831AD26358DFD770BB0FEF00C08F",
"challenge": "21AAB78D77C7749B2B0F135A40D053E5C809A6816733627C1257E4BF6AEC57E0",
"response": "A6D3ED3183B199D0535D434055B37A07C8EE6C6BF9650317F2D14B2C844F0EC4"
},
...
]
},
...
]
}
@Serializable
data class PlaintextBallotJson(
val ballot_id: String,
val ballot_style: String,
val contests: List<PlaintextContestJson>,
)
@Serializable
data class PlaintextContestJson(
val contest_id: String,
val sequence_order: Int,
val selections: List<PlaintextSelectionJson>,
val write_ins: List<String>,
)
@Serializable
data class PlaintextSelectionJson(
val selection_id: String,
val sequence_order: Int,
val vote: Int,
)
Example:
{
"ballot_id": "ballot-id-940962467",
"ballot_style": "ballotStyle",
"contests": [
{
"contest_id": "contest0",
"sequence_order": 0,
"selections": [
{
"selection_id": "selection0",
"sequence_order": 0,
"vote": 0
},
{
"selection_id": "selection1",
"sequence_order": 1,
"vote": 0
},
{
"selection_id": "selection2",
"sequence_order": 2,
"vote": 0
},
{
"selection_id": "selection3",
"sequence_order": 3,
"vote": 0
}
],
"write_ins": [
]
},
{
"contest_id": "contest1",
"sequence_order": 1,
"selections": [
{
"selection_id": "selection4",
"sequence_order": 4,
"vote": 1
},
{
"selection_id": "selection5",
"sequence_order": 5,
"vote": 0
},
{
"selection_id": "selection6",
"sequence_order": 6,
"vote": 0
},
{
"selection_id": "selection7",
"sequence_order": 7,
"vote": 0
}
],
"write_ins": [
]
},
...
]
}
@Serializable
data class EncryptedBallotJson(
val ballot_id: String,
val ballot_style_id: String,
val voting_device: String,
val timestamp: Long, // Timestamp at which the ballot encryption is generated, in seconds since the epoch UTC.
val code_baux: String, // Baux in eq 59
val confirmation_code: UInt256Json,
val contests: List<EncryptedContestJson>,
val state: String, // BallotState
val is_preencrypt: Boolean,
val primary_nonce: UInt256Json?, // only when uncast
)
@Serializable
data class EncryptedContestJson(
val contest_id: String,
val sequence_order: Int,
val votes_allowed: Int,
val contest_hash: UInt256Json,
val selections: List<EncryptedSelectionJson>,
val proof: RangeProofJson,
val encrypted_contest_data: HashedElGamalCiphertextJson,
val pre_encryption: PreEncryptionJson?, // only for is_preencrypt
)
@Serializable
data class EncryptedSelectionJson(
val selection_id: String,
val sequence_order: Int,
val encrypted_vote: ElGamalCiphertextJson,
val proof: RangeProofJson,
)
@Serializable
data class RangeProofJson(
val proofs: List<ChaumPedersenJson>,
)
@Serializable
data class ChaumPedersenJson(
val challenge: ElementModQJson,
val response: ElementModQJson,
)
@Serializable
data class HashedElGamalCiphertextJson(
val c0: ElementModPJson, // ElementModP,
val c1: String, // ByteArray,
val c2: UInt256Json, // UInt256,
val numBytes: Int // TODO needed?
)
@Serializable
data class PreEncryptionJson(
val preencryption_hash: UInt256Json,
val all_selection_hashes: List<UInt256Json>, // size = nselections + limit, sorted numerically
val selected_vectors: List<SelectionVectorJson>, // size = limit, sorted numerically
)
@Serializable
data class SelectionVectorJson(
val selection_hash: UInt256Json,
val short_code : String,
val encryptions: List<ElGamalCiphertextJson>, // Ej, size = nselections, in order by sequence_order
)
Example:
{
"ballot_id": "ballot-id-940962467",
"ballot_style_id": "ballotStyle",
"confirmation_code": "FDFF7BC3F062E95582491F1EF792BBDF3CBE4FFAD7A3F59550CCC7C10BAE39B7",
"code_baux": "",
"contests": [
{
"contest_id": "contest0",
"sequence_order": 0,
"contest_hash": "29CC2480F1E3C2789D9291CE5E3664FCFE90569D19E1041E1B930C89FC623C7D",
"selections": [
{
"selection_id": "selection0",
"sequence_order": 0,
"encrypted_vote": {
"pad": "F89578412A0FAE575E6A7245DBAE0197B44A69A931D70D90A7C45C252E11CB0EDC3765D143E7B3A06D0E910FEDD4597F6B5597D05FA4B7B967EF8CEDB46F0CB96A3484C1292FA9ED858111EDBE733721FA59E07DE0B68D9B3A8E8C727F068AACC870316596ADC84FE0AE88A77249AEF16108E280810DFD794373249C8C7EADD7A8536BE682601BBADB13C51E66D69DDD535ACFC47A0DBF713FED7F9FB30EC1DB023632583C2E9D472C495AE13E9477A027EE5E9E1D3E799ECF0D23CECF27E299ACB5379737FC8A8D459E01539990AE84F83FAC662F88C15CE41C2AA8A6C08B32090E9DFC442939B2702CB6514AADA27884D7B2FD72B9C99649B84CA8EF4033D14B5C8EEF3325F34D8DF1E9EF80D20EA7063D2FC3B5666CD0594FE5E53471D75B74A46DE9A9FDB37E006D03388FA31FF1BCD4B320216F1416C5E4BB15DB8266C608BE0599B46A32C7FF2AAE8663A5D7BE09FBC5911AE882DAFA0EE3A4C947B48911BD41467F3218E4271C09D6811F5E0901CF871FF77E499433F00B8ACCD1A1A41245C0FE483E908F2416C6DD672FE4E47059B03CE2F68FC775F66F0B33DC1034001E32E9E7986B5711C875AD8EA2E63BE3CCD7C968B987838F546DC095BF722C5D710A8CA3948586C7028EFC9DB6F5F9922FAB34375686D7967754DF28211D6BBEDB1B74F81A52DBED7FEBF529A7376539D4F583B9E4207577496311E528E2A0",
"data": "301F149588E52E8D7A1DB54103BE3AA9F32627389310B6EE6E2B6BF72A529C9B8C4946FA107E9F425D59DB9240F35C5666A214418645FD9D43DB6829F1BB3AEBC69D279531126176562BA4DD384A2950E459EE179B1FAA882A7D77BC01DBB285F64CDD7411BC53009AE7472039D42B1324DF0C962FBDC31CBBD33A1EDF5CBE4E3FD74873BAB463AC90EFDC53A6BC78EB8C136756F16594FC9ADCB3678663FF691FAA0FB091D27310DA998189F764A315E885B37CB9091FADC416C917FA318B29A9CF5F341A5AAFAB53A21A76AD62DC5783EFEEEDF3670DFD8415DD60F89D63FBC90B4649F18A9CB36A8638DE65E6E6F92AC6E278B2DEE2936439CA09A73D0257F9A5E8946DD33C1EF7F6E5F708C38D336A0C8CF03FDA4068208587CFCE411DE9C6EBC416277BD18614BBDD6C03DDBBA1099320CFFE796B2319EAF0E9675E2EF5CEF904D14F682C089DABF2A89228539F87706523ADD39F2B1A8C7AD0834112EF10148C91B0B5FA4BEBC3D9FA672C52A66A4582D2239613868D96B23056CD5EDCC55784BA3E9AD38C01B5D51EA46CBE22921671BA571BFCEA66B3C3ABF2FF509608F96D9EBA0EAA6C9C17496AAF8F83F51E11054238BC1A0DADF37167DEA02076EA13DDF0BFEA133F5C55296F86967CDD195ED0C21B16B9D71A0B6FAA61B036F185E5876E096FF704FDBF02243399EEB0CAECCF2EA67501A1EE01B458106F6295"
},
"proof": {
"proofs": [
{
"challenge": "4F4A0EA015876DA10ADA7940B40661CFB9A37AEC664E87F9E2EFC423C957F5E6",
"response": "0DA42F14E4ED17220D21F655EB7B397947FD18B8595582BF071037DD00101446"
},
{
"challenge": "822FB9C37FB8A6DFFD927B86D9A633F73BCC8D028FE9998FA7B1DA033608DDC3",
"response": "12E3DB224139DD23EFFA807A1EF964F6D2C349E6FA71954523FA3C4F6D254628"
}
]
}
},
...
],
"proof": {
"proofs": [
{
"challenge": "9FA998057913D52820DA9622796276C993A5759EC1F4A5F4705DE86C8BEA6656",
"response": "3CCF406BA68A3F3865062F800CD9BDDC8EA6B39B222F1E459B40FB20E4DFF688"
},
{
"challenge": "0A4A3462C34FFA880A6DB8E94A9DCA7E7733073312AF4B1883E4B7185A8FB46C",
"response": "0E3C261409F26C287786869E80EBDA6830ED0578C12EC15461198B2633079E91"
}
]
},
"encrypted_contest_data": {
"c0": "8B7AAD9092BA856F3086799A1C73165F056A76E19F68D3BDBF2A2B34AE7E4D05A2DC76804CE7CB0868CA3EBD4B0C307EA92F77E13EB4DD5D902BF56AC3C07AD2F32F642AA9BD6D199BBB8ABE98E3EF3C7D10564C07036BC4141C2C2F493C36CB04B8B7338489439ED37BFA342F256A7C49E97560EEE81C99F4E9DD57D6F49F9040CB6F3AB7534ECA09D825AA55728AD751C000C92197C6ACA53395F82C40C1EA265BD89229C7DDF8F8C8D34997F1D6B6CA897AE5D79785E7919A66AF25923A9513D2A00119EBB62DADF7B0C1ED3F1824491CEAD2901F7D82BD30C8FAC77F7B4A0E4A55DECAACE16E39814627D074B0F42FD75D544C18C127D1C52AFF02047DB471951D415658E41BFD2477E8A21388979D536AFD89C6C0E8923590A50CEC5A12C66BEA5FEEF7998E400C34C93D0747806895FFAA7A3069A8127C1F2B5068F19C16D834DFD5AD0E2AC0E07FC92859E37F937897322C6DAD1E30057BF5678D2F6986EEC0D5896D527C5B438C4369600752AABB06DB2BF4066CEE38D8114F1F04FE521B5C2AA453DF779EE371DF9CCE1E8DFB05D3AB2F2838ED84E9E13AA766F005237D36902EE1E30A9AB9C0F340B3CE197F762CA83A1BF9CAD163904833FDCBBAAF93CFB535C45BB63889491241AB97CBA4CB9210D76598D97E8DFF3905EF37A16BF9C49A0E66488AC53F0BE94330F1EB8FD2D5A7A18DDDCAF1BC322866E52117",
"c1": "2CF0B67658EBA6FC28E6AC0EC3072599E18CA0B1D37427CB02088A733FF4FC0C5806B14D4AD24043B670759D6A69CF3513536423C67491482C26A3C92C94BE58",
"c2": "80832436E989ADD1D2D53C443D15DF4C083AAA074B1F8FAE8E7BDB38F4AFD27D",
"numBytes": 64
},
"pre_encryption": null
},
...
],
"timestamp": 1687652358,
"state": "CAST",
"is_preencrypt": false,
"primary_nonce": null
}
@Serializable
data class EncryptedTallyJson(
val tally_id: String,
val contests: List<EncryptedTallyContestJson>,
val cast_ballot_ids: List<String>,
)
@Serializable
data class EncryptedTallyContestJson(
val contest_id: String,
val sequence_order: Int,
val selections: List<EncryptedTallySelectionJson>,
)
@Serializable
data class EncryptedTallySelectionJson(
val selection_id: String,
val sequence_order: Int,
val encrypted_vote: ElGamalCiphertextJson,
)
Example:
{
"tally_id": "RunWorkflow",
"contests": [
{
"contest_id": "contest0",
"sequence_order": 0,
"selections": [
{
"selection_id": "selection0",
"sequence_order": 0,
"encrypted_vote": {
"pad": "E48AAFFA311914A4EFCD474A99686D06DB53ED7106B91D4824286993E291010BC26C3B74D13A902EBA1D054C96E68D2ADC3B9A84493742CF1200CFDF73DF0AD34B26B65A766A5383124253D36C40F1F9410092689E7B6B37F3073C7D39AE9BC40026A384FEF02ABE4773C101A5F124C2B2CC9FFB13DA5881F615F7436DCF8824B159ECBFD8E874C03CCEB6B09B138245331375310FBB805D68C3FBDDC6E3538CD5B9FD2D4E4CB7E902C717E54686C8F66267245D50796C2AF98ADB086166C532EBA86D77F1C815A020D3DEB8DE607CEFC6397C3D7BB266AB1210AEEF5C2273CDCDCF3FF54691F829C152F005334331A03939FD6955D3262554A2C5A6F0588D9839DA004F909565E016C4AB4EE6C457FA780AA3412DC5AB4F85DD910F6122A650084488B9EFDCB09B4A4F96BA8F56985BD81B71D1DB489457485C8505B2AF3CD517A5B86B3A169A7C0B57A468BBC456DF8B849E9A97E6EE075DA2C57C5449A6F99B8F5501205867D56F3352D602ADA17592C4586736E2B656AD3A26EB90533EE9E691F989AC0862611C224CCEC8613092DC17334805C11DC3F8BCDC23E969A8EF5DFC5432CA0AB85D6C6932686DB74A318DBFCDB48AD36BF57F151091893F16D4833EDA02F20291C00DC57FE2464AF8D5244D3CD71144417EBC78DCF974138345B284CD53E114F0FB491A89A96D2A3E4C4E864656D7B27D316CAD4020502E18D8",
"data": "8D332AC66036483FB50E30BB35866CBE130CFC8F753CB45E299895DC18FA22DB1E0E79B64CC15F79A4B3A85DD89A6C18BCD2D292A6A384FA199C62599CD7866452E39F9F7F7CAED23FF5728EDCED3CE30838734D199FC33601054A327B641EEE33B32A2BF1F6B56256F19CF15D0051798782811B8D1C2186A96C8DB931AAF548763268848408D1F5741D806DBA797D6B89C06CA83D04B2A1669D2BA6D4000270F95184E5CFECEAF8D8EC4EE61F2AF3B4F4DEA51BAE61728A70CB09ED7B3BE120C09FFFC757F4AF2251EE0D00C2FA5299392C6120DF8F4EC9AC36F05218BFCCF12DF29B6ABBA9F71988ACA90178ED062667AAD6A24B8B169D1DFABFCE9B71642DFDDEA54ED75ABCB9EAE023278EC92621429B987E8E70524387ACDD941455D42B2346D73906AD07303E32C4E3C705C0CB0C2189628799C58FCC9D197880AC51EF2FFF70547F5D260EFA80F2C08B16BB71F9C1C1F4D486C515275CBA22A743FA62121BEA2BEC22E48EBA15D39ABD78E12F05DC3A8418205EFDFB23997E3FC59D632E4DA5D3A8B97AE397BCBCE18A9777960251E7F7210688D7FCF49EECB12096CC32625574CE32857301A10D38965AB697B6727936671B3A4444A720FF3D95C927A70A14474903D0ED9C0806577B93C8043DA7941E1C2ED91C80A6CDE0854763B64A26EF22F1556F8DFB2ACCC9AAFA4102438232648487C4F022D91373A0257A80"
}
},
...
]
},
...
"cast_ballot_ids": [
"id1343738539",
"id-939995991",
"id-1698682164",
"id-1254440059",
"id287012309",
"id-712320552",
...
]
}
The only difference between a DecryptedTally and a DecryptedBallot is the presence of decrypted_contest_data for the ballot.
@Serializable
data class DecryptedTallyOrBallotJson(
val id: String,
val contests: List<DecryptedContestJson>,
)
@Serializable
data class DecryptedContestJson(
val contest_id: String,
val selections: List<DecryptedSelectionJson>,
val decrypted_contest_data: DecryptedContestDataJson?, // ballot decryption only
)
@Serializable
data class DecryptedSelectionJson(
val selection_id: String,
val tally: Int,
val b_over_m: ElementModPJson, // eq 65
val encrypted_vote: ElGamalCiphertextJson,
val proof: ChaumPedersenJson,
)
// (incomplete) strawman for contest data (section 3.3.7)
// "The contest data can contain different kinds of information such as undervote, null vote, and
// overvote information together with the corresponding selections, the text captured for write-in
// options and other data associated to the contest."
@Serializable
data class ContestDataJson(
val over_votes: List<Int>, // list of selection sequence_number for this contest
val write_ins: List<String>, // list of write_in strings
val status: String,
)
Example:
{
"id": "RunWorkflow",
"contests": [
{
"contest_id": "contest0",
"selections": [
{
"selection_id": "selection0",
"tally": 5,
"k_exp_tally": "35CADD01FA5171D9498FE310DA00EFE784E43EB27BB6FF908A7D3CD1A0C182209B0769053B56CDF3AC7E6A30315AECE7F1F77A2CE04F8130B9E57E1C60A552613AB457ABB4CC8C8FA8A4124620D9CA5736466B189AE9366152B4D7BFCC81C6157BEA267AB449EFB95CA7F948F31CB984CA7A5C55AB1D71B6A0E26D7641A112265E8DB9146F70ABF2CEEC79F779161BC992F415743E87A6FA784CF3853F498D7E93DF6A3F94305C3EEF536D72352FAE658711FD312916450DB7597F5A6D6D473A00CAA720BF9084DA47322C43BD6DFF5A21D210A18B7F41306B1D0FE376865624DED09CE47F617EAEB512C663F2A633DB744A31CA00DBA369169032CFD0EACBB26E60C79CBC498EBD2458CA020C0DA5718C621F113370B5F574019E688F920FC3C0A4AD47A1B0E019AB22386A6DE0348C530C6B885074F812274AE5EDF473D44858FB4F5B929A29844290C008F02F8C32D449188C28C7505F73F820A5AC71BAB7E152499EB84B7CC0C6E6CCF18A546EA01633FA5F558CC2380CA6FD035ECC28A044E9D7837A30CE1CAABCA0DE28E3BD966BA149F6DA9A5FDBF2249DE638CCBCBE092F300295152A77DF5C5E2EBDC82F477FD006FF93C470A165C207C9C08D6CB6ECBDAEB9DF43FD75CC34457E12A7B22F057C471A00B49050D6D2EDA690024908AE97332238321A6B9D93523D3E870789C937D1A1AD6573A1D2A54A64ECF85814",
"encrypted_vote": {
"pad": "E48AAFFA311914A4EFCD474A99686D06DB53ED7106B91D4824286993E291010BC26C3B74D13A902EBA1D054C96E68D2ADC3B9A84493742CF1200CFDF73DF0AD34B26B65A766A5383124253D36C40F1F9410092689E7B6B37F3073C7D39AE9BC40026A384FEF02ABE4773C101A5F124C2B2CC9FFB13DA5881F615F7436DCF8824B159ECBFD8E874C03CCEB6B09B138245331375310FBB805D68C3FBDDC6E3538CD5B9FD2D4E4CB7E902C717E54686C8F66267245D50796C2AF98ADB086166C532EBA86D77F1C815A020D3DEB8DE607CEFC6397C3D7BB266AB1210AEEF5C2273CDCDCF3FF54691F829C152F005334331A03939FD6955D3262554A2C5A6F0588D9839DA004F909565E016C4AB4EE6C457FA780AA3412DC5AB4F85DD910F6122A650084488B9EFDCB09B4A4F96BA8F56985BD81B71D1DB489457485C8505B2AF3CD517A5B86B3A169A7C0B57A468BBC456DF8B849E9A97E6EE075DA2C57C5449A6F99B8F5501205867D56F3352D602ADA17592C4586736E2B656AD3A26EB90533EE9E691F989AC0862611C224CCEC8613092DC17334805C11DC3F8BCDC23E969A8EF5DFC5432CA0AB85D6C6932686DB74A318DBFCDB48AD36BF57F151091893F16D4833EDA02F20291C00DC57FE2464AF8D5244D3CD71144417EBC78DCF974138345B284CD53E114F0FB491A89A96D2A3E4C4E864656D7B27D316CAD4020502E18D8",
"data": "8D332AC66036483FB50E30BB35866CBE130CFC8F753CB45E299895DC18FA22DB1E0E79B64CC15F79A4B3A85DD89A6C18BCD2D292A6A384FA199C62599CD7866452E39F9F7F7CAED23FF5728EDCED3CE30838734D199FC33601054A327B641EEE33B32A2BF1F6B56256F19CF15D0051798782811B8D1C2186A96C8DB931AAF548763268848408D1F5741D806DBA797D6B89C06CA83D04B2A1669D2BA6D4000270F95184E5CFECEAF8D8EC4EE61F2AF3B4F4DEA51BAE61728A70CB09ED7B3BE120C09FFFC757F4AF2251EE0D00C2FA5299392C6120DF8F4EC9AC36F05218BFCCF12DF29B6ABBA9F71988ACA90178ED062667AAD6A24B8B169D1DFABFCE9B71642DFDDEA54ED75ABCB9EAE023278EC92621429B987E8E70524387ACDD941455D42B2346D73906AD07303E32C4E3C705C0CB0C2189628799C58FCC9D197880AC51EF2FFF70547F5D260EFA80F2C08B16BB71F9C1C1F4D486C515275CBA22A743FA62121BEA2BEC22E48EBA15D39ABD78E12F05DC3A8418205EFDFB23997E3FC59D632E4DA5D3A8B97AE397BCBCE18A9777960251E7F7210688D7FCF49EECB12096CC32625574CE32857301A10D38965AB697B6727936671B3A4444A720FF3D95C927A70A14474903D0ED9C0806577B93C8043DA7941E1C2ED91C80A6CDE0854763B64A26EF22F1556F8DFB2ACCC9AAFA4102438232648487C4F022D91373A0257A80"
},
"proof": {
"challenge": "048061CA6033996EE2F411D0C92CADBD6E56A2D1310EE8F4A463FA7CC5412EF6",
"response": "77FD11A99C99BB5DD11A9A5F014AC1BDDB360F7389CA893D595675A612A1376B"
}
},
...
]
},
...
]
}