예제 #1
0
        /// <summary>
        /// Get the next unused GMSS private key.
        /// <para>Use this call to get a new private key for each signing operation.</para>
        /// </summary>
        /// 
        /// <returns>The next available private key</returns>
        public GMSSPrivateKey NextKey()
        {
            GMSSPrivateKey nKey = new GMSSPrivateKey(this);
            nKey.NextKey(_gmssPS.NumLayers - 1);

            return nKey;
        }
예제 #2
0
        /// <summary>
        /// Generate an encryption Key pair
        /// </summary>
        /// 
        /// <returns>A GMSSKeyPair containing public and private keys</returns>
        public IAsymmetricKeyPair GenerateKeyPair()
        {
            // initialize authenticationPaths and treehash instances
            byte[][][] currentAuthPaths = new byte[_numLayer][][];
            byte[][][] nextAuthPaths = new byte[_numLayer - 1][][];
            Treehash[][] currentTreehash = new Treehash[_numLayer][];
            Treehash[][] nextTreehash = new Treehash[_numLayer - 1][];
            List<byte[]>[] currentStack = new List<byte[]>[_numLayer];
            List<byte[]>[] nextStack = new List<byte[]>[_numLayer - 1];
            List<byte[]>[][] currentRetain = new List<byte[]>[_numLayer][];
            List<byte[]>[][] nextRetain = new List<byte[]>[_numLayer - 1][];

            for (int i = 0; i < _numLayer; i++)
            {
                currentAuthPaths[i] = ArrayUtils.CreateJagged<byte[][]>(_heightOfTrees[i], _mdLength);//new byte[heightOfTrees[i]][mdLength];
                currentTreehash[i] = new Treehash[_heightOfTrees[i] - _K[i]];

                if (i > 0)
                {
                    nextAuthPaths[i - 1] = ArrayUtils.CreateJagged<byte[][]>(_heightOfTrees[i], _mdLength);//new byte[heightOfTrees[i]][mdLength];
                    nextTreehash[i - 1] = new Treehash[_heightOfTrees[i] - _K[i]];
                }

                currentStack[i] = new List<byte[]>();
                if (i > 0)
                    nextStack[i - 1] = new List<byte[]>();
            }

            // initialize roots
            byte[][] currentRoots = ArrayUtils.CreateJagged<byte[][]>(_numLayer, _mdLength);
            byte[][] nextRoots = ArrayUtils.CreateJagged<byte[][]>(_numLayer - 1, _mdLength);
            // initialize seeds
            byte[][] seeds = ArrayUtils.CreateJagged<byte[][]>(_numLayer, _mdLength);

            // initialize seeds[] by copying starting-seeds of first trees of each layer
            for (int i = 0; i < _numLayer; i++)
                Array.Copy(_currentSeeds[i], 0, seeds[i], 0, _mdLength);

            // initialize rootSigs
            _currentRootSigs = ArrayUtils.CreateJagged<byte[][]>(_numLayer - 1, _mdLength);//new byte[numLayer - 1][mdLength];

            // calculation of current authpaths and current rootsigs (AUTHPATHS, SIG) from bottom up to the root
            for (int h = _numLayer - 1; h >= 0; h--)
            {
                GMSSRootCalc tree = new GMSSRootCalc(_heightOfTrees[h], _K[h], GetDigest(_msgDigestType));
                try
                {
                    // on lowest layer no lower root is available, so just call the method with null as first parameter
                    if (h == _numLayer - 1)
                        tree = GenerateCurrentAuthpathAndRoot(null, currentStack[h], seeds[h], h);
                    else
                        // otherwise call the method with the former computed root value
                        tree = GenerateCurrentAuthpathAndRoot(currentRoots[h + 1], currentStack[h], seeds[h], h);

                }
                catch
                {
                }

                // set initial values needed for the private key construction
                for (int i = 0; i < _heightOfTrees[h]; i++)
                    Array.Copy(tree.GetAuthPath()[i], 0, currentAuthPaths[h][i], 0, _mdLength);

                currentRetain[h] = tree.GetRetain();
                currentTreehash[h] = tree.GetTreehash();
                Array.Copy(tree.GetRoot(), 0, currentRoots[h], 0, _mdLength);
            }

            // calculation of next authpaths and next roots (AUTHPATHS+, ROOTS+)
            for (int h = _numLayer - 2; h >= 0; h--)
            {
                GMSSRootCalc tree = GenerateNextAuthpathAndRoot(nextStack[h], seeds[h + 1], h + 1);

                // set initial values needed for the private key construction
                for (int i = 0; i < _heightOfTrees[h + 1]; i++)
                    Array.Copy(tree.GetAuthPath()[i], 0, nextAuthPaths[h][i], 0, _mdLength);

                nextRetain[h] = tree.GetRetain();
                nextTreehash[h] = tree.GetTreehash();
                Array.Copy(tree.GetRoot(), 0, nextRoots[h], 0, _mdLength);
                // create seed for the Merkle tree after next (nextNextSeeds) SEEDs++
                Array.Copy(seeds[h + 1], 0, _nextNextSeeds[h], 0, _mdLength);
            }

            // generate JDKGMSSPublicKey
            int[] len = new int[] { currentRoots[0].Length };
            byte[] btlen = new byte[4];
            Buffer.BlockCopy(len, 0, btlen, 0, btlen.Length);

            GMSSPublicKey pubKey = new GMSSPublicKey(ArrayUtils.Concat(btlen, currentRoots[0]));

            // generate the JDKGMSSPrivateKey
            GMSSPrivateKey privKey = new GMSSPrivateKey(_currentSeeds, _nextNextSeeds, currentAuthPaths, nextAuthPaths, currentTreehash,
                nextTreehash, currentStack, nextStack, currentRetain, nextRetain, nextRoots, _currentRootSigs, _gmssParams, _msgDigestType);

            // return the KeyPair
            return new GMSSKeyPair(pubKey, privKey);
        }
예제 #3
0
 /// <summary>
 /// Copy Constructor
 /// </summary>
 /// 
 /// <param name="PrivateKey">The GMSSPrivateKey to copy</param>
 private GMSSPrivateKey(GMSSPrivateKey PrivateKey)
 {
     _index = ArrayUtils.Clone(PrivateKey._index);
     _currentSeeds = GMSSUtil.Clone(PrivateKey._currentSeeds);
     _nextNextSeeds = GMSSUtil.Clone(PrivateKey._nextNextSeeds);
     _currentAuthPaths = GMSSUtil.Clone(PrivateKey._currentAuthPaths);
     _nextAuthPaths = GMSSUtil.Clone(PrivateKey._nextAuthPaths);
     _keep = GMSSUtil.Clone(PrivateKey._keep);
     _currentTreehash = PrivateKey._currentTreehash;
     _nextTreehash = PrivateKey._nextTreehash;
     _currentStack = PrivateKey._currentStack;
     _nextStack = PrivateKey._nextStack;
     _currentRetain = PrivateKey._currentRetain;
     _nextRetain = PrivateKey._nextRetain;
     _nextNextLeaf = PrivateKey._nextNextLeaf; //N
     _upperLeaf = PrivateKey._upperLeaf; //N
     _upperTreehashLeaf = PrivateKey._upperTreehashLeaf; //N
     _minTreehash = PrivateKey._minTreehash; //N
     _nextRoot = GMSSUtil.Clone(PrivateKey._nextRoot);
     _nextNextRoot = PrivateKey._nextNextRoot; //N
     _currentRootSig = PrivateKey._currentRootSig;
     _nextRootSig = PrivateKey._nextRootSig; //N
     _gmssPS = PrivateKey._gmssPS;
     _msgDigestType = PrivateKey._msgDigestType;
     _heightOfTrees = PrivateKey._heightOfTrees;
     _otsIndex = PrivateKey._otsIndex;
     _K = PrivateKey._K;
     _numLayer = PrivateKey._numLayer;
     _msgDigestTrees = PrivateKey._msgDigestTrees;
     _mdLength = PrivateKey._mdLength;
     _gmssRandom = PrivateKey._gmssRandom;
     _numLeafs = PrivateKey._numLeafs;
 }