/* * Copyright contributors to the AERE Network. * * 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. * * SPDX-License-Identifier: Apache-2.0 */ package org.hyperledger.besu.evm.precompile; import org.hyperledger.besu.evm.frame.MessageFrame; import org.hyperledger.besu.evm.gascalculator.GasCalculator; import jakarta.validation.constraints.NotNull; import org.apache.tuweni.bytes.Bytes; import org.bouncycastle.pqc.crypto.falcon.FalconParameters; /** * AERE PQC precompile: Falcon-512 signature verification (NIST round-3 reference encoding). * *
Input: {@code pk(897) || sm(rest)} where pk is the reference public key (header 0x09) and sm is * the reference signed-message blob. Output: 32-byte word, {@code ...01} if valid else {@code ...00}. */ public class Falcon512PrecompiledContract extends AbstractPrecompiledContract { static final int PK_LEN = 897; private static final int LOGN = 9; private static final long GAS = 40_000L; /** * Instantiates a new Falcon-512 precompiled contract. * * @param gasCalculator the gas calculator */ Falcon512PrecompiledContract(final GasCalculator gasCalculator) { super("AereFalcon512", gasCalculator); } @Override public long gasRequirement(final Bytes input) { return GAS; } @NotNull @Override public PrecompileContractResult computePrecompile( final Bytes input, @NotNull final MessageFrame messageFrame) { boolean valid = false; if (input.size() > PK_LEN) { final byte[] pk = input.slice(0, PK_LEN).toArrayUnsafe(); final byte[] sm = input.slice(PK_LEN).toArrayUnsafe(); valid = AereFalconSupport.verify(FalconParameters.falcon_512, LOGN, pk, sm); } return PrecompileContractResult.success(AereFalconSupport.resultWord(valid)); } }