@@ -231,6 +231,71 @@ func TestCreateCASignedCert(t *testing.T) {
231231 }
232232}
233233
234+ func TestCASignParsedPublicKeySerialGeneration (t * testing.T ) {
235+ caKey , err := GenerateP256Key ()
236+ if err != nil {
237+ t .Fatalf ("GenerateP256Key: %v" , err )
238+ }
239+ defer caKey .Free ()
240+
241+ caTmpl := & Certificate {
242+ SerialNumber : big .NewInt (1 ),
243+ Subject : Name {CommonName : "auto serial CA" },
244+ NotBefore : time .Now ().Add (- time .Hour ),
245+ NotAfter : time .Now ().Add (24 * time .Hour ),
246+ IsCA : true ,
247+ BasicConstraintsValid : true ,
248+ KeyUsage : KeyUsageCertSign ,
249+ }
250+ caDER , err := CreateCertificate (caTmpl , caTmpl , caKey , caKey )
251+ if err != nil {
252+ t .Fatalf ("CreateCertificate(CA): %v" , err )
253+ }
254+ caCert , err := ParseCertificate (caDER )
255+ if err != nil {
256+ t .Fatalf ("ParseCertificate(CA): %v" , err )
257+ }
258+ defer caCert .Free ()
259+
260+ // The subject key as a CA sees it: parsed from a certificate, so
261+ // public-key-only and carrying no RNG.
262+ subjectDER , err := CreateCertificate (caTmpl , caTmpl , caKey , caKey )
263+ if err != nil {
264+ t .Fatalf ("CreateCertificate(subject): %v" , err )
265+ }
266+ subject , err := ParseCertificate (subjectDER )
267+ if err != nil {
268+ t .Fatalf ("ParseCertificate(subject): %v" , err )
269+ }
270+ defer subject .Free ()
271+ if subject .PublicKey == nil {
272+ t .Fatal ("parsed certificate carries no PublicKey" )
273+ }
274+ if subject .PublicKey .CRngPtr () != nil {
275+ t .Error ("a parsed public key should report no RNG" )
276+ }
277+
278+ leafTmpl := & Certificate {
279+ // No SerialNumber here: CreateCertificate has to generates one.
280+ Subject : Name {CommonName : "auto serial leaf" },
281+ NotBefore : time .Now ().Add (- time .Hour ),
282+ NotAfter : time .Now ().Add (24 * time .Hour ),
283+ }
284+ leafDER , err := CreateCertificate (leafTmpl , caCert , subject .PublicKey , caKey )
285+ if err != nil {
286+ t .Fatalf ("CA-signing a parsed public key with an auto serial: %v" , err )
287+ }
288+
289+ leaf , err := ParseCertificate (leafDER )
290+ if err != nil {
291+ t .Fatalf ("ParseCertificate(leaf): %v" , err )
292+ }
293+ defer leaf .Free ()
294+ if leaf .SerialNumber == nil || leaf .SerialNumber .Sign () == 0 {
295+ t .Errorf ("expected a generated serial, got %v" , leaf .SerialNumber )
296+ }
297+ }
298+
234299func TestCreateCertificateRequest (t * testing.T ) {
235300 k , err := GenerateP256Key ()
236301 if err != nil {
0 commit comments