@@ -2,71 +2,18 @@ package main
22
33import (
44 "bytes"
5- "crypto"
6- "crypto/ecdsa"
7- "crypto/elliptic"
85 "crypto/rand"
9- "crypto/sha256"
106 "crypto/x509"
117 "encoding/asn1"
128 "encoding/hex"
139 "errors"
14- "math/big"
1510 "testing"
1611
1712 "github.com/letsencrypt/boulder/pkcs11helpers"
1813 "github.com/letsencrypt/boulder/test"
1914 "github.com/miekg/pkcs11"
2015)
2116
22- func TestX509Signer (t * testing.T ) {
23- s , ctx := pkcs11helpers .NewSessionWithMock ()
24-
25- // test that x509Signer.Sign properly converts the PKCS#11 format signature to
26- // the RFC 5480 format signature
27- ctx .SignInitFunc = func (pkcs11.SessionHandle , []* pkcs11.Mechanism , pkcs11.ObjectHandle ) error {
28- return nil
29- }
30- tk , err := ecdsa .GenerateKey (elliptic .P256 (), rand .Reader )
31- test .AssertNotError (t , err , "Failed to generate test key" )
32- ctx .SignFunc = func (_ pkcs11.SessionHandle , digest []byte ) ([]byte , error ) {
33- r , s , err := ecdsa .Sign (rand .Reader , tk , digest [:])
34- if err != nil {
35- return nil , err
36- }
37- rBytes := r .Bytes ()
38- sBytes := s .Bytes ()
39- // http://docs.oasis-open.org/pkcs11/pkcs11-curr/v2.40/os/pkcs11-curr-v2.40-os.html
40- // Section 2.3.1: EC Signatures
41- // "If r and s have different octet length, the shorter of both must be padded with
42- // leading zero octets such that both have the same octet length."
43- switch {
44- case len (rBytes ) < len (sBytes ):
45- padding := make ([]byte , len (sBytes )- len (rBytes ))
46- rBytes = append (padding , rBytes ... )
47- case len (rBytes ) > len (sBytes ):
48- padding := make ([]byte , len (rBytes )- len (sBytes ))
49- sBytes = append (padding , sBytes ... )
50- }
51- return append (rBytes , sBytes ... ), nil
52- }
53- digest := sha256 .Sum256 ([]byte ("hello" ))
54- signer := & x509Signer {session : s , keyType : pkcs11helpers .ECDSAKey , pub : tk .Public ()}
55- signature , err := signer .Sign (nil , digest [:], crypto .SHA256 )
56- test .AssertNotError (t , err , "x509Signer.Sign failed" )
57-
58- var rfcFormat struct {
59- R , S * big.Int
60- }
61- rest , err := asn1 .Unmarshal (signature , & rfcFormat )
62- test .AssertNotError (t , err , "asn1.Unmarshal failed trying to parse signature" )
63- test .Assert (t , len (rest ) == 0 , "Signature had trailing garbage" )
64- verified := ecdsa .Verify (& tk .PublicKey , digest [:], rfcFormat .R , rfcFormat .S )
65- test .Assert (t , verified , "Failed to verify RFC format signature" )
66- // For the sake of coverage
67- test .AssertEquals (t , signer .Public (), tk .Public ())
68- }
69-
7017func TestParseOID (t * testing.T ) {
7118 _ , err := parseOID ("" )
7219 test .AssertError (t , err , "parseOID accepted an empty OID" )
@@ -458,94 +405,3 @@ func TestVerifyProfile(t *testing.T) {
458405 }
459406 }
460407}
461-
462- func TestGetKey (t * testing.T ) {
463- s , ctx := pkcs11helpers .NewSessionWithMock ()
464-
465- // test newSigner fails when pkcs11helpers.FindObject for private key handle fails
466- ctx .FindObjectsInitFunc = func (pkcs11.SessionHandle , []* pkcs11.Attribute ) error {
467- return errors .New ("broken" )
468- }
469- _ , err := newSigner (s , "label" , []byte {255 , 255 })
470- test .AssertError (t , err , "newSigner didn't fail when pkcs11helpers.FindObject for private key handle failed" )
471-
472- // test newSigner fails when GetAttributeValue fails
473- ctx .FindObjectsInitFunc = func (pkcs11.SessionHandle , []* pkcs11.Attribute ) error {
474- return nil
475- }
476- ctx .FindObjectsFunc = func (pkcs11.SessionHandle , int ) ([]pkcs11.ObjectHandle , bool , error ) {
477- return []pkcs11.ObjectHandle {1 }, false , nil
478- }
479- ctx .FindObjectsFinalFunc = func (pkcs11.SessionHandle ) error {
480- return nil
481- }
482- ctx .GetAttributeValueFunc = func (pkcs11.SessionHandle , pkcs11.ObjectHandle , []* pkcs11.Attribute ) ([]* pkcs11.Attribute , error ) {
483- return nil , errors .New ("broken" )
484- }
485- _ , err = newSigner (s , "label" , []byte {255 , 255 })
486- test .AssertError (t , err , "newSigner didn't fail when GetAttributeValue for private key type failed" )
487-
488- // test newSigner fails when GetAttributeValue returns no attributes
489- ctx .GetAttributeValueFunc = func (pkcs11.SessionHandle , pkcs11.ObjectHandle , []* pkcs11.Attribute ) ([]* pkcs11.Attribute , error ) {
490- return nil , nil
491- }
492- _ , err = newSigner (s , "label" , []byte {255 , 255 })
493- test .AssertError (t , err , "newSigner didn't fail when GetAttributeValue for private key type returned no attributes" )
494-
495- // test newSigner fails when pkcs11helpers.FindObject for public key handle fails
496- ctx .GetAttributeValueFunc = func (pkcs11.SessionHandle , pkcs11.ObjectHandle , []* pkcs11.Attribute ) ([]* pkcs11.Attribute , error ) {
497- return []* pkcs11.Attribute {pkcs11 .NewAttribute (pkcs11 .CKA_KEY_TYPE , pkcs11 .CKK_EC )}, nil
498- }
499- ctx .FindObjectsInitFunc = func (_ pkcs11.SessionHandle , tmpl []* pkcs11.Attribute ) error {
500- if bytes .Equal (tmpl [0 ].Value , []byte {2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }) {
501- return errors .New ("broken" )
502- }
503- return nil
504- }
505- _ , err = newSigner (s , "label" , []byte {255 , 255 })
506- test .AssertError (t , err , "newSigner didn't fail when pkcs11helpers.FindObject for public key handle failed" )
507-
508- // test newSigner fails when pkcs11helpers.FindObject for private key returns unknown CKA_KEY_TYPE
509- ctx .FindObjectsInitFunc = func (_ pkcs11.SessionHandle , tmpl []* pkcs11.Attribute ) error {
510- return nil
511- }
512- ctx .GetAttributeValueFunc = func (pkcs11.SessionHandle , pkcs11.ObjectHandle , []* pkcs11.Attribute ) ([]* pkcs11.Attribute , error ) {
513- return []* pkcs11.Attribute {pkcs11 .NewAttribute (pkcs11 .CKA_KEY_TYPE , []byte {2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 })}, nil
514- }
515- _ , err = newSigner (s , "label" , []byte {255 , 255 })
516- test .AssertError (t , err , "newSigner didn't fail when GetAttributeValue for private key returned unknown key type" )
517-
518- // test newSigner fails when GetRSAPublicKey fails
519- ctx .GetAttributeValueFunc = func (pkcs11.SessionHandle , pkcs11.ObjectHandle , []* pkcs11.Attribute ) ([]* pkcs11.Attribute , error ) {
520- return []* pkcs11.Attribute {pkcs11 .NewAttribute (pkcs11 .CKA_KEY_TYPE , []byte {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 })}, nil
521- }
522- _ , err = newSigner (s , "label" , []byte {255 , 255 })
523- test .AssertError (t , err , "newSigner didn't fail when GetRSAPublicKey fails" )
524-
525- // test newSigner fails when GetECDSAPublicKey fails
526- ctx .GetAttributeValueFunc = func (pkcs11.SessionHandle , pkcs11.ObjectHandle , []* pkcs11.Attribute ) ([]* pkcs11.Attribute , error ) {
527- return []* pkcs11.Attribute {pkcs11 .NewAttribute (pkcs11 .CKA_KEY_TYPE , []byte {3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 })}, nil
528- }
529- _ , err = newSigner (s , "label" , []byte {255 , 255 })
530- test .AssertError (t , err , "newSigner didn't fail when GetECDSAPublicKey fails" )
531-
532- // test newSigner works when everything... works
533- ctx .GetAttributeValueFunc = func (_ pkcs11.SessionHandle , _ pkcs11.ObjectHandle , attrs []* pkcs11.Attribute ) ([]* pkcs11.Attribute , error ) {
534- var returns []* pkcs11.Attribute
535- for _ , attr := range attrs {
536- switch attr .Type {
537- case pkcs11 .CKA_KEY_TYPE :
538- returns = append (returns , pkcs11 .NewAttribute (pkcs11 .CKA_KEY_TYPE , []byte {0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }))
539- case pkcs11 .CKA_PUBLIC_EXPONENT :
540- returns = append (returns , pkcs11 .NewAttribute (pkcs11 .CKA_PUBLIC_EXPONENT , []byte {1 , 2 , 3 }))
541- case pkcs11 .CKA_MODULUS :
542- returns = append (returns , pkcs11 .NewAttribute (pkcs11 .CKA_MODULUS , []byte {4 , 5 , 6 }))
543- default :
544- return nil , errors .New ("GetAttributeValue got unexpected attribute type" )
545- }
546- }
547- return returns , nil
548- }
549- _ , err = newSigner (s , "label" , []byte {255 , 255 })
550- test .AssertNotError (t , err , "newSigner failed when everything worked properly" )
551- }
0 commit comments