Changeset 086381d9


Ignore:
Timestamp:
Aug 6, 2014 4:32:10 PM (6 years ago)
Author:
zzz <zzz@…>
Branches:
master
Children:
d1a2e24
Parents:
89764c12
Message:

SU3File: Add support for XML and NEWS types

File:
1 edited

Legend:

Unmodified
Added
Removed
  • core/java/src/net/i2p/crypto/SU3File.java

    r89764c12 r086381d9  
    5050    private String _signer;
    5151    private int _signerLength;
     52    private int _fileType = -1;
    5253    private ContentType _contentType;
    5354    private long _contentLength;
     
    6162    private static final int VERSION_OFFSET = 40; // Signature.SIGNATURE_BYTES; avoid early ctx init
    6263
    63     private static final int TYPE_ZIP = 0;
     64    public static final int TYPE_ZIP = 0;
     65    public static final int TYPE_XML = 1;
    6466
    6567    public static final int CONTENT_UNKNOWN = 0;
     
    6769    public static final int CONTENT_PLUGIN = 2;
    6870    public static final int CONTENT_RESEED = 3;
     71    public static final int CONTENT_NEWS = 4;
    6972
    7073    private enum ContentType {
     
    7275        ROUTER(CONTENT_ROUTER, "router"),
    7376        PLUGIN(CONTENT_PLUGIN, "plugin"),
    74         RESEED(CONTENT_RESEED, "reseed")
     77        RESEED(CONTENT_RESEED, "reseed"),
     78        NEWS(CONTENT_NEWS, "news")
    7579        ;
    7680
     
    152156        verifyHeader();
    153157        return _contentType != null ? _contentType.getCode() : -1;
     158    }
     159
     160    /**
     161     *  @return -1 if unknown
     162     *  @since 0.9.15
     163     */
     164    public int getFileType() throws IOException {
     165        verifyHeader();
     166        return _fileType;
    154167    }
    155168
     
    205218            throw new IOException("bad content length");
    206219        skip(in, 1);
    207         foo = in.read();
    208         if (foo != TYPE_ZIP)
    209             throw new IOException("bad type");
     220        _fileType = in.read();
     221        if (_fileType != TYPE_ZIP && _fileType != TYPE_XML)
     222            throw new IOException("bad file type");
    210223        skip(in, 1);
    211224        int cType = in.read();
     
    353366     *
    354367     *  @param content the input file, probably in zip format
    355      *  @param contentType 0-255, 0 for zip
     368     *  @param fileType 0-255, 0 for zip
     369     *  @param contentType 0-255
    356370     *  @param version 1-255 bytes when converted to UTF-8
    357371     *  @param signer ID of the public key, 1-255 bytes when converted to UTF-8
    358372     */
    359     public void write(File content, int contentType, String version,
     373    public void write(File content, int fileType, int contentType, String version,
    360374                      String signer, PrivateKey privkey, SigType sigType) throws IOException {
    361375        InputStream in = null;
     
    387401            DataHelper.writeLong(out, 8, contentLength);
    388402            out.write((byte) 0);
    389             out.write((byte) TYPE_ZIP);
     403            if (fileType < 0 || fileType > 255)
     404                throw new IllegalArgumentException("bad content type");
     405            out.write((byte) fileType);
    390406            out.write((byte) 0);
    391407            if (contentType < 0 || contentType > 255)
     
    444460            String stype = null;
    445461            String ctype = null;
     462            String ftype = null;
    446463            boolean error = false;
    447             Getopt g = new Getopt("SU3File", args, "t:c:");
     464            Getopt g = new Getopt("SU3File", args, "t:c:f:");
    448465            int c;
    449466            while ((c = g.getopt()) != -1) {
     
    455472                case 'c':
    456473                    ctype = g.getOptarg();
     474                    break;
     475
     476                case 'f':
     477                    ftype = g.getOptarg();
    457478                    break;
    458479
     
    477498                props.setProperty("prng.bufferSize", "16384");
    478499                new I2PAppContext(props);
    479                 ok = signCLI(stype, ctype, a.get(0), a.get(1), a.get(2), a.get(3), a.get(4), "");
     500                ok = signCLI(stype, ctype, ftype, a.get(0), a.get(1), a.get(2), a.get(3), a.get(4), "");
    480501            } else if ("bulksign".equals(cmd)) {
    481502                Properties props = new Properties();
     
    503524    private static final void showUsageCLI() {
    504525        System.err.println("Usage: SU3File keygen       [-t type|code] publicKeyFile keystore.ks you@mail.i2p");
    505         System.err.println("       SU3File sign         [-c type|code] [-t type|code] inputFile.zip signedFile.su3 keystore.ks version you@mail.i2p");
    506         System.err.println("       SU3File bulksign     [-c type|code] [-t type|code] directory keystore.ks version you@mail.i2p");
     526        System.err.println("       SU3File sign         [-t type|code] [-c type|code] [-f type|code] inputFile.zip signedFile.su3 keystore.ks version you@mail.i2p");
     527        System.err.println("       SU3File bulksign     [-t type|code] [-c type|code] directory keystore.ks version you@mail.i2p");
    507528        System.err.println("       SU3File showversion  signedFile.su3");
    508529        System.err.println("       SU3File verifysig    signedFile.su3");
    509         System.err.println("       SU3File extract      signedFile.su3 outFile.zip");
     530        System.err.println("       SU3File extract      signedFile.su3 outFile");
    510531        System.err.println(dumpTypes());
    511532    }
     
    530551            buf.append('\n');
    531552        }
     553        buf.append("Available file types (-f):\n");
     554        buf.append("      ZIP\t(code: 0) DEFAULT\n");
     555        buf.append("      XML\t(code: 1)\n");
    532556        return buf.toString();
    533557    }
     
    575599
    576600    /**
     601     *  Zip only
    577602     *  @return success
    578603     *  @since 0.9.9
     
    609634                continue;
    610635            String signedFile = inputFile.substring(0, inputFile.length() - 4) + ".su3";
    611             boolean rv = signCLI(stype, ctype, inputFile, signedFile, privateKeyFile, version, signerName, keypw);
     636            boolean rv = signCLI(stype, ctype, null, inputFile, signedFile, privateKeyFile, version, signerName, keypw);
    612637            if (!rv)
    613638                return false;
     
    623648     *  @since 0.9.9
    624649     */
    625     private static final boolean signCLI(String stype, String ctype, String inputFile, String signedFile,
     650    private static final boolean signCLI(String stype, String ctype, String ftype, String inputFile, String signedFile,
    626651                                         String privateKeyFile, String version, String signerName, String keypw) {
    627652        SigType type = stype == null ? SigType.getByCode(Integer.valueOf(DEFAULT_SIG_CODE)) : SigType.parseSigType(stype);
     
    635660            return false;
    636661        }
    637         return signCLI(type, ct, inputFile, signedFile, privateKeyFile, version, signerName, keypw);
     662        int ft = TYPE_ZIP;
     663        if (ftype != null) {
     664            if (ftype.equalsIgnoreCase("ZIP")) {
     665                ft = TYPE_ZIP;
     666            } else if (ftype.equalsIgnoreCase("XML")) {
     667                ft = TYPE_XML;
     668            } else {
     669                try {
     670                    ft = Integer.parseInt(ftype);
     671                } catch (NumberFormatException nfe) {
     672                    ft = -1;
     673                }
     674                if (ft != TYPE_ZIP && ft != TYPE_XML) {
     675                    System.out.println("File type " + ftype + " is not supported");
     676                    return false;
     677                }
     678            }
     679        }
     680        return signCLI(type, ct, ft, inputFile, signedFile, privateKeyFile, version, signerName, keypw);
    638681    }
    639682
     
    642685     *  @since 0.9.9
    643686     */
    644     private static final boolean signCLI(SigType type, ContentType ctype, String inputFile, String signedFile,
     687    private static final boolean signCLI(SigType type, ContentType ctype, int ftype, String inputFile, String signedFile,
    645688                                         String privateKeyFile, String version, String signerName, String keypw) {
    646689        try {
     
    658701            }
    659702            SU3File file = new SU3File(signedFile);
    660             file.write(new File(inputFile), ctype.getCode(), version, signerName, pk, type);
     703            file.write(new File(inputFile), ftype, ctype.getCode(), version, signerName, pk, type);
    661704            System.out.println("Input file '" + inputFile + "' signed and written to '" + signedFile + "'");
    662705            return true;
Note: See TracChangeset for help on using the changeset viewer.