Loading src/crypto/curve25519.cpp +20 −52 Original line number Diff line number Diff line Loading @@ -130,32 +130,24 @@ void FieldElement::from_bytes(std::vector<uint8_t> in){ } std::vector<uint8_t> FieldElement::to_bytes() const { FieldElement t = *this; FieldElement m; // 3 carries wie in ref10 t.carry25519(); t.carry25519(); t.carry25519(); for (int j = 0; j < 2; ++j) { std::vector <uint8_t> out(32,0); int carry; FieldElement m,t=*this; t.carry25519(); t.carry25519(); t.carry25519(); for(size_t j=0; j<2; ++j){ m.limbs[0]=t.limbs[0]-0xFFED; for (int i = 1; i < 15; ++i) { for(size_t i=1; i< 15; i++){ m.limbs[i]=t.limbs[i]-0xFFFF-((m.limbs[i-1]>>16) & 1); m.limbs[i-1]&=0xFFFF; } m.limbs[15]=t.limbs[15]-0x7FFF-((m.limbs[14]>>16) &1); int carry = (m.limbs[15] >> 16) & 1; carry=(m.limbs[15]>>16) & 1; m.limbs[14] &=0xFFFF; // constant-time select: t.sel25519(m, 1 - carry); t.cswap(m,1-carry); } std::vector<uint8_t> out(32); for (int i = 0; i < 16; ++i) { out[2*i] = (uint8_t)(t.limbs[i] & 0xFF); out[2*i + 1] = (uint8_t)((t.limbs[i] >> 8) & 0xFF); for(size_t i = 0; i <16; ++i){ out[2*i] = t.limbs[i] & 0xFF; out[2*i+1] = t.limbs[i] >> 8; } return out; } Loading Loading @@ -189,30 +181,6 @@ bool scalarmult_curve25519(std::vector<uint8_t> &out, const std::vector<uint8_t> &scalar, const std::vector<uint8_t> &point_u) { auto pack = [&](std::vector<uint8_t> &out,const FieldElement &in){ out.resize(32); int carry; FieldElement m,t; for(size_t i=0; i <16; ++i){ t.limbs[i]=in.limbs[i]; } t.carry25519(); t.carry25519(); t.carry25519(); for(size_t j=0; j<2; ++j){ m.limbs[0]=t.limbs[0]-0xFFED; for(size_t i=1; i< 15; i++){ m.limbs[i]=t.limbs[i]-0xFFFF-((m.limbs[i-1]>>16) & 1); m.limbs[i-1]&=0xFFFF; } m.limbs[15]=t.limbs[15]-0x7FFF-((m.limbs[14]>>16) &1); carry=(m.limbs[15]>>16) & 1; m.limbs[14] &=0xFFFF; t.cswap(m,1-carry); } for(size_t i = 0; i <16; ++i){ out[2*i] = t.limbs[i] & 0xFF; out[2*i+1] = t.limbs[i] >> 8; } }; std::array<uint8_t,32> clamped; FieldElement _12665; _12665.limbs={0xDB41,1}; Loading Loading @@ -263,7 +231,7 @@ bool scalarmult_curve25519(std::vector<uint8_t> &out, c=c.invert(); a=a*c; pack(out,a); out=a.to_bytes(); return true; } Loading Loading
src/crypto/curve25519.cpp +20 −52 Original line number Diff line number Diff line Loading @@ -130,32 +130,24 @@ void FieldElement::from_bytes(std::vector<uint8_t> in){ } std::vector<uint8_t> FieldElement::to_bytes() const { FieldElement t = *this; FieldElement m; // 3 carries wie in ref10 t.carry25519(); t.carry25519(); t.carry25519(); for (int j = 0; j < 2; ++j) { std::vector <uint8_t> out(32,0); int carry; FieldElement m,t=*this; t.carry25519(); t.carry25519(); t.carry25519(); for(size_t j=0; j<2; ++j){ m.limbs[0]=t.limbs[0]-0xFFED; for (int i = 1; i < 15; ++i) { for(size_t i=1; i< 15; i++){ m.limbs[i]=t.limbs[i]-0xFFFF-((m.limbs[i-1]>>16) & 1); m.limbs[i-1]&=0xFFFF; } m.limbs[15]=t.limbs[15]-0x7FFF-((m.limbs[14]>>16) &1); int carry = (m.limbs[15] >> 16) & 1; carry=(m.limbs[15]>>16) & 1; m.limbs[14] &=0xFFFF; // constant-time select: t.sel25519(m, 1 - carry); t.cswap(m,1-carry); } std::vector<uint8_t> out(32); for (int i = 0; i < 16; ++i) { out[2*i] = (uint8_t)(t.limbs[i] & 0xFF); out[2*i + 1] = (uint8_t)((t.limbs[i] >> 8) & 0xFF); for(size_t i = 0; i <16; ++i){ out[2*i] = t.limbs[i] & 0xFF; out[2*i+1] = t.limbs[i] >> 8; } return out; } Loading Loading @@ -189,30 +181,6 @@ bool scalarmult_curve25519(std::vector<uint8_t> &out, const std::vector<uint8_t> &scalar, const std::vector<uint8_t> &point_u) { auto pack = [&](std::vector<uint8_t> &out,const FieldElement &in){ out.resize(32); int carry; FieldElement m,t; for(size_t i=0; i <16; ++i){ t.limbs[i]=in.limbs[i]; } t.carry25519(); t.carry25519(); t.carry25519(); for(size_t j=0; j<2; ++j){ m.limbs[0]=t.limbs[0]-0xFFED; for(size_t i=1; i< 15; i++){ m.limbs[i]=t.limbs[i]-0xFFFF-((m.limbs[i-1]>>16) & 1); m.limbs[i-1]&=0xFFFF; } m.limbs[15]=t.limbs[15]-0x7FFF-((m.limbs[14]>>16) &1); carry=(m.limbs[15]>>16) & 1; m.limbs[14] &=0xFFFF; t.cswap(m,1-carry); } for(size_t i = 0; i <16; ++i){ out[2*i] = t.limbs[i] & 0xFF; out[2*i+1] = t.limbs[i] >> 8; } }; std::array<uint8_t,32> clamped; FieldElement _12665; _12665.limbs={0xDB41,1}; Loading Loading @@ -263,7 +231,7 @@ bool scalarmult_curve25519(std::vector<uint8_t> &out, c=c.invert(); a=a*c; pack(out,a); out=a.to_bytes(); return true; } Loading