36#define OC_BN_MAX_VAL ((OC_BN_WORD)0U - 1U)
40 "OC_BN_WORD_SIZE and OC_BN_WORD_NUM_BITS usages must be adapted."
80 ASSERT (NumWordsResult > 0);
83 ASSERT (Exponent < NumWordsResult);
84 ASSERT (NumWordsResult - Exponent >= NumWordsA);
88 if (NumWordsResult - Exponent > NumWordsA) {
90 &Result[NumWordsA + Exponent],
91 OC_BN_SIZE (NumWordsResult - Exponent - NumWordsA)
122 ASSERT (NumWordsResult > 0);
125 ASSERT (NumWordsResult == NumWordsA + NumWords + 1);
138 for (Index = (NumWordsA - 1); Index > 0; --Index) {
139 Result[Index + NumWords] = (A[Index] << NumBits) | (A[Index - 1] >> (
OC_BN_WORD_NUM_BITS - NumBits));
145 Result[NumWords] = A[0] << NumBits;
177 ASSERT (NumWordsResult > 0);
219 ASSERT (NumWordsResult > 0);
222 ASSERT (Exponent < NumWordsResult);
223 ASSERT (NumWordsResult - Exponent >= NumWordsA);
256 for (Index = 0; Index < (NumWords - 1U); ++Index) {
260 A[Index] >>= Exponent;
288 ASSERT (NumWordsResult > 0);
291 ASSERT (NumWordsA >= NumWords);
302 ASSERT (NumWordsA - NumWords >= NumWordsResult);
309 for (Index = NumWords; Index < (UINTN)(NumWordsA - 1); ++Index) {
310 Result[Index - NumWords] = (A[Index] >> NumBits) | (A[Index + 1] << (
OC_BN_WORD_NUM_BITS - NumBits));
316 Result[Index - NumWords] = (A[NumWordsA - 1] >> NumBits);
320 ZeroMem (&Result[Index - NumWords + 1],
OC_BN_SIZE (NumWordsResult - (Index - NumWords + 1)));
347 ASSERT (NumWordsResult > 0);
390 Result64 = (UINT64)A * B;
426 for (Index = 0; Index < NumWords; ++Index) {
428 Tmp2 = B[Index] + Borrow;
429 TmpResult = (Tmp1 - Tmp2);
434 Borrow = (Tmp2 < Borrow) | (Tmp1 < TmpResult);
435 Result[Index] = TmpResult;
462 while (Mask != 0 && (Word & Mask) == 0) {
497 }
while (Index != 0);
533 if (WordIndex < NumWords) {
535 A[WordIndex] |= (Value << NumBits);
555 if (A[Index] > B[Index]) {
557 }
else if (A[Index] < B[Index]) {
560 }
while (Index != 0);
588 ASSERT (NumWordsRest > 0);
592 ASSERT (NumWordsA >= NumWordsRest);
602 ModTmp = &Scratch[0];
603 BigDiv = &Scratch[SigWordsModTmp];
604 SigWordsBigDiv = SigWordsModTmp;
621 ASSERT (SigBitsModTmp >= SigBitsBigDiv);
622 BigDivExp = SigBitsModTmp - SigBitsBigDiv;
625 SigBitsBigDiv = SigBitsModTmp;
635 ASSERT (SigWordsModTmp == SigWordsBigDiv || SigWordsModTmp == SigWordsBigDiv + 1);
636 if (SigWordsModTmp > SigWordsBigDiv) {
637 ASSERT (ModTmp[SigWordsModTmp - 1] != 0);
640 CmpResult =
BigNumCmp (ModTmp, SigWordsBigDiv, BigDiv);
643 if (CmpResult >= 0) {
652 BigNumSub (ModTmp, SigWordsModTmp, ModTmp, BigDiv);
654 if (BigDivExp == 0) {
672 ASSERT (SigBitsBigDiv >= SigBitsModTmp);
673 DeltaBits = SigBitsBigDiv - SigBitsModTmp;
674 if (DeltaBits > BigDivExp) {
685 BigNumRightShift (BigDiv, SigWordsBigDiv, BigDiv, SigWordsBigDiv, DeltaBits);
688 SigBitsBigDiv = SigBitsModTmp;
690 BigDivExp -= DeltaBits;
696 if (BigDivExp == 0) {
719 ASSERT (BigDiv[SigWordsBigDiv - 1] == 0);
766 ((UINT32)
Buffer[(BufferSize - Index) + 0] << 24U) |
767 ((UINT32)
Buffer[(BufferSize - Index) + 1] << 16U) |
768 ((UINT32)
Buffer[(BufferSize - Index) + 2] << 8U) |
769 ((UINT32)
Buffer[(BufferSize - Index) + 3] << 0U));
772 ((UINT64)
Buffer[(BufferSize - Index) + 0] << 56U) |
773 ((UINT64)
Buffer[(BufferSize - Index) + 1] << 48U) |
774 ((UINT64)
Buffer[(BufferSize - Index) + 2] << 40U) |
775 ((UINT64)
Buffer[(BufferSize - Index) + 3] << 32U) |
776 ((UINT64)
Buffer[(BufferSize - Index) + 4] << 24U) |
777 ((UINT64)
Buffer[(BufferSize - Index) + 5] << 16U) |
778 ((UINT64)
Buffer[(BufferSize - Index) + 6] << 8U) |
779 ((UINT64)
Buffer[(BufferSize - Index) + 7] << 0U));
#define OC_BN_WORD_NUM_BITS
OC_BN_WORD BigNumWordMul64(OUT OC_BN_WORD *Hi, IN OC_BN_WORD A, IN OC_BN_WORD B)
STATIC VOID BigNumRightShift(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWordsResult, IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWordsA, IN UINTN Exponent)
STATIC UINT8 BigNumSignificantBitsWord(IN OC_BN_WORD Word)
STATIC VOID BigNumRightShiftBitsSmall(IN OUT OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWords, IN UINT8 Exponent)
STATIC OC_BN_NUM_WORDS BigNumMostSignificantWord(IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWords)
STATIC VOID BigNumRightShiftWords(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWordsResult, IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWordsA, IN UINTN Exponent)
VOID BigNumSub(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWords, IN CONST OC_BN_WORD *A, IN CONST OC_BN_WORD *B)
OC_BN_WORD BigNumSwapWord(IN OC_BN_WORD Word)
VOID BigNumMod(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWordsRest, IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWordsA, IN CONST OC_BN_WORD *B, IN OC_BN_WORD *Scratch)
STATIC_ASSERT(OC_BN_WORD_SIZE==sizeof(UINT32)||OC_BN_WORD_SIZE==sizeof(UINT64), "OC_BN_WORD_SIZE and OC_BN_WORD_NUM_BITS usages must be adapted.")
OC_BN_WORD BigNumWordMul(OUT OC_BN_WORD *Hi, IN OC_BN_WORD A, IN OC_BN_WORD B)
VOID BigNumOrWord(IN OUT OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWords, IN OC_BN_WORD Value, IN UINTN Exponent)
STATIC VOID BigNumLeftShiftWords(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWordsResult, IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWordsA, IN UINTN Exponent)
OC_BN_NUM_BITS BigNumSignificantBits(IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWords)
VOID BigNumParseBuffer(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWords, IN CONST UINT8 *Buffer, IN UINTN BufferSize)
INTN BigNumCmp(IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWords, IN CONST OC_BN_WORD *B)
STATIC VOID BigNumRightShiftWordsAndBits(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWordsResult, IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWordsA, IN UINTN NumWords, IN UINT8 NumBits)
STATIC VOID BigNumLeftShift(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWordsResult, IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWordsA, IN UINTN Exponent)
STATIC VOID BigNumLeftShiftWordsAndBits(IN OUT OC_BN_WORD *Result, IN OC_BN_NUM_WORDS NumWordsResult, IN CONST OC_BN_WORD *A, IN OC_BN_NUM_WORDS NumWordsA, IN UINTN NumWords, IN UINT8 NumBits)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
VOID *EFIAPI CopyMem(OUT VOID *DestinationBuffer, IN CONST VOID *SourceBuffer, IN UINTN Length)
VOID *EFIAPI ZeroMem(OUT VOID *Buffer, IN UINTN Length)
UINT64 EFIAPI RShiftU64(IN UINT64 Operand, IN UINTN Count)
UINT64 SwapBytes64(UINT64 Operand)