@@ -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 =
145147let 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
303306let 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
335316type keyContainerName = string
336317type keyPair = byte array
337318type pubkey = byte array
338319type 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+
340327let signerGetPublicKeyForKeyPair ( kp : keyPair ) : pubkey = getPublicKeyForKeyPair kp
341328
342329let 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