175 | 974 | } CryptoPP::HKDF<CryptoPP::SHA1>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 62 | { | 128 | 62 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 62 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 62 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 62 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 62 | if (salt == NULLPTR) | 136 | 22 | { | 137 | 22 | salt = GetNullVector(); | 138 | 22 | saltLen = T::DIGESTSIZE; | 139 | 22 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 62 | HMAC<T> hmac; | 143 | 62 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 62 | hmac.SetKey(salt, saltLen); | 147 | 62 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 62 | hmac.SetKey(key.begin(), key.size()); | 151 | 62 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 7.24k | while (derivedLen > 0) | 155 | 7.17k | { | 156 | 7.17k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 7.17k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 7.17k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 7.17k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 7.17k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 7.17k | std::memcpy(derived, buffer, segmentLen); | 168 | 7.17k | #endif | 169 | | | 170 | 7.17k | derived += segmentLen; | 171 | 7.17k | derivedLen -= segmentLen; | 172 | 7.17k | } | 173 | | | 174 | 62 | return 1; | 175 | 62 | } |
CryptoPP::HKDF<CryptoPP::SHA224>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 30 | { | 128 | 30 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 30 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 30 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 30 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 30 | if (salt == NULLPTR) | 136 | 1 | { | 137 | 1 | salt = GetNullVector(); | 138 | 1 | saltLen = T::DIGESTSIZE; | 139 | 1 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 30 | HMAC<T> hmac; | 143 | 30 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 30 | hmac.SetKey(salt, saltLen); | 147 | 30 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 30 | hmac.SetKey(key.begin(), key.size()); | 151 | 30 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 2.49k | while (derivedLen > 0) | 155 | 2.46k | { | 156 | 2.46k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 2.46k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 2.46k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 2.46k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 2.46k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 2.46k | std::memcpy(derived, buffer, segmentLen); | 168 | 2.46k | #endif | 169 | | | 170 | 2.46k | derived += segmentLen; | 171 | 2.46k | derivedLen -= segmentLen; | 172 | 2.46k | } | 173 | | | 174 | 30 | return 1; | 175 | 30 | } |
CryptoPP::HKDF<CryptoPP::SHA384>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 43 | { | 128 | 43 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 43 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 43 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 43 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 43 | if (salt == NULLPTR) | 136 | 5 | { | 137 | 5 | salt = GetNullVector(); | 138 | 5 | saltLen = T::DIGESTSIZE; | 139 | 5 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 43 | HMAC<T> hmac; | 143 | 43 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 43 | hmac.SetKey(salt, saltLen); | 147 | 43 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 43 | hmac.SetKey(key.begin(), key.size()); | 151 | 43 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 3.70k | while (derivedLen > 0) | 155 | 3.66k | { | 156 | 3.66k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 3.66k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 3.66k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 3.66k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 3.66k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 3.66k | std::memcpy(derived, buffer, segmentLen); | 168 | 3.66k | #endif | 169 | | | 170 | 3.66k | derived += segmentLen; | 171 | 3.66k | derivedLen -= segmentLen; | 172 | 3.66k | } | 173 | | | 174 | 43 | return 1; | 175 | 43 | } |
CryptoPP::HKDF<CryptoPP::SHA512>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 54 | { | 128 | 54 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 54 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 54 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 54 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 54 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 54 | HMAC<T> hmac; | 143 | 54 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 54 | hmac.SetKey(salt, saltLen); | 147 | 54 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 54 | hmac.SetKey(key.begin(), key.size()); | 151 | 54 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 5.70k | while (derivedLen > 0) | 155 | 5.64k | { | 156 | 5.64k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 5.64k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 5.64k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 5.64k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 5.64k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 5.64k | std::memcpy(derived, buffer, segmentLen); | 168 | 5.64k | #endif | 169 | | | 170 | 5.64k | derived += segmentLen; | 171 | 5.64k | derivedLen -= segmentLen; | 172 | 5.64k | } | 173 | | | 174 | 54 | return 1; | 175 | 54 | } |
CryptoPP::HKDF<CryptoPP::SHAKE128>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 59 | { | 128 | 59 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 59 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 59 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 59 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 59 | if (salt == NULLPTR) | 136 | 24 | { | 137 | 24 | salt = GetNullVector(); | 138 | 24 | saltLen = T::DIGESTSIZE; | 139 | 24 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 59 | HMAC<T> hmac; | 143 | 59 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 59 | hmac.SetKey(salt, saltLen); | 147 | 59 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 59 | hmac.SetKey(key.begin(), key.size()); | 151 | 59 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.87k | while (derivedLen > 0) | 155 | 1.81k | { | 156 | 1.81k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.81k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.81k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.81k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.81k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.81k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.81k | #endif | 169 | | | 170 | 1.81k | derived += segmentLen; | 171 | 1.81k | derivedLen -= segmentLen; | 172 | 1.81k | } | 173 | | | 174 | 59 | return 1; | 175 | 59 | } |
CryptoPP::HKDF<CryptoPP::SHAKE256>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 53 | { | 128 | 53 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 53 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 53 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 53 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 53 | if (salt == NULLPTR) | 136 | 25 | { | 137 | 25 | salt = GetNullVector(); | 138 | 25 | saltLen = T::DIGESTSIZE; | 139 | 25 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 53 | HMAC<T> hmac; | 143 | 53 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 53 | hmac.SetKey(salt, saltLen); | 147 | 53 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 53 | hmac.SetKey(key.begin(), key.size()); | 151 | 53 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 6.84k | while (derivedLen > 0) | 155 | 6.79k | { | 156 | 6.79k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 6.79k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 6.79k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 6.79k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 6.79k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 6.79k | std::memcpy(derived, buffer, segmentLen); | 168 | 6.79k | #endif | 169 | | | 170 | 6.79k | derived += segmentLen; | 171 | 6.79k | derivedLen -= segmentLen; | 172 | 6.79k | } | 173 | | | 174 | 53 | return 1; | 175 | 53 | } |
CryptoPP::HKDF<CryptoPP::RIPEMD128>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 20 | { | 128 | 20 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 20 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 20 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 20 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 20 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 20 | HMAC<T> hmac; | 143 | 20 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 20 | hmac.SetKey(salt, saltLen); | 147 | 20 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 20 | hmac.SetKey(key.begin(), key.size()); | 151 | 20 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.16k | while (derivedLen > 0) | 155 | 1.14k | { | 156 | 1.14k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.14k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.14k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.14k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.14k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.14k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.14k | #endif | 169 | | | 170 | 1.14k | derived += segmentLen; | 171 | 1.14k | derivedLen -= segmentLen; | 172 | 1.14k | } | 173 | | | 174 | 20 | return 1; | 175 | 20 | } |
CryptoPP::HKDF<CryptoPP::RIPEMD160>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 34 | { | 128 | 34 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 34 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 34 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 34 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 34 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 34 | HMAC<T> hmac; | 143 | 34 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 34 | hmac.SetKey(salt, saltLen); | 147 | 34 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 34 | hmac.SetKey(key.begin(), key.size()); | 151 | 34 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 3.11k | while (derivedLen > 0) | 155 | 3.07k | { | 156 | 3.07k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 3.07k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 3.07k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 3.07k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 3.07k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 3.07k | std::memcpy(derived, buffer, segmentLen); | 168 | 3.07k | #endif | 169 | | | 170 | 3.07k | derived += segmentLen; | 171 | 3.07k | derivedLen -= segmentLen; | 172 | 3.07k | } | 173 | | | 174 | 34 | return 1; | 175 | 34 | } |
CryptoPP::HKDF<CryptoPP::RIPEMD256>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 26 | { | 128 | 26 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 26 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 26 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 26 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 26 | if (salt == NULLPTR) | 136 | 3 | { | 137 | 3 | salt = GetNullVector(); | 138 | 3 | saltLen = T::DIGESTSIZE; | 139 | 3 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 26 | HMAC<T> hmac; | 143 | 26 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 26 | hmac.SetKey(salt, saltLen); | 147 | 26 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 26 | hmac.SetKey(key.begin(), key.size()); | 151 | 26 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 3.06k | while (derivedLen > 0) | 155 | 3.03k | { | 156 | 3.03k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 3.03k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 3.03k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 3.03k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 3.03k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 3.03k | std::memcpy(derived, buffer, segmentLen); | 168 | 3.03k | #endif | 169 | | | 170 | 3.03k | derived += segmentLen; | 171 | 3.03k | derivedLen -= segmentLen; | 172 | 3.03k | } | 173 | | | 174 | 26 | return 1; | 175 | 26 | } |
CryptoPP::HKDF<CryptoPP::RIPEMD320>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 37 | { | 128 | 37 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 37 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 37 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 37 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 37 | if (salt == NULLPTR) | 136 | 9 | { | 137 | 9 | salt = GetNullVector(); | 138 | 9 | saltLen = T::DIGESTSIZE; | 139 | 9 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 37 | HMAC<T> hmac; | 143 | 37 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 37 | hmac.SetKey(salt, saltLen); | 147 | 37 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 37 | hmac.SetKey(key.begin(), key.size()); | 151 | 37 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 2.65k | while (derivedLen > 0) | 155 | 2.61k | { | 156 | 2.61k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 2.61k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 2.61k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 2.61k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 2.61k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 2.61k | std::memcpy(derived, buffer, segmentLen); | 168 | 2.61k | #endif | 169 | | | 170 | 2.61k | derived += segmentLen; | 171 | 2.61k | derivedLen -= segmentLen; | 172 | 2.61k | } | 173 | | | 174 | 37 | return 1; | 175 | 37 | } |
CryptoPP::HKDF<CryptoPP::Whirlpool>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 101 | { | 128 | 101 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 101 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 101 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 101 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 101 | if (salt == NULLPTR) | 136 | 32 | { | 137 | 32 | salt = GetNullVector(); | 138 | 32 | saltLen = T::DIGESTSIZE; | 139 | 32 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 101 | HMAC<T> hmac; | 143 | 101 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 101 | hmac.SetKey(salt, saltLen); | 147 | 101 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 101 | hmac.SetKey(key.begin(), key.size()); | 151 | 101 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 6.59k | while (derivedLen > 0) | 155 | 6.48k | { | 156 | 6.48k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 6.48k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 6.48k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 6.48k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 6.48k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 6.48k | std::memcpy(derived, buffer, segmentLen); | 168 | 6.48k | #endif | 169 | | | 170 | 6.48k | derived += segmentLen; | 171 | 6.48k | derivedLen -= segmentLen; | 172 | 6.48k | } | 173 | | | 174 | 101 | return 1; | 175 | 101 | } |
CryptoPP::HKDF<CryptoPP::Weak1::MD2>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 24 | { | 128 | 24 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 24 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 24 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 24 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 24 | if (salt == NULLPTR) | 136 | 2 | { | 137 | 2 | salt = GetNullVector(); | 138 | 2 | saltLen = T::DIGESTSIZE; | 139 | 2 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 24 | HMAC<T> hmac; | 143 | 24 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 24 | hmac.SetKey(salt, saltLen); | 147 | 24 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 24 | hmac.SetKey(key.begin(), key.size()); | 151 | 24 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.89k | while (derivedLen > 0) | 155 | 1.86k | { | 156 | 1.86k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.86k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.86k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.86k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.86k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.86k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.86k | #endif | 169 | | | 170 | 1.86k | derived += segmentLen; | 171 | 1.86k | derivedLen -= segmentLen; | 172 | 1.86k | } | 173 | | | 174 | 24 | return 1; | 175 | 24 | } |
CryptoPP::HKDF<CryptoPP::Weak1::MD4>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 26 | { | 128 | 26 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 26 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 26 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 26 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 26 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 26 | HMAC<T> hmac; | 143 | 26 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 26 | hmac.SetKey(salt, saltLen); | 147 | 26 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 26 | hmac.SetKey(key.begin(), key.size()); | 151 | 26 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.55k | while (derivedLen > 0) | 155 | 1.53k | { | 156 | 1.53k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.53k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.53k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.53k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.53k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.53k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.53k | #endif | 169 | | | 170 | 1.53k | derived += segmentLen; | 171 | 1.53k | derivedLen -= segmentLen; | 172 | 1.53k | } | 173 | | | 174 | 26 | return 1; | 175 | 26 | } |
CryptoPP::HKDF<CryptoPP::Weak1::MD5>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 32 | { | 128 | 32 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 32 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 32 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 32 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 32 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 32 | HMAC<T> hmac; | 143 | 32 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 32 | hmac.SetKey(salt, saltLen); | 147 | 32 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 32 | hmac.SetKey(key.begin(), key.size()); | 151 | 32 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.61k | while (derivedLen > 0) | 155 | 1.57k | { | 156 | 1.57k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.57k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.57k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.57k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.57k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.57k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.57k | #endif | 169 | | | 170 | 1.57k | derived += segmentLen; | 171 | 1.57k | derivedLen -= segmentLen; | 172 | 1.57k | } | 173 | | | 174 | 32 | return 1; | 175 | 32 | } |
CryptoPP::HKDF<CryptoPP::SM3>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 34 | { | 128 | 34 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 34 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 34 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 34 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 34 | if (salt == NULLPTR) | 136 | 3 | { | 137 | 3 | salt = GetNullVector(); | 138 | 3 | saltLen = T::DIGESTSIZE; | 139 | 3 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 34 | HMAC<T> hmac; | 143 | 34 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 34 | hmac.SetKey(salt, saltLen); | 147 | 34 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 34 | hmac.SetKey(key.begin(), key.size()); | 151 | 34 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 3.43k | while (derivedLen > 0) | 155 | 3.39k | { | 156 | 3.39k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 3.39k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 3.39k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 3.39k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 3.39k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 3.39k | std::memcpy(derived, buffer, segmentLen); | 168 | 3.39k | #endif | 169 | | | 170 | 3.39k | derived += segmentLen; | 171 | 3.39k | derivedLen -= segmentLen; | 172 | 3.39k | } | 173 | | | 174 | 34 | return 1; | 175 | 34 | } |
CryptoPP::HKDF<CryptoPP::BLAKE2b>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 27 | { | 128 | 27 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 27 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 27 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 27 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 27 | if (salt == NULLPTR) | 136 | 1 | { | 137 | 1 | salt = GetNullVector(); | 138 | 1 | saltLen = T::DIGESTSIZE; | 139 | 1 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 27 | HMAC<T> hmac; | 143 | 27 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 27 | hmac.SetKey(salt, saltLen); | 147 | 27 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 27 | hmac.SetKey(key.begin(), key.size()); | 151 | 27 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 2.91k | while (derivedLen > 0) | 155 | 2.88k | { | 156 | 2.88k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 2.88k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 2.88k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 2.88k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 2.88k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 2.88k | std::memcpy(derived, buffer, segmentLen); | 168 | 2.88k | #endif | 169 | | | 170 | 2.88k | derived += segmentLen; | 171 | 2.88k | derivedLen -= segmentLen; | 172 | 2.88k | } | 173 | | | 174 | 27 | return 1; | 175 | 27 | } |
CryptoPP::HKDF<CryptoPP::BLAKE2s>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 61 | { | 128 | 61 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 61 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 61 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 61 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 61 | if (salt == NULLPTR) | 136 | 8 | { | 137 | 8 | salt = GetNullVector(); | 138 | 8 | saltLen = T::DIGESTSIZE; | 139 | 8 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 61 | HMAC<T> hmac; | 143 | 61 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 61 | hmac.SetKey(salt, saltLen); | 147 | 61 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 61 | hmac.SetKey(key.begin(), key.size()); | 151 | 61 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 7.49k | while (derivedLen > 0) | 155 | 7.43k | { | 156 | 7.43k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 7.43k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 7.43k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 7.43k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 7.43k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 7.43k | std::memcpy(derived, buffer, segmentLen); | 168 | 7.43k | #endif | 169 | | | 170 | 7.43k | derived += segmentLen; | 171 | 7.43k | derivedLen -= segmentLen; | 172 | 7.43k | } | 173 | | | 174 | 61 | return 1; | 175 | 61 | } |
CryptoPP::HKDF<CryptoPP::Tiger>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 20 | { | 128 | 20 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 20 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 20 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 20 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 20 | if (salt == NULLPTR) | 136 | 1 | { | 137 | 1 | salt = GetNullVector(); | 138 | 1 | saltLen = T::DIGESTSIZE; | 139 | 1 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 20 | HMAC<T> hmac; | 143 | 20 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 20 | hmac.SetKey(salt, saltLen); | 147 | 20 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 20 | hmac.SetKey(key.begin(), key.size()); | 151 | 20 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.72k | while (derivedLen > 0) | 155 | 1.70k | { | 156 | 1.70k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.70k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.70k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.70k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.70k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.70k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.70k | #endif | 169 | | | 170 | 1.70k | derived += segmentLen; | 171 | 1.70k | derivedLen -= segmentLen; | 172 | 1.70k | } | 173 | | | 174 | 20 | return 1; | 175 | 20 | } |
CryptoPP::HKDF<CryptoPP::Keccak_Final<28u> >::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 17 | { | 128 | 17 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 17 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 17 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 17 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 17 | if (salt == NULLPTR) | 136 | 4 | { | 137 | 4 | salt = GetNullVector(); | 138 | 4 | saltLen = T::DIGESTSIZE; | 139 | 4 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 17 | HMAC<T> hmac; | 143 | 17 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 17 | hmac.SetKey(salt, saltLen); | 147 | 17 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 17 | hmac.SetKey(key.begin(), key.size()); | 151 | 17 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.36k | while (derivedLen > 0) | 155 | 1.34k | { | 156 | 1.34k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.34k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.34k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.34k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.34k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.34k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.34k | #endif | 169 | | | 170 | 1.34k | derived += segmentLen; | 171 | 1.34k | derivedLen -= segmentLen; | 172 | 1.34k | } | 173 | | | 174 | 17 | return 1; | 175 | 17 | } |
CryptoPP::HKDF<CryptoPP::Keccak_Final<32u> >::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 19 | { | 128 | 19 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 19 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 19 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 19 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 19 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 19 | HMAC<T> hmac; | 143 | 19 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 19 | hmac.SetKey(salt, saltLen); | 147 | 19 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 19 | hmac.SetKey(key.begin(), key.size()); | 151 | 19 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.68k | while (derivedLen > 0) | 155 | 1.66k | { | 156 | 1.66k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.66k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.66k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.66k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.66k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.66k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.66k | #endif | 169 | | | 170 | 1.66k | derived += segmentLen; | 171 | 1.66k | derivedLen -= segmentLen; | 172 | 1.66k | } | 173 | | | 174 | 19 | return 1; | 175 | 19 | } |
CryptoPP::HKDF<CryptoPP::Keccak_Final<48u> >::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 28 | { | 128 | 28 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 28 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 28 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 28 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 28 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 28 | HMAC<T> hmac; | 143 | 28 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 28 | hmac.SetKey(salt, saltLen); | 147 | 28 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 28 | hmac.SetKey(key.begin(), key.size()); | 151 | 28 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 3.41k | while (derivedLen > 0) | 155 | 3.38k | { | 156 | 3.38k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 3.38k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 3.38k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 3.38k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 3.38k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 3.38k | std::memcpy(derived, buffer, segmentLen); | 168 | 3.38k | #endif | 169 | | | 170 | 3.38k | derived += segmentLen; | 171 | 3.38k | derivedLen -= segmentLen; | 172 | 3.38k | } | 173 | | | 174 | 28 | return 1; | 175 | 28 | } |
CryptoPP::HKDF<CryptoPP::Keccak_Final<64u> >::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 69 | { | 128 | 69 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 69 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 69 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 69 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 69 | if (salt == NULLPTR) | 136 | 50 | { | 137 | 50 | salt = GetNullVector(); | 138 | 50 | saltLen = T::DIGESTSIZE; | 139 | 50 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 69 | HMAC<T> hmac; | 143 | 69 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 69 | hmac.SetKey(salt, saltLen); | 147 | 69 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 69 | hmac.SetKey(key.begin(), key.size()); | 151 | 69 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 8.95k | while (derivedLen > 0) | 155 | 8.88k | { | 156 | 8.88k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 8.88k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 8.88k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 8.88k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 8.88k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 8.88k | std::memcpy(derived, buffer, segmentLen); | 168 | 8.88k | #endif | 169 | | | 170 | 8.88k | derived += segmentLen; | 171 | 8.88k | derivedLen -= segmentLen; | 172 | 8.88k | } | 173 | | | 174 | 69 | return 1; | 175 | 69 | } |
CryptoPP::HKDF<CryptoPP::LSH224>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 19 | { | 128 | 19 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 19 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 19 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 19 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 19 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 19 | HMAC<T> hmac; | 143 | 19 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 19 | hmac.SetKey(salt, saltLen); | 147 | 19 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 19 | hmac.SetKey(key.begin(), key.size()); | 151 | 19 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.20k | while (derivedLen > 0) | 155 | 1.18k | { | 156 | 1.18k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.18k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.18k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.18k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.18k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.18k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.18k | #endif | 169 | | | 170 | 1.18k | derived += segmentLen; | 171 | 1.18k | derivedLen -= segmentLen; | 172 | 1.18k | } | 173 | | | 174 | 19 | return 1; | 175 | 19 | } |
CryptoPP::HKDF<CryptoPP::LSH256>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 21 | { | 128 | 21 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 21 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 21 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 21 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 21 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 21 | HMAC<T> hmac; | 143 | 21 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 21 | hmac.SetKey(salt, saltLen); | 147 | 21 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 21 | hmac.SetKey(key.begin(), key.size()); | 151 | 21 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.53k | while (derivedLen > 0) | 155 | 1.51k | { | 156 | 1.51k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.51k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.51k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.51k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.51k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.51k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.51k | #endif | 169 | | | 170 | 1.51k | derived += segmentLen; | 171 | 1.51k | derivedLen -= segmentLen; | 172 | 1.51k | } | 173 | | | 174 | 21 | return 1; | 175 | 21 | } |
CryptoPP::HKDF<CryptoPP::LSH384>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 24 | { | 128 | 24 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 24 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 24 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 24 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 24 | if (salt == NULLPTR) | 136 | 1 | { | 137 | 1 | salt = GetNullVector(); | 138 | 1 | saltLen = T::DIGESTSIZE; | 139 | 1 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 24 | HMAC<T> hmac; | 143 | 24 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 24 | hmac.SetKey(salt, saltLen); | 147 | 24 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 24 | hmac.SetKey(key.begin(), key.size()); | 151 | 24 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.89k | while (derivedLen > 0) | 155 | 1.86k | { | 156 | 1.86k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.86k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.86k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.86k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.86k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.86k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.86k | #endif | 169 | | | 170 | 1.86k | derived += segmentLen; | 171 | 1.86k | derivedLen -= segmentLen; | 172 | 1.86k | } | 173 | | | 174 | 24 | return 1; | 175 | 24 | } |
CryptoPP::HKDF<CryptoPP::LSH512>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 19 | { | 128 | 19 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 19 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 19 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 19 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 19 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 19 | HMAC<T> hmac; | 143 | 19 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 19 | hmac.SetKey(salt, saltLen); | 147 | 19 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 19 | hmac.SetKey(key.begin(), key.size()); | 151 | 19 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 1.79k | while (derivedLen > 0) | 155 | 1.77k | { | 156 | 1.77k | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 1.77k | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 1.77k | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 1.77k | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 1.77k | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 1.77k | std::memcpy(derived, buffer, segmentLen); | 168 | 1.77k | #endif | 169 | | | 170 | 1.77k | derived += segmentLen; | 171 | 1.77k | derivedLen -= segmentLen; | 172 | 1.77k | } | 173 | | | 174 | 19 | return 1; | 175 | 19 | } |
CryptoPP::HKDF<CryptoPP::LSH512_256>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const Line | Count | Source | 127 | 15 | { | 128 | 15 | CRYPTOPP_ASSERT(secret && secretLen); | 129 | 15 | CRYPTOPP_ASSERT(derived && derivedLen); | 130 | 15 | CRYPTOPP_ASSERT(derivedLen <= MaxDerivedKeyLength()); | 131 | | | 132 | 15 | ThrowIfInvalidDerivedKeyLength(derivedLen); | 133 | | | 134 | | // HKDF business logic. NULL is different than empty. | 135 | 15 | if (salt == NULLPTR) | 136 | 0 | { | 137 | 0 | salt = GetNullVector(); | 138 | 0 | saltLen = T::DIGESTSIZE; | 139 | 0 | } | 140 | | | 141 | | // key is PRK from the RFC, salt is IKM from the RFC | 142 | 15 | HMAC<T> hmac; | 143 | 15 | SecByteBlock key(T::DIGESTSIZE), buffer(T::DIGESTSIZE); | 144 | | | 145 | | // Extract | 146 | 15 | hmac.SetKey(salt, saltLen); | 147 | 15 | hmac.CalculateDigest(key, secret, secretLen); | 148 | | | 149 | | // Key | 150 | 15 | hmac.SetKey(key.begin(), key.size()); | 151 | 15 | byte block = 0; | 152 | | | 153 | | // Expand | 154 | 940 | while (derivedLen > 0) | 155 | 925 | { | 156 | 925 | if (block++) {hmac.Update(buffer, buffer.size());} | 157 | 925 | if (infoLen) {hmac.Update(info, infoLen);} | 158 | 925 | hmac.CalculateDigest(buffer, &block, 1); | 159 | | | 160 | | #if CRYPTOPP_MSC_VERSION | 161 | | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 162 | | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 163 | | memcpy_s(derived, segmentLen, buffer, segmentLen); | 164 | | #else | 165 | 925 | const size_t digestSize = static_cast<size_t>(T::DIGESTSIZE); | 166 | 925 | const size_t segmentLen = STDMIN(derivedLen, digestSize); | 167 | 925 | std::memcpy(derived, buffer, segmentLen); | 168 | 925 | #endif | 169 | | | 170 | 925 | derived += segmentLen; | 171 | 925 | derivedLen -= segmentLen; | 172 | 925 | } | 173 | | | 174 | 15 | return 1; | 175 | 15 | } |
Unexecuted instantiation: CryptoPP::HKDF<CryptoPP::SHA256>::DeriveKey(unsigned char*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long, unsigned char const*, unsigned long) const |