@@ -43,19 +43,22 @@ public byte[] PackPublic(bool compress)
4343 if ( compress )
4444 {
4545 var result = new byte [ Curve . Size + 1 ] ;
46-
46+
4747 result [ 0 ] = ( byte ) ( Public . Y . IsEven ^ Public . Y . Sign < 0 ? 0x02 : 0x03 ) ;
48- Public . X . TryWriteBytes ( result . AsSpan ( ) [ 1 ..] , out _ , true , true ) ;
49-
48+ var xBytes = ToFixedBytes ( Public . X , Curve . Size ) ;
49+ xBytes . CopyTo ( result , 1 ) ;
50+
5051 return result ;
5152 }
5253 else
5354 {
5455 var result = new byte [ Curve . Size * 2 + 1 ] ;
55-
56+
5657 result [ 0 ] = 0x04 ;
57- Public . X . TryWriteBytes ( result . AsSpan ( ) [ 1 ..] , out _ , true , true ) ;
58- Public . Y . TryWriteBytes ( result . AsSpan ( ) [ ( Curve . Size + 1 ) ..] , out _ , true , true ) ;
58+ var xBytes = ToFixedBytes ( Public . X , Curve . Size ) ;
59+ var yBytes = ToFixedBytes ( Public . Y , Curve . Size ) ;
60+ xBytes . CopyTo ( result , 1 ) ;
61+ yBytes . CopyTo ( result , Curve . Size + 1 ) ;
5962
6063 return result ;
6164 }
@@ -72,7 +75,7 @@ public byte[] PackSecret()
7275
7376 private byte [ ] PackShared ( EllipticPoint ecShared , bool isHash )
7477 {
75- var x = ecShared . X . ToByteArray ( true , true ) ;
78+ var x = ToFixedBytes ( ecShared . X , Curve . Size ) ;
7679 return ! isHash ? x : MD5 . HashData ( x [ ..Curve . PackSize ] ) ;
7780 }
7881
@@ -202,6 +205,24 @@ private static BigInteger Mod(BigInteger a, BigInteger b)
202205 if ( result < 0 ) result += b ;
203206 return result ;
204207 }
208+
209+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
210+ private static byte [ ] ToFixedBytes ( BigInteger value , int size )
211+ {
212+ var bytes = value . ToByteArray ( true , true ) ;
213+ if ( bytes . Length == size ) return bytes ;
214+
215+ var result = new byte [ size ] ;
216+ if ( bytes . Length < size )
217+ {
218+ bytes . CopyTo ( result , size - bytes . Length ) ;
219+ }
220+ else
221+ {
222+ Array . Copy ( bytes , bytes . Length - size , result , 0 , size ) ;
223+ }
224+ return result ;
225+ }
205226}
206227
207228internal readonly struct EllipticCurve
0 commit comments