2016-02-01 01:56:10 -08:00
|
|
|
package common
|
|
|
|
|
2016-02-05 02:23:11 -08:00
|
|
|
import (
|
2016-02-07 02:54:02 -08:00
|
|
|
"errors"
|
2016-02-05 02:23:11 -08:00
|
|
|
"github.com/bounce-chat/go-i2p/lib/crypto"
|
|
|
|
)
|
|
|
|
|
|
|
|
type KeysAndCert []byte
|
|
|
|
|
2016-02-07 02:54:02 -08:00
|
|
|
func (keys_and_cert KeysAndCert) PublicKey() (key crypto.ElgPublicKey, err error) {
|
|
|
|
keys_cert_len := len(keys_and_cert)
|
|
|
|
if keys_cert_len < 387 {
|
|
|
|
if keys_cert_len < 256 {
|
|
|
|
err = errors.New("error parsing KeysAndCert: data smaller than ElgPublicKey size")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = errors.New("warning parsing KeysAndCert: data is smaller than minimum valid size")
|
2016-02-05 02:23:11 -08:00
|
|
|
}
|
|
|
|
copy(keys_and_cert[:256], key[:])
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-02-07 02:54:02 -08:00
|
|
|
func (keys_and_cert KeysAndCert) SigningPublicKey() (signing_public_key crypto.SigningPublicKey, err error) {
|
|
|
|
cert, err := keys_and_cert.Certificate()
|
|
|
|
switch err.Error() {
|
|
|
|
case "":
|
|
|
|
}
|
2016-02-05 02:23:11 -08:00
|
|
|
if cert.Type() == CERT_KEY {
|
2016-02-07 02:54:02 -08:00
|
|
|
signing_public_key = KeyCertificate(cert).SigningPublicKey()
|
2016-02-05 02:23:11 -08:00
|
|
|
} else {
|
2016-02-07 02:54:02 -08:00
|
|
|
// Only Key Certificates are currently used:
|
|
|
|
// https://geti2p.net/en/docs/spec/common-structures#type_Certificate
|
2016-02-05 02:23:11 -08:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2016-02-07 02:54:02 -08:00
|
|
|
func (keys_and_cert KeysAndCert) Certificate() (cert Certificate, err error) {
|
|
|
|
keys_cert_len := len(keys_and_cert)
|
|
|
|
if keys_cert_len < 387 {
|
|
|
|
if keys_cert_len < 384 {
|
|
|
|
err = errors.New("error parsing KeysAndCert: data smaller than needed for Certificate")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
err = errors.New("warning parsing KeysAndCert: data is smaller than minimum valid size")
|
|
|
|
}
|
2016-02-05 02:23:11 -08:00
|
|
|
copy(keys_and_cert[256+128:], cert)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
func ReadKeysAndCert(data []byte) (KeysAndCert, []byte, error) {
|
|
|
|
var keys_and_cert KeysAndCert
|
|
|
|
copy(data[:387], keys_and_cert)
|
2016-02-07 02:54:02 -08:00
|
|
|
cert, _ := keys_and_cert.Certificate()
|
|
|
|
n, err := cert.Length()
|
2016-02-05 02:23:11 -08:00
|
|
|
if err != nil {
|
|
|
|
return keys_and_cert, data, err
|
|
|
|
}
|
|
|
|
keys_and_cert = append(keys_and_cert, data[387:n]...)
|
|
|
|
return keys_and_cert, data[387+n:], nil
|
|
|
|
}
|