Skip to content

Commit f8427ae

Browse files
author
Ahmed
committed
Align signature size logic with Roslyn and fix cross-platform key import
1 parent 7875753 commit f8427ae

File tree

1 file changed

+20
-37
lines changed

1 file changed

+20
-37
lines changed

src/Compiler/AbstractIL/ilsign.fs

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,9 @@ type BlobReader =
126126
val mutable _blob: byte array
127127
val mutable _offset: int
128128
new(blob: byte array) = { _blob = blob; _offset = 0 }
129-
129+
130+
member x.Offset with get() = x._offset and set(v) = x._offset <- v
131+
130132
member x.ReadInt32() : int =
131133
let offset = x._offset
132134
x._offset <- offset + 4
@@ -145,7 +147,8 @@ type BlobReader =
145147
let RSAParametersFromBlob blob keyType =
146148
let mutable reader = BlobReader blob
147149

148-
if reader.ReadInt32() <> 0x00000207 && keyType = KeyType.KeyPair then
150+
let header = reader.ReadInt32()
151+
if header <> 0x00000206 && header <> 0x00000207 && keyType = KeyType.KeyPair then
149152
raise (CryptographicException(getResourceString (FSComp.SR.ilSignPrivateKeyExpected ())))
150153

151154
reader.ReadInt32() |> ignore // ALG_ID
@@ -301,42 +304,26 @@ let signStream stream keyBlob =
301304
patchSignature stream peReader signature
302305

303306
let signatureSize (pk: byte array) =
304-
if pk.Length < 25 then
305-
raise (CryptographicException(getResourceString (FSComp.SR.ilSignInvalidPKBlob ())))
306-
307-
try
308-
use rsa = RSA.Create()
309-
310-
try
311-
rsa.ImportParameters(RSAParametersFromBlob pk KeyType.Public)
312-
with _ ->
313-
rsa.ImportParameters(RSAParametersFromBlob pk KeyType.KeyPair)
314-
315-
rsa.KeySize / 8
316-
with _ ->
317-
let mutable reader = BlobReader pk
318-
reader.ReadBigInteger 12 |> ignore
319-
reader.ReadBigInteger 8 |> ignore
320-
let magic = reader.ReadInt32()
321-
322-
if not (magic = RSA_PRIV_MAGIC || magic = RSA_PUB_MAGIC) then
323-
raise (CryptographicException(getResourceString (FSComp.SR.ilSignInvalidPKBlob ())))
324-
325-
let x = reader.ReadInt32() / 8
326-
x
327-
// Returns a CLR Format Blob public key
328-
let getPublicKeyForKeyPair keyBlob =
329-
use rsa = RSA.Create()
330-
rsa.ImportParameters(RSAParametersFromBlob keyBlob KeyType.KeyPair)
331-
let rsaParameters = rsa.ExportParameters false
332-
toCLRKeyBlob rsaParameters CALG_RSA_KEYX
333-
307+
if pk.Length < 20 then 0
308+
else
309+
let reader = BlobReader pk
310+
reader.Offset <- 12
311+
let bitLen = reader.ReadInt32()
312+
let modulusLength = bitLen / 8
313+
314+
if modulusLength < 160 then 128 else modulusLength - 32
334315
// Key signing
335316
type keyContainerName = string
336317
type keyPair = byte array
337318
type pubkey = byte array
338319
type pubkeyOptions = byte array * bool
339320

321+
let getPublicKeyForKeyPair keyBlob =
322+
use rsa = RSA.Create()
323+
rsa.ImportParameters(RSAParametersFromBlob keyBlob KeyType.KeyPair)
324+
let rsaParameters = rsa.ExportParameters false
325+
toCLRKeyBlob rsaParameters CALG_RSA_KEYX
326+
340327
let signerGetPublicKeyForKeyPair (kp: keyPair) : pubkey = getPublicKeyForKeyPair kp
341328

342329
let signerSignatureSize (pk: pubkey) : int = signatureSize pk
@@ -381,11 +368,7 @@ type ILStrongNameSigner =
381368

382369
member s.SignatureSize =
383370
let pkSignatureSize pk =
384-
try
385-
signerSignatureSize pk
386-
with exn ->
387-
failwith ("A call to StrongNameSignatureSize failed (" + exn.Message + ")")
388-
0x80
371+
signerSignatureSize pk
389372

390373
match s with
391374
| PublicKeySigner pk -> pkSignatureSize pk

0 commit comments

Comments
 (0)