< Summary

Information
Class: Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10.MontgomeryOperations
Assembly: Renci.SshNet
File(s): \home\appveyor\projects\ssh-net\src\Renci.SshNet\Security\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs
Line coverage
100%
Covered lines: 50
Uncovered lines: 0
Coverable lines: 50
Total lines: 205
Line coverage: 100%
Branch coverage
100%
Covered branches: 4
Total branches: 4
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Cyclomatic complexity Line coverage
scalarmult(...)100%1100%
scalarmult(...)100%4100%

File(s)

\home\appveyor\projects\ssh-net\src\Renci.SshNet\Security\Chaos.NaCl\Internal\Ed25519Ref10\scalarmult.cs

#LineLine coverage
 1using System;
 2
 3namespace Renci.SshNet.Security.Chaos.NaCl.Internal.Ed25519Ref10
 4{
 5  internal static class MontgomeryOperations
 6  {
 7    internal static void scalarmult(
 8      byte[] q, int qoffset,
 9      byte[] n, int noffset,
 10      byte[] p, int poffset)
 234411    {
 12      FieldElement p0;
 13      FieldElement q0;
 234414      FieldOperations.fe_frombytes2(out p0, p, poffset);
 234415      scalarmult(out q0, n, noffset, ref p0);
 234416      FieldOperations.fe_tobytes(q, qoffset, ref q0);
 234417    }
 18
 19    internal static void scalarmult(
 20      out FieldElement q,
 21      byte[] n, int noffset,
 22      ref FieldElement p)
 234423    {
 234424      byte[] e = new byte[32];//ToDo: remove allocation
 25      UInt32 i;
 26      FieldElement x1;
 27      FieldElement x2;
 28      FieldElement z2;
 29      FieldElement x3;
 30      FieldElement z3;
 31      FieldElement tmp0;
 32      FieldElement tmp1;
 33      int pos;
 34      UInt32 swap;
 35      UInt32 b;
 36
 15470437      for (i = 0; i < 32; ++i)
 7500838        e[i] = n[noffset + i];
 234439        ScalarOperations.sc_clamp(e, 0);
 234440      x1 = p;
 234441      FieldOperations.fe_1(out x2);
 234442      FieldOperations.fe_0(out z2);
 234443      x3 = x1;
 234444      FieldOperations.fe_1(out z3);
 45
 234446      swap = 0;
 120012847      for (pos = 254; pos >= 0; --pos)
 59772048      {
 59772049        b = (uint)(e[pos / 8] >> (pos & 7));
 59772050        b &= 1;
 59772051        swap ^= b;
 59772052        FieldOperations.fe_cswap(ref x2, ref x3, swap);
 59772053        FieldOperations.fe_cswap(ref z2, ref z3, swap);
 59772054        swap = b;
 55        /* qhasm: fe X2 */
 56
 57        /* qhasm: fe Z2 */
 58
 59        /* qhasm: fe X3 */
 60
 61        /* qhasm: fe Z3 */
 62
 63        /* qhasm: fe X4 */
 64
 65        /* qhasm: fe Z4 */
 66
 67        /* qhasm: fe X5 */
 68
 69        /* qhasm: fe Z5 */
 70
 71        /* qhasm: fe A */
 72
 73        /* qhasm: fe B */
 74
 75        /* qhasm: fe C */
 76
 77        /* qhasm: fe D */
 78
 79        /* qhasm: fe E */
 80
 81        /* qhasm: fe AA */
 82
 83        /* qhasm: fe BB */
 84
 85        /* qhasm: fe DA */
 86
 87        /* qhasm: fe CB */
 88
 89        /* qhasm: fe t0 */
 90
 91        /* qhasm: fe t1 */
 92
 93        /* qhasm: fe t2 */
 94
 95        /* qhasm: fe t3 */
 96
 97        /* qhasm: fe t4 */
 98
 99        /* qhasm: enter ladder */
 100
 101        /* qhasm: D = X3-Z3 */
 102        /* asm 1: fe_sub(>D=fe#5,<X3=fe#3,<Z3=fe#4); */
 103        /* asm 2: fe_sub(>D=tmp0,<X3=x3,<Z3=z3); */
 597720104        FieldOperations.fe_sub(out tmp0, ref  x3, ref  z3);
 105
 106        /* qhasm: B = X2-Z2 */
 107        /* asm 1: fe_sub(>B=fe#6,<X2=fe#1,<Z2=fe#2); */
 108        /* asm 2: fe_sub(>B=tmp1,<X2=x2,<Z2=z2); */
 597720109        FieldOperations.fe_sub(out tmp1, ref x2, ref z2);
 110
 111        /* qhasm: A = X2+Z2 */
 112        /* asm 1: fe_add(>A=fe#1,<X2=fe#1,<Z2=fe#2); */
 113        /* asm 2: fe_add(>A=x2,<X2=x2,<Z2=z2); */
 597720114        FieldOperations.fe_add(out x2, ref x2, ref z2);
 115
 116        /* qhasm: C = X3+Z3 */
 117        /* asm 1: fe_add(>C=fe#2,<X3=fe#3,<Z3=fe#4); */
 118        /* asm 2: fe_add(>C=z2,<X3=x3,<Z3=z3); */
 597720119        FieldOperations.fe_add(out z2, ref  x3, ref z3);
 120
 121        /* qhasm: DA = D*A */
 122        /* asm 1: fe_mul(>DA=fe#4,<D=fe#5,<A=fe#1); */
 123        /* asm 2: fe_mul(>DA=z3,<D=tmp0,<A=x2); */
 597720124        FieldOperations.fe_mul(out z3, ref tmp0, ref x2);
 125
 126        /* qhasm: CB = C*B */
 127        /* asm 1: fe_mul(>CB=fe#2,<C=fe#2,<B=fe#6); */
 128        /* asm 2: fe_mul(>CB=z2,<C=z2,<B=tmp1); */
 597720129        FieldOperations.fe_mul(out z2, ref  z2, ref tmp1);
 130
 131        /* qhasm: BB = B^2 */
 132        /* asm 1: fe_sq(>BB=fe#5,<B=fe#6); */
 133        /* asm 2: fe_sq(>BB=tmp0,<B=tmp1); */
 597720134        FieldOperations.fe_sq(out tmp0, ref  tmp1);
 135
 136        /* qhasm: AA = A^2 */
 137        /* asm 1: fe_sq(>AA=fe#6,<A=fe#1); */
 138        /* asm 2: fe_sq(>AA=tmp1,<A=x2); */
 597720139        FieldOperations.fe_sq(out tmp1, ref  x2);
 140
 141        /* qhasm: t0 = DA+CB */
 142        /* asm 1: fe_add(>t0=fe#3,<DA=fe#4,<CB=fe#2); */
 143        /* asm 2: fe_add(>t0=x3,<DA=z3,<CB=z2); */
 597720144        FieldOperations.fe_add(out x3, ref z3, ref  z2);
 145
 146        /* qhasm: assign x3 to t0 */
 147
 148        /* qhasm: t1 = DA-CB */
 149        /* asm 1: fe_sub(>t1=fe#2,<DA=fe#4,<CB=fe#2); */
 150        /* asm 2: fe_sub(>t1=z2,<DA=z3,<CB=z2); */
 597720151        FieldOperations.fe_sub(out z2, ref z3, ref  z2);
 152
 153        /* qhasm: X4 = AA*BB */
 154        /* asm 1: fe_mul(>X4=fe#1,<AA=fe#6,<BB=fe#5); */
 155        /* asm 2: fe_mul(>X4=x2,<AA=tmp1,<BB=tmp0); */
 597720156        FieldOperations.fe_mul(out x2, ref tmp1, ref  tmp0);
 157
 158        /* qhasm: E = AA-BB */
 159        /* asm 1: fe_sub(>E=fe#6,<AA=fe#6,<BB=fe#5); */
 160        /* asm 2: fe_sub(>E=tmp1,<AA=tmp1,<BB=tmp0); */
 597720161        FieldOperations.fe_sub(out tmp1, ref  tmp1, ref tmp0);
 162
 163        /* qhasm: t2 = t1^2 */
 164        /* asm 1: fe_sq(>t2=fe#2,<t1=fe#2); */
 165        /* asm 2: fe_sq(>t2=z2,<t1=z2); */
 597720166        FieldOperations.fe_sq(out z2, ref z2);
 167
 168        /* qhasm: t3 = a24*E */
 169        /* asm 1: fe_mul121666(>t3=fe#4,<E=fe#6); */
 170        /* asm 2: fe_mul121666(>t3=z3,<E=tmp1); */
 597720171        FieldOperations.fe_mul121666(out z3, ref tmp1);
 172
 173        /* qhasm: X5 = t0^2 */
 174        /* asm 1: fe_sq(>X5=fe#3,<t0=fe#3); */
 175        /* asm 2: fe_sq(>X5=x3,<t0=x3); */
 597720176        FieldOperations.fe_sq(out x3, ref  x3);
 177
 178        /* qhasm: t4 = BB+t3 */
 179        /* asm 1: fe_add(>t4=fe#5,<BB=fe#5,<t3=fe#4); */
 180        /* asm 2: fe_add(>t4=tmp0,<BB=tmp0,<t3=z3); */
 597720181        FieldOperations.fe_add(out tmp0, ref  tmp0, ref z3);
 182
 183        /* qhasm: Z5 = X1*t2 */
 184        /* asm 1: fe_mul(>Z5=fe#4,x1,<t2=fe#2); */
 185        /* asm 2: fe_mul(>Z5=z3,x1,<t2=z2); */
 597720186        FieldOperations.fe_mul(out z3, ref x1, ref  z2);
 187
 188        /* qhasm: Z4 = E*t4 */
 189        /* asm 1: fe_mul(>Z4=fe#2,<E=fe#6,<t4=fe#5); */
 190        /* asm 2: fe_mul(>Z4=z2,<E=tmp1,<t4=tmp0); */
 597720191        FieldOperations.fe_mul(out z2, ref  tmp1, ref  tmp0);
 192
 193        /* qhasm: return */
 194
 597720195      }
 2344196      FieldOperations.fe_cswap(ref x2, ref x3, swap);
 2344197      FieldOperations.fe_cswap(ref z2, ref z3, swap);
 198
 2344199      FieldOperations.fe_invert(out z2, ref z2);
 2344200      FieldOperations.fe_mul(out x2, ref x2, ref z2);
 2344201      q = x2;
 2344202      CryptoBytes.Wipe(e);
 2344203    }
 204  }
 205}