MastersThesis/TIIGER_TLS/PQ_TIIGER_TLS/sal/miracl-ubuntu22-11-04-24/includes/kyber.h
2024-04-15 11:53:30 +02:00

140 lines
3.6 KiB
C++

/*
* Copyright (c) 2012-2020 MIRACL UK Ltd.
*
* This file is part of MIRACL Core
* (see https://github.com/miracl/core).
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* Kyber API */
#ifndef KYBER_H
#define KYBER_H
#include "core.h"
//q= 3329
#define KY_LGN 8
#define KY_DEGREE (1 << KY_LGN)
#define KY_PRIME 0xD01
#define KY_ONE 0x549 // R mod Q
#define KY_QINV 62209 // q^(-1) mod 2^16
#define KYBER_SECRET_CPA_SIZE_512 (2*(KY_DEGREE*3)/2)
#define KYBER_PUBLIC_SIZE_512 (32+2*(KY_DEGREE*3)/2)
#define KYBER_CIPHERTEXT_SIZE_512 ((10*2+4)*KY_DEGREE/8)
#define KYBER_SECRET_CCA_SIZE_512 (KYBER_SECRET_CPA_SIZE_512+KYBER_PUBLIC_SIZE_512+64)
#define KYBER_SHARED_SECRET_512 32
#define KYBER_SECRET_CPA_SIZE_768 (3*(KY_DEGREE*3)/2)
#define KYBER_PUBLIC_SIZE_768 (32+3*(KY_DEGREE*3)/2)
#define KYBER_CIPHERTEXT_SIZE_768 ((10*3+4)*KY_DEGREE/8)
#define KYBER_SECRET_CCA_SIZE_768 (KYBER_SECRET_CPA_SIZE_768+KYBER_PUBLIC_SIZE_768+64)
#define KYBER_SHARED_SECRET_768 32
#define KYBER_SECRET_CPA_SIZE_1024 (4*(KY_DEGREE*3)/2)
#define KYBER_PUBLIC_SIZE_1024 (32+4*(KY_DEGREE*3)/2)
#define KYBER_CIPHERTEXT_SIZE_1024 ((11*4+5)*KY_DEGREE/8)
#define KYBER_SECRET_CCA_SIZE_1024 (KYBER_SECRET_CPA_SIZE_1024+KYBER_PUBLIC_SIZE_1024+64)
#define KYBER_SHARED_SECRET_1024 32
#define KY_MAXK 4
namespace core {
/** @brief Kyber KEM CCA key pair generation
*
@param r64 64 random bytes
@param SK secret key
@param PK public key
*/
extern void KYBER512_keypair(byte *r64,octet *SK,octet *PK);
/** @brief Kyber KEM CCA encrypt
*
@param r32 32 random bytes
@param PK public key
@param SS random session key generated
@param CT ciphertext
*/
extern void KYBER512_encrypt(byte *r32,octet *PK,octet *SS,octet *CT);
/** @brief Kyber KEM CCA decrypt
*
@param SK secret key
@param CT ciphertext
@param SS output session key
*/
extern void KYBER512_decrypt(octet *SK,octet *CT,octet *SS);
/** @brief Kyber KEM CCA key pair generation
*
@param r64 64 random bytes
@param SK secret key
@param PK public key
*/
extern void KYBER768_keypair(byte *r64,octet *SK,octet *PK);
/** @brief Kyber KEM CCA encrypt
*
@param r32 32 random bytes
@param PK public key
@param SS random session key generated
@param CT ciphertext
*/
extern void KYBER768_encrypt(byte *r32,octet *PK,octet *SS,octet *CT);
/** @brief Kyber KEM CCA decrypt
*
@param SK secret key
@param CT ciphertext
@param SS output session key
*/
extern void KYBER768_decrypt(octet *SK,octet *CT,octet *SS);
/** @brief Kyber KEM CCA key pair generation
*
@param r64 64 random bytes
@param SK secret key
@param PK public key
*/
extern void KYBER1024_keypair(byte *r64,octet *SK,octet *PK);
/** @brief Kyber KEM CCA encrypt
*
@param r32 32 random bytes
@param PK public key
@param SS random session key generated
@param CT ciphertext
*/
extern void KYBER1024_encrypt(byte *r32,octet *PK,octet *SS,octet *CT);
/** @brief Kyber KEM CCA decrypt
*
@param SK secret key
@param CT ciphertext
@param SS output session key
*/
extern void KYBER1024_decrypt(octet *SK,octet *CT,octet *SS);
}
#endif