Skip to content

Commit 11d3af9

Browse files
authored
Merge pull request #54 from lealem47/F7846
F7846: wolfx509: pass the signer's RNG to wc_MakeCert
2 parents a64770b + af7fb5e commit 11d3af9

3 files changed

Lines changed: 76 additions & 3 deletions

File tree

handles/ecc_handles.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,13 @@ func (k *EccKey) Rng() *wolfSSL.WC_RNG { return &k.rng }
149149

150150
func (k *EccKey) Algorithm() Algorithm { return AlgECDSAP256 }
151151
func (k *EccKey) CKeyPtr() unsafe.Pointer { return unsafe.Pointer(&k.raw) }
152-
func (k *EccKey) CRngPtr() unsafe.Pointer { return unsafe.Pointer(&k.rng) }
152+
153+
func (k *EccKey) CRngPtr() unsafe.Pointer {
154+
if k == nil || !k.hasRng {
155+
return nil
156+
}
157+
return unsafe.Pointer(&k.rng)
158+
}
153159

154160
// -----------------------------------------------------------------------------
155161
// EccKey marshal/parse helpers

wolfx509/certgen_test.go

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
234299
func TestCreateCertificateRequest(t *testing.T) {
235300
k, err := GenerateP256Key()
236301
if err != nil {

wolfx509/certgen_wolfcrypt.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,9 @@ func buildAndSignCert(opts certBuildOpts, parentDER []byte, pubKey, signerKey Ke
157157
if signerKey == nil {
158158
return nil, errors.New("wolfx509: signerKey is nil")
159159
}
160+
if signerKey.CRngPtr() == nil {
161+
return nil, errors.New("wolfx509: signerKey has no RNG, and cannot sign")
162+
}
160163
if pubKey.Algorithm() != signerKey.Algorithm() {
161164
return nil, fmt.Errorf("wolfx509: pubKey algorithm %d does not match signerKey algorithm %d",
162165
pubKey.Algorithm(), signerKey.Algorithm())
@@ -258,8 +261,7 @@ func buildAndSignCert(opts certBuildOpts, parentDER []byte, pubKey, signerKey Ke
258261
if isCSR {
259262
bodySz = int(C.wc_MakeCertReq(&cert, derPtr, derCap, nil, pubEcc))
260263
} else {
261-
pubRng := (*C.WC_RNG)(pubKey.CRngPtr())
262-
bodySz = int(C.wc_MakeCert(&cert, derPtr, derCap, nil, pubEcc, pubRng))
264+
bodySz = int(C.wc_MakeCert(&cert, derPtr, derCap, nil, pubEcc, signerRng))
263265
}
264266
if bodySz < 0 {
265267
return nil, fmt.Errorf("wolfCrypt: body build failed: %d", bodySz)

0 commit comments

Comments
 (0)