2017-05-28 11:33:04 +02:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/pem"
|
2017-05-31 21:03:51 +02:00
|
|
|
|
|
|
|
"github.com/gibheer/pkiadm"
|
2017-05-28 11:33:04 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
|
|
|
PUTRSA PublicKeyType = iota
|
|
|
|
PUTECDSA
|
|
|
|
PUTED25519
|
|
|
|
)
|
|
|
|
|
|
|
|
type (
|
|
|
|
PublicKey struct {
|
|
|
|
ID string
|
|
|
|
|
2017-05-31 21:03:51 +02:00
|
|
|
PrivateKey pkiadm.ResourceName
|
2017-05-28 11:33:04 +02:00
|
|
|
Type PublicKeyType // mark the type of the public key
|
|
|
|
Key []byte
|
|
|
|
}
|
|
|
|
|
|
|
|
PublicKeyType uint
|
|
|
|
)
|
|
|
|
|
2017-05-31 21:03:51 +02:00
|
|
|
func NewPublicKey(id string, pk pkiadm.ResourceName) (*PublicKey, error) {
|
2017-05-28 11:33:04 +02:00
|
|
|
pub := PublicKey{
|
|
|
|
ID: id,
|
|
|
|
PrivateKey: pk,
|
|
|
|
}
|
|
|
|
return &pub, nil
|
|
|
|
}
|
|
|
|
|
2017-05-31 21:03:51 +02:00
|
|
|
func (p *PublicKey) Name() pkiadm.ResourceName {
|
|
|
|
return pkiadm.ResourceName{p.ID, pkiadm.RTPublicKey}
|
2017-05-28 11:33:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PublicKey) Refresh(lookup *Storage) error {
|
|
|
|
r, err := lookup.Get(p.PrivateKey)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
pk, ok := r.(*PrivateKey)
|
|
|
|
if !ok {
|
|
|
|
return EUnknownType
|
|
|
|
}
|
|
|
|
privateKey, err := pk.GetKey()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
pubKey := privateKey.Public()
|
|
|
|
block, err := pubKey.ToPem()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
block.Headers = map[string]string{"ID": p.ID, "TYPE": p.Type.String()}
|
|
|
|
p.Key = pem.EncodeToMemory(&block)
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2017-05-31 21:03:51 +02:00
|
|
|
func (p *PublicKey) DependsOn() []pkiadm.ResourceName {
|
|
|
|
return []pkiadm.ResourceName{p.PrivateKey}
|
2017-05-28 11:33:04 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PublicKey) Pem() ([]byte, error) {
|
|
|
|
return p.Key, nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func (p *PublicKey) Checksum() []byte {
|
|
|
|
return Hash(p.Key)
|
|
|
|
}
|
|
|
|
|
|
|
|
//func (p *PublicKey) MarshalJSON() ([]byte, error) {
|
|
|
|
// return json.Marshal(*p)
|
|
|
|
//}
|
|
|
|
//func (p *PublicKey) UnmarshalJSON(raw []byte) error {
|
|
|
|
// return json.Unmarshal(raw, p)
|
|
|
|
//}
|