code.gitea.io/gitea@v1.19.3/modules/util/keypair_test.go (about)

     1  // Copyright 2021 The Gitea Authors. All rights reserved.
     2  // SPDX-License-Identifier: MIT
     3  
     4  package util
     5  
     6  import (
     7  	"crypto"
     8  	"crypto/rand"
     9  	"crypto/rsa"
    10  	"crypto/sha256"
    11  	"crypto/x509"
    12  	"encoding/pem"
    13  	"regexp"
    14  	"testing"
    15  
    16  	"github.com/stretchr/testify/assert"
    17  )
    18  
    19  func TestKeygen(t *testing.T) {
    20  	priv, pub, err := GenerateKeyPair(2048)
    21  	assert.NoError(t, err)
    22  
    23  	assert.NotEmpty(t, priv)
    24  	assert.NotEmpty(t, pub)
    25  
    26  	assert.Regexp(t, regexp.MustCompile("^-----BEGIN RSA PRIVATE KEY-----.*"), priv)
    27  	assert.Regexp(t, regexp.MustCompile("^-----BEGIN PUBLIC KEY-----.*"), pub)
    28  }
    29  
    30  func TestSignUsingKeys(t *testing.T) {
    31  	priv, pub, err := GenerateKeyPair(2048)
    32  	assert.NoError(t, err)
    33  
    34  	privPem, _ := pem.Decode([]byte(priv))
    35  	if privPem == nil || privPem.Type != "RSA PRIVATE KEY" {
    36  		t.Fatal("key is wrong type")
    37  	}
    38  
    39  	privParsed, err := x509.ParsePKCS1PrivateKey(privPem.Bytes)
    40  	assert.NoError(t, err)
    41  
    42  	pubPem, _ := pem.Decode([]byte(pub))
    43  	if pubPem == nil || pubPem.Type != "PUBLIC KEY" {
    44  		t.Fatal("key failed to decode")
    45  	}
    46  
    47  	pubParsed, err := x509.ParsePKIXPublicKey(pubPem.Bytes)
    48  	assert.NoError(t, err)
    49  
    50  	// Sign
    51  	msg := "activity pub is great!"
    52  	h := sha256.New()
    53  	h.Write([]byte(msg))
    54  	d := h.Sum(nil)
    55  	sig, err := rsa.SignPKCS1v15(rand.Reader, privParsed, crypto.SHA256, d)
    56  	assert.NoError(t, err)
    57  
    58  	// Verify
    59  	err = rsa.VerifyPKCS1v15(pubParsed.(*rsa.PublicKey), crypto.SHA256, d, sig)
    60  	assert.NoError(t, err)
    61  }