123456789101112131415161718192021222324252627282930313233 |
- /*
- * Make a copy of an existing ssh_key object, e.g. to survive after
- * the original is freed.
- */
- #include "misc.h"
- #include "ssh.h"
- ssh_key *ssh_key_clone(ssh_key *key)
- {
- /*
- * To avoid having to add a special method in the vtable API, we
- * clone by round-tripping through public and private blobs.
- */
- strbuf *pub = strbuf_new_nm();
- ssh_key_public_blob(key, BinarySink_UPCAST(pub));
- ssh_key *copy;
- if (ssh_key_has_private(key)) {
- strbuf *priv = strbuf_new_nm();
- ssh_key_private_blob(key, BinarySink_UPCAST(priv));
- copy = ssh_key_new_priv(ssh_key_alg(key), ptrlen_from_strbuf(pub),
- ptrlen_from_strbuf(priv));
- strbuf_free(priv);
- } else {
- copy = ssh_key_new_pub(ssh_key_alg(key), ptrlen_from_strbuf(pub));
- }
- strbuf_free(pub);
- return copy;
- }
|