diff options
| author | saturneric <[email protected]> | 2024-07-28 08:18:33 +0000 | 
|---|---|---|
| committer | saturneric <[email protected]> | 2024-07-28 08:18:33 +0000 | 
| commit | c27c541257585878e4db705559c5cb953dc860b7 (patch) | |
| tree | 7dc69115de96151a40acfc8891bf9a065eee0a9b /src/m_paper_key/extract.cpp | |
| parent | fix: solve a memory leak issue (diff) | |
| download | Modules-c27c541257585878e4db705559c5cb953dc860b7.tar.gz Modules-c27c541257585878e4db705559c5cb953dc860b7.zip  | |
feat: add pinentry module and  paper key module
Diffstat (limited to 'src/m_paper_key/extract.cpp')
| -rw-r--r-- | src/m_paper_key/extract.cpp | 93 | 
1 files changed, 93 insertions, 0 deletions
diff --git a/src/m_paper_key/extract.cpp b/src/m_paper_key/extract.cpp new file mode 100644 index 0000000..388a6c7 --- /dev/null +++ b/src/m_paper_key/extract.cpp @@ -0,0 +1,93 @@ +/* + * Copyright (C) 2007, 2017 David Shaw <[email protected]> + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA + */ + +#include "extract.h" + +#include <cstdio> + +#include "output.h" +#include "packets.h" +#include "parse.h" + +extern int verbose; + +int extract(FILE *input, const char *outname, enum data_type output_type) { +  struct packet *packet; +  int offset; +  unsigned char fingerprint[20]; +  unsigned char version = 0; + +  packet = parse(input, 5, 0); +  if (!packet) { +    fprintf(stderr, "Unable to find secret key packet\n"); +    return 1; +  } + +  offset = extract_secrets(packet); +  if (offset == -1) return 1; + +  if (verbose > 1) fprintf(stderr, "Secret offset is %d\n", offset); + +  calculate_fingerprint(packet, offset, fingerprint); + +  if (verbose) { +    fprintf(stderr, "Primary key fingerprint: "); +    print_bytes(stderr, fingerprint, 20); +    fprintf(stderr, "\n"); +  } + +  output_start(outname, output_type, fingerprint); +  output_bytes(&version, 1); +  output_bytes(packet->buf, 1); +  output_bytes(fingerprint, 20); +  output_length16(packet->len - offset); +  output_bytes(&packet->buf[offset], packet->len - offset); + +  free_packet(packet); + +  while ((packet = parse(input, 7, 5))) { +    offset = extract_secrets(packet); +    if (offset == -1) return 1; + +    if (verbose > 1) fprintf(stderr, "Secret subkey offset is %d\n", offset); + +    calculate_fingerprint(packet, offset, fingerprint); + +    if (verbose) { +      fprintf(stderr, "Subkey fingerprint: "); +      print_bytes(stderr, fingerprint, 20); +      fprintf(stderr, "\n"); +    } + +    output_bytes(packet->buf, 1); +    output_bytes(fingerprint, 20); +    output_length16(packet->len - offset); +    output_bytes(&packet->buf[offset], packet->len - offset); + +    free_packet(packet); +  } + +  output_finish(); + +  if (input == stdin) { +    /* Consume everything else on input */ +    while ((fgetc(input) != EOF)); +  } + +  return 0; +}  | 
