100 lines
4.6 KiB
C
100 lines
4.6 KiB
C
/**
|
|
* \file bn_mul.h
|
|
*
|
|
* \brief Multi-precision integer library
|
|
*
|
|
* Copyright (C) 2006-2015, ARM Limited, All Rights Reserved
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*
|
|
* 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.
|
|
*
|
|
* This file is part of mbed TLS (https://tls.mbed.org)
|
|
*/
|
|
/*
|
|
* Multiply source vector [s] with b, add result
|
|
* to destination vector [d] and set carry c.
|
|
*
|
|
* Currently supports:
|
|
*
|
|
* . IA-32 (386+) . AMD64 / EM64T
|
|
* . IA-32 (SSE2) . Motorola 68000
|
|
* . PowerPC, 32-bit . MicroBlaze
|
|
* . PowerPC, 64-bit . TriCore
|
|
* . SPARC v8 . ARM v3+
|
|
* . Alpha . MIPS32
|
|
* . C, longlong . C, generic
|
|
*/
|
|
#ifndef MBEDTLS_BN_MUL_H
|
|
#define MBEDTLS_BN_MUL_H
|
|
|
|
#include "bignum.h"
|
|
|
|
#if !defined(MULADDC_CORE)
|
|
#if defined(MBEDTLS_HAVE_UDBL)
|
|
|
|
#define MULADDC_INIT \
|
|
{ \
|
|
mbedtls_t_udbl r; \
|
|
mbedtls_mpi_uint r0, r1;
|
|
|
|
#define MULADDC_CORE \
|
|
r = *(s++) * (mbedtls_t_udbl)b; \
|
|
r0 = (mbedtls_mpi_uint)r; \
|
|
r1 = (mbedtls_mpi_uint)(r >> biL); \
|
|
r0 += c; \
|
|
r1 += (r0 < c); \
|
|
r0 += *d; \
|
|
r1 += (r0 < *d); \
|
|
c = r1; \
|
|
*(d++) = r0;
|
|
|
|
#define MULADDC_STOP }
|
|
|
|
#else
|
|
#define MULADDC_INIT \
|
|
{ \
|
|
mbedtls_mpi_uint s0, s1, b0, b1; \
|
|
mbedtls_mpi_uint r0, r1, rx, ry; \
|
|
b0 = (b << biH) >> biH; \
|
|
b1 = (b >> biH);
|
|
|
|
#define MULADDC_CORE \
|
|
s0 = (*s << biH) >> biH; \
|
|
s1 = (*s >> biH); \
|
|
s++; \
|
|
rx = s0 * b1; \
|
|
r0 = s0 * b0; \
|
|
ry = s1 * b0; \
|
|
r1 = s1 * b1; \
|
|
r1 += (rx >> biH); \
|
|
r1 += (ry >> biH); \
|
|
rx <<= biH; \
|
|
ry <<= biH; \
|
|
r0 += rx; \
|
|
r1 += (r0 < rx); \
|
|
r0 += ry; \
|
|
r1 += (r0 < ry); \
|
|
r0 += c; \
|
|
r1 += (r0 < c); \
|
|
r0 += *d; \
|
|
r1 += (r0 < *d); \
|
|
c = r1; \
|
|
*(d++) = r0;
|
|
|
|
#define MULADDC_STOP }
|
|
|
|
#endif /* C (generic) */
|
|
#endif /* C (longlong) */
|
|
|
|
#endif /* bn_mul.h */
|