All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.siisise.ietf.pkcs.asn1.PrivateKeyInfo Maven / Gradle / Ivy

/*
 * Copyright 2023 okome.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package net.siisise.ietf.pkcs.asn1;

import java.math.BigInteger;
import java.util.List;
import net.siisise.iso.asn1.tag.INTEGER;
import net.siisise.iso.asn1.tag.NULL;
import net.siisise.iso.asn1.tag.OBJECTIDENTIFIER;
import net.siisise.iso.asn1.tag.OCTETSTRING;
import net.siisise.iso.asn1.tag.SEQUENCE;

/**
 * RFC 5208 Section 5. Private-Key Information Syntax
 * PKCS #8
 */
public class PrivateKeyInfo {

    public int version;
    public PrivateKeyAlgorithmIdentifier privateKeyAlgorithm;
    public byte[] privateKey;
    public List attributes;

    /**
     * AlgorithmIdentifier (パラメータはNULL) と privateKey を設定する
     * @param oid AlgorithmIdentifier のalgorithm
     * @param privateKey 秘密鍵のASN.1 DER
     */
    public PrivateKeyInfo(OBJECTIDENTIFIER oid, byte[] privateKey) {
        version = 0;
        privateKeyAlgorithm = new PrivateKeyAlgorithmIdentifier(oid);
        this.privateKey = privateKey;
    }

    public PrivateKeyInfo(String oid, byte[] privateKey) {
        version = 0;
        privateKeyAlgorithm = new PrivateKeyAlgorithmIdentifier(oid);
        this.privateKey = privateKey;
    }
    
    public SEQUENCE encodeASN1() {
        SEQUENCE s = new SEQUENCE();
        s.add(version);
        s.add(privateKeyAlgorithm.encodeASN1());
        s.add(new OCTETSTRING(privateKey));
        if ( attributes != null ) {
            // attributes [0] IMPLICIT Attributes OPTIONAL
            throw new UnsupportedOperationException();
        }
        return s;
    }

    public static PrivateKeyInfo decode(SEQUENCE seq) {
        INTEGER ver = (INTEGER) seq.get(0);
        if ( ver.getValue().equals(BigInteger.ZERO)) {
            AlgorithmIdentifier ai = AlgorithmIdentifier.decode((SEQUENCE) seq.get(1));
            if (ai.parameters.equals(new NULL()) ) {
                PrivateKeyInfo info = new PrivateKeyInfo(ai.algorithm, ((OCTETSTRING)seq.get(2)).getValue());
                if (seq.size() == 3) {
                    return info;
                }
            }
        }
        throw new UnsupportedOperationException();
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy