Files
GmSSL/crypto/sphincs/pors.h
2019-03-13 22:26:55 +08:00

75 lines
1.8 KiB
C

/*
* Copyright (C) 2017 Nagravision S.A.
*/
#pragma once
#include "hash.h"
/* PRNG to obtain a random subset */
struct pors_subset {
int s[PORS_k];
};
void pors_randsubset (const struct hash *rand,
const struct hash *msg,
uint64_t *address,
struct pors_subset *subset);
/* Naive PORS without Merkle tree */
struct pors_sk {
struct hash k[PORS_t];
};
struct pors_pk {
struct hash k[PORS_t];
};
struct pors_keypair {
struct pors_sk sk;
struct pors_pk pk;
};
struct pors_sign {
struct hash s[PORS_k];
};
void pors_gensk (const struct hash *key, const struct address *address, struct pors_sk *sk);
void pors_sign (const struct pors_sk *sk, struct pors_sign *sign, const struct pors_subset *subset);
/* Naive PORST without merging of authentication paths */
struct porst_pk {
struct hash k;
};
struct porst_keypair {
struct pors_sk sk;
struct porst_pk pk;
};
int porst_genpk (const struct pors_sk *sk, struct porst_pk *pk);
/* PORST with authentication octopus */
struct octoporst_sign {
struct pors_sign s;
struct hash octopus[PORS_k * PORS_tau]; /* Large enough buffer */
int octolen; /* Number of elements in the octopus */
};
int octoporst_sign (const struct pors_sk *sk,
struct octoporst_sign *sign,
struct porst_pk *pk,
struct pors_subset *subset);
int octoporst_extract (struct porst_pk *pk,
const struct octoporst_sign *sign,
struct pors_subset *subset);
/* Serialization */
int octoporst_loadsign (struct octoporst_sign *sign, const uint8_t *_sign, size_t _len);
int octoporst_signcmp (const struct octoporst_sign *sign1, const struct octoporst_sign *sign2);