2021-09-28 22:19:22 +03:00
// Copyright 2021 The Gitea Authors. All rights reserved.
2022-11-27 21:20:29 +03:00
// SPDX-License-Identifier: MIT
2021-09-28 22:19:22 +03:00
2023-02-06 04:49:21 +03:00
package util
2021-09-28 22:19:22 +03:00
import (
2023-05-12 20:27:50 +03:00
"crypto"
2021-09-28 22:19:22 +03:00
"crypto/rand"
"crypto/rsa"
2024-02-25 16:32:13 +03:00
"crypto/sha256"
2021-09-28 22:19:22 +03:00
"crypto/x509"
"encoding/pem"
)
2023-02-06 04:49:21 +03:00
// GenerateKeyPair generates a public and private keypair
func GenerateKeyPair ( bits int ) ( string , string , error ) {
priv , _ := rsa . GenerateKey ( rand . Reader , bits )
2024-06-11 21:47:45 +03:00
privPem := pemBlockForPriv ( priv )
2021-09-28 22:19:22 +03:00
pubPem , err := pemBlockForPub ( & priv . PublicKey )
if err != nil {
return "" , "" , err
}
return privPem , pubPem , nil
}
2024-06-11 21:47:45 +03:00
func pemBlockForPriv ( priv * rsa . PrivateKey ) string {
2021-09-28 22:19:22 +03:00
privBytes := pem . EncodeToMemory ( & pem . Block {
Type : "RSA PRIVATE KEY" ,
Bytes : x509 . MarshalPKCS1PrivateKey ( priv ) ,
} )
2024-06-11 21:47:45 +03:00
return string ( privBytes )
2021-09-28 22:19:22 +03:00
}
func pemBlockForPub ( pub * rsa . PublicKey ) ( string , error ) {
pubASN1 , err := x509 . MarshalPKIXPublicKey ( pub )
if err != nil {
return "" , err
}
pubBytes := pem . EncodeToMemory ( & pem . Block {
Type : "PUBLIC KEY" ,
Bytes : pubASN1 ,
} )
return string ( pubBytes ) , nil
}
2023-05-12 20:27:50 +03:00
// CreatePublicKeyFingerprint creates a fingerprint of the given key.
// The fingerprint is the sha256 sum of the PKIX structure of the key.
func CreatePublicKeyFingerprint ( key crypto . PublicKey ) ( [ ] byte , error ) {
bytes , err := x509 . MarshalPKIXPublicKey ( key )
if err != nil {
return nil , err
}
checksum := sha256 . Sum256 ( bytes )
return checksum [ : ] , nil
}