@@ -210,38 +210,7 @@ func (s *cngSigner) signPSS(digest []byte, opts *rsa.PSSOptions) ([]byte, error)
210210 }
211211
212212 padding := bcryptPSSPaddingInfo {pszAlgId : algNameUTF16 , cbSalt : saltLen }
213- paddingFlags := uint32 (ncryptPadPSSFlag )
214-
215- var sigLen uint32
216- ret , _ , _ := procNCryptSignHash .Call (
217- s .hKey ,
218- uintptr (unsafe .Pointer (& padding )),
219- uintptr (unsafe .Pointer (& digest [0 ])),
220- uintptr (len (digest )),
221- 0 ,
222- 0 ,
223- uintptr (unsafe .Pointer (& sigLen )),
224- uintptr (paddingFlags ),
225- )
226- if ret != 0 {
227- return nil , fmt .Errorf ("NCryptSignHash PSS (size query) failed: 0x%x" , ret )
228- }
229-
230- sig := make ([]byte , sigLen )
231- ret , _ , _ = procNCryptSignHash .Call (
232- s .hKey ,
233- uintptr (unsafe .Pointer (& padding )),
234- uintptr (unsafe .Pointer (& digest [0 ])),
235- uintptr (len (digest )),
236- uintptr (unsafe .Pointer (& sig [0 ])),
237- uintptr (sigLen ),
238- uintptr (unsafe .Pointer (& sigLen )),
239- uintptr (paddingFlags ),
240- )
241- if ret != 0 {
242- return nil , fmt .Errorf ("NCryptSignHash PSS failed: 0x%x" , ret )
243- }
244- return sig [:sigLen ], nil
213+ return ncryptSign (s .hKey , unsafe .Pointer (& padding ), ncryptPadPSSFlag , digest , "PSS" )
245214}
246215
247216func (s * cngSigner ) signPKCS1v15 (digest []byte , opts crypto.SignerOpts ) ([]byte , error ) {
@@ -255,13 +224,16 @@ func (s *cngSigner) signPKCS1v15(digest []byte, opts crypto.SignerOpts) ([]byte,
255224 return nil , fmt .Errorf ("converting hash alg name: %w" , err )
256225 }
257226 padding := bcryptPKCS1PaddingInfo {pszAlgId : algNameUTF16 }
258- paddingFlags := uint32 (0x00000002 ) // NCRYPT_PAD_PKCS1_FLAG
227+ return ncryptSign (s .hKey , unsafe .Pointer (& padding ), 0x00000002 , digest , "PKCS1v15" )
228+ }
259229
260- // Get required buffer size
230+ // ncryptSign performs a two-step NCryptSignHash call (size query, then sign)
231+ // using the provided key handle, padding info pointer, padding flags, and digest.
232+ func ncryptSign (hKey uintptr , padding unsafe.Pointer , paddingFlags uint32 , digest []byte , label string ) ([]byte , error ) {
261233 var sigLen uint32
262234 ret , _ , _ := procNCryptSignHash .Call (
263- s . hKey ,
264- uintptr (unsafe . Pointer ( & padding ) ),
235+ hKey ,
236+ uintptr (padding ),
265237 uintptr (unsafe .Pointer (& digest [0 ])),
266238 uintptr (len (digest )),
267239 0 ,
@@ -270,13 +242,13 @@ func (s *cngSigner) signPKCS1v15(digest []byte, opts crypto.SignerOpts) ([]byte,
270242 uintptr (paddingFlags ),
271243 )
272244 if ret != 0 {
273- return nil , fmt .Errorf ("NCryptSignHash (size query) failed: 0x%x" , ret )
245+ return nil , fmt .Errorf ("NCryptSignHash %s (size query) failed: 0x%x" , label , ret )
274246 }
275247
276248 sig := make ([]byte , sigLen )
277249 ret , _ , _ = procNCryptSignHash .Call (
278- s . hKey ,
279- uintptr (unsafe . Pointer ( & padding ) ),
250+ hKey ,
251+ uintptr (padding ),
280252 uintptr (unsafe .Pointer (& digest [0 ])),
281253 uintptr (len (digest )),
282254 uintptr (unsafe .Pointer (& sig [0 ])),
@@ -285,7 +257,7 @@ func (s *cngSigner) signPKCS1v15(digest []byte, opts crypto.SignerOpts) ([]byte,
285257 uintptr (paddingFlags ),
286258 )
287259 if ret != 0 {
288- return nil , fmt .Errorf ("NCryptSignHash failed: 0x%x" , ret )
260+ return nil , fmt .Errorf ("NCryptSignHash %s failed: 0x%x" , label , ret )
289261 }
290262 return sig [:sigLen ], nil
291263}
0 commit comments