101 lines
2.6 KiB
Go
101 lines
2.6 KiB
Go
package routes
|
|
|
|
import (
|
|
"crypto/ecdsa"
|
|
"crypto/rsa"
|
|
"encoding/hex"
|
|
"net/http"
|
|
"time"
|
|
|
|
"golang.org/x/crypto/openpgp"
|
|
"golang.org/x/crypto/openpgp/armor"
|
|
"golang.org/x/crypto/openpgp/packet"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type PGPKey struct {
|
|
FullName, Name, Comment, Email string
|
|
CreationTime time.Time
|
|
PublicKeyAlgorithm packet.PublicKeyAlgorithm
|
|
Fingerprint [20]byte
|
|
KeyID uint64
|
|
}
|
|
|
|
func GetOpenPGPInformationEncoded(c *gin.Context) {
|
|
query := c.Copy().Request.Body
|
|
|
|
block, err := armor.Decode(query)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"status": false,
|
|
"message": "Unable to parse body.",
|
|
})
|
|
return
|
|
}
|
|
pkt := packet.NewReader(block.Body)
|
|
entity, err := openpgp.ReadEntity(pkt)
|
|
if err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"status": false,
|
|
"message": "Unable to parse body.",
|
|
})
|
|
return
|
|
}
|
|
if len(entity.Identities) > 1 {
|
|
c.JSON(http.StatusBadRequest, gin.H{
|
|
"status": false,
|
|
"message": "No identities found in PGP key.",
|
|
})
|
|
return
|
|
}
|
|
var key *PGPKey
|
|
for name, identity := range entity.Identities {
|
|
key = &PGPKey{
|
|
FullName: name,
|
|
Name: identity.UserId.Name,
|
|
Comment: identity.UserId.Comment,
|
|
Email: identity.UserId.Email,
|
|
CreationTime: entity.PrimaryKey.CreationTime,
|
|
PublicKeyAlgorithm: entity.PrimaryKey.PubKeyAlgo,
|
|
Fingerprint: entity.PrimaryKey.Fingerprint,
|
|
KeyID: entity.PrimaryKey.KeyId,
|
|
}
|
|
break
|
|
}
|
|
|
|
// bitLength, _ := entity.PrimaryKey.BitLength()
|
|
var bitLength int
|
|
|
|
switch entity.PrimaryKey.PubKeyAlgo {
|
|
case packet.PubKeyAlgoECDSA:
|
|
if ecdsaKey, ok := entity.PrimaryKey.PublicKey.(*ecdsa.PublicKey); ok {
|
|
bitLength = ecdsaKey.Params().BitSize
|
|
} else {
|
|
panic("expected ecdsa.PublicKey for type packet.PubKeyAlgoECDSA")
|
|
}
|
|
case packet.PubKeyAlgoRSA:
|
|
if rsaKey, ok := entity.PrimaryKey.PublicKey.(*rsa.PublicKey); ok {
|
|
bitLength = rsaKey.N.BitLen()
|
|
} else {
|
|
panic("expected rsa.PublicKey for type packet.PubKeyAlgoRSA")
|
|
}
|
|
default:
|
|
val, _ := entity.PrimaryKey.BitLength()
|
|
bitLength = int(val)
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{
|
|
"status": true,
|
|
"fullName": key.FullName,
|
|
"name": key.Name,
|
|
"comment": key.Comment,
|
|
"email": key.Email,
|
|
"creationTime": key.CreationTime,
|
|
"publicKeyAlgorithm": key.PublicKeyAlgorithm,
|
|
"fingerprint": hex.EncodeToString(key.Fingerprint[:]),
|
|
"keyID": entity.PrimaryKey.KeyIdString(),
|
|
"bitLength": bitLength,
|
|
})
|
|
}
|