@@ -12,14 +12,14 @@ namespace System.Security.Cryptography.Asn1
12
12
internal partial struct RSAPrivateKeyAsn
13
13
{
14
14
internal int Version ;
15
- internal System . Numerics . BigInteger Modulus ;
16
- internal System . Numerics . BigInteger PublicExponent ;
17
- internal System . Numerics . BigInteger PrivateExponent ;
18
- internal System . Numerics . BigInteger Prime1 ;
19
- internal System . Numerics . BigInteger Prime2 ;
20
- internal System . Numerics . BigInteger Exponent1 ;
21
- internal System . Numerics . BigInteger Exponent2 ;
22
- internal System . Numerics . BigInteger Coefficient ;
15
+ internal ReadOnlyMemory < byte > Modulus ;
16
+ internal ReadOnlyMemory < byte > PublicExponent ;
17
+ internal ReadOnlyMemory < byte > PrivateExponent ;
18
+ internal ReadOnlyMemory < byte > Prime1 ;
19
+ internal ReadOnlyMemory < byte > Prime2 ;
20
+ internal ReadOnlyMemory < byte > Exponent1 ;
21
+ internal ReadOnlyMemory < byte > Exponent2 ;
22
+ internal ReadOnlyMemory < byte > Coefficient ;
23
23
24
24
internal readonly void Encode ( AsnWriter writer )
25
25
{
@@ -31,14 +31,14 @@ internal readonly void Encode(AsnWriter writer, Asn1Tag tag)
31
31
writer . PushSequence ( tag ) ;
32
32
33
33
writer . WriteInteger ( Version ) ;
34
- writer . WriteInteger ( Modulus ) ;
35
- writer . WriteInteger ( PublicExponent ) ;
36
- writer . WriteInteger ( PrivateExponent ) ;
37
- writer . WriteInteger ( Prime1 ) ;
38
- writer . WriteInteger ( Prime2 ) ;
39
- writer . WriteInteger ( Exponent1 ) ;
40
- writer . WriteInteger ( Exponent2 ) ;
41
- writer . WriteInteger ( Coefficient ) ;
34
+ writer . WriteInteger ( Modulus . Span ) ;
35
+ writer . WriteInteger ( PublicExponent . Span ) ;
36
+ writer . WriteInteger ( PrivateExponent . Span ) ;
37
+ writer . WriteInteger ( Prime1 . Span ) ;
38
+ writer . WriteInteger ( Prime2 . Span ) ;
39
+ writer . WriteInteger ( Exponent1 . Span ) ;
40
+ writer . WriteInteger ( Exponent2 . Span ) ;
41
+ writer . WriteInteger ( Coefficient . Span ) ;
42
42
writer . PopSequence ( tag ) ;
43
43
}
44
44
@@ -53,7 +53,7 @@ internal static RSAPrivateKeyAsn Decode(Asn1Tag expectedTag, ReadOnlyMemory<byte
53
53
{
54
54
AsnValueReader reader = new AsnValueReader ( encoded . Span , ruleSet ) ;
55
55
56
- DecodeCore ( ref reader , expectedTag , out RSAPrivateKeyAsn decoded ) ;
56
+ DecodeCore ( ref reader , expectedTag , encoded , out RSAPrivateKeyAsn decoded ) ;
57
57
reader . ThrowIfNotEmpty ( ) ;
58
58
return decoded ;
59
59
}
@@ -63,42 +63,53 @@ internal static RSAPrivateKeyAsn Decode(Asn1Tag expectedTag, ReadOnlyMemory<byte
63
63
}
64
64
}
65
65
66
- internal static void Decode ( ref AsnValueReader reader , out RSAPrivateKeyAsn decoded )
66
+ internal static void Decode ( ref AsnValueReader reader , ReadOnlyMemory < byte > rebind , out RSAPrivateKeyAsn decoded )
67
67
{
68
- Decode ( ref reader , Asn1Tag . Sequence , out decoded ) ;
68
+ Decode ( ref reader , Asn1Tag . Sequence , rebind , out decoded ) ;
69
69
}
70
70
71
- internal static void Decode ( ref AsnValueReader reader , Asn1Tag expectedTag , out RSAPrivateKeyAsn decoded )
71
+ internal static void Decode ( ref AsnValueReader reader , Asn1Tag expectedTag , ReadOnlyMemory < byte > rebind , out RSAPrivateKeyAsn decoded )
72
72
{
73
73
try
74
74
{
75
- DecodeCore ( ref reader , expectedTag , out decoded ) ;
75
+ DecodeCore ( ref reader , expectedTag , rebind , out decoded ) ;
76
76
}
77
77
catch ( AsnContentException e )
78
78
{
79
79
throw new CryptographicException ( SR . Cryptography_Der_Invalid_Encoding , e ) ;
80
80
}
81
81
}
82
82
83
- private static void DecodeCore ( ref AsnValueReader reader , Asn1Tag expectedTag , out RSAPrivateKeyAsn decoded )
83
+ private static void DecodeCore ( ref AsnValueReader reader , Asn1Tag expectedTag , ReadOnlyMemory < byte > rebind , out RSAPrivateKeyAsn decoded )
84
84
{
85
85
decoded = default ;
86
86
AsnValueReader sequenceReader = reader . ReadSequence ( expectedTag ) ;
87
+ ReadOnlySpan < byte > rebindSpan = rebind . Span ;
88
+ int offset ;
89
+ ReadOnlySpan < byte > tmpSpan ;
87
90
88
91
89
92
if ( ! sequenceReader . TryReadInt32 ( out decoded . Version ) )
90
93
{
91
94
sequenceReader . ThrowIfNotEmpty ( ) ;
92
95
}
93
96
94
- decoded . Modulus = sequenceReader . ReadInteger ( ) ;
95
- decoded . PublicExponent = sequenceReader . ReadInteger ( ) ;
96
- decoded . PrivateExponent = sequenceReader . ReadInteger ( ) ;
97
- decoded . Prime1 = sequenceReader . ReadInteger ( ) ;
98
- decoded . Prime2 = sequenceReader . ReadInteger ( ) ;
99
- decoded . Exponent1 = sequenceReader . ReadInteger ( ) ;
100
- decoded . Exponent2 = sequenceReader . ReadInteger ( ) ;
101
- decoded . Coefficient = sequenceReader . ReadInteger ( ) ;
97
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
98
+ decoded . Modulus = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
99
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
100
+ decoded . PublicExponent = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
101
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
102
+ decoded . PrivateExponent = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
103
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
104
+ decoded . Prime1 = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
105
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
106
+ decoded . Prime2 = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
107
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
108
+ decoded . Exponent1 = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
109
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
110
+ decoded . Exponent2 = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
111
+ tmpSpan = sequenceReader . ReadIntegerBytes ( ) ;
112
+ decoded . Coefficient = rebindSpan . Overlaps ( tmpSpan , out offset ) ? rebind . Slice ( offset , tmpSpan . Length ) : tmpSpan . ToArray ( ) ;
102
113
103
114
sequenceReader . ThrowIfNotEmpty ( ) ;
104
115
}
0 commit comments